{ "$schema": "https://hwlab.pikastech.local/schemas/dev-cd-apply.schema.json", "$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-cd-apply.json", "reportVersion": "v1", "issue": "pikasTech/HWLAB#274", "taskId": "dev-cd-apply", "commitId": "63acb59", "acceptanceLevel": "dev_cd_apply", "devOnly": true, "prodDisabled": true, "status": "pass", "generatedAt": "2026-05-23T09:40:36.676Z", "reportLifecycle": { "version": "v1", "state": "active", "activeEndpoint": "http://74.48.78.17:16667", "activeBrowserEndpoint": "http://74.48.78.17:16666", "deprecatedEndpoint": null, "summary": "Current DEV CD transaction report; the only DEV side-effect entrypoint is scripts/dev-cd-apply.mjs." }, "supports": [ "pikasTech/HWLAB#274", "pikasTech/HWLAB#116", "pikasTech/HWLAB#235", "pikasTech/HWLAB#50", "pikasTech/HWLAB#57", "pikasTech/HWLAB#67", "pikasTech/HWLAB#73" ], "sourceContract": { "status": "pass", "documents": [ "docs/reference/deployment-publish.md", "docs/reference/dev-runtime-boundary.md", "docs/dev-artifact-publish.md", "docs/dev-deploy-apply.md", "docs/artifact-catalog.md" ], "summary": "DEV CD publish/apply/verify side effects are serialized by one Kubernetes Lease and use deploy/deploy.json as the apply desired-state source." }, "validationCommands": [ "node --check scripts/dev-cd-apply.mjs", "node --check scripts/src/dev-cd-apply.mjs", "node --test scripts/src/dev-cd-apply.test.mjs", "node --check scripts/dev-artifact-publish.mjs", "node --check scripts/src/dev-deploy-apply.mjs", "node --test scripts/src/dev-deploy-apply.test.mjs", "node scripts/deploy-desired-state-plan.mjs --check", "node scripts/validate-artifact-catalog.mjs", "git diff --check" ], "localSmoke": { "status": "not_run", "commands": [ "npm run check" ], "evidence": [ "Local checks are listed as validation commands and are not implied by a DEV CD transaction." ], "summary": "The transaction report records DEV publish/apply/verify evidence; local smoke is a separate gate." }, "dryRun": { "status": "not_run", "commands": [ "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked --write-report" ], "evidence": [ "The transaction path owns live side effects; dry-run remains a preflight support mode." ], "summary": "DEV CD mutation requires --apply and the transaction Lease lock." }, "devPreconditions": { "status": "pass", "requirements": [ "HEAD must match the requested target ref before publish.", "Lease/hwlab-dev-cd-lock must be acquired before publish/apply.", "Legacy publish/apply side-effect scripts must run with HWLAB_CD_TRANSACTION_ID.", "deploy/deploy.json, artifact catalog, and workloads must converge before apply.", "Public 16666 and 16667 live health must be recorded in this report." ], "summary": "DEV CD transaction preconditions passed." }, "transaction": { "transactionId": "fdb50204-3968-48f8-82ee-cd8f172b0c5a", "ownerTaskId": "DC-DCSN-P0-2026-003", "targetNamespace": "hwlab-dev", "lockName": "hwlab-dev-cd-lock", "lockBackend": "Lease", "startedAt": "2026-05-23T09:40:07.734Z", "finishedAt": "2026-05-23T09:40:36.676Z", "ttlSeconds": 3600, "phases": [ { "phase": "publishing", "status": "entered", "at": "2026-05-23T09:40:11.742Z" }, { "phase": "applying", "status": "entered", "at": "2026-05-23T09:40:33.012Z" }, { "phase": "verifying", "status": "entered", "at": "2026-05-23T09:40:35.398Z" }, { "phase": "released", "status": "released", "at": "2026-05-23T09:40:36.676Z" } ], "release": { "status": "released", "command": "kubectl -n hwlab-dev replace -f - -o json", "lock": { "lockBackend": "Lease", "lockName": "hwlab-dev-cd-lock", "resourceVersion": "1387022", "holderIdentity": "", "promotionCommit": "63acb59", "deployJsonHash": "sha256:d1e1c344b8b36913ba39985c0b91531bc377e4ef293b0a28cee44d4f3c025b67", "ownerTaskId": "DC-DCSN-P0-2026-003", "transactionId": "fdb50204-3968-48f8-82ee-cd8f172b0c5a", "phase": "released", "startedAt": "2026-05-23T09:40:07.746000Z", "updatedAt": "2026-05-23T09:40:36.631000Z", "ttlSeconds": 3600, "liveBefore": { "status": "pass", "expectedCommit": null, "endpoints": [ { "id": "cloud-web-16666", "url": "http://74.48.78.17:16666/health/live", "status": "pass", "httpStatus": 200, "reachable": true, "identityMatches": true, "startedAt": "2026-05-23T09:40:07.823Z", "finishedAt": "2026-05-23T09:40:08.574Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "63acb59", "image": null, "imageTag": null, "observedAt": null, "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] }, { "id": "cloud-api-16667", "url": "http://74.48.78.17:16667/health/live", "status": "pass", "httpStatus": 200, "reachable": true, "identityMatches": true, "startedAt": "2026-05-23T09:40:07.825Z", "finishedAt": "2026-05-23T09:40:11.666Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "ok", "ready": true, "observedCommit": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "observedAt": "2026-05-23T09:40:09.312Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] } ], "summary": { "checked": 2, "reachable": 2, "identityMatches": 2, "commitMatches": null, "ports": [ 16666, 16667 ] } }, "targetNamespace": "hwlab-dev", "targetRef": "origin/main", "releasedAt": "2026-05-23T09:40:36.631000Z", "releaseStatus": "pass", "staleLockBrokenAt": null, "staleLockPrevious": null } } }, "devCdApply": { "mode": "apply", "target": { "ref": "origin/main", "promotionCommit": "63acb5989baa9f12266ca3467eb896a454593efc", "shortCommitId": "63acb59", "headCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "headMatchesTarget": true, "namespace": "hwlab-dev", "apiEndpoint": "http://74.48.78.17:16667", "browserEndpoint": "http://74.48.78.17:16666/" }, "deployJson": { "before": { "path": "deploy/deploy.json", "hash": "sha256:d1e1c344b8b36913ba39985c0b91531bc377e4ef293b0a28cee44d4f3c025b67", "commitId": "6963ed2", "namespace": "hwlab-dev", "environment": "dev", "endpoint": "http://74.48.78.17:16667", "manifest": { "manifestVersion": "v1", "environment": "dev", "commitId": "6963ed2", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "health": { "method": "GET", "path": "/health/live", "responseFormat": "json" }, "publicEndpoints": { "frontend": { "url": "http://74.48.78.17:16666", "protocol": "http", "host": "74.48.78.17", "port": 16666, "serviceId": "hwlab-cloud-web", "frpProxy": "hwlab-dev-cloud-web" }, "api": { "url": "http://74.48.78.17:16667", "protocol": "http", "host": "74.48.78.17", "port": 16667, "serviceId": "hwlab-edge-proxy", "frpProxy": "hwlab-dev-edge-proxy" } }, "frp": { "server": { "address": "74.48.78.17", "bindPort": 7000 }, "proxies": [ { "name": "hwlab-dev-cloud-web", "endpointId": "frontend", "type": "tcp", "localServiceId": "hwlab-cloud-web", "localHost": "hwlab-cloud-web.hwlab-dev.svc.cluster.local", "localPort": 8080, "remotePort": 16666 }, { "name": "hwlab-dev-edge-proxy", "endpointId": "api", "type": "tcp", "localServiceId": "hwlab-edge-proxy", "localHost": "hwlab-edge-proxy.hwlab-dev.svc.cluster.local", "localPort": 6667, "remotePort": 16667 }, { "name": "hwlab-dev-tunnel-health", "type": "tcp", "localServiceId": "hwlab-tunnel-client", "localHost": "hwlab-tunnel-client.hwlab-dev.svc.cluster.local", "localPort": 7402, "remotePort": 7402 } ] }, "k3s": { "serviceMappings": [ { "serviceId": "hwlab-cloud-api", "name": "hwlab-cloud-api", "namespace": "hwlab-dev", "port": 6667, "targetPort": "http" }, { "serviceId": "hwlab-cloud-web", "name": "hwlab-cloud-web", "namespace": "hwlab-dev", "port": 8080, "targetPort": "http" }, { "serviceId": "hwlab-gateway", "name": "hwlab-gateway", "namespace": "hwlab-dev", "port": 7001, "targetPort": "http" }, { "serviceId": "hwlab-cli", "name": "hwlab-cli", "namespace": "hwlab-dev", "port": 7501, "targetPort": "http" }, { "serviceId": "hwlab-agent-skills", "name": "hwlab-agent-skills", "namespace": "hwlab-dev", "port": 7430, "targetPort": "http" }, { "serviceId": "hwlab-agent-mgr", "name": "hwlab-agent-mgr", "namespace": "hwlab-dev", "port": 7410, "targetPort": "http" }, { "serviceId": "hwlab-gateway-simu", "name": "hwlab-gateway-simu-1", "namespace": "hwlab-dev", "port": 7101, "targetPort": "http" }, { "serviceId": "hwlab-box-simu", "name": "hwlab-box-simu-1", "namespace": "hwlab-dev", "port": 7201, "targetPort": "http" }, { "serviceId": "hwlab-gateway-simu", "name": "hwlab-gateway-simu-2", "namespace": "hwlab-dev", "port": 7101, "targetPort": "http" }, { "serviceId": "hwlab-box-simu", "name": "hwlab-box-simu-2", "namespace": "hwlab-dev", "port": 7201, "targetPort": "http" }, { "serviceId": "hwlab-patch-panel", "name": "hwlab-patch-panel", "namespace": "hwlab-dev", "port": 7301, "targetPort": "http" }, { "serviceId": "hwlab-router", "name": "hwlab-router", "namespace": "hwlab-dev", "port": 7401, "targetPort": "http" }, { "serviceId": "hwlab-tunnel-client", "name": "hwlab-tunnel-client", "namespace": "hwlab-dev", "port": 7402, "targetPort": "http" }, { "serviceId": "hwlab-edge-proxy", "name": "hwlab-edge-proxy", "namespace": "hwlab-dev", "port": 6667, "targetPort": "http" } ] }, "profiles": { "dev": { "name": "dev", "enabled": true, "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "notes": "DEV-only k3s deployment skeleton. D601 reaches the master edge through frp reverse tunnel." }, "prod": { "name": "prod", "enabled": false, "namespace": "hwlab-prod", "notes": "Reserved placeholder only. PROD deployment and acceptance are explicitly out of scope." } }, "services": [ { "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_ENVIRONMENT": "dev", "HWLAB_PUBLIC_ENDPOINT": "http://74.48.78.17:16667", "HWLAB_COMMIT_ID": "6963ed2", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "HWLAB_IMAGE_TAG": "6963ed2", "HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN": "unidesk-backend,provider-gateway,microservice-proxy", "HWLAB_CLOUD_DB_URL": "secretRef:hwlab-cloud-api-dev-db/database-url", "HWLAB_CLOUD_DB_SSL_MODE": "disable", "HWLAB_CLOUD_DB_CONTRACT": "dev-redacted-presence-only", "HWLAB_CLOUD_RUNTIME_ADAPTER": "postgres", "HWLAB_CLOUD_RUNTIME_DURABLE": "true", "HWLAB_M3_IO_CONTROL_ENABLED": "true", "HWLAB_M3_GATEWAY_SIMU_1_URL": "http://hwlab-gateway-simu-1.hwlab-dev.svc.cluster.local:7101", "HWLAB_M3_GATEWAY_SIMU_2_URL": "http://hwlab-gateway-simu-2.hwlab-dev.svc.cluster.local:7101", "HWLAB_M3_PATCH_PANEL_URL": "http://hwlab-patch-panel.hwlab-dev.svc.cluster.local:7301", "HWLAB_CODE_AGENT_PROVIDER": "openai", "HWLAB_CODE_AGENT_MODEL": "gpt-5.5", "HWLAB_CODE_AGENT_OPENAI_BASE_URL": "http://172.26.26.227:17680/v1/responses", "OPENAI_API_KEY": "secretRef:hwlab-code-agent-provider/openai-api-key" } }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_ENVIRONMENT": "dev", "HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667", "HWLAB_COMMIT_ID": "6963ed2", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "HWLAB_IMAGE_TAG": "6963ed2" } }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_AGENT_SESSION_MODE": "control-plane", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 0, "env": { "HWLAB_AGENT_SESSION_MODE": "session-scoped", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 0, "env": { "HWLAB_GATEWAY_MODE": "hardware-boundary", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 2, "instanceNames": [ "hwlab-gateway-simu-1", "hwlab-gateway-simu-2" ], "identityStrategy": "indexed-workloads", "env": { "HWLAB_GATEWAY_MODE": "simulator", "HWLAB_GATEWAY_ID": "gwsimu_1,gwsimu_2", "HWLAB_BOX_IDS": "boxsimu_1,boxsimu_2", "HWLAB_BOX_RESOURCES": "res_boxsimu_1,res_boxsimu_2", "HWLAB_BOX_URLS": "http://hwlab-box-simu-1.hwlab-dev.svc.cluster.local:7201,http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201" } }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 2, "instanceNames": [ "hwlab-box-simu-1", "hwlab-box-simu-2" ], "identityStrategy": "indexed-workloads", "env": { "HWLAB_BOX_ID": "boxsimu_1,boxsimu_2", "HWLAB_BOX_RESOURCE_ID": "res_boxsimu_1,res_boxsimu_2", "HWLAB_GATEWAY_SESSION_ID": "gws_gwsimu_1,gws_gwsimu_2", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "m3Route": { "fromResourceId": "res_boxsimu_1", "fromPort": "DO1", "patchPanelServiceId": "hwlab-patch-panel", "toResourceId": "res_boxsimu_2", "toPort": "DI1" }, "env": { "HWLAB_PATCH_PANEL_MODE": "dev-skeleton", "HWLAB_PATCH_PANEL_ENDPOINT_MAP": "{\"res_boxsimu_2\":\"http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201\"}", "HWLAB_PATCH_PANEL_WIRING_CONFIG": "{\"wiringConfigId\":\"wir_m3_do1_di1\",\"projectId\":\"prj_m3_hardware_loop\",\"gatewaySessionId\":\"gws_gwsimu_1\",\"name\":\"M3 simulated DO1 to DI1 patch wiring\",\"status\":\"active\",\"connections\":[{\"from\":{\"resourceId\":\"res_boxsimu_1\",\"port\":\"DO1\"},\"to\":{\"resourceId\":\"res_boxsimu_2\",\"port\":\"DI1\"},\"mode\":\"exclusive\"}],\"constraints\":{\"propagation\":\"patch-panel-only\",\"localLoopbackSubstituteAllowed\":false},\"createdAt\":\"2026-05-21T00:00:00.000Z\",\"updatedAt\":\"2026-05-21T00:00:00.000Z\"}", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_ROUTER_MODE": "edge-reachability", "HWLAB_EDGE_PROXY_SERVICE": "hwlab-edge-proxy" } }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_TUNNEL_MODE": "frp-client", "HWLAB_FRP_SERVER_ADDR": "74.48.78.17", "HWLAB_FRP_PUBLIC_PORT": "16667", "HWLAB_FRP_WEB_PUBLIC_PORT": "16666" } }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_EDGE_LISTEN": "0.0.0.0:6667", "HWLAB_EDGE_UPSTREAM": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667" } }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 0, "env": { "HWLAB_CLI_ENDPOINT": "http://74.48.78.17:16667" } }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_SKILLS_COMMIT_ID": "6963ed2" } } ], "createdAt": "2026-05-21T00:00:00Z" } }, "after": { "path": "deploy/deploy.json", "hash": "sha256:a9e8d6019ffc8e40548f70a0d7ea119a37f6384113fc16eea8ea259dcbeea0e8", "commitId": "63acb59", "namespace": "hwlab-dev", "environment": "dev", "endpoint": "http://74.48.78.17:16667", "manifest": { "manifestVersion": "v1", "environment": "dev", "commitId": "63acb59", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "health": { "method": "GET", "path": "/health/live", "responseFormat": "json" }, "publicEndpoints": { "frontend": { "url": "http://74.48.78.17:16666", "protocol": "http", "host": "74.48.78.17", "port": 16666, "serviceId": "hwlab-cloud-web", "frpProxy": "hwlab-dev-cloud-web" }, "api": { "url": "http://74.48.78.17:16667", "protocol": "http", "host": "74.48.78.17", "port": 16667, "serviceId": "hwlab-edge-proxy", "frpProxy": "hwlab-dev-edge-proxy" } }, "frp": { "server": { "address": "74.48.78.17", "bindPort": 7000 }, "proxies": [ { "name": "hwlab-dev-cloud-web", "endpointId": "frontend", "type": "tcp", "localServiceId": "hwlab-cloud-web", "localHost": "hwlab-cloud-web.hwlab-dev.svc.cluster.local", "localPort": 8080, "remotePort": 16666 }, { "name": "hwlab-dev-edge-proxy", "endpointId": "api", "type": "tcp", "localServiceId": "hwlab-edge-proxy", "localHost": "hwlab-edge-proxy.hwlab-dev.svc.cluster.local", "localPort": 6667, "remotePort": 16667 }, { "name": "hwlab-dev-tunnel-health", "type": "tcp", "localServiceId": "hwlab-tunnel-client", "localHost": "hwlab-tunnel-client.hwlab-dev.svc.cluster.local", "localPort": 7402, "remotePort": 7402 } ] }, "k3s": { "serviceMappings": [ { "serviceId": "hwlab-cloud-api", "name": "hwlab-cloud-api", "namespace": "hwlab-dev", "port": 6667, "targetPort": "http" }, { "serviceId": "hwlab-cloud-web", "name": "hwlab-cloud-web", "namespace": "hwlab-dev", "port": 8080, "targetPort": "http" }, { "serviceId": "hwlab-gateway", "name": "hwlab-gateway", "namespace": "hwlab-dev", "port": 7001, "targetPort": "http" }, { "serviceId": "hwlab-cli", "name": "hwlab-cli", "namespace": "hwlab-dev", "port": 7501, "targetPort": "http" }, { "serviceId": "hwlab-agent-skills", "name": "hwlab-agent-skills", "namespace": "hwlab-dev", "port": 7430, "targetPort": "http" }, { "serviceId": "hwlab-agent-mgr", "name": "hwlab-agent-mgr", "namespace": "hwlab-dev", "port": 7410, "targetPort": "http" }, { "serviceId": "hwlab-gateway-simu", "name": "hwlab-gateway-simu-1", "namespace": "hwlab-dev", "port": 7101, "targetPort": "http" }, { "serviceId": "hwlab-box-simu", "name": "hwlab-box-simu-1", "namespace": "hwlab-dev", "port": 7201, "targetPort": "http" }, { "serviceId": "hwlab-gateway-simu", "name": "hwlab-gateway-simu-2", "namespace": "hwlab-dev", "port": 7101, "targetPort": "http" }, { "serviceId": "hwlab-box-simu", "name": "hwlab-box-simu-2", "namespace": "hwlab-dev", "port": 7201, "targetPort": "http" }, { "serviceId": "hwlab-patch-panel", "name": "hwlab-patch-panel", "namespace": "hwlab-dev", "port": 7301, "targetPort": "http" }, { "serviceId": "hwlab-router", "name": "hwlab-router", "namespace": "hwlab-dev", "port": 7401, "targetPort": "http" }, { "serviceId": "hwlab-tunnel-client", "name": "hwlab-tunnel-client", "namespace": "hwlab-dev", "port": 7402, "targetPort": "http" }, { "serviceId": "hwlab-edge-proxy", "name": "hwlab-edge-proxy", "namespace": "hwlab-dev", "port": 6667, "targetPort": "http" } ] }, "profiles": { "dev": { "name": "dev", "enabled": true, "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "notes": "DEV-only k3s deployment skeleton. D601 reaches the master edge through frp reverse tunnel." }, "prod": { "name": "prod", "enabled": false, "namespace": "hwlab-prod", "notes": "Reserved placeholder only. PROD deployment and acceptance are explicitly out of scope." } }, "services": [ { "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_ENVIRONMENT": "dev", "HWLAB_PUBLIC_ENDPOINT": "http://74.48.78.17:16667", "HWLAB_COMMIT_ID": "63acb59", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "HWLAB_IMAGE_TAG": "63acb59", "HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN": "unidesk-backend,provider-gateway,microservice-proxy", "HWLAB_CLOUD_DB_URL": "secretRef:hwlab-cloud-api-dev-db/database-url", "HWLAB_CLOUD_DB_SSL_MODE": "disable", "HWLAB_CLOUD_DB_CONTRACT": "dev-redacted-presence-only", "HWLAB_CLOUD_RUNTIME_ADAPTER": "postgres", "HWLAB_CLOUD_RUNTIME_DURABLE": "true", "HWLAB_M3_IO_CONTROL_ENABLED": "true", "HWLAB_M3_GATEWAY_SIMU_1_URL": "http://hwlab-gateway-simu-1.hwlab-dev.svc.cluster.local:7101", "HWLAB_M3_GATEWAY_SIMU_2_URL": "http://hwlab-gateway-simu-2.hwlab-dev.svc.cluster.local:7101", "HWLAB_M3_PATCH_PANEL_URL": "http://hwlab-patch-panel.hwlab-dev.svc.cluster.local:7301", "HWLAB_CODE_AGENT_PROVIDER": "openai", "HWLAB_CODE_AGENT_MODEL": "gpt-5.5", "HWLAB_CODE_AGENT_OPENAI_BASE_URL": "http://172.26.26.227:17680/v1/responses", "OPENAI_API_KEY": "secretRef:hwlab-code-agent-provider/openai-api-key" } }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_ENVIRONMENT": "dev", "HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667", "HWLAB_COMMIT_ID": "63acb59", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "HWLAB_IMAGE_TAG": "63acb59" } }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_AGENT_SESSION_MODE": "control-plane", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 0, "env": { "HWLAB_AGENT_SESSION_MODE": "session-scoped", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 0, "env": { "HWLAB_GATEWAY_MODE": "hardware-boundary", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 2, "instanceNames": [ "hwlab-gateway-simu-1", "hwlab-gateway-simu-2" ], "identityStrategy": "indexed-workloads", "env": { "HWLAB_GATEWAY_MODE": "simulator", "HWLAB_GATEWAY_ID": "gwsimu_1,gwsimu_2", "HWLAB_BOX_IDS": "boxsimu_1,boxsimu_2", "HWLAB_BOX_RESOURCES": "res_boxsimu_1,res_boxsimu_2", "HWLAB_BOX_URLS": "http://hwlab-box-simu-1.hwlab-dev.svc.cluster.local:7201,http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201" } }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 2, "instanceNames": [ "hwlab-box-simu-1", "hwlab-box-simu-2" ], "identityStrategy": "indexed-workloads", "env": { "HWLAB_BOX_ID": "boxsimu_1,boxsimu_2", "HWLAB_BOX_RESOURCE_ID": "res_boxsimu_1,res_boxsimu_2", "HWLAB_GATEWAY_SESSION_ID": "gws_gwsimu_1,gws_gwsimu_2", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "m3Route": { "fromResourceId": "res_boxsimu_1", "fromPort": "DO1", "patchPanelServiceId": "hwlab-patch-panel", "toResourceId": "res_boxsimu_2", "toPort": "DI1" }, "env": { "HWLAB_PATCH_PANEL_MODE": "dev-skeleton", "HWLAB_PATCH_PANEL_ENDPOINT_MAP": "{\"res_boxsimu_2\":\"http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201\"}", "HWLAB_PATCH_PANEL_WIRING_CONFIG": "{\"wiringConfigId\":\"wir_m3_do1_di1\",\"projectId\":\"prj_m3_hardware_loop\",\"gatewaySessionId\":\"gws_gwsimu_1\",\"name\":\"M3 simulated DO1 to DI1 patch wiring\",\"status\":\"active\",\"connections\":[{\"from\":{\"resourceId\":\"res_boxsimu_1\",\"port\":\"DO1\"},\"to\":{\"resourceId\":\"res_boxsimu_2\",\"port\":\"DI1\"},\"mode\":\"exclusive\"}],\"constraints\":{\"propagation\":\"patch-panel-only\",\"localLoopbackSubstituteAllowed\":false},\"createdAt\":\"2026-05-21T00:00:00.000Z\",\"updatedAt\":\"2026-05-21T00:00:00.000Z\"}", "HWLAB_ENVIRONMENT": "dev" } }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_ROUTER_MODE": "edge-reachability", "HWLAB_EDGE_PROXY_SERVICE": "hwlab-edge-proxy" } }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_TUNNEL_MODE": "frp-client", "HWLAB_FRP_SERVER_ADDR": "74.48.78.17", "HWLAB_FRP_PUBLIC_PORT": "16667", "HWLAB_FRP_WEB_PUBLIC_PORT": "16666" } }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_EDGE_LISTEN": "0.0.0.0:6667", "HWLAB_EDGE_UPSTREAM": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667" } }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 0, "env": { "HWLAB_CLI_ENDPOINT": "http://74.48.78.17:16667" } }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_SKILLS_COMMIT_ID": "63acb59" } } ], "createdAt": "2026-05-21T00:00:00Z" } } }, "lock": { "acquired": true, "current": { "lockBackend": "Lease", "lockName": "hwlab-dev-cd-lock", "resourceVersion": "1387021", "holderIdentity": "DC-DCSN-P0-2026-003/fdb50204-3968-48f8-82ee-cd8f172b0c5a", "promotionCommit": "63acb59", "deployJsonHash": "sha256:d1e1c344b8b36913ba39985c0b91531bc377e4ef293b0a28cee44d4f3c025b67", "ownerTaskId": "DC-DCSN-P0-2026-003", "transactionId": "fdb50204-3968-48f8-82ee-cd8f172b0c5a", "phase": "verifying", "startedAt": "2026-05-23T09:40:07.746000Z", "updatedAt": "2026-05-23T09:40:35.317000Z", "ttlSeconds": 3600, "liveBefore": { "status": "pass", "expectedCommit": null, "endpoints": [ { "id": "cloud-web-16666", "url": "http://74.48.78.17:16666/health/live", "status": "pass", "httpStatus": 200, "reachable": true, "identityMatches": true, "startedAt": "2026-05-23T09:40:07.823Z", "finishedAt": "2026-05-23T09:40:08.574Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "63acb59", "image": null, "imageTag": null, "observedAt": null, "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] }, { "id": "cloud-api-16667", "url": "http://74.48.78.17:16667/health/live", "status": "pass", "httpStatus": 200, "reachable": true, "identityMatches": true, "startedAt": "2026-05-23T09:40:07.825Z", "finishedAt": "2026-05-23T09:40:11.666Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "ok", "ready": true, "observedCommit": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "observedAt": "2026-05-23T09:40:09.312Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] } ], "summary": { "checked": 2, "reachable": 2, "identityMatches": 2, "commitMatches": null, "ports": [ 16666, 16667 ] } }, "targetNamespace": "hwlab-dev", "targetRef": "origin/main", "releasedAt": null, "releaseStatus": "running", "staleLockBrokenAt": null, "staleLockPrevious": null }, "staleBreak": null }, "steps": [ { "id": "desired-state-check-before-publish", "phase": "publishing", "status": "pass", "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/deploy-desired-state-plan.mjs --check --pretty", "code": 0, "startedAt": "2026-05-23T09:40:11.742Z", "finishedAt": "2026-05-23T09:40:11.784Z", "stdoutJson": { "kind": "hwlab-deploy-desired-state-plan", "mode": "read-only-plan", "status": "pass", "source": { "deploy": "deploy/deploy.json", "artifactCatalog": "deploy/artifact-catalog.dev.json", "workloads": "deploy/k8s/base/workloads.yaml", "optionalReport": "reports/dev-gate/dev-artifacts.json" }, "safety": { "readOnly": true, "sourceOrDryRunSupportOnly": true, "kubectlApply": false, "registryPull": false, "registryPush": false, "imageBuild": false, "serviceRestart": false, "prod": false, "devLiveClaim": false }, "checkSemantics": "--check exits non-zero for missing/invalid desired-state sources, internal commit/image mirror drift, invalid target tags, partial target drift, or any mismatch with an explicit --target-ref, --target-tag, or --promotion-commit. When the checked target ref is the current checked-out merge commit, the comparable current-main target is its accepted first parent because a commit cannot embed its own content hash. Without --check, a uniform older desired-state under --target-ref/--target-tag is a read-only promotion plan.", "summary": { "desiredCommitId": "6963ed2", "desiredImageTag": "6963ed2", "artifactState": "published", "ciPublished": true, "registryVerified": true, "services": 13, "workloadContainers": 13, "presentMirrorCount": 14, "diagnostics": 0, "blockers": 0, "targetConvergence": "not_requested" }, "target": null, "promotionBoundary": { "writes": [], "authoritativeDesiredState": [ "deploy/deploy.json", "deploy/artifact-catalog.dev.json", "deploy/k8s/base/workloads.yaml" ], "nonAuthoritativeEvidence": [ "reports/dev-gate/dev-artifacts.json" ], "note": "This planner reviews source desired-state only. It does not prove image existence, registry reachability, a real DEV apply, or M3 DEV-LIVE hardware-loop evidence." }, "cloudApiDb": { "contractVersion": "v1", "environment": "dev", "status": "pass", "ready": true, "secretRef": { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "deployPlaceholderPresent": true, "workloadSecretRefPresent": true, "present": true, "redacted": true }, "sslMode": { "env": "HWLAB_CLOUD_DB_SSL_MODE", "value": "disable", "workloadValue": "disable", "expected": "disable", "deployMatches": true, "workloadMatches": true, "secret": false }, "secretMaterialRead": false, "valuesRedacted": true, "liveDbEvidence": false, "fixtureEvidence": false }, "codeAgentProvider": { "contractVersion": "v1", "environment": "dev", "provider": "openai-responses", "model": "gpt-5.5", "status": "pass", "ready": true, "requiredEnv": [ { "name": "HWLAB_CODE_AGENT_PROVIDER", "deployPresent": true, "workloadPresent": true, "redacted": false, "source": "runtime-env" }, { "name": "HWLAB_CODE_AGENT_MODEL", "deployPresent": true, "workloadPresent": true, "redacted": false, "source": "runtime-env" }, { "name": "OPENAI_API_KEY", "deployPresent": true, "workloadPresent": true, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "deployPresent": true, "workloadPresent": true, "redacted": true, "source": "runtime-env" } ], "secretRef": { "env": "OPENAI_API_KEY", "secretName": "hwlab-code-agent-provider", "secretKey": "openai-api-key", "deployPlaceholderPresent": true, "workloadSecretRefPresent": true, "present": true, "redacted": true }, "egress": { "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "target": "dev-egress-proxy", "deployPresent": true, "workloadPresent": true, "deployMatchesDevProxy": true, "workloadMatchesDevProxy": true, "directPublicOpenAi": false, "valueRedacted": true }, "missingDeployEnv": [], "missingWorkloadEnv": [], "deployMismatches": [], "workloadMismatches": [], "missingSecretRefs": [], "missingEgressContract": [], "secretMaterialRead": false, "valuesRedacted": true, "providerConnected": false, "fixtureEvidence": false }, "reportHints": { "path": "reports/dev-gate/dev-artifacts.json", "present": true, "authoritative": false, "note": "report snapshots are contextual evidence only; deploy desired-state remains authoritative in deploy/, not reports/", "commitId": "6963ed2", "matchesDesiredState": true, "artifactPublish": { "status": "published", "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", "sourceMatchesDesiredState": true, "publishedCount": 13, "serviceCount": 13, "registryVerified": null, "registryCapabilitiesClassification": "degraded" } }, "services": [ { "serviceId": "hwlab-cloud-api", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "6963ed2", "expected": "6963ed2", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "6963ed2", "expected": "6963ed2", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "imageTag": "6963ed2", "digest": "sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-cloud-api", "namespace": "hwlab-dev", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "6963ed2", "expected": "6963ed2", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "6963ed2", "expected": "6963ed2", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-cloud-web", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "6963ed2", "expected": "6963ed2", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "6963ed2", "expected": "6963ed2", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "imageTag": "6963ed2", "digest": "sha256:3c3a4ef374bf843ad1c170696c5a122fdbf35a872a17c086ed06ffd50c5a0e06", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-cloud-web", "namespace": "hwlab-dev", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "6963ed2", "expected": "6963ed2", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "6963ed2", "expected": "6963ed2", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-agent-mgr", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", "imageTag": "6963ed2", "digest": "sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-agent-mgr", "namespace": "hwlab-dev", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-agent-worker", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", "imageTag": "6963ed2", "digest": "sha256:8131839bd8f08fc654bf96ba7c713ba917e198ebab04cf051b9e384392eb95e9", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Job", "name": "hwlab-agent-worker-template", "namespace": "hwlab-dev", "container": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-gateway", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", "imageTag": "6963ed2", "digest": "sha256:808d609ef4873b64faf5eeb13f8eb6bf280bcd9f799d90f00bab44c2c7ad3fd8", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-gateway", "namespace": "hwlab-dev", "container": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-gateway-simu", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", "imageTag": "6963ed2", "digest": "sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "StatefulSet", "name": "hwlab-gateway-simu", "namespace": "hwlab-dev", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-box-simu", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", "imageTag": "6963ed2", "digest": "sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "StatefulSet", "name": "hwlab-box-simu", "namespace": "hwlab-dev", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-patch-panel", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", "imageTag": "6963ed2", "digest": "sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-patch-panel", "namespace": "hwlab-dev", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-router", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", "imageTag": "6963ed2", "digest": "sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-router", "namespace": "hwlab-dev", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-tunnel-client", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", "imageTag": "6963ed2", "digest": "sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-tunnel-client", "namespace": "hwlab-dev", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-edge-proxy", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", "imageTag": "6963ed2", "digest": "sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-edge-proxy", "namespace": "hwlab-dev", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-cli", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", "imageTag": "6963ed2", "digest": "sha256:7e5ac811644c83237542c95f4a6302d607a070a4b4f9f247191ce529577ead99", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Job", "name": "hwlab-cli-template", "namespace": "hwlab-dev", "container": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null }, { "serviceId": "hwlab-agent-skills", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "6963ed2", "expected": "6963ed2", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "6963ed2", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", "imageTag": "6963ed2", "digest": "sha256:6881f9d417b91705cca9d134f2df85da3a3ec2af393882f0f24ea113a20d6efd", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-agent-skills", "namespace": "hwlab-dev", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", "imageTag": "6963ed2", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "6963ed2", "expected": "6963ed2", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": null } ], "diagnostics": [] }, "stdoutTail": null, "stderrTail": "", "reportPath": null }, { "id": "artifact-publish", "phase": "publishing", "status": "pass", "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-artifact-publish.mjs --publish", "code": 0, "startedAt": "2026-05-23T09:40:11.785Z", "finishedAt": "2026-05-23T09:40:32.799Z", "stdoutJson": { "status": "published", "mode": "publish", "reportPath": "reports/dev-gate/dev-artifacts.json", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryPrefix": "127.0.0.1:5000/hwlab", "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", "generatedAt": "2026-05-23T09:40:15.352Z", "classification": "degraded", "dimensions": { "processHttpAccess": { "id": "process-http-access", "status": "degraded", "requiredForPublish": false, "requiredForDeploy": false, "endpoint": "http://127.0.0.1:5000/v2/", "probeKind": "runner-process-http-v2", "summary": "Runner process cannot reach http://127.0.0.1:5000/v2/; this is process HTTP access only and does not prove Docker daemon push failure.", "evidence": { "probe": { "ok": false, "url": "http://127.0.0.1:5000/v2/", "method": "GET", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, "publishFailure": false } }, "dockerDaemonPushAccess": { "id": "docker-daemon-push-access", "status": "pass", "requiredForPublish": true, "requiredForDeploy": false, "endpoint": "127.0.0.1:5000/hwlab", "probeKind": "docker-ps-read-only", "summary": "Docker daemon can see a local/internal registry target for publish preflight purposes; no push was attempted.", "evidence": { "dockerVersion": { "command": "docker --version", "ok": true, "exitCode": 0, "stdout": "Docker version 26.1.5+dfsg1, build a72d7cd", "stderr": "", "error": null }, "registryPrefix": "127.0.0.1:5000/hwlab", "loopbackPort5000": true, "registryContainerVisible": true, "matchingContainers": [ { "id": "00091efce380", "image": "registry:2.8.3", "names": "unidesk-artifact-registry", "ports": "127.0.0.1:5000->5000/tcp", "state": "running", "status": "Up 2 days" } ], "pushAttempted": false, "mutationAttempted": false } }, "k3sPullAccess": { "id": "k3s-pull-access", "status": "pass", "requiredForPublish": false, "requiredForDeploy": true, "endpoint": "127.0.0.1:5000/hwlab", "probeKind": "kubectl-read-only", "summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.", "evidence": { "kubectlAvailable": true, "context": { "command": "kubectl config current-context", "ok": true, "exitCode": 0, "stdout": "in-cluster", "stderr": "", "error": null }, "canGetPods": { "command": "kubectl auth can-i get pods -n hwlab-dev", "ok": true, "exitCode": 0, "stdout": "yes", "stderr": "", "error": null }, "podCount": 21, "pulledImages": [ { "pod": "hwlab-agent-mgr-57d8bc9f89-5kv4p", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80" }, { "pod": "hwlab-agent-mgr-6c6f64bf5-zjbf7", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82" }, { "pod": "hwlab-agent-skills-75b55bc498-gjjj2", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cd6003a7e8694a31a5cc116a7af38c8790ef3931edb7ae596455ee4aa8ec5dc1" }, { "pod": "hwlab-agent-skills-8687f446fd-lqtgt", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7" }, { "pod": "hwlab-box-simu-0", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" }, { "pod": "hwlab-box-simu-1", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" }, { "pod": "hwlab-cloud-api-668549d448-gnct8", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:08d9ec3943b6b2530af9a67cfba440460a0357fb6b0ed585cc4537c3ee36f3a9" }, { "pod": "hwlab-cloud-api-858f6df96d-tcrbg", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f" }, { "pod": "hwlab-cloud-web-576b7bb89d-dxk6w", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:58b891a", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:820804a6fe2da63d36951dcbbd8753077c923c252648b9e261eaea973908a379" }, { "pod": "hwlab-cloud-web-fc896cddb-gwh58", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e" }, { "pod": "hwlab-edge-proxy-5889fb8fb8-gblw8", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b" }, { "pod": "hwlab-edge-proxy-5ff8d747d-rgdjm", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314" }, { "pod": "hwlab-frpc-59f57d479c-wm5l2", "container": "frpc", "image": "127.0.0.1:5000/hwlab/frpc:v0.68.1", "imageID": "127.0.0.1:5000/hwlab/frpc@sha256:ce400cda42a260964e40ab1ca68b868f72c569cdce4b243aef36ce40194d287b" }, { "pod": "hwlab-gateway-simu-0", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" }, { "pod": "hwlab-gateway-simu-1", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" }, { "pod": "hwlab-patch-panel-5dd8fdf4f7-7cg4w", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce" }, { "pod": "hwlab-patch-panel-79c59cd5b7-dl4sz", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a" }, { "pod": "hwlab-router-59458f576d-l2j27", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40" }, { "pod": "hwlab-router-7d47d6dfc4-gzcw9", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024" }, { "pod": "hwlab-tunnel-client-64779fc4bd-pz8lz", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e" }, { "pod": "hwlab-tunnel-client-65ff794986-5z2s6", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707" } ], "pullFailures": [], "pullAttempted": false, "mutationAttempted": false } } }, "interpretation": { "processHttpAccess": "Runner process HTTP access to /v2/ is diagnostic only and must not be treated as Docker daemon push access.", "dockerDaemonPushAccess": "Docker daemon push access is the publish-path capability. This probe is read-only and does not push.", "k3sPullAccess": "k3s pull access is the deploy-path capability. This probe is read-only and does not create pods or read secrets." } }, "baseImagePreflight": { "status": "ready", "imageSource": "local-docker-node:20-*", "requestedImage": null, "localTag": "node:20-bookworm-slim", "imageId": "sha256:9da6b4e352d0d5c94963eba1832408f5b7b08839cd8be9b6610c05de5118c704", "repoDigests": [ "node@sha256:2cf067cfed83d5ea958367df9f966191a942351a2df77d6f0193e162b5febfc0" ], "candidates": [ { "source": "local-docker-node:20-*", "approval": { "approved": true, "reason": "local Node 20 builder base image" }, "localTag": "node:20-bookworm-slim", "imageId": "9da6b4e352d0", "size": "200MB", "createdSince": "4 weeks ago" } ], "rejectedCandidates": [ { "source": "local-docker-node", "localTag": "node:22-bookworm-slim", "imageId": "341b84210b33", "reason": "local Node image is not Node 20 and is not approved as the HWLAB DEV builder base image" } ], "publishUsable": true, "blockers": [], "nextSteps": [ "Use the reported localTag as the DEV builder base image for artifact publish.", "Keep publish DEV-only and record the produced HWLAB service image tags and digests separately." ], "recommendation": { "source": "Preloaded D601 local Docker cache or D601-local registry tag.", "envVar": "HWLAB_DEV_BASE_IMAGE", "preferredImageTag": "node:20-bookworm-slim", "preferredHwlabImageTag": "127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim", "recommendedEnvValue": "node:20-bookworm-slim" }, "provision": { "required": false, "exactBlocker": null, "expectedImageTag": "node:20-bookworm-slim", "recommendedEnv": { "name": "HWLAB_DEV_BASE_IMAGE", "value": "node:20-bookworm-slim", "assignment": "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim" }, "recommendedHwlabImageTag": "127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim", "nextHumanCommand": null, "commands": { "d601OnlinePreload": [ "docker pull node:20-bookworm-slim", "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/preflight-dev-base-image.mjs" ], "d601HwlabTagProvision": [ "docker pull node:20-bookworm-slim", "docker tag node:20-bookworm-slim 127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim", "HWLAB_DEV_BASE_IMAGE=127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim node scripts/preflight-dev-base-image.mjs" ], "offlineSourceExport": [ "docker pull node:20-bookworm-slim", "docker save node:20-bookworm-slim -o hwlab-node20-bookworm-slim.tar" ], "offlineD601Import": [ "docker load -i hwlab-node20-bookworm-slim.tar", "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/preflight-dev-base-image.mjs" ], "artifactPublishDryRun": [ "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/dev-artifact-publish.mjs --preflight --no-report" ] } }, "blockedReport": null, "containerEngine": { "command": "docker", "available": true, "version": "Docker version 26.1.5+dfsg1, build a72d7cd", "errorCode": null, "stderr": "" } }, "publishPlan": { "version": "v2", "mode": "publish", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "imageTag": "63acb59", "registryTarget": "127.0.0.1:5000/hwlab", "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", "generatedAt": "2026-05-23T09:40:15.352Z", "classification": "degraded", "dimensions": { "processHttpAccess": { "id": "process-http-access", "status": "degraded", "requiredForPublish": false, "requiredForDeploy": false, "endpoint": "http://127.0.0.1:5000/v2/", "probeKind": "runner-process-http-v2", "summary": "Runner process cannot reach http://127.0.0.1:5000/v2/; this is process HTTP access only and does not prove Docker daemon push failure.", "evidence": { "probe": { "ok": false, "url": "http://127.0.0.1:5000/v2/", "method": "GET", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, "publishFailure": false } }, "dockerDaemonPushAccess": { "id": "docker-daemon-push-access", "status": "pass", "requiredForPublish": true, "requiredForDeploy": false, "endpoint": "127.0.0.1:5000/hwlab", "probeKind": "docker-ps-read-only", "summary": "Docker daemon can see a local/internal registry target for publish preflight purposes; no push was attempted.", "evidence": { "dockerVersion": { "command": "docker --version", "ok": true, "exitCode": 0, "stdout": "Docker version 26.1.5+dfsg1, build a72d7cd", "stderr": "", "error": null }, "registryPrefix": "127.0.0.1:5000/hwlab", "loopbackPort5000": true, "registryContainerVisible": true, "matchingContainers": [ { "id": "00091efce380", "image": "registry:2.8.3", "names": "unidesk-artifact-registry", "ports": "127.0.0.1:5000->5000/tcp", "state": "running", "status": "Up 2 days" } ], "pushAttempted": false, "mutationAttempted": false } }, "k3sPullAccess": { "id": "k3s-pull-access", "status": "pass", "requiredForPublish": false, "requiredForDeploy": true, "endpoint": "127.0.0.1:5000/hwlab", "probeKind": "kubectl-read-only", "summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.", "evidence": { "kubectlAvailable": true, "context": { "command": "kubectl config current-context", "ok": true, "exitCode": 0, "stdout": "in-cluster", "stderr": "", "error": null }, "canGetPods": { "command": "kubectl auth can-i get pods -n hwlab-dev", "ok": true, "exitCode": 0, "stdout": "yes", "stderr": "", "error": null }, "podCount": 21, "pulledImages": [ { "pod": "hwlab-agent-mgr-57d8bc9f89-5kv4p", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80" }, { "pod": "hwlab-agent-mgr-6c6f64bf5-zjbf7", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82" }, { "pod": "hwlab-agent-skills-75b55bc498-gjjj2", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cd6003a7e8694a31a5cc116a7af38c8790ef3931edb7ae596455ee4aa8ec5dc1" }, { "pod": "hwlab-agent-skills-8687f446fd-lqtgt", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7" }, { "pod": "hwlab-box-simu-0", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" }, { "pod": "hwlab-box-simu-1", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" }, { "pod": "hwlab-cloud-api-668549d448-gnct8", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:08d9ec3943b6b2530af9a67cfba440460a0357fb6b0ed585cc4537c3ee36f3a9" }, { "pod": "hwlab-cloud-api-858f6df96d-tcrbg", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f" }, { "pod": "hwlab-cloud-web-576b7bb89d-dxk6w", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:58b891a", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:820804a6fe2da63d36951dcbbd8753077c923c252648b9e261eaea973908a379" }, { "pod": "hwlab-cloud-web-fc896cddb-gwh58", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e" }, { "pod": "hwlab-edge-proxy-5889fb8fb8-gblw8", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b" }, { "pod": "hwlab-edge-proxy-5ff8d747d-rgdjm", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314" }, { "pod": "hwlab-frpc-59f57d479c-wm5l2", "container": "frpc", "image": "127.0.0.1:5000/hwlab/frpc:v0.68.1", "imageID": "127.0.0.1:5000/hwlab/frpc@sha256:ce400cda42a260964e40ab1ca68b868f72c569cdce4b243aef36ce40194d287b" }, { "pod": "hwlab-gateway-simu-0", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" }, { "pod": "hwlab-gateway-simu-1", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" }, { "pod": "hwlab-patch-panel-5dd8fdf4f7-7cg4w", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce" }, { "pod": "hwlab-patch-panel-79c59cd5b7-dl4sz", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a" }, { "pod": "hwlab-router-59458f576d-l2j27", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40" }, { "pod": "hwlab-router-7d47d6dfc4-gzcw9", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024" }, { "pod": "hwlab-tunnel-client-64779fc4bd-pz8lz", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e" }, { "pod": "hwlab-tunnel-client-65ff794986-5z2s6", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707" } ], "pullFailures": [], "pullAttempted": false, "mutationAttempted": false } } }, "interpretation": { "processHttpAccess": "Runner process HTTP access to /v2/ is diagnostic only and must not be treated as Docker daemon push access.", "dockerDaemonPushAccess": "Docker daemon push access is the publish-path capability. This probe is read-only and does not push.", "k3sPullAccess": "k3s pull access is the deploy-path capability. This probe is read-only and does not create pods or read secrets." } }, "digestPlaceholder": "not_published", "services": [ { "serviceId": "hwlab-cloud-api", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-mgr", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "imageTag": "63acb59", "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "imageTag": "63acb59", "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "imageTag": "63acb59", "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "imageTag": "63acb59", "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "imageTag": "63acb59", "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "imageTag": "63acb59", "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-router", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "imageTag": "63acb59", "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "imageTag": "63acb59", "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "imageTag": "63acb59", "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-cli", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "imageTag": "63acb59", "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "imageTag": "63acb59", "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "digestStatus": "real", "status": "published", "notPublishedReason": null } ] }, "services": [ { "serviceId": "hwlab-cloud-api", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "distFreshness": { "status": "pass", "distPath": "web/hwlab-cloud-web/dist", "buildCommand": "node web/hwlab-cloud-web/scripts/build.mjs", "freshnessCommand": "node web/hwlab-cloud-web/scripts/build.mjs", "files": [ { "kind": "runtime", "path": "index.html", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/index.html", "status": "match" }, { "kind": "runtime", "path": "styles.css", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/styles.css", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/styles.css", "status": "match" }, { "kind": "runtime", "path": "app.mjs", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/app.mjs", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/app.mjs", "status": "match" }, { "kind": "runtime", "path": "gate-summary.mjs", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/gate-summary.mjs", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/gate-summary.mjs", "status": "match" }, { "kind": "runtime", "path": "runtime.mjs", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/runtime.mjs", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/runtime.mjs", "status": "match" }, { "kind": "runtime", "path": "workbench-hardware-panel.mjs", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/workbench-hardware-panel.mjs", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/workbench-hardware-panel.mjs", "status": "match" }, { "kind": "runtime", "path": "help.md", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/help.md", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/help.md", "status": "match" }, { "kind": "runtime", "path": "third_party/marked/marked.esm.js", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/third_party/marked/marked.esm.js", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/third_party/marked/marked.esm.js", "status": "match" }, { "kind": "runtime", "path": "third_party/marked/LICENSE", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/third_party/marked/LICENSE", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/third_party/marked/LICENSE", "status": "match" }, { "kind": "alias", "path": "gate/index.html", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/gate/index.html", "status": "match" }, { "kind": "alias", "path": "diagnostics/gate/index.html", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/diagnostics/gate/index.html", "status": "match" }, { "kind": "alias", "path": "help/index.html", "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/help/index.html", "status": "match" } ], "mismatches": [] }, "notPublishedReason": null }, { "serviceId": "hwlab-agent-mgr", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "imageTag": "63acb59", "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "imageTag": "63acb59", "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "imageTag": "63acb59", "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "imageTag": "63acb59", "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "imageTag": "63acb59", "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "imageTag": "63acb59", "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "notPublishedReason": null }, { "serviceId": "hwlab-router", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "imageTag": "63acb59", "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "imageTag": "63acb59", "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "imageTag": "63acb59", "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "notPublishedReason": null }, { "serviceId": "hwlab-cli", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "imageTag": "63acb59", "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "imageTag": "63acb59", "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "notPublishedReason": null } ], "blockers": [] }, "stdoutTail": null, "stderrTail": "\"event\":\"publish_start\",\"serviceId\":\"hwlab-tunnel-client\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-tunnel-client\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59\",\"digest\":\"sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59\",\"digest\":\"sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:63acb59\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:63acb59\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:63acb59\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:63acb59\",\"digest\":\"sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59\",\"digest\":\"sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7\"}", "reportPath": "reports/dev-gate/dev-artifacts.json" }, { "id": "artifact-catalog-refresh", "phase": "publishing", "status": "pass", "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/refresh-artifact-catalog.mjs --target-ref 63acb5989baa9f12266ca3467eb896a454593efc --publish-report reports/dev-gate/dev-artifacts.json", "code": 0, "startedAt": "2026-05-23T09:40:32.800Z", "finishedAt": "2026-05-23T09:40:32.853Z", "stdoutJson": { "status": "published", "targetRef": "63acb5989baa9f12266ca3467eb896a454593efc", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "artifactCommitId": "63acb59", "wrote": [ "deploy/deploy.json", "deploy/artifact-catalog.dev.json", "deploy/k8s/base/workloads.yaml" ], "ciPublished": true, "registryVerified": true, "publishedCount": 13, "requiredServiceCount": 13, "disabledServiceCount": 0, "notPublishedCount": 0, "digestPolicy": "catalog digests copied only for required services from a published DEV artifact report; disabled services stay not_published", "services": [ { "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "imageTag": "63acb59", "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "imageTag": "63acb59", "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "imageTag": "63acb59", "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "imageTag": "63acb59", "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "imageTag": "63acb59", "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "imageTag": "63acb59", "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "imageTag": "63acb59", "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "imageTag": "63acb59", "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "imageTag": "63acb59", "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "imageTag": "63acb59", "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "imageTag": "63acb59", "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "publishState": "published", "artifactRequired": true, "notPublishedReason": null } ] }, "stdoutTail": null, "stderrTail": "", "reportPath": null }, { "id": "artifact-catalog-validate", "phase": "publishing", "status": "pass", "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/validate-artifact-catalog.mjs", "code": 0, "startedAt": "2026-05-23T09:40:32.853Z", "finishedAt": "2026-05-23T09:40:32.885Z", "stdoutJson": null, "stdoutTail": "validated 13 DEV artifact catalog services at 63acb59 (published)", "stderrTail": "", "reportPath": null }, { "id": "desired-state-check-after-refresh", "phase": "publishing", "status": "pass", "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/deploy-desired-state-plan.mjs --promotion-commit 63acb5989baa9f12266ca3467eb896a454593efc --check --pretty", "code": 0, "startedAt": "2026-05-23T09:40:32.886Z", "finishedAt": "2026-05-23T09:40:32.936Z", "stdoutJson": { "kind": "hwlab-deploy-desired-state-plan", "mode": "read-only-plan", "status": "pass", "source": { "deploy": "deploy/deploy.json", "artifactCatalog": "deploy/artifact-catalog.dev.json", "workloads": "deploy/k8s/base/workloads.yaml", "optionalReport": "reports/dev-gate/dev-artifacts.json" }, "safety": { "readOnly": true, "sourceOrDryRunSupportOnly": true, "kubectlApply": false, "registryPull": false, "registryPush": false, "imageBuild": false, "serviceRestart": false, "prod": false, "devLiveClaim": false }, "checkSemantics": "--check exits non-zero for missing/invalid desired-state sources, internal commit/image mirror drift, invalid target tags, partial target drift, or any mismatch with an explicit --target-ref, --target-tag, or --promotion-commit. When the checked target ref is the current checked-out merge commit, the comparable current-main target is its accepted first parent because a commit cannot embed its own content hash. Without --check, a uniform older desired-state under --target-ref/--target-tag is a read-only promotion plan.", "summary": { "desiredCommitId": "63acb59", "desiredImageTag": "63acb59", "artifactState": "published", "ciPublished": true, "registryVerified": true, "services": 13, "workloadContainers": 13, "presentMirrorCount": 14, "diagnostics": 0, "blockers": 0, "targetConvergence": "already_promoted" }, "target": { "targetRef": null, "promotionCommit": "63acb5989baa9f12266ca3467eb896a454593efc", "commitId": "63acb5989baa9f12266ca3467eb896a454593efc", "shortCommitId": "63acb59", "tag": "63acb59", "tagSource": "promotion-commit-short", "acceptedCurrentMain": null, "comparisonCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "comparisonTag": "63acb59", "requireConvergence": true, "convergenceRequirement": "promotion-commit", "convergence": { "state": "already_promoted", "comparableFields": 81, "matchingTargetFields": 81, "pendingTargetFields": 0, "matchingPaths": [ "deploy/deploy.json.commitId", "deploy/artifact-catalog.dev.json.commitId", "deploy/deploy.json.services.hwlab-cloud-api.image", "deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_COMMIT_ID", "deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_IMAGE", "deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_IMAGE_TAG", "deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.image", "deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].image", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_COMMIT_ID", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_IMAGE", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_IMAGE_TAG", "deploy/deploy.json.services.hwlab-cloud-web.image", "deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_COMMIT_ID", "deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_IMAGE", "deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_IMAGE_TAG", "deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.image", "deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].image", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_COMMIT_ID", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_IMAGE", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_IMAGE_TAG", "deploy/deploy.json.services.hwlab-agent-mgr.image", "deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.image", "deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-mgr.containers[0].image", "deploy/deploy.json.services.hwlab-agent-worker.image", "deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.image", "deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.imageTag", "deploy/k8s/base/workloads.yaml.Job.hwlab-agent-worker-template.containers[0].image", "deploy/deploy.json.services.hwlab-gateway.image", "deploy/artifact-catalog.dev.json.services.hwlab-gateway.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-gateway.image", "deploy/artifact-catalog.dev.json.services.hwlab-gateway.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-gateway.containers[0].image", "deploy/deploy.json.services.hwlab-gateway-simu.image", "deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.image", "deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.imageTag", "deploy/k8s/base/workloads.yaml.StatefulSet.hwlab-gateway-simu.containers[0].image", "deploy/deploy.json.services.hwlab-box-simu.image", "deploy/artifact-catalog.dev.json.services.hwlab-box-simu.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-box-simu.image", "deploy/artifact-catalog.dev.json.services.hwlab-box-simu.imageTag", "deploy/k8s/base/workloads.yaml.StatefulSet.hwlab-box-simu.containers[0].image", "deploy/deploy.json.services.hwlab-patch-panel.image", "deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.image", "deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-patch-panel.containers[0].image", "deploy/deploy.json.services.hwlab-router.image", "deploy/artifact-catalog.dev.json.services.hwlab-router.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-router.image", "deploy/artifact-catalog.dev.json.services.hwlab-router.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-router.containers[0].image", "deploy/deploy.json.services.hwlab-tunnel-client.image", "deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.image", "deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-tunnel-client.containers[0].image", "deploy/deploy.json.services.hwlab-edge-proxy.image", "deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.image", "deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-edge-proxy.containers[0].image", "deploy/deploy.json.services.hwlab-cli.image", "deploy/artifact-catalog.dev.json.services.hwlab-cli.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-cli.image", "deploy/artifact-catalog.dev.json.services.hwlab-cli.imageTag", "deploy/k8s/base/workloads.yaml.Job.hwlab-cli-template.containers[0].image", "deploy/deploy.json.services.hwlab-agent-skills.image", "deploy/deploy.json.services.hwlab-agent-skills.env.HWLAB_SKILLS_COMMIT_ID", "deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.commitId", "deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.image", "deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.imageTag", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-skills.containers[0].image", "deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-skills.containers[0].env.HWLAB_SKILLS_COMMIT_ID" ], "pendingPaths": [] }, "commands": [ "node scripts/deploy-desired-state-plan.mjs --promotion-commit 63acb5989baa9f12266ca3467eb896a454593efc --check --pretty" ] }, "promotionBoundary": { "writes": [], "authoritativeDesiredState": [ "deploy/deploy.json", "deploy/artifact-catalog.dev.json", "deploy/k8s/base/workloads.yaml" ], "nonAuthoritativeEvidence": [ "reports/dev-gate/dev-artifacts.json" ], "note": "This planner reviews source desired-state only. It does not prove image existence, registry reachability, a real DEV apply, or M3 DEV-LIVE hardware-loop evidence." }, "cloudApiDb": { "contractVersion": "v1", "environment": "dev", "status": "pass", "ready": true, "secretRef": { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "deployPlaceholderPresent": true, "workloadSecretRefPresent": true, "present": true, "redacted": true }, "sslMode": { "env": "HWLAB_CLOUD_DB_SSL_MODE", "value": "disable", "workloadValue": "disable", "expected": "disable", "deployMatches": true, "workloadMatches": true, "secret": false }, "secretMaterialRead": false, "valuesRedacted": true, "liveDbEvidence": false, "fixtureEvidence": false }, "codeAgentProvider": { "contractVersion": "v1", "environment": "dev", "provider": "openai-responses", "model": "gpt-5.5", "status": "pass", "ready": true, "requiredEnv": [ { "name": "HWLAB_CODE_AGENT_PROVIDER", "deployPresent": true, "workloadPresent": true, "redacted": false, "source": "runtime-env" }, { "name": "HWLAB_CODE_AGENT_MODEL", "deployPresent": true, "workloadPresent": true, "redacted": false, "source": "runtime-env" }, { "name": "OPENAI_API_KEY", "deployPresent": true, "workloadPresent": true, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "deployPresent": true, "workloadPresent": true, "redacted": true, "source": "runtime-env" } ], "secretRef": { "env": "OPENAI_API_KEY", "secretName": "hwlab-code-agent-provider", "secretKey": "openai-api-key", "deployPlaceholderPresent": true, "workloadSecretRefPresent": true, "present": true, "redacted": true }, "egress": { "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "target": "dev-egress-proxy", "deployPresent": true, "workloadPresent": true, "deployMatchesDevProxy": true, "workloadMatchesDevProxy": true, "directPublicOpenAi": false, "valueRedacted": true }, "missingDeployEnv": [], "missingWorkloadEnv": [], "deployMismatches": [], "workloadMismatches": [], "missingSecretRefs": [], "missingEgressContract": [], "secretMaterialRead": false, "valuesRedacted": true, "providerConnected": false, "fixtureEvidence": false }, "reportHints": { "path": "reports/dev-gate/dev-artifacts.json", "present": true, "authoritative": false, "note": "report snapshots are contextual evidence only; deploy desired-state remains authoritative in deploy/, not reports/", "commitId": "63acb59", "matchesDesiredState": true, "artifactPublish": { "status": "published", "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "sourceMatchesDesiredState": true, "publishedCount": 13, "serviceCount": 13, "registryVerified": null, "registryCapabilitiesClassification": "degraded" } }, "services": [ { "serviceId": "hwlab-cloud-api", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "63acb59", "expected": "63acb59", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "63acb59", "expected": "63acb59", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-cloud-api", "namespace": "hwlab-dev", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "63acb59", "expected": "63acb59", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "63acb59", "expected": "63acb59", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "workloadImages": [ { "workload": "hwlab-cloud-api", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59" } ] } }, { "serviceId": "hwlab-cloud-web", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "63acb59", "expected": "63acb59", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "63acb59", "expected": "63acb59", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-cloud-web", "namespace": "hwlab-dev", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "63acb59", "expected": "63acb59", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "63acb59", "expected": "63acb59", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "workloadImages": [ { "workload": "hwlab-cloud-web", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59" } ] } }, { "serviceId": "hwlab-agent-mgr", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "imageTag": "63acb59", "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-agent-mgr", "namespace": "hwlab-dev", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "workloadImages": [ { "workload": "hwlab-agent-mgr", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59" } ] } }, { "serviceId": "hwlab-agent-worker", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "imageTag": "63acb59", "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Job", "name": "hwlab-agent-worker-template", "namespace": "hwlab-dev", "container": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "workloadImages": [ { "workload": "hwlab-agent-worker-template", "container": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" } ] } }, { "serviceId": "hwlab-gateway", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "imageTag": "63acb59", "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-gateway", "namespace": "hwlab-dev", "container": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "workloadImages": [ { "workload": "hwlab-gateway", "container": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59" } ] } }, { "serviceId": "hwlab-gateway-simu", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "imageTag": "63acb59", "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "StatefulSet", "name": "hwlab-gateway-simu", "namespace": "hwlab-dev", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "workloadImages": [ { "workload": "hwlab-gateway-simu", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59" } ] } }, { "serviceId": "hwlab-box-simu", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "imageTag": "63acb59", "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "StatefulSet", "name": "hwlab-box-simu", "namespace": "hwlab-dev", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "workloadImages": [ { "workload": "hwlab-box-simu", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59" } ] } }, { "serviceId": "hwlab-patch-panel", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "imageTag": "63acb59", "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-patch-panel", "namespace": "hwlab-dev", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "workloadImages": [ { "workload": "hwlab-patch-panel", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59" } ] } }, { "serviceId": "hwlab-router", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "imageTag": "63acb59", "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-router", "namespace": "hwlab-dev", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "workloadImages": [ { "workload": "hwlab-router", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59" } ] } }, { "serviceId": "hwlab-tunnel-client", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "imageTag": "63acb59", "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-tunnel-client", "namespace": "hwlab-dev", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "workloadImages": [ { "workload": "hwlab-tunnel-client", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59" } ] } }, { "serviceId": "hwlab-edge-proxy", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "imageTag": "63acb59", "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-edge-proxy", "namespace": "hwlab-dev", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "workloadImages": [ { "workload": "hwlab-edge-proxy", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59" } ] } }, { "serviceId": "hwlab-cli", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "imageTag": "63acb59", "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Job", "name": "hwlab-cli-template", "namespace": "hwlab-dev", "container": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "imageTag": "63acb59", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "workloadImages": [ { "workload": "hwlab-cli-template", "container": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" } ] } }, { "serviceId": "hwlab-agent-skills", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "imageTag": "63acb59", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "63acb59", "expected": "63acb59", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "imageTag": "63acb59", "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "publishState": "published", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-agent-skills", "namespace": "hwlab-dev", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "imageTag": "63acb59", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "63acb59", "expected": "63acb59", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "targetImageTag": "63acb59", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "workloadImages": [ { "workload": "hwlab-agent-skills", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59" } ] } } ], "diagnostics": [] }, "stdoutTail": null, "stderrTail": "", "reportPath": null }, { "id": "dev-deploy-apply", "phase": "applying", "status": "pass", "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-deploy-apply.mjs --apply --confirm-dev --confirmed-non-production --write-report", "code": 0, "startedAt": "2026-05-23T09:40:33.012Z", "finishedAt": "2026-05-23T09:40:35.316Z", "stdoutJson": { "$schema": "https://hwlab.pikastech.local/schemas/dev-gate-report.schema.json", "$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-deploy-report.json", "reportVersion": "v1", "issue": "pikasTech/HWLAB#33", "supports": [ "pikasTech/HWLAB#164", "pikasTech/HWLAB#143", "pikasTech/HWLAB#99", "pikasTech/HWLAB#63", "pikasTech/HWLAB#50", "pikasTech/HWLAB#7", "pikasTech/HWLAB#33", "pikasTech/HWLAB#17", "pikasTech/HWLAB#32", "pikasTech/HWLAB#30" ], "taskId": "dev-deploy-apply", "commitId": "63acb59", "acceptanceLevel": "dev_deploy_apply", "devOnly": true, "prodDisabled": true, "reportLifecycle": { "version": "v1", "state": "active", "activeEndpoint": "http://74.48.78.17:16667", "activeBrowserEndpoint": "http://74.48.78.17:16666", "deprecatedEndpoint": null, "summary": "Current DEV deploy apply report; active public API/health endpoint is 16667 and browser endpoint is 16666." }, "status": "pass", "generatedAt": "2026-05-23T09:40:35.311Z", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "sourceContract": { "status": "pass", "documents": [ "docs/dev-acceptance-matrix.md", "docs/m0-contract-audit.md", "docs/dev-deploy-apply.md", "docs/artifact-catalog.md", "deploy/README.md" ], "summary": "DEV deploy apply is pinned to hwlab-dev and the frozen HWLAB service IDs" }, "validationCommands": [ "node --check scripts/validate-dev-gate-report.mjs", "node scripts/validate-dev-gate-report.mjs", "node --check scripts/dev-deploy-apply.mjs", "node --check scripts/src/dev-deploy-apply.mjs", "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked" ], "localSmoke": { "status": "not_run", "commands": [ "node scripts/m1-contract-smoke.mjs" ], "evidence": [ "This deploy apply task did not run local smoke because artifact/executor blockers stop promotion first." ], "summary": "Local smoke remains available but is not a substitute for DEV artifact publish evidence." }, "dryRun": { "status": "pass", "commands": [ "node tools/hwlab-cli/bin/hwlab-cli.mjs test e2e --env dev --mvp --dry-run", "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked" ], "evidence": [ "artifact services checked: 13", "expected artifact commit: 63acb59", "namespace: hwlab-dev", "workloads planned: 13", "kubectl executor: /usr/local/bin/kubectl", "kubectl kubeconfig source: env:KUBECONFIG", "kubectl kubeconfig: /var/lib/unidesk/code-queue/kubeconfig", "live health: pass", "code agent provider desired-state: pass", "code agent provider live env before apply: pass", "template job replacements: 0", "legacy simulator deployment cleanups: 0" ], "summary": "DEV dry-run preflight passed." }, "devPreconditions": { "status": "pass", "requirements": [ "DEV artifact catalog must contain CI publish evidence and registry digests", "kubectl must be available for D601 hwlab-dev and must not target PROD", "hwlab-cloud-api /health/live must report serviceId, dev environment, and DB env readiness without exposing secret values", "hwlab-cloud-api must declare and preserve OPENAI_API_KEY from hwlab-code-agent-provider/openai-api-key plus the DEV Code Agent egress proxy env without reading Secret values", "pods, services, configmaps, and image commit tags must be observable in hwlab-dev" ], "summary": "DEV deploy preconditions are satisfied." }, "devDeployApply": { "mode": "apply", "conclusion": { "status": "ready", "reason": "All DEV-only preconditions passed; human approval is still required before apply.", "blockerCount": 0 }, "applyBoundary": { "currentMode": "apply-requested", "defaultNoWrite": false, "mutationAttempted": true, "mutationAllowed": true, "applyRequiresFlags": [ "--apply", "--confirm-dev", "--confirmed-non-production" ], "kubeconfigSource": "env:KUBECONFIG", "writeScope": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl apply -k deploy/k8s/dev, namespace hwlab-dev only; delete/recreate is allowed only for explicitly allowlisted suspended DEV template Jobs and stale legacy simulator Deployments", "noWriteScope": "source/catalog/k8s validation, optional DEV health probe, KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl read, replacement planning, and server-side dry-run only", "forbiddenActions": [ "prod-deploy", "secret-read", "runtime-substitute", "unidesk-restart", "code-queue-restart", "backend-core-restart", "heavy-master-e2e", "force-push" ] }, "mutationAttempted": true, "target": { "environment": "dev", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "prodDisabled": true }, "artifactPlan": { "expectedArtifactCommit": "63acb59", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "sourceCommitId": "63acb59", "serviceCommitIds": [ "63acb59" ], "matchesSourceCommit": true, "published": true, "registryVerified": true, "imageCount": 13, "requiredServiceCount": 13, "disabledServiceCount": 0, "unpublishedServices": [] }, "workloadPlan": [ { "kind": "Deployment", "name": "hwlab-cloud-api", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-cloud-api" ], "containers": [ { "name": "hwlab-cloud-api", "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59" } ] }, { "kind": "Deployment", "name": "hwlab-cloud-web", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-cloud-web" ], "containers": [ { "name": "hwlab-cloud-web", "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59" } ] }, { "kind": "Deployment", "name": "hwlab-agent-mgr", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-agent-mgr" ], "containers": [ { "name": "hwlab-agent-mgr", "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59" } ] }, { "kind": "Job", "name": "hwlab-agent-worker-template", "namespace": "hwlab-dev", "replicas": 0, "serviceIds": [ "hwlab-agent-worker" ], "containers": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" } ] }, { "kind": "Deployment", "name": "hwlab-gateway", "namespace": "hwlab-dev", "replicas": 0, "serviceIds": [ "hwlab-gateway" ], "containers": [ { "name": "hwlab-gateway", "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59" } ] }, { "kind": "StatefulSet", "name": "hwlab-gateway-simu", "namespace": "hwlab-dev", "replicas": 2, "serviceIds": [ "hwlab-gateway-simu" ], "containers": [ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59" } ] }, { "kind": "StatefulSet", "name": "hwlab-box-simu", "namespace": "hwlab-dev", "replicas": 2, "serviceIds": [ "hwlab-box-simu" ], "containers": [ { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59" } ] }, { "kind": "Deployment", "name": "hwlab-patch-panel", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-patch-panel" ], "containers": [ { "name": "hwlab-patch-panel", "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59" } ] }, { "kind": "Deployment", "name": "hwlab-router", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-router" ], "containers": [ { "name": "hwlab-router", "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59" } ] }, { "kind": "Deployment", "name": "hwlab-tunnel-client", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-tunnel-client" ], "containers": [ { "name": "hwlab-tunnel-client", "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59" } ] }, { "kind": "Deployment", "name": "hwlab-edge-proxy", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-edge-proxy" ], "containers": [ { "name": "hwlab-edge-proxy", "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59" } ] }, { "kind": "Job", "name": "hwlab-cli-template", "namespace": "hwlab-dev", "replicas": 0, "serviceIds": [ "hwlab-cli" ], "containers": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" } ] }, { "kind": "Deployment", "name": "hwlab-agent-skills", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-agent-skills" ], "containers": [ { "name": "hwlab-agent-skills", "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59" } ] } ], "servicePlan": [ { "kind": "Service", "name": "hwlab-cloud-api", "namespace": "hwlab-dev", "serviceId": "hwlab-cloud-api", "type": "ClusterIP", "ports": [ { "name": "http", "port": 6667, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-gateway-simu-1", "namespace": "hwlab-dev", "serviceId": "hwlab-gateway-simu", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7101, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-gateway-simu-2", "namespace": "hwlab-dev", "serviceId": "hwlab-gateway-simu", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7101, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-cloud-web", "namespace": "hwlab-dev", "serviceId": "hwlab-cloud-web", "type": "ClusterIP", "ports": [ { "name": "http", "port": 8080, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-box-simu-1", "namespace": "hwlab-dev", "serviceId": "hwlab-box-simu", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7201, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-box-simu-2", "namespace": "hwlab-dev", "serviceId": "hwlab-box-simu", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7201, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-gateway", "namespace": "hwlab-dev", "serviceId": "hwlab-gateway", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7001, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-cli", "namespace": "hwlab-dev", "serviceId": "hwlab-cli", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7501, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-agent-skills", "namespace": "hwlab-dev", "serviceId": "hwlab-agent-skills", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7430, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-agent-mgr", "namespace": "hwlab-dev", "serviceId": "hwlab-agent-mgr", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7410, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-gateway-simu", "namespace": "hwlab-dev", "serviceId": "hwlab-gateway-simu", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7101, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-box-simu", "namespace": "hwlab-dev", "serviceId": "hwlab-box-simu", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7201, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-patch-panel", "namespace": "hwlab-dev", "serviceId": "hwlab-patch-panel", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7301, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-router", "namespace": "hwlab-dev", "serviceId": "hwlab-router", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7401, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-tunnel-client", "namespace": "hwlab-dev", "serviceId": "hwlab-tunnel-client", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7402, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-edge-proxy", "namespace": "hwlab-dev", "serviceId": "hwlab-edge-proxy", "type": "ClusterIP", "ports": [ { "name": "http", "port": 6667, "targetPort": "http" } ] } ], "templateJobReplacementPolicy": { "status": "active", "namespace": "hwlab-dev", "scope": "DEV-only suspended template Jobs", "allowedJobs": [ { "name": "hwlab-agent-worker-template", "serviceId": "hwlab-agent-worker", "reason": "suspended session worker template Job has immutable spec.template" }, { "name": "hwlab-cli-template", "serviceId": "hwlab-cli", "reason": "suspended CLI template Job has immutable spec.template" } ] }, "templateJobReplacements": [ { "namespace": "hwlab-dev", "jobName": "hwlab-agent-worker-template", "allowed": true, "desiredSuspended": true, "liveExists": true, "liveSuspended": true, "oldImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "oldImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" } ], "newImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" } ], "replace": false, "result": "not_needed", "reason": "Live suspended template Job already matches the desired image." }, { "namespace": "hwlab-dev", "jobName": "hwlab-cli-template", "allowed": true, "desiredSuspended": true, "liveExists": true, "liveSuspended": true, "oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "newImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "oldImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" } ], "newImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" } ], "replace": false, "result": "not_needed", "reason": "Live suspended template Job already matches the desired image." } ], "legacySimulatorDeploymentCleanupPolicy": { "status": "active", "namespace": "hwlab-dev", "scope": "DEV-only stale simulator Deployments replaced by indexed StatefulSets", "allowedDeployments": [ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", "replacementKind": "StatefulSet", "reason": "M3 DEV requires exactly two indexed gateway-simu identities/sessions" }, { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", "replacementKind": "StatefulSet", "reason": "M3 DEV requires exactly two indexed box-simu resource identities" } ] }, "legacySimulatorDeploymentCleanups": [ { "namespace": "hwlab-dev", "deploymentName": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", "allowed": true, "desiredReplacementExists": true, "desiredReplacementKind": "StatefulSet", "liveExists": false, "oldImage": null, "newImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "oldImages": [], "newImages": [ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59" } ], "cleanup": false, "result": "not_found", "reason": "Live legacy Deployment is absent; no cleanup is needed." }, { "namespace": "hwlab-dev", "deploymentName": "hwlab-box-simu", "serviceId": "hwlab-box-simu", "allowed": true, "desiredReplacementExists": true, "desiredReplacementKind": "StatefulSet", "liveExists": false, "oldImage": null, "newImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "oldImages": [], "newImages": [ { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59" } ], "cleanup": false, "result": "not_found", "reason": "Live legacy Deployment is absent; no cleanup is needed." } ], "cloudWebRollout": { "serviceId": "hwlab-cloud-web", "namespace": "hwlab-dev", "status": "observed", "observationPhase": "after_apply", "sourceCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "34", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageMatchesDesired": true, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "63acb59", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "HWLAB_IMAGE_TAG": "63acb59" }, "liveRuntimeEnv": { "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "63acb59", "actual": "63acb59", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "63acb59", "actual": "63acb59", "status": "match" } ], "drift": [] }, "runtimeEnvMatchesDesired": true, "runtimeEnvDrift": [], "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", "kubeconfigSource": "env:KUBECONFIG" }, "cloudWebRolloutBeforeApply": { "serviceId": "hwlab-cloud-web", "namespace": "hwlab-dev", "status": "observed", "observationPhase": "before_apply", "sourceCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "34", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageMatchesDesired": true, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "63acb59", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "HWLAB_IMAGE_TAG": "63acb59" }, "liveRuntimeEnv": { "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "63acb59", "actual": "63acb59", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "63acb59", "actual": "63acb59", "status": "match" } ], "drift": [] }, "runtimeEnvMatchesDesired": true, "runtimeEnvDrift": [], "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", "kubeconfigSource": "env:KUBECONFIG" }, "cloudWebRolloutAfterApply": { "serviceId": "hwlab-cloud-web", "namespace": "hwlab-dev", "status": "observed", "observationPhase": "after_apply", "sourceCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageTag": "63acb59", "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "34", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageMatchesDesired": true, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "63acb59", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "HWLAB_IMAGE_TAG": "63acb59" }, "liveRuntimeEnv": { "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "63acb59", "actual": "63acb59", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "63acb59", "actual": "63acb59", "status": "match" } ], "drift": [] }, "runtimeEnvMatchesDesired": true, "runtimeEnvDrift": [], "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", "kubeconfigSource": "env:KUBECONFIG" }, "codeAgentProvider": { "desiredState": { "contractVersion": "v1", "environment": "dev", "provider": "openai-responses", "model": "gpt-5.5", "status": "pass", "ready": true, "requiredEnv": [ { "name": "HWLAB_CODE_AGENT_PROVIDER", "deployPresent": true, "workloadPresent": true, "redacted": false, "source": "runtime-env" }, { "name": "HWLAB_CODE_AGENT_MODEL", "deployPresent": true, "workloadPresent": true, "redacted": false, "source": "runtime-env" }, { "name": "OPENAI_API_KEY", "deployPresent": true, "workloadPresent": true, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "deployPresent": true, "workloadPresent": true, "redacted": true, "source": "runtime-env" } ], "secretRef": { "env": "OPENAI_API_KEY", "secretName": "hwlab-code-agent-provider", "secretKey": "openai-api-key", "deployPlaceholderPresent": true, "workloadSecretRefPresent": true, "present": true, "redacted": true }, "egress": { "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "target": "dev-egress-proxy", "deployPresent": true, "workloadPresent": true, "deployMatchesDevProxy": true, "workloadMatchesDevProxy": true, "directPublicOpenAi": false, "valueRedacted": true }, "missingDeployEnv": [], "missingWorkloadEnv": [], "deployMismatches": [], "workloadMismatches": [], "missingSecretRefs": [], "missingEgressContract": [], "secretMaterialRead": false, "valuesRedacted": true, "providerConnected": false, "fixtureEvidence": false }, "liveBeforeApply": { "phase": "before_apply", "namespace": "hwlab-dev", "serviceId": "hwlab-cloud-api", "status": "pass", "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json", "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", "expectedSecretRef": "hwlab-code-agent-provider/openai-api-key", "expectedEgressTarget": "dev-egress-proxy", "secretValuesRead": false, "kubernetesSecretDataRead": false, "valuesRedacted": true, "contractVersion": "v1", "environment": "dev", "provider": "openai-responses", "model": "gpt-5.5", "ready": true, "requiredEnv": [ { "name": "HWLAB_CODE_AGENT_PROVIDER", "present": true, "redacted": false, "source": "runtime-env" }, { "name": "HWLAB_CODE_AGENT_MODEL", "present": true, "redacted": false, "source": "runtime-env" }, { "name": "OPENAI_API_KEY", "present": true, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "present": true, "redacted": true, "source": "runtime-env" } ], "missingEnv": [], "mismatchedEnv": [], "secretRef": { "env": "OPENAI_API_KEY", "secretName": "hwlab-code-agent-provider", "secretKey": "openai-api-key", "present": true, "redacted": true }, "egress": { "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "target": "dev-egress-proxy", "present": true, "matchesDevProxy": true, "directPublicOpenAi": false, "valueRedacted": true }, "secretMaterialRead": false, "providerConnected": false, "deployment": "hwlab-cloud-api", "container": "hwlab-cloud-api", "validationScope": "deployment-env-and-secretKeyRef-metadata-only" }, "liveAfterApply": { "phase": "after_apply", "namespace": "hwlab-dev", "serviceId": "hwlab-cloud-api", "status": "pass", "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json", "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", "expectedSecretRef": "hwlab-code-agent-provider/openai-api-key", "expectedEgressTarget": "dev-egress-proxy", "secretValuesRead": false, "kubernetesSecretDataRead": false, "valuesRedacted": true, "contractVersion": "v1", "environment": "dev", "provider": "openai-responses", "model": "gpt-5.5", "ready": true, "requiredEnv": [ { "name": "HWLAB_CODE_AGENT_PROVIDER", "present": true, "redacted": false, "source": "runtime-env" }, { "name": "HWLAB_CODE_AGENT_MODEL", "present": true, "redacted": false, "source": "runtime-env" }, { "name": "OPENAI_API_KEY", "present": true, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "present": true, "redacted": true, "source": "runtime-env" } ], "missingEnv": [], "mismatchedEnv": [], "secretRef": { "env": "OPENAI_API_KEY", "secretName": "hwlab-code-agent-provider", "secretKey": "openai-api-key", "present": true, "redacted": true }, "egress": { "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", "target": "dev-egress-proxy", "present": true, "matchesDevProxy": true, "directPublicOpenAi": false, "valueRedacted": true }, "secretMaterialRead": false, "providerConnected": false, "deployment": "hwlab-cloud-api", "container": "hwlab-cloud-api", "validationScope": "deployment-env-and-secretKeyRef-metadata-only" }, "validationGate": "no-secret provider env/secretKeyRef preservation", "providerCallAttempted": false, "secretValuesRead": false, "kubernetesSecretDataRead": false, "valuesRedacted": true }, "applyStep": { "status": "pass", "command": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl apply -k deploy/k8s/dev", "stdout": "namespace/hwlab-dev unchanged\nconfigmap/hwlab-dev-health-contract unchanged\nservice/hwlab-agent-mgr unchanged\nservice/hwlab-agent-skills unchanged\nservice/hwlab-box-simu unchanged\nservice/hwlab-box-simu-1 unchanged\nservice/hwlab-box-simu-2 unchanged\nservice/hwlab-cli unchanged\nservice/hwlab-cloud-api unchanged\nservice/hwlab-cloud-web unchanged\nservice/hwlab-edge-proxy unchanged\nservice/hwlab-gateway unchanged\nservice/hwlab-gateway-simu unchanged\nservice/hwlab-gateway-simu-1 unchanged\nservice/hwlab-gateway-simu-2 unchanged\nservice/hwlab-patch-panel unchanged\nservice/hwlab-router unchanged\nservice/hwlab-tunnel-client unchanged\ndeployment.apps/hwlab-agent-mgr unchanged\ndeployment.apps/hwlab-agent-skills unchanged\ndeployment.apps/hwlab-cloud-api unchanged\ndeployment.apps/hwlab-cloud-web unchanged\ndeployment.apps/hwlab-edge-proxy unchanged\ndeployment.apps/hwlab-gateway unchanged\ndeployment.apps/hwlab-patch-panel unchanged\ndeployment.apps/hwlab-router unchanged\ndeployment.apps/hwlab-tunnel-client unchanged\nstatefulset.apps/hwlab-box-simu unchanged\nstatefulset.apps/hwlab-gateway-simu unchanged\njob.batch/hwlab-agent-worker-template unchanged\njob.batch/hwlab-cli-template unchanged", "stderr": "# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.\n# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.", "mutationAttempted": true, "expectedImmutableTemplateJobDryRun": false, "expectedImmutableTemplateJobs": [] }, "manualCommands": { "status": "ready", "beforeHumanApproval": [ "node scripts/dev-deploy-apply.mjs --dry-run --write-report", "node scripts/validate-dev-gate-report.mjs" ], "afterHumanApproval": [ "node scripts/dev-cd-apply.mjs --apply --confirm-dev --confirmed-non-production --write-report" ], "summary": "Run the dry-run plan and validator immediately before requesting human approval; live apply still requires the explicit DEV confirmation flags." }, "rollbackHint": { "namespace": "hwlab-dev", "strategy": "DEV-only Kubernetes rollback using deployment revision history; do not touch PROD or UniDesk services.", "captureBeforeApply": [ "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get pods,services,configmaps,deployments,jobs -o wide", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployments -o json" ], "deploymentRollbackCommands": [ "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-api", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-web", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-mgr", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-gateway", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-patch-panel", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-router", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-tunnel-client", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-edge-proxy", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-skills" ], "jobCleanupCommands": [ "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found", "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found" ], "postRollbackChecks": [ "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-api --timeout=120s", "curl -fsS http://74.48.78.17:16667/health/live" ] }, "remainingBlockers": [], "artifactEvidence": [ { "serviceId": "hwlab-cloud-api", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "publishState": "published" }, { "serviceId": "hwlab-cloud-web", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "publishState": "published" }, { "serviceId": "hwlab-agent-mgr", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "publishState": "published" }, { "serviceId": "hwlab-agent-worker", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "publishState": "published" }, { "serviceId": "hwlab-gateway", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "publishState": "published" }, { "serviceId": "hwlab-gateway-simu", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "publishState": "published" }, { "serviceId": "hwlab-box-simu", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "publishState": "published" }, { "serviceId": "hwlab-patch-panel", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "publishState": "published" }, { "serviceId": "hwlab-router", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "publishState": "published" }, { "serviceId": "hwlab-tunnel-client", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "publishState": "published" }, { "serviceId": "hwlab-edge-proxy", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "publishState": "published" }, { "serviceId": "hwlab-cli", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "publishState": "published" }, { "serviceId": "hwlab-agent-skills", "deployCommitId": "63acb59", "catalogCommitId": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "publishState": "published" } ], "cloudApiDb": { "status": "contract-ready", "requiredEnv": [ { "name": "HWLAB_CLOUD_DB_URL", "manifestPresent": true, "k8sPresent": true, "redacted": true, "source": "k8s-secret-ref", "secretRef": { "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "present": true, "redacted": true } }, { "name": "HWLAB_CLOUD_DB_SSL_MODE", "manifestPresent": true, "k8sPresent": true, "redacted": false, "source": "runtime-env", "secretRef": null } ], "missingManifest": [], "missingK8s": [], "missingSecretRefs": [], "mismatchedNonSecretEnv": [], "missingDnsContract": [], "dns": { "ready": true, "source": "optional-public-dns-alias", "serviceName": "cloud-api-db", "namespace": "hwlab-dev", "port": 5432, "portName": "postgres", "requiredForReadiness": false, "usedForProbe": false, "servicePresent": false, "secretMaterialRead": false, "liveDbEvidence": false, "missing": [], "actual": {} }, "runtimeHealth": { "status": "degraded", "ready": false, "configReady": true, "connected": false, "liveConnected": false, "connectionChecked": false, "connectionAttempted": false, "connectionResult": "unknown", "liveDbEvidence": false, "requiredEnv": [ { "name": "HWLAB_CLOUD_DB_URL", "present": true, "redacted": true }, { "name": "HWLAB_CLOUD_DB_SSL_MODE", "present": true, "redacted": false } ], "missingEnv": [], "secretRefs": [ { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "present": true, "envInjected": true, "secretPresent": "not_observed", "secretKeyPresent": "not_observed", "redacted": true } ], "endpointSource": "secret-url-host", "optionalPublicDnsAlias": { "source": "optional-public-dns-alias", "serviceName": "cloud-api-db", "namespace": "hwlab-dev", "port": 5432, "portName": "postgres", "requiredForReadiness": false, "usedForProbe": false, "envPresent": false, "readyGate": "not_readiness_authority" }, "connection": { "attempted": false, "result": "unknown", "endpointRedacted": true, "valueRedacted": true }, "redaction": { "valuesRedacted": true, "endpointRedacted": true, "valueRedacted": true, "secretMaterialRead": false, "secretRefsOnly": true }, "readinessLayers": { "dns": { "status": "not_proven", "result": "unknown" }, "tcp": { "status": "not_proven", "result": "unknown" }, "ssl": { "status": "not_proven", "result": "unknown" }, "auth": { "status": "not_proven", "result": "unknown" }, "schema": { "status": "not_proven", "result": "unknown" }, "migration": { "status": "not_proven", "result": "unknown" }, "durability": { "status": "not_proven", "result": "unknown" } }, "blocker": null, "fixtureEvidence": false }, "secretMaterialRead": false, "valuesRedacted": true, "liveDbEvidence": false, "fixtureEvidence": false, "note": "This check records DB env, Secret reference, and Secret URL host authority only. Optional cloud-api-db alias presence is diagnostic and is not live DB evidence." }, "k8sManifest": { "resourceCounts": { "workloads": 13, "services": 16, "configMaps": 1 }, "images": [ { "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "kind": "Deployment", "name": "hwlab-cloud-api" }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "kind": "Deployment", "name": "hwlab-cloud-web" }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "kind": "Deployment", "name": "hwlab-agent-mgr" }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "kind": "Job", "name": "hwlab-agent-worker-template" }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "kind": "Deployment", "name": "hwlab-gateway" }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "kind": "StatefulSet", "name": "hwlab-gateway-simu" }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "kind": "StatefulSet", "name": "hwlab-box-simu" }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "kind": "Deployment", "name": "hwlab-patch-panel" }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "kind": "Deployment", "name": "hwlab-router" }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "kind": "Deployment", "name": "hwlab-tunnel-client" }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "kind": "Deployment", "name": "hwlab-edge-proxy" }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "kind": "Job", "name": "hwlab-cli-template" }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "kind": "Deployment", "name": "hwlab-agent-skills" } ], "runtimeIdentityEnv": [ { "serviceId": "hwlab-cloud-web", "kind": "Deployment", "name": "hwlab-cloud-web", "container": "hwlab-cloud-web", "expected": { "HWLAB_COMMIT_ID": "63acb59", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "HWLAB_IMAGE_TAG": "63acb59" }, "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "63acb59", "actual": "63acb59", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "63acb59", "actual": "63acb59", "status": "match" } ], "drift": [] } ] }, "clusterObservation": { "status": "pass", "executor": "/usr/local/bin/kubectl", "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", "kubeconfigSource": "env:KUBECONFIG", "commandPrefix": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl", "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl get pods,services,configmaps,deployments,jobs -n hwlab-dev -o json", "version": "clientVersion:\n buildDate: \"2026-05-12T09:54:35Z\"\n compiler: gc\n gitCommit: 756939600b9a7180fc2df6550a4585b638875e67\n gitTreeState: clean\n gitVersion: v1.36.1\n goVersion: go1.26.2\n major: \"1\"\n minor: \"36\"\n platform: linux/amd64\nkustomizeVersion: v5.8.1", "resources": [ { "kind": "Pod", "name": "hwlab-agent-mgr-57d8bc9f89-5kv4p", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-agent-skills-8687f446fd-lqtgt", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-box-simu-0", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-box-simu-1", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-cloud-api-668549d448-gnct8", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-cloud-web-fc896cddb-gwh58", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-edge-proxy-5ff8d747d-rgdjm", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-frpc-59f57d479c-wm5l2", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-gateway-simu-0", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-gateway-simu-1", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-patch-panel-79c59cd5b7-dl4sz", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-router-7d47d6dfc4-gzcw9", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-tunnel-client-64779fc4bd-pz8lz", "phase": "Running" }, { "kind": "Service", "name": "hwlab-agent-mgr" }, { "kind": "Service", "name": "hwlab-agent-skills" }, { "kind": "Service", "name": "hwlab-box-simu" }, { "kind": "Service", "name": "hwlab-box-simu-1" }, { "kind": "Service", "name": "hwlab-box-simu-2" }, { "kind": "Service", "name": "hwlab-cli" }, { "kind": "Service", "name": "hwlab-cloud-api" }, { "kind": "Service", "name": "hwlab-cloud-web" }, { "kind": "Service", "name": "hwlab-edge-proxy" }, { "kind": "Service", "name": "hwlab-gateway" }, { "kind": "Service", "name": "hwlab-gateway-simu" }, { "kind": "Service", "name": "hwlab-gateway-simu-1" }, { "kind": "Service", "name": "hwlab-gateway-simu-2" }, { "kind": "Service", "name": "hwlab-patch-panel" }, { "kind": "Service", "name": "hwlab-router" }, { "kind": "Service", "name": "hwlab-tunnel-client" }, { "kind": "ConfigMap", "name": "hwlab-dev-health-contract" }, { "kind": "ConfigMap", "name": "hwlab-frpc-config" }, { "kind": "ConfigMap", "name": "kube-root-ca.crt" }, { "kind": "Deployment", "name": "hwlab-agent-mgr", "readyReplicas": 1, "replicas": 1 }, { "kind": "Deployment", "name": "hwlab-agent-skills", "readyReplicas": 1, "replicas": 1 }, { "kind": "Deployment", "name": "hwlab-cloud-api", "readyReplicas": 1, "replicas": 1 }, { "kind": "Deployment", "name": "hwlab-cloud-web", "readyReplicas": 1, "replicas": 1 }, { "kind": "Deployment", "name": "hwlab-edge-proxy", "readyReplicas": 1, "replicas": 1 }, { "kind": "Deployment", "name": "hwlab-frpc", "readyReplicas": 1, "replicas": 1 }, { "kind": "Deployment", "name": "hwlab-gateway" }, { "kind": "Deployment", "name": "hwlab-patch-panel", "readyReplicas": 1, "replicas": 1 }, { "kind": "Deployment", "name": "hwlab-router", "readyReplicas": 1, "replicas": 1 }, { "kind": "Deployment", "name": "hwlab-tunnel-client", "readyReplicas": 1, "replicas": 1 }, { "kind": "Job", "name": "hwlab-agent-worker-template" }, { "kind": "Job", "name": "hwlab-cli-template" } ] }, "liveProbe": { "status": "pass", "url": "http://74.48.78.17:16667/health/live", "httpStatus": 200, "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"ok\",\"ready\":true,\"readiness\":{\"contractVersion\":\"v3\",\"ready\":true,\"status\":\"ok\",\"blockerCodes\":[],\"blockers\":[],\"components\":{\"db\":\"ready\",\"codeAgent\":\"ready\",\"runtime\":\"ready\"},\"durability\":{\"status\":\"ready\",\"ready\":true,\"adapter\":\"postgres\",\"durable\":true,\"durableRequested\":true,\"durableCapable\":true,\"runtimeStatus\":\"ready\",\"runtimeReady\":true,\"liveRuntimeEvidence\":true,\"dbLiveEvidenceObserved\":true,\"dbLiveEvidenceIsDurabilityEvidenc" } }, "blockers": [], "notes": "DEV-only result. No PROD resources, secret values, force push, heavy e2e, browser e2e, or UniDesk runtime substitute were used." }, "stdoutTail": null, "stderrTail": "", "reportPath": "reports/dev-gate/dev-deploy-report.json" } ], "liveBefore": { "status": "pass", "expectedCommit": null, "endpoints": [ { "id": "cloud-web-16666", "url": "http://74.48.78.17:16666/health/live", "status": "pass", "httpStatus": 200, "reachable": true, "identityMatches": true, "startedAt": "2026-05-23T09:40:07.823Z", "finishedAt": "2026-05-23T09:40:08.574Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "63acb59", "image": null, "imageTag": null, "observedAt": null, "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] }, { "id": "cloud-api-16667", "url": "http://74.48.78.17:16667/health/live", "status": "pass", "httpStatus": 200, "reachable": true, "identityMatches": true, "startedAt": "2026-05-23T09:40:07.825Z", "finishedAt": "2026-05-23T09:40:11.666Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "ok", "ready": true, "observedCommit": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "observedAt": "2026-05-23T09:40:09.312Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] } ], "summary": { "checked": 2, "reachable": 2, "identityMatches": 2, "commitMatches": null, "ports": [ 16666, 16667 ] } }, "liveVerify": { "status": "pass", "expectedCommit": "63acb59", "endpoints": [ { "id": "cloud-web-16666", "url": "http://74.48.78.17:16666/health/live", "status": "pass", "httpStatus": 200, "reachable": true, "identityMatches": true, "startedAt": "2026-05-23T09:40:35.398Z", "finishedAt": "2026-05-23T09:40:36.584Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": "63acb59", "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "63acb59", "image": null, "imageTag": null, "observedAt": null, "serviceMatches": true, "environmentMatches": true, "commitMatches": true, "blockerCodes": [] }, { "id": "cloud-api-16667", "url": "http://74.48.78.17:16667/health/live", "status": "pass", "httpStatus": 200, "reachable": true, "identityMatches": true, "startedAt": "2026-05-23T09:40:35.399Z", "finishedAt": "2026-05-23T09:40:36.592Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": "63acb59", "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "ok", "ready": true, "observedCommit": "63acb59", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "imageTag": "63acb59", "observedAt": "2026-05-23T09:40:36.263Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": true, "blockerCodes": [] } ], "summary": { "checked": 2, "reachable": 2, "identityMatches": 2, "commitMatches": 2, "ports": [ 16666, 16667 ] } }, "reportPaths": { "transaction": "reports/dev-gate/dev-cd-apply.json", "artifacts": "reports/dev-gate/dev-artifacts.json", "deployApply": "reports/dev-gate/dev-deploy-report.json" }, "safety": { "prodTouched": false, "secretValuesRead": false, "secretValuesPrinted": false, "manualDbWrite": false, "oldPublicPortsUsed": false, "mutationAttempted": true, "singleLock": "Lease/hwlab-dev/hwlab-dev-cd-lock" } }, "blockers": [], "notes": "DEV-only CD transaction evidence. This does not claim M3 PASS or runtime durability." }