{ "$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": "e6d4bd5", "acceptanceLevel": "dev_cd_apply", "devOnly": true, "prodDisabled": true, "status": "blocked", "generatedAt": "2026-05-23T21:48:18.309Z", "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": "blocked", "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": "blocked", "requirements": [ "DEV CD apply must force KUBECONFIG=/etc/rancher/k3s/k3s.yaml and verify native node d601 before any Lease, Job, apply, or rollout side effect.", "DEV CD apply must reject docker-desktop, desktop-control-plane, 127.0.0.1:11700, bare kubectl ambiguity, and second hwlab-dev control-plane signals before mutation.", "DEV CD apply must verify required SecretRef existence and key names without reading or printing Secret values.", "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.", "DEV DB role/database provisioning and runtime migration must run through repo-owned commands before workload apply.", "deploy/deploy.json, artifact catalog, and workloads must converge before apply.", "When deploy/deploy.json already points to a published promotion commit, HEAD may be a later control commit and the transaction must consume that promotion without republishing HEAD.", "Public 16666 and 16667 live health plus M3 durable postflight must be recorded in this report." ], "summary": "One or more DEV CD transaction preconditions failed." }, "transaction": { "transactionId": "35e3d897-c90f-42bf-b41c-c1b042ffbae9", "ownerTaskId": "DC-DCSN-P0-2026-003-HWLAB-DEV-CD-ROLLOUT-20260523T2138Z", "targetNamespace": "hwlab-dev", "lockName": "hwlab-dev-cd-lock", "lockBackend": "Lease", "startedAt": "2026-05-23T21:37:52.909Z", "finishedAt": "2026-05-23T21:48:18.309Z", "ttlSeconds": 3600, "phases": [ { "phase": "publishing", "status": "entered", "at": "2026-05-23T21:37:54.541Z" }, { "phase": "applying", "status": "entered", "at": "2026-05-23T21:47:57.434Z" }, { "phase": "verifying", "status": "entered", "at": "2026-05-23T21:48:14.217Z" }, { "phase": "released", "status": "released", "at": "2026-05-23T21:48:18.309Z" } ], "release": { "status": "released", "command": "kubectl -n hwlab-dev replace -f - -o json", "lock": { "lockBackend": "Lease", "lockName": "hwlab-dev-cd-lock", "resourceVersion": "1495698", "holderIdentity": "", "promotionCommit": "e6d4bd5", "deployJsonHash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e", "ownerTaskId": "DC-DCSN-P0-2026-003-HWLAB-DEV-CD-ROLLOUT-20260523T2138Z", "transactionId": "35e3d897-c90f-42bf-b41c-c1b042ffbae9", "phase": "released", "startedAt": "2026-05-23T21:37:53.176000Z", "updatedAt": "2026-05-23T21:48:18.271000Z", "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-23T21:37:53.244Z", "finishedAt": "2026-05-23T21:37:53.799Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "b02ac5b", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "imageTag": "b02ac5b", "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-23T21:37:53.246Z", "finishedAt": "2026-05-23T21:37:54.477Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "degraded", "ready": false, "observedCommit": "b02ac5b", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b", "imageTag": "b02ac5b", "observedAt": "2026-05-23T21:37:53.704Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [ "stdio_protocol_not_wired" ] } ], "summary": { "checked": 2, "reachable": 2, "identityMatches": 2, "commitMatches": null, "ports": [ 16666, 16667 ] } }, "targetNamespace": "hwlab-dev", "targetRef": "origin/main", "releasedAt": "2026-05-23T21:48:18.271000Z", "releaseStatus": "blocked", "staleLockBrokenAt": null, "staleLockPrevious": null } } }, "devCdApply": { "mode": "apply", "target": { "ref": "origin/main", "promotionCommit": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "shortCommitId": "e6d4bd5", "promotionSource": "target-ref", "publishRequired": true, "controlRef": { "ref": "origin/main", "commitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "shortCommitId": "e6d4bd5" }, "headCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "headMatchesTarget": true, "desiredStateCheck": null, "artifactBoundary": { "status": "degraded", "controlCommit": { "commitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "shortCommitId": "e6d4bd5" }, "artifactMergeCommit": { "commitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "shortCommitId": "e6d4bd5", "isMergeCommit": true, "parents": [ "cb79b9dac7815dd86d49e9b0c44502064713a37a", "3c8a146eee8286315d11a60ac1a42de02c24e546" ], "promotionParent": "cb79b9dac7815dd86d49e9b0c44502064713a37a", "artifactParent": "3c8a146eee8286315d11a60ac1a42de02c24e546", "promotionParentMatches": false, "changedPaths": [ "deploy/deploy.json", "deploy/k8s/base/workloads.yaml" ] }, "artifactCommit": { "commitId": "3c8a146eee8286315d11a60ac1a42de02c24e546", "shortCommitId": "3c8a146", "parents": [ "cb79b9dac7815dd86d49e9b0c44502064713a37a" ], "promotionParentMatches": false }, "desiredState": { "deployCommitId": "e6d4bd5", "deployJsonHash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e", "catalogCommitId": "e6d4bd5", "catalogHash": "sha256:6195e2ed01c7f0fcad407b454b306b07a81270f8b6e79119158af295c6fd744e", "reportCommitId": "b02ac5b", "reportSourceCommitId": "b02ac5becad13aeeab0d5cb7d8f01300bccb78c2", "reportHash": "sha256:2679ba1b2f89d554e99031fd5fa7df6067a6b42ef7b3fdfc2ee04c0f1880b41b", "deployCommitMatches": true, "catalogCommitMatches": true, "reportCommitMatches": false, "desiredStatePaths": [ "deploy/artifact-catalog.dev.json", "deploy/deploy.json", "deploy/k8s/base/workloads.yaml", "reports/dev-gate/dev-artifacts.json" ] } }, "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:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e", "commitId": "e6d4bd5", "namespace": "hwlab-dev", "environment": "dev", "endpoint": "http://74.48.78.17:16667", "manifest": { "manifestVersion": "v1", "environment": "dev", "commitId": "e6d4bd5", "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:e6d4bd5", "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": "e6d4bd5", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "HWLAB_IMAGE_TAG": "e6d4bd5", "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": "codex-stdio", "HWLAB_CODE_AGENT_MODEL": "gpt-5.5", "HWLAB_CODE_AGENT_TIMEOUT_MS": "120000", "HWLAB_CODE_AGENT_OPENAI_BASE_URL": "http://172.26.26.227:17680/v1/responses", "HWLAB_CODE_AGENT_HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667", "HWLAB_CODE_AGENT_CODEX_STDIO_ENABLED": "1", "HWLAB_CODE_AGENT_CODEX_STDIO_SUPERVISOR": "repo-owned", "HWLAB_CODE_AGENT_WORKSPACE": "/workspace/hwlab", "HWLAB_CODE_AGENT_CODEX_WORKSPACE": "/workspace/hwlab", "HWLAB_CODE_AGENT_CODEX_SANDBOX": "workspace-write", "HWLAB_CODE_AGENT_CODEX_COMMAND": "/app/node_modules/.bin/codex", "CODEX_HOME": "/codex-home", "OPENAI_API_KEY": "secretRef:hwlab-code-agent-provider/openai-api-key", "HWLAB_CODE_AGENT_SKILLS_DIRS": "/app/skills:/root/.agents/skills:/home/ubuntu/.agents/skills" } }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "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_CLOUD_WEB_PROXY_TIMEOUT_MS": "150000", "HWLAB_COMMIT_ID": "e6d4bd5", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "HWLAB_IMAGE_TAG": "e6d4bd5" } }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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", "HWLAB_EDGE_PROXY_TIMEOUT_MS": "150000" } }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "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:e6d4bd5", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_SKILLS_COMMIT_ID": "e6d4bd5" } } ], "createdAt": "2026-05-21T00:00:00Z" } }, "after": { "path": "deploy/deploy.json", "hash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e", "commitId": "e6d4bd5", "namespace": "hwlab-dev", "environment": "dev", "endpoint": "http://74.48.78.17:16667", "manifest": { "manifestVersion": "v1", "environment": "dev", "commitId": "e6d4bd5", "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:e6d4bd5", "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": "e6d4bd5", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "HWLAB_IMAGE_TAG": "e6d4bd5", "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": "codex-stdio", "HWLAB_CODE_AGENT_MODEL": "gpt-5.5", "HWLAB_CODE_AGENT_TIMEOUT_MS": "120000", "HWLAB_CODE_AGENT_OPENAI_BASE_URL": "http://172.26.26.227:17680/v1/responses", "HWLAB_CODE_AGENT_HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667", "HWLAB_CODE_AGENT_CODEX_STDIO_ENABLED": "1", "HWLAB_CODE_AGENT_CODEX_STDIO_SUPERVISOR": "repo-owned", "HWLAB_CODE_AGENT_WORKSPACE": "/workspace/hwlab", "HWLAB_CODE_AGENT_CODEX_WORKSPACE": "/workspace/hwlab", "HWLAB_CODE_AGENT_CODEX_SANDBOX": "workspace-write", "HWLAB_CODE_AGENT_CODEX_COMMAND": "/app/node_modules/.bin/codex", "CODEX_HOME": "/codex-home", "OPENAI_API_KEY": "secretRef:hwlab-code-agent-provider/openai-api-key", "HWLAB_CODE_AGENT_SKILLS_DIRS": "/app/skills:/root/.agents/skills:/home/ubuntu/.agents/skills" } }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "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_CLOUD_WEB_PROXY_TIMEOUT_MS": "150000", "HWLAB_COMMIT_ID": "e6d4bd5", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "HWLAB_IMAGE_TAG": "e6d4bd5" } }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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:e6d4bd5", "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", "HWLAB_EDGE_PROXY_TIMEOUT_MS": "150000" } }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "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:e6d4bd5", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_SKILLS_COMMIT_ID": "e6d4bd5" } } ], "createdAt": "2026-05-21T00:00:00Z" } } }, "lock": { "acquired": true, "current": { "lockBackend": "Lease", "lockName": "hwlab-dev-cd-lock", "resourceVersion": "1495618", "holderIdentity": "DC-DCSN-P0-2026-003-HWLAB-DEV-CD-ROLLOUT-20260523T2138Z/35e3d897-c90f-42bf-b41c-c1b042ffbae9", "promotionCommit": "e6d4bd5", "deployJsonHash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e", "ownerTaskId": "DC-DCSN-P0-2026-003-HWLAB-DEV-CD-ROLLOUT-20260523T2138Z", "transactionId": "35e3d897-c90f-42bf-b41c-c1b042ffbae9", "phase": "verifying", "startedAt": "2026-05-23T21:37:53.176000Z", "updatedAt": "2026-05-23T21:48:14.132000Z", "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-23T21:37:53.244Z", "finishedAt": "2026-05-23T21:37:53.799Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "b02ac5b", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "imageTag": "b02ac5b", "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-23T21:37:53.246Z", "finishedAt": "2026-05-23T21:37:54.477Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "degraded", "ready": false, "observedCommit": "b02ac5b", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b", "imageTag": "b02ac5b", "observedAt": "2026-05-23T21:37:53.704Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [ "stdio_protocol_not_wired" ] } ], "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-23T21:37:54.541Z", "finishedAt": "2026-05-23T21:37:54.597Z", "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": "e6d4bd5", "desiredImageTag": "e6d4bd5", "artifactState": "contract-skeleton", "ciPublished": false, "registryVerified": false, "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": "codex-stdio", "runtimeProvider": "openai-responses", "backend": "hwlab-cloud-api/codex-mcp-stdio", "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": "b02ac5b", "matchesDesiredState": false, "artifactPublish": { "status": "published", "sourceCommitId": "b02ac5becad13aeeab0d5cb7d8f01300bccb78c2", "sourceMatchesDesiredState": false, "publishedCount": 13, "serviceCount": 13, "registryVerified": null, "registryCapabilitiesClassification": "degraded" } }, "services": [ { "serviceId": "hwlab-cloud-api", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "e6d4bd5", "expected": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "e6d4bd5", "expected": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-gateway", "namespace": "hwlab-dev", "container": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true }, "workloads": [ { "kind": "Deployment", "name": "hwlab-router", "namespace": "hwlab-dev", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true }, "workloads": [ { "kind": "Job", "name": "hwlab-cli-template", "namespace": "hwlab-dev", "container": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "imageTag": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "imageTag": "e6d4bd5", "digest": "not_published", "publishState": "skeleton-only", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "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-23T21:37:54.597Z", "finishedAt": "2026-05-23T21:47:57.243Z", "stdoutJson": { "status": "published", "mode": "publish", "reportPath": "reports/dev-gate/dev-artifacts.json", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryPrefix": "127.0.0.1:5000/hwlab", "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", "generatedAt": "2026-05-23T21:37:56.100Z", "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 8 hours" } ], "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, "kubeconfig": "/etc/rancher/k3s/k3s.yaml", "context": { "command": "env KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl config current-context", "ok": true, "exitCode": 0, "stdout": "in-cluster", "stderr": "", "error": null }, "canGetPods": { "command": "env KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl auth can-i get pods -n hwlab-dev", "ok": true, "exitCode": 0, "stdout": "yes", "stderr": "", "error": null }, "podCount": 13, "pulledImages": [ { "pod": "hwlab-agent-mgr-99d44c747-mfqzj", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:1457c7141f0f6ddeee04c4342e87a0cda8d95718ac64d7b009bf76832c5c7bee" }, { "pod": "hwlab-agent-skills-7f99b49598-lqjdd", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:22c1ad255a1039ca148444664563ae76209ccbb0d3e7fba27613250c938e3f5b" }, { "pod": "hwlab-box-simu-0", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:9fde14a98f0850e139435cf7b473219c3d43231acd2f65b2410e8e3d0f49b858" }, { "pod": "hwlab-box-simu-1", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:9fde14a98f0850e139435cf7b473219c3d43231acd2f65b2410e8e3d0f49b858" }, { "pod": "hwlab-cloud-api-57cfcfc587-kdvg9", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:33b2075ed01c5cb77d8b5bbd3cc8e4acaa1dbd8566d091e15e663c43ff63af31" }, { "pod": "hwlab-cloud-web-67c684947b-lkvtj", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:a1c95841f6f2bd913c82751f603c164cbb8bfbfd186d14f98d0f2f91c17cd84f" }, { "pod": "hwlab-edge-proxy-85db66bcc9-mv8pv", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:eb0a165cc57428741a59ef953c8596631f9d85bc51117d16f16d5847803ebfef" }, { "pod": "hwlab-frpc-59f57d479c-tgjhl", "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:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:4cfb1315aa93a11ea480ddb0da89994acc344834499d6cf322bbf0ff4b0c3137" }, { "pod": "hwlab-gateway-simu-1", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:4cfb1315aa93a11ea480ddb0da89994acc344834499d6cf322bbf0ff4b0c3137" }, { "pod": "hwlab-patch-panel-7cd9d9d597-kwnm6", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:2abe0cb87c3eef6d080a3d60bdd39037df89269b0b730a704a52e12405dceaea" }, { "pod": "hwlab-router-65dc5579fb-d2r8l", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:fcfa1c1f5231e48d07113fbbbec525b16cc5431b38d4fbacc263f517ad0b9120" }, { "pod": "hwlab-tunnel-client-54d968477d-mf2qk", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:687826d894137c5c471124f6f3cffdb1165acf23c80dc2cc6fd5bca98434b6e7" } ], "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": [], "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": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "imageTag": "e6d4bd5", "registryTarget": "127.0.0.1:5000/hwlab", "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", "generatedAt": "2026-05-23T21:37:56.100Z", "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 8 hours" } ], "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, "kubeconfig": "/etc/rancher/k3s/k3s.yaml", "context": { "command": "env KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl config current-context", "ok": true, "exitCode": 0, "stdout": "in-cluster", "stderr": "", "error": null }, "canGetPods": { "command": "env KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl auth can-i get pods -n hwlab-dev", "ok": true, "exitCode": 0, "stdout": "yes", "stderr": "", "error": null }, "podCount": 13, "pulledImages": [ { "pod": "hwlab-agent-mgr-99d44c747-mfqzj", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:1457c7141f0f6ddeee04c4342e87a0cda8d95718ac64d7b009bf76832c5c7bee" }, { "pod": "hwlab-agent-skills-7f99b49598-lqjdd", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:22c1ad255a1039ca148444664563ae76209ccbb0d3e7fba27613250c938e3f5b" }, { "pod": "hwlab-box-simu-0", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:9fde14a98f0850e139435cf7b473219c3d43231acd2f65b2410e8e3d0f49b858" }, { "pod": "hwlab-box-simu-1", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:9fde14a98f0850e139435cf7b473219c3d43231acd2f65b2410e8e3d0f49b858" }, { "pod": "hwlab-cloud-api-57cfcfc587-kdvg9", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:33b2075ed01c5cb77d8b5bbd3cc8e4acaa1dbd8566d091e15e663c43ff63af31" }, { "pod": "hwlab-cloud-web-67c684947b-lkvtj", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:a1c95841f6f2bd913c82751f603c164cbb8bfbfd186d14f98d0f2f91c17cd84f" }, { "pod": "hwlab-edge-proxy-85db66bcc9-mv8pv", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:eb0a165cc57428741a59ef953c8596631f9d85bc51117d16f16d5847803ebfef" }, { "pod": "hwlab-frpc-59f57d479c-tgjhl", "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:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:4cfb1315aa93a11ea480ddb0da89994acc344834499d6cf322bbf0ff4b0c3137" }, { "pod": "hwlab-gateway-simu-1", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:4cfb1315aa93a11ea480ddb0da89994acc344834499d6cf322bbf0ff4b0c3137" }, { "pod": "hwlab-patch-panel-7cd9d9d597-kwnm6", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:2abe0cb87c3eef6d080a3d60bdd39037df89269b0b730a704a52e12405dceaea" }, { "pod": "hwlab-router-65dc5579fb-d2r8l", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:fcfa1c1f5231e48d07113fbbbec525b16cc5431b38d4fbacc263f517ad0b9120" }, { "pod": "hwlab-tunnel-client-54d968477d-mf2qk", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:b02ac5b", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:687826d894137c5c471124f6f3cffdb1165acf23c80dc2cc6fd5bca98434b6e7" } ], "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": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-mgr", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-router", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-cli", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f", "digestStatus": "real", "status": "published", "notPublishedReason": null } ] }, "services": [ { "serviceId": "hwlab-cloud-api", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d", "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "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": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/index.html", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/index.html", "status": "match" }, { "kind": "runtime", "path": "styles.css", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/styles.css", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/styles.css", "status": "match" }, { "kind": "runtime", "path": "auth.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/auth.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/auth.mjs", "status": "match" }, { "kind": "runtime", "path": "app.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/app.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/app.mjs", "status": "match" }, { "kind": "runtime", "path": "code-agent-facts.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/code-agent-facts.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/code-agent-facts.mjs", "status": "match" }, { "kind": "runtime", "path": "code-agent-status.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/code-agent-status.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/code-agent-status.mjs", "status": "match" }, { "kind": "runtime", "path": "code-agent-m3-evidence.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/code-agent-m3-evidence.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/code-agent-m3-evidence.mjs", "status": "match" }, { "kind": "runtime", "path": "live-status.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/live-status.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/live-status.mjs", "status": "match" }, { "kind": "runtime", "path": "gate-summary.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/gate-summary.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/gate-summary.mjs", "status": "match" }, { "kind": "runtime", "path": "runtime.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/runtime.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/runtime.mjs", "status": "match" }, { "kind": "runtime", "path": "wiring-status.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/wiring-status.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/wiring-status.mjs", "status": "match" }, { "kind": "runtime", "path": "workbench-hardware-panel.mjs", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/workbench-hardware-panel.mjs", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/workbench-hardware-panel.mjs", "status": "match" }, { "kind": "runtime", "path": "help.md", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/help.md", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/help.md", "status": "match" }, { "kind": "runtime", "path": "third_party/marked/marked.esm.js", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/third_party/marked/marked.esm.js", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/third_party/marked/marked.esm.js", "status": "match" }, { "kind": "runtime", "path": "third_party/marked/LICENSE", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/third_party/marked/LICENSE", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/third_party/marked/LICENSE", "status": "match" }, { "kind": "alias", "path": "gate/index.html", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/index.html", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/gate/index.html", "status": "match" }, { "kind": "alias", "path": "diagnostics/gate/index.html", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/index.html", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/diagnostics/gate/index.html", "status": "match" }, { "kind": "alias", "path": "help/index.html", "sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/index.html", "distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/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:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35", "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336", "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0", "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a", "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f", "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5", "notPublishedReason": null }, { "serviceId": "hwlab-router", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f", "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a", "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd", "notPublishedReason": null }, { "serviceId": "hwlab-cli", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f", "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f", "notPublishedReason": null } ], "blockers": [] }, "stdoutTail": null, "stderrTail": "\"event\":\"publish_start\",\"serviceId\":\"hwlab-tunnel-client\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-tunnel-client\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5\",\"digest\":\"sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5\",\"digest\":\"sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5\",\"digest\":\"sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5\",\"digest\":\"sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f\"}", "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 e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96 --publish-report reports/dev-gate/dev-artifacts.json", "code": 0, "startedAt": "2026-05-23T21:47:57.244Z", "finishedAt": "2026-05-23T21:47:57.286Z", "stdoutJson": { "status": "published", "targetRef": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "artifactCommitId": "e6d4bd5", "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:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "imageTag": "e6d4bd5", "buildCreatedAt": "2026-05-23T21:37:56.106Z", "digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f", "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-23T21:47:57.286Z", "finishedAt": "2026-05-23T21:47:57.319Z", "stdoutJson": null, "stdoutTail": "validated 13 DEV artifact catalog services at e6d4bd5 (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 e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96 --check --pretty", "code": 0, "startedAt": "2026-05-23T21:47:57.319Z", "finishedAt": "2026-05-23T21:47:57.365Z", "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": "e6d4bd5", "desiredImageTag": "e6d4bd5", "artifactState": "published", "ciPublished": true, "registryVerified": true, "services": 13, "workloadContainers": 13, "presentMirrorCount": 14, "diagnostics": 0, "blockers": 0, "targetConvergence": "already_promoted" }, "target": { "targetRef": null, "promotionCommit": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "commitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "shortCommitId": "e6d4bd5", "tag": "e6d4bd5", "tagSource": "promotion-commit-short", "acceptedCurrentMain": null, "comparisonCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "comparisonTag": "e6d4bd5", "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 e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96 --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": "codex-stdio", "runtimeProvider": "openai-responses", "backend": "hwlab-cloud-api/codex-mcp-stdio", "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": "e6d4bd5", "matchesDesiredState": true, "artifactPublish": { "status": "published", "sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "workloadImages": [ { "workload": "hwlab-cloud-api", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5" } ] } }, { "serviceId": "hwlab-cloud-web", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "workloadImages": [ { "workload": "hwlab-cloud-web", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5" } ] } }, { "serviceId": "hwlab-agent-mgr", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "workloadImages": [ { "workload": "hwlab-agent-mgr", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5" } ] } }, { "serviceId": "hwlab-agent-worker", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "workloadImages": [ { "workload": "hwlab-agent-worker-template", "container": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5" } ] } }, { "serviceId": "hwlab-gateway", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "workloadImages": [ { "workload": "hwlab-gateway", "container": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5" } ] } }, { "serviceId": "hwlab-gateway-simu", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "workloadImages": [ { "workload": "hwlab-gateway-simu", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5" } ] } }, { "serviceId": "hwlab-box-simu", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "workloadImages": [ { "workload": "hwlab-box-simu", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5" } ] } }, { "serviceId": "hwlab-patch-panel", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "workloadImages": [ { "workload": "hwlab-patch-panel", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5" } ] } }, { "serviceId": "hwlab-router", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "workloadImages": [ { "workload": "hwlab-router", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5" } ] } }, { "serviceId": "hwlab-tunnel-client", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "workloadImages": [ { "workload": "hwlab-tunnel-client", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5" } ] } }, { "serviceId": "hwlab-edge-proxy", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "workloadImages": [ { "workload": "hwlab-edge-proxy", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5" } ] } }, { "serviceId": "hwlab-cli", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "workloadImages": [ { "workload": "hwlab-cli-template", "container": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5" } ] } }, { "serviceId": "hwlab-agent-skills", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f", "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:e6d4bd5", "imageTag": "e6d4bd5", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "e6d4bd5", "expected": "e6d4bd5", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96", "targetImageTag": "e6d4bd5", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "workloadImages": [ { "workload": "hwlab-agent-skills", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5" } ] } } ], "diagnostics": [] }, "stdoutTail": null, "stderrTail": "", "reportPath": null }, { "id": "runtime-db-provisioning", "phase": "applying", "status": "pass", "command": "kubectl -n hwlab-dev apply/wait/logs job/hwlab-runtime-provision-35e3d897", "code": 0, "startedAt": "2026-05-23T21:47:57.434Z", "finishedAt": "2026-05-23T21:48:04.828Z", "stdoutJson": { "issue": "pikasTech/HWLAB#311", "mode": "apply", "generatedAt": "2026-05-23T21:48:01.780Z", "target": { "environment": "dev", "namespace": "hwlab-dev", "prodAllowed": false, "dbUrlEnv": "HWLAB_CLOUD_DB_URL", "dbUrlSecretRef": { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url" }, "adminUrlEnv": "HWLAB_CLOUD_DB_ADMIN_URL", "adminUrlSecretRef": { "env": "HWLAB_CLOUD_DB_ADMIN_URL", "secretName": "hwlab-cloud-api-dev-db-admin", "secretKey": "admin-url" }, "dbEndpointAuthority": "secret-url-host" }, "db": { "targetUrlPresent": true, "targetUrlValueRedacted": true, "targetEndpointRedacted": true, "targetEndpointClass": "secret-url-host", "targetParseStatus": "ready", "targetErrorCode": null, "targetRoleNamePresent": true, "targetDatabaseNamePresent": true, "targetDatabaseAllowed": true, "targetPasswordPresent": true, "sslMode": "disable", "sslModeSecret": false, "adminUrlPresent": true, "adminUrlValueRedacted": true, "adminEndpointRedacted": true, "dbUrlSecretRef": { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url" }, "adminUrlSecretRef": { "env": "HWLAB_CLOUD_DB_ADMIN_URL", "secretName": "hwlab-cloud-api-dev-db-admin", "secretKey": "admin-url" }, "endpointAuthority": "secret-url-host" }, "applyBoundary": { "defaultMode": "check", "mode": "apply", "liveDbReads": true, "liveDbWrites": true, "requiresForLiveDbRead": [ "--confirm-dev", "HWLAB_CLOUD_DB_URL from hwlab-cloud-api-dev-db/database-url", "HWLAB_CLOUD_DB_ADMIN_URL from hwlab-cloud-api-dev-db-admin/admin-url unless runtime readiness already proves auth" ], "requiresForApply": [ "--apply", "--confirm-dev", "--confirmed-non-production", "HWLAB_CLOUD_DB_URL from hwlab-cloud-api-dev-db/database-url", "HWLAB_CLOUD_DB_ADMIN_URL from hwlab-cloud-api-dev-db-admin/admin-url" ], "writeScope": [ "DEV Postgres target role named by the redacted cloud-api DB URL", "DEV Postgres target database named by the redacted cloud-api DB URL", "DEV target DB CONNECT and public schema CREATE/USAGE grants for that role" ], "noWriteScope": [ "Kubernetes Secret resources", "PROD", "service restarts", "schema migrations", "M3/M4/M5 acceptance" ], "forbidden": [ "printing DB URLs, passwords, tokens, Secret values, or kubeconfig material", "manual psql or node stdin database writes", "mutating PROD" ] }, "safety": { "devOnly": true, "environment": "dev", "targetNamespace": "hwlab-dev", "prodAllowed": false, "sourceStoresSecretValues": false, "printsSecretValues": false, "secretValuesPrinted": false, "dbUrlValueRedacted": true, "adminUrlValueRedacted": true, "endpointRedacted": true, "readsKubernetesSecrets": false, "writesKubernetesSecrets": false, "liveDbWrites": true, "fixtureEvidenceAllowed": false }, "actions": { "liveDbReadAttempted": true, "liveDbWriteAttempted": true, "adminInspectionAttempted": false, "adminWriteAttempted": true, "appRuntimeReadinessAttempted": true, "roleCreated": false, "roleExisted": true, "rolePasswordSynchronized": true, "databaseCreated": false, "databaseExisted": true, "databaseConnectGranted": true, "schemaPrivilegesGranted": true, "readinessVerified": true }, "provisioning": { "targetRole": { "checked": true, "exists": true, "created": false, "ready": true, "targetNamePresent": true, "inferredFromRuntime": true }, "targetDatabase": { "checked": true, "exists": true, "created": false, "ready": true, "targetNamePresent": true, "inferredFromRuntime": true }, "privileges": { "checked": true, "ready": true, "databaseConnectGranted": true, "schemaPrivilegesGranted": true }, "ready": true }, "runtime": { "adapter": "postgres", "durable": true, "durableRequested": true, "ready": true, "status": "ready", "blocker": null, "liveRuntimeEvidence": true, "fixtureEvidence": false, "connection": { "queryAttempted": true, "queryResult": "durable_readiness_ready", "endpointRedacted": true, "valueRedacted": true, "errorCode": null }, "schema": { "checked": true, "ready": true, "missingTables": [], "missingColumns": [] }, "migration": { "checked": true, "ready": true, "requiredMigrationId": "0001_cloud_core_skeleton", "appliedMigrationId": "0001_cloud_core_skeleton", "missing": false }, "gates": { "ssl": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "auth": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "schema": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "migration": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "durability": { "checked": true, "ready": true, "status": "ready", "blocker": null } } }, "gates": { "ssl": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" }, "auth": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" }, "role": { "checked": false, "ready": false, "status": "not_checked", "blocker": null, "summary": "role existence requires DEV admin catalog inspection" }, "database": { "checked": false, "ready": false, "status": "not_checked", "blocker": null, "summary": "database existence requires DEV admin catalog inspection" }, "schema": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" }, "migration": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" }, "durability": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" } }, "downstreamRuntimeGates": { "ssl": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "auth": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "schema": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "migration": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "durability": { "checked": true, "ready": true, "status": "ready", "blocker": null } }, "blockers": [], "safetyRefusal": false, "conclusion": { "status": "ready", "summary": "DEV DB role/database provisioning completed without printing secret values.", "blockerCount": 0 } }, "stdoutTail": null, "stderrTail": "", "reportPath": "reports/dev-gate/dev-runtime-provisioning-report.json", "k8sJob": { "jobName": "hwlab-runtime-provision-35e3d897", "phase": "complete", "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "secretRefsOnly": true, "secretValuesRead": false, "secretValuesPrinted": false } }, { "id": "runtime-db-migration", "phase": "applying", "status": "pass", "command": "kubectl -n hwlab-dev apply/wait/logs job/hwlab-runtime-migrate-35e3d897", "code": 0, "startedAt": "2026-05-23T21:48:04.828Z", "finishedAt": "2026-05-23T21:48:11.243Z", "stdoutJson": { "issue": "pikasTech/HWLAB#164", "mode": "apply", "generatedAt": "2026-05-23T21:48:05.450Z", "target": { "environment": "dev", "namespace": "hwlab-dev", "prodAllowed": false, "dbUrlEnv": "HWLAB_CLOUD_DB_URL", "dbUrlSecretRef": { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url" }, "dbEndpointAuthority": "secret-url-host" }, "migration": { "id": "0001_cloud_core_skeleton", "path": "internal/db/migrations/0001_cloud_core_skeleton.sql", "sha256": "814c654ba17a4f515b0179940ee248462648d17c814ec76c034f398bd92c7a97", "schemaVersion": "runtime-durable-postgres-v1", "ledgerTable": "hwlab_schema_migrations", "runtimeAdapter": "postgres" }, "db": { "requiredEnv": [ { "name": "HWLAB_CLOUD_DB_URL", "present": true, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CLOUD_DB_SSL_MODE", "present": true, "redacted": false, "source": "runtime-env" } ], "urlPresent": true, "urlValueRedacted": true, "sslMode": "disable", "sslModeSecret": false, "secretRef": { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url" }, "endpointAuthority": "secret-url-host", "optionalPublicDnsAliasRequired": false }, "sourceCheck": { "ready": true, "checked": true, "migrationPath": "internal/db/migrations/0001_cloud_core_skeleton.sql", "requiredMigrationId": "0001_cloud_core_skeleton", "requiredSchemaVersion": "runtime-durable-postgres-v1", "requiredTables": [ "gateway_sessions", "box_resources", "box_capabilities", "hardware_operations", "audit_events", "evidence_records" ], "requiredLedgerTable": "hwlab_schema_migrations", "missing": [], "connectsToDatabase": false, "fixtureEvidence": false }, "applyBoundary": { "defaultMode": "check", "mode": "apply", "liveDbReads": true, "liveDbWrites": true, "requiresForLiveDbRead": [ "--confirm-dev", "HWLAB_CLOUD_DB_URL from hwlab-cloud-api-dev-db/database-url" ], "requiresForApply": [ "--apply", "--confirm-dev", "--confirmed-non-production", "HWLAB_CLOUD_DB_URL from hwlab-cloud-api-dev-db/database-url" ], "writeScope": [ "DEV Postgres schema objects declared by internal/db/migrations/0001_cloud_core_skeleton.sql", "DEV hwlab_schema_migrations ledger row 0001_cloud_core_skeleton" ], "noWriteScope": [ "Kubernetes Secret resources", "PROD", "service restarts", "M3/M4/M5 acceptance" ], "forbidden": [ "printing DB URLs, passwords, tokens, Secret values, or kubeconfig material", "using fixture output as DEV-LIVE runtime evidence", "mutating PROD" ] }, "safety": { "devOnly": true, "environment": "dev", "targetNamespace": "hwlab-dev", "prodAllowed": false, "sourceStoresSecretValues": false, "printsSecretValues": false, "dbUrlValueRedacted": true, "endpointRedacted": true, "readsKubernetesSecrets": false, "writesKubernetesSecrets": false, "liveDbWrites": true, "fixtureEvidenceAllowed": false }, "actions": { "sourceValidated": true, "liveDbReadAttempted": true, "liveDbWriteAttempted": true, "migrationApplied": true, "readinessVerified": true }, "gates": { "auth": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" }, "schema": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" }, "migration": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" }, "readiness": { "checked": true, "ready": true, "status": "ready", "blocker": null, "summary": "ready" } }, "blockers": [], "safetyRefusal": false, "runtime": { "adapter": "postgres", "durable": true, "durableRequested": true, "ready": true, "status": "ready", "blocker": null, "liveRuntimeEvidence": true, "fixtureEvidence": false, "connection": { "queryAttempted": true, "queryResult": "durable_readiness_ready", "endpointRedacted": true, "valueRedacted": true, "errorCode": null }, "schema": { "checked": true, "ready": true, "requiredTables": [ "gateway_sessions", "box_resources", "box_capabilities", "hardware_operations", "audit_events", "evidence_records" ], "missingTables": [], "missingColumns": [] }, "migration": { "checked": true, "ready": true, "table": "hwlab_schema_migrations", "requiredMigrationId": "0001_cloud_core_skeleton", "requiredSchemaVersion": "runtime-durable-postgres-v1", "appliedMigrationId": "0001_cloud_core_skeleton", "appliedSchemaVersion": "runtime-durable-postgres-v1", "missing": false } }, "conclusion": { "status": "ready", "summary": "DEV runtime migration applied and durable runtime readiness was verified without printing secret values.", "blockerCount": 0 } }, "stdoutTail": null, "stderrTail": "", "reportPath": "reports/dev-gate/dev-runtime-migration-report.json", "k8sJob": { "jobName": "hwlab-runtime-migrate-35e3d897", "phase": "complete", "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "secretRefsOnly": true, "secretValuesRead": false, "secretValuesPrinted": false } }, { "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 --kubeconfig /etc/rancher/k3s/k3s.yaml", "code": 0, "startedAt": "2026-05-23T21:48:11.243Z", "finishedAt": "2026-05-23T21:48:14.131Z", "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": "e6d4bd5", "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-23T21:48:14.125Z", "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: e6d4bd5", "namespace: hwlab-dev", "workloads planned: 13", "kubectl executor: /usr/local/bin/kubectl", "kubectl kubeconfig source: flag:--kubeconfig", "kubectl kubeconfig: /etc/rancher/k3s/k3s.yaml", "live health: pass", "code agent provider desired-state: pass", "code agent provider live env before apply: blocked", "template job replacements: 2", "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": "flag:--kubeconfig", "writeScope": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml 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=/etc/rancher/k3s/k3s.yaml 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": "e6d4bd5", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "sourceCommitId": "e6d4bd5", "serviceCommitIds": [ "e6d4bd5" ], "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] }, { "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:e6d4bd5" } ] } ], "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:b02ac5b", "newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "oldImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:b02ac5b" } ], "newImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5" } ], "replace": true, "result": "replaced", "reason": "Live suspended template Job was deleted and recreated by kubectl apply.", "deleteCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found=true", "deleteStdout": "job.batch \"hwlab-agent-worker-template\" deleted from hwlab-dev namespace", "deleteStderr": "" }, { "namespace": "hwlab-dev", "jobName": "hwlab-cli-template", "allowed": true, "desiredSuspended": true, "liveExists": true, "liveSuspended": true, "oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:b02ac5b", "newImage": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "oldImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:b02ac5b" } ], "newImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5" } ], "replace": true, "result": "replaced", "reason": "Live suspended template Job was deleted and recreated by kubectl apply.", "deleteCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found=true", "deleteStdout": "job.batch \"hwlab-cli-template\" deleted from hwlab-dev namespace", "deleteStderr": "" } ], "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:e6d4bd5", "oldImages": [], "newImages": [ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5" } ], "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:e6d4bd5", "oldImages": [], "newImages": [ { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5" } ], "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": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "41", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageMatchesDesired": true, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "e6d4bd5", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "HWLAB_IMAGE_TAG": "e6d4bd5" }, "liveRuntimeEnv": { "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "e6d4bd5", "actual": "e6d4bd5", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "e6d4bd5", "actual": "e6d4bd5", "status": "match" } ], "drift": [] }, "runtimeEnvMatchesDesired": true, "runtimeEnvDrift": [], "verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", "readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", "kubeconfig": "/etc/rancher/k3s/k3s.yaml", "kubeconfigSource": "flag:--kubeconfig" }, "cloudWebRolloutBeforeApply": { "serviceId": "hwlab-cloud-web", "namespace": "hwlab-dev", "status": "observed", "observationPhase": "before_apply", "sourceCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "40", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "imageMatchesDesired": false, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "e6d4bd5", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "HWLAB_IMAGE_TAG": "e6d4bd5" }, "liveRuntimeEnv": { "status": "drift", "matchesDesired": false, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "e6d4bd5", "actual": "b02ac5b", "status": "drift" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "status": "drift" }, { "name": "HWLAB_IMAGE_TAG", "expected": "e6d4bd5", "actual": "b02ac5b", "status": "drift" } ], "drift": [ { "name": "HWLAB_COMMIT_ID", "expected": "e6d4bd5", "actual": "b02ac5b", "status": "drift" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "status": "drift" }, { "name": "HWLAB_IMAGE_TAG", "expected": "e6d4bd5", "actual": "b02ac5b", "status": "drift" } ] }, "runtimeEnvMatchesDesired": false, "runtimeEnvDrift": [ { "name": "HWLAB_COMMIT_ID", "expected": "e6d4bd5", "actual": "b02ac5b", "status": "drift" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "status": "drift" }, { "name": "HWLAB_IMAGE_TAG", "expected": "e6d4bd5", "actual": "b02ac5b", "status": "drift" } ], "verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", "readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", "kubeconfig": "/etc/rancher/k3s/k3s.yaml", "kubeconfigSource": "flag:--kubeconfig" }, "cloudWebRolloutAfterApply": { "serviceId": "hwlab-cloud-web", "namespace": "hwlab-dev", "status": "observed", "observationPhase": "after_apply", "sourceCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageTag": "e6d4bd5", "digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "41", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "imageMatchesDesired": true, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "e6d4bd5", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "HWLAB_IMAGE_TAG": "e6d4bd5" }, "liveRuntimeEnv": { "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "e6d4bd5", "actual": "e6d4bd5", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "e6d4bd5", "actual": "e6d4bd5", "status": "match" } ], "drift": [] }, "runtimeEnvMatchesDesired": true, "runtimeEnvDrift": [], "verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", "readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", "kubeconfig": "/etc/rancher/k3s/k3s.yaml", "kubeconfigSource": "flag:--kubeconfig" }, "codeAgentProvider": { "desiredState": { "contractVersion": "v1", "environment": "dev", "provider": "codex-stdio", "runtimeProvider": "openai-responses", "backend": "hwlab-cloud-api/codex-mcp-stdio", "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": "blocked", "readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json", "kubeconfig": "/etc/rancher/k3s/k3s.yaml", "expectedSecretRef": "hwlab-code-agent-provider/openai-api-key", "expectedEgressTarget": "dev-egress-proxy", "secretValuesRead": false, "kubernetesSecretDataRead": false, "valuesRedacted": true, "contractVersion": "v1", "environment": "dev", "provider": "codex-stdio", "runtimeProvider": "openai-responses", "backend": "hwlab-cloud-api/codex-mcp-stdio", "model": "gpt-5.5", "ready": false, "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": [ { "name": "HWLAB_CODE_AGENT_PROVIDER", "expected": "codex-stdio", "redacted": false } ], "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=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json", "kubeconfig": "/etc/rancher/k3s/k3s.yaml", "expectedSecretRef": "hwlab-code-agent-provider/openai-api-key", "expectedEgressTarget": "dev-egress-proxy", "secretValuesRead": false, "kubernetesSecretDataRead": false, "valuesRedacted": true, "contractVersion": "v1", "environment": "dev", "provider": "codex-stdio", "runtimeProvider": "openai-responses", "backend": "hwlab-cloud-api/codex-mcp-stdio", "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=/etc/rancher/k3s/k3s.yaml 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 configured\ndeployment.apps/hwlab-agent-skills configured\ndeployment.apps/hwlab-cloud-api configured\ndeployment.apps/hwlab-cloud-web configured\ndeployment.apps/hwlab-edge-proxy configured\ndeployment.apps/hwlab-gateway configured\ndeployment.apps/hwlab-patch-panel configured\ndeployment.apps/hwlab-router configured\ndeployment.apps/hwlab-tunnel-client configured\nstatefulset.apps/hwlab-box-simu configured\nstatefulset.apps/hwlab-gateway-simu configured\njob.batch/hwlab-agent-worker-template created\njob.batch/hwlab-cli-template created", "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=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get pods,services,configmaps,deployments,jobs -o wide", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployments -o json" ], "deploymentRollbackCommands": [ "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-api", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-web", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-mgr", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-gateway", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-patch-panel", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-router", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-tunnel-client", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-edge-proxy", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-skills" ], "jobCleanupCommands": [ "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found", "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found" ], "postRollbackChecks": [ "KUBECONFIG=/etc/rancher/k3s/k3s.yaml 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": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5", "digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d", "publishState": "published" }, { "serviceId": "hwlab-cloud-web", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da", "publishState": "published" }, { "serviceId": "hwlab-agent-mgr", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35", "publishState": "published" }, { "serviceId": "hwlab-agent-worker", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336", "publishState": "published" }, { "serviceId": "hwlab-gateway", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0", "publishState": "published" }, { "serviceId": "hwlab-gateway-simu", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a", "publishState": "published" }, { "serviceId": "hwlab-box-simu", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f", "publishState": "published" }, { "serviceId": "hwlab-patch-panel", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5", "publishState": "published" }, { "serviceId": "hwlab-router", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f", "publishState": "published" }, { "serviceId": "hwlab-tunnel-client", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a", "publishState": "published" }, { "serviceId": "hwlab-edge-proxy", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd", "publishState": "published" }, { "serviceId": "hwlab-cli", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f", "publishState": "published" }, { "serviceId": "hwlab-agent-skills", "deployCommitId": "e6d4bd5", "catalogCommitId": "e6d4bd5", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f", "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:e6d4bd5", "kind": "Deployment", "name": "hwlab-cloud-api" }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "kind": "Deployment", "name": "hwlab-cloud-web" }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5", "kind": "Deployment", "name": "hwlab-agent-mgr" }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5", "kind": "Job", "name": "hwlab-agent-worker-template" }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5", "kind": "Deployment", "name": "hwlab-gateway" }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5", "kind": "StatefulSet", "name": "hwlab-gateway-simu" }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5", "kind": "StatefulSet", "name": "hwlab-box-simu" }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5", "kind": "Deployment", "name": "hwlab-patch-panel" }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5", "kind": "Deployment", "name": "hwlab-router" }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5", "kind": "Deployment", "name": "hwlab-tunnel-client" }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5", "kind": "Deployment", "name": "hwlab-edge-proxy" }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5", "kind": "Job", "name": "hwlab-cli-template" }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5", "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": "e6d4bd5", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "HWLAB_IMAGE_TAG": "e6d4bd5" }, "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "e6d4bd5", "actual": "e6d4bd5", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "e6d4bd5", "actual": "e6d4bd5", "status": "match" } ], "drift": [] } ] }, "clusterObservation": { "status": "pass", "executor": "/usr/local/bin/kubectl", "kubeconfig": "/etc/rancher/k3s/k3s.yaml", "kubeconfigSource": "flag:--kubeconfig", "commandPrefix": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl", "readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml 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-99d44c747-mfqzj", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-agent-skills-7f99b49598-lqjdd", "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-57cfcfc587-kdvg9", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-cloud-web-67c684947b-lkvtj", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-edge-proxy-85db66bcc9-mv8pv", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-frpc-59f57d479c-tgjhl", "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-7cd9d9d597-kwnm6", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-router-65dc5579fb-d2r8l", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-runtime-migrate-35e3d897-kfr4m", "phase": "Succeeded" }, { "kind": "Pod", "name": "hwlab-runtime-provision-35e3d897-jk2rc", "phase": "Succeeded" }, { "kind": "Pod", "name": "hwlab-tunnel-client-54d968477d-mf2qk", "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" }, { "kind": "Job", "name": "hwlab-runtime-migrate-35e3d897" }, { "kind": "Job", "name": "hwlab-runtime-provision-35e3d897" } ] }, "liveProbe": { "status": "pass", "url": "http://74.48.78.17:16667/health/live", "httpStatus": 200, "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"degraded\",\"ready\":false,\"revision\":\"b02ac5becad13aeeab0d5cb7d8f01300bccb78c2\",\"readiness\":{\"contractVersion\":\"v3\",\"ready\":false,\"status\":\"degraded\",\"blockerCodes\":[\"stdio_protocol_not_wired\"],\"blockers\":[{\"code\":\"stdio_protocol_not_wired\",\"type\":\"agent_blocker\",\"scope\":\"code-agent-long-lived-session\",\"status\":\"open\",\"sourceIssue\":\"pikasTech/HWLAB#275\",\"summary\":\"普通聊天可走 OpenAI Responses fallback,pwd/skills 走受控只读 runner,M3 IO 走 Skill CLI" } }, "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" }, { "id": "runtime-durable-postflight", "phase": "verifying", "status": "blocked", "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-runtime-postflight.mjs --live --confirm-dev --confirmed-non-production --target api --write-report --fail-on-blocked", "code": 1, "startedAt": "2026-05-23T21:48:14.217Z", "finishedAt": "2026-05-23T21:48:18.238Z", "stdoutJson": { "issue": "pikasTech/HWLAB#311", "mode": "dev-live", "generatedAt": "2026-05-23T21:48:14.250Z", "target": { "environment": "dev", "namespace": "hwlab-dev", "prodAllowed": false, "apiHealthUrl": "http://74.48.78.17:16667/health/live", "apiV1Url": "http://74.48.78.17:16667/v1", "m3Target": "api" }, "actions": { "healthLiveReadAttempted": true, "v1ReadAttempted": true, "m3MutationAttempted": true, "m3MutationAllowed": true }, "apiHealth": { "check": "GET /health/live", "httpStatus": 200, "reachable": true, "serviceId": "hwlab-cloud-api", "environment": "dev", "status": "degraded", "ready": false, "runtime": { "adapter": "postgres", "durable": true, "durableRequested": true, "ready": true, "status": "ready", "blocker": null, "liveRuntimeEvidence": true, "requiredEvidence": "runtime_adapter_schema_migration_read_query", "blockedLayer": null, "gates": { "ssl": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "auth": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "schema": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "migration": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "durability": { "checked": true, "ready": true, "status": "ready", "blocker": null } } }, "runtimeDurableReadiness": { "status": "ready", "ready": true, "classification": "runtime_durable_ready", "reasonCode": "runtime_durable_ready", "reason": "runtime durable ready; adapter=postgres; queryResult=durable_readiness_ready", "impact": "M3 durable postflight may run because runtime persistence readiness is green.", "safeNextAction": "Continue with repo-owned DEV CD postflight; do not read or print Secret values.", "retryable": true, "readonly": false, "evidence": { "adapter": "postgres", "durable": true, "runtimeReady": true, "durabilityReady": true, "liveRuntimeEvidence": true, "blocker": null, "blockedLayer": null, "queryResult": "durable_readiness_ready", "readyQueryResult": true, "rawStatus": "degraded", "postgresRequired": true, "gates": { "ssl": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "auth": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "schema": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "migration": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "durability": { "checked": true, "ready": true, "status": "ready", "blocker": null } }, "secretMaterialRead": false } }, "db": { "ready": true, "connected": true, "liveDbEvidence": true, "endpointSource": "secret-url-host", "connectionResult": "connected", "endpointRedacted": true, "valueRedacted": true, "runtimeReadiness": { "ready": true, "status": "ready", "blocker": null, "queryResult": "durable_readiness_ready", "requiredEvidence": "runtime_adapter_schema_migration_read_query" } }, "readiness": { "ready": false, "status": "degraded", "durabilityReady": true, "durabilityBlockedLayer": null }, "blockerCodes": [ "stdio_protocol_not_wired" ], "m3IoControl": null, "error": null }, "apiV1": { "check": "GET /v1", "httpStatus": 200, "reachable": true, "serviceId": "hwlab-cloud-api", "environment": null, "status": "degraded", "ready": false, "runtime": { "adapter": "postgres", "durable": true, "durableRequested": true, "ready": true, "status": "ready", "blocker": null, "liveRuntimeEvidence": true, "requiredEvidence": "runtime_adapter_schema_migration_read_query", "blockedLayer": null, "gates": { "ssl": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "auth": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "schema": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "migration": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "durability": { "checked": true, "ready": true, "status": "ready", "blocker": null } } }, "runtimeDurableReadiness": { "status": "ready", "ready": true, "classification": "runtime_durable_ready", "reasonCode": "runtime_durable_ready", "reason": "runtime durable ready; adapter=postgres; queryResult=durable_readiness_ready", "impact": "M3 durable postflight may run because runtime persistence readiness is green.", "safeNextAction": "Continue with repo-owned DEV CD postflight; do not read or print Secret values.", "retryable": true, "readonly": false, "evidence": { "adapter": "postgres", "durable": true, "runtimeReady": true, "durabilityReady": true, "liveRuntimeEvidence": true, "blocker": null, "blockedLayer": null, "queryResult": "durable_readiness_ready", "readyQueryResult": true, "rawStatus": "degraded", "postgresRequired": true, "gates": { "ssl": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "auth": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "schema": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "migration": { "checked": true, "ready": true, "status": "ready", "blocker": null }, "durability": { "checked": true, "ready": true, "status": "ready", "blocker": null } }, "secretMaterialRead": false } }, "db": { "ready": true, "connected": true, "liveDbEvidence": true, "endpointSource": "secret-url-host", "connectionResult": "connected", "endpointRedacted": true, "valueRedacted": true, "runtimeReadiness": { "ready": true, "status": "ready", "blocker": null, "queryResult": "durable_readiness_ready", "requiredEvidence": "runtime_adapter_schema_migration_read_query" } }, "readiness": { "ready": false, "status": "degraded", "durabilityReady": true, "durabilityBlockedLayer": null }, "blockerCodes": [ "stdio_protocol_not_wired" ], "m3IoControl": { "route": "/v1/m3/io", "status": "available", "enabled": true, "contractVersion": "m3-io-control-v1", "directFrontendGatewayOrBoxAccess": false, "genericHardwareRpcExposedToFrontend": false }, "error": null }, "m3": { "mode": "dev-live", "status": "blocked", "classification": "source_contract_failed", "trustedGreen": false, "result": "SOURCE/static contract failed.", "operationCount": 4, "persisted": true, "persistenceContract": { "contractVersion": "m3-do1-true-false-persisted-v1", "requiredRoute": "res_boxsimu_1:DO1 -> hwlab-patch-panel -> res_boxsimu_2:DI1", "requiredValues": [ true, true, false, false ], "ready": true, "sequence": [ { "id": "write-do1-true", "action": "do.write", "expectedValue": true, "observedValue": true, "status": "succeeded", "idsPresent": true, "valueMatches": true, "evidenceGreen": true, "persisted": true }, { "id": "read-di1-true", "action": "di.read", "expectedValue": true, "observedValue": true, "status": "succeeded", "idsPresent": true, "valueMatches": true, "evidenceGreen": true, "persisted": true }, { "id": "write-do1-false", "action": "do.write", "expectedValue": false, "observedValue": false, "status": "succeeded", "idsPresent": true, "valueMatches": true, "evidenceGreen": true, "persisted": true }, { "id": "read-di1-false", "action": "di.read", "expectedValue": false, "observedValue": false, "status": "succeeded", "idsPresent": true, "valueMatches": true, "evidenceGreen": true, "persisted": true } ] }, "operations": [ { "id": "write-do1-true", "action": "do.write", "status": "succeeded", "operationId": "op_m3_do_write_04f30c71-8cfd-46f9-8d91-aa506ae20f0b", "traceId": "trc_m3_io_e2e_write_do1_true_338f3beb-810b-447b-9612-071ba131fe16", "auditId": "aud_m3_do_write_04f30c71-8cfd-46f9-8d91-aa506ae20f0b_succeeded", "evidenceId": "evd_m3_do_write_04f30c71-8cfd-46f9-8d91-aa506ae20f0b_succeeded", "resultValue": true, "evidenceState": { "status": "green", "durable": true, "sourceKind": "DEV-LIVE", "writeStatus": "persisted" }, "blocker": null }, { "id": "read-di1-true", "action": "di.read", "status": "succeeded", "operationId": "op_m3_di_read_a40696ff-1581-4789-a1ad-7778bb4b2da7", "traceId": "trc_m3_io_e2e_read_di1_true_e4587f6a-2ab4-492f-a924-f160c9cfdc2d", "auditId": "aud_m3_di_read_a40696ff-1581-4789-a1ad-7778bb4b2da7_succeeded", "evidenceId": "evd_m3_di_read_a40696ff-1581-4789-a1ad-7778bb4b2da7_succeeded", "resultValue": true, "evidenceState": { "status": "green", "durable": true, "sourceKind": "DEV-LIVE", "writeStatus": "persisted" }, "blocker": null }, { "id": "write-do1-false", "action": "do.write", "status": "succeeded", "operationId": "op_m3_do_write_eb8b7b21-c8c5-45f4-8c08-a1e87b62b2aa", "traceId": "trc_m3_io_e2e_write_do1_false_e5f378b1-38d0-4307-8aef-dc94b633b0e8", "auditId": "aud_m3_do_write_eb8b7b21-c8c5-45f4-8c08-a1e87b62b2aa_succeeded", "evidenceId": "evd_m3_do_write_eb8b7b21-c8c5-45f4-8c08-a1e87b62b2aa_succeeded", "resultValue": false, "evidenceState": { "status": "green", "durable": true, "sourceKind": "DEV-LIVE", "writeStatus": "persisted" }, "blocker": null }, { "id": "read-di1-false", "action": "di.read", "status": "succeeded", "operationId": "op_m3_di_read_c92ea3cf-c3e0-4a0f-80e8-cf719d215aae", "traceId": "trc_m3_io_e2e_read_di1_false_c06468ba-3ae4-4436-a4a4-64b0e6754dfa", "auditId": "aud_m3_di_read_c92ea3cf-c3e0-4a0f-80e8-cf719d215aae_succeeded", "evidenceId": "evd_m3_di_read_c92ea3cf-c3e0-4a0f-80e8-cf719d215aae_succeeded", "resultValue": false, "evidenceState": { "status": "green", "durable": true, "sourceKind": "DEV-LIVE", "writeStatus": "persisted" }, "blocker": null } ] }, "blockers": [ { "type": "runtime_blocker", "scope": "m3-durable-postflight", "status": "open", "reason": "M3 true/false durable postflight did not produce trusted green persisted evidence.", "impact": "M3 durable readiness cannot be accepted because trusted evidence is not green.", "safeNextAction": "Fix the M3 control path or trusted-record persistence and rerun DEV runtime postflight.", "retryable": true, "summary": "M3 true/false durable postflight did not produce trusted green persisted evidence. Impact: M3 durable readiness cannot be accepted because trusted evidence is not green. Safe next action: Fix the M3 control path or trusted-record persistence and rerun DEV runtime postflight.", "sourceIssue": "pikasTech/HWLAB#311", "evidence": { "classification": "source_contract_failed", "trustedGreen": false, "operationCount": 4 } } ], "safety": { "devOnly": true, "environment": "dev", "prodAllowed": false, "liveHttpReads": true, "liveM3Writes": true, "liveM3WritesRequireDurableRuntimeReady": true, "readsKubernetesSecrets": false, "writesKubernetesSecrets": false, "secretValuesPrinted": false, "dbUrlValueRedacted": true, "endpointRedacted": true }, "safetyRefusal": false, "conclusion": { "status": "blocked", "summary": "DEV runtime postflight is blocked; M3 is skipped unless durable runtime readiness is proven first.", "blockerCount": 1 } }, "stdoutTail": null, "stderrTail": "", "reportPath": "reports/dev-gate/dev-runtime-postflight-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-23T21:37:53.244Z", "finishedAt": "2026-05-23T21:37:53.799Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "b02ac5b", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b", "imageTag": "b02ac5b", "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-23T21:37:53.246Z", "finishedAt": "2026-05-23T21:37:54.477Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "degraded", "ready": false, "observedCommit": "b02ac5b", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b", "imageTag": "b02ac5b", "observedAt": "2026-05-23T21:37:53.704Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [ "stdio_protocol_not_wired" ] } ], "summary": { "checked": 2, "reachable": 2, "identityMatches": 2, "commitMatches": null, "ports": [ 16666, 16667 ] } }, "liveVerify": { "status": "not_run", "reason": "transaction blocked before live verify", "endpoints": [], "summary": { "checked": 0 } }, "preflight": { "status": "pass", "scope": "pre-lock-pre-side-effect", "generatedAt": "2026-05-23T21:37:52.937Z", "namespace": "hwlab-dev", "kubeconfig": { "required": "/etc/rancher/k3s/k3s.yaml", "selected": "/etc/rancher/k3s/k3s.yaml", "source": "flag:--kubeconfig", "enforcedEnv": true }, "kubectl": { "executor": "/usr/local/bin/kubectl", "commandPrefix": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl" }, "controlPlane": { "forced": { "label": "forced-d601-k3s", "contextCommand": { "command": "kubectl config current-context", "code": 0, "ok": true, "summary": "in-cluster" }, "serverCommand": { "command": "kubectl config view --minify -o jsonpath={.clusters[0].cluster.server}", "code": 0, "ok": true, "summary": "https://10.43.0.1:443" }, "nodesCommand": { "command": "kubectl get nodes -o jsonpath={.items[*].metadata.name}", "code": 0, "ok": true, "summary": "d601" }, "contextName": "in-cluster", "serverUrl": "https://10.43.0.1:443", "nodeNames": [ "d601" ], "status": "observed" }, "bare": { "label": "bare-kubectl", "contextCommand": { "command": "kubectl config current-context", "code": 1, "ok": false, "summary": "error: current-context is not set" }, "serverCommand": { "command": "kubectl config view --minify -o jsonpath={.clusters[0].cluster.server}", "code": 1, "ok": false, "summary": "error: current-context must exist in order to minify" }, "nodesCommand": { "command": "kubectl get nodes -o jsonpath={.items[*].metadata.name}", "code": 0, "ok": true, "summary": "d601" }, "contextName": null, "serverUrl": null, "nodeNames": [ "d601" ], "status": "unavailable", "namespace": { "command": "kubectl get namespace hwlab-dev -o name", "code": 0, "ok": true, "summary": "namespace/hwlab-dev" }, "hwlabDevNamespaceObserved": true, "secondControlPlaneCandidate": null } }, "secretRefs": [ { "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "status": "present", "exists": true, "keyPresent": true, "keysObserved": [ "database-url" ], "existenceCommand": "kubectl -n hwlab-dev get secret hwlab-cloud-api-dev-db -o name", "keyCommand": "kubectl -n hwlab-dev describe secret hwlab-cloud-api-dev-db", "secretValueRead": false, "secretValuePrinted": false }, { "secretName": "hwlab-cloud-api-dev-db-admin", "secretKey": "admin-url", "status": "present", "exists": true, "keyPresent": true, "keysObserved": [ "admin-url" ], "existenceCommand": "kubectl -n hwlab-dev get secret hwlab-cloud-api-dev-db-admin -o name", "keyCommand": "kubectl -n hwlab-dev describe secret hwlab-cloud-api-dev-db-admin", "secretValueRead": false, "secretValuePrinted": false }, { "secretName": "hwlab-code-agent-provider", "secretKey": "openai-api-key", "status": "present", "exists": true, "keyPresent": true, "keysObserved": [ "openai-api-key" ], "existenceCommand": "kubectl -n hwlab-dev get secret hwlab-code-agent-provider -o name", "keyCommand": "kubectl -n hwlab-dev describe secret hwlab-code-agent-provider", "secretValueRead": false, "secretValuePrinted": false } ], "safety": { "writeSideEffectsAttempted": false, "prodTouched": false, "secretValuesRead": false, "secretValuesPrinted": false, "secretKeyNamesOnly": true }, "blockers": [] }, "reportPaths": { "transaction": "reports/dev-gate/dev-cd-apply.json", "artifacts": "reports/dev-gate/dev-artifacts.json", "deployApply": "reports/dev-gate/dev-deploy-report.json", "runtimeProvisioning": "reports/dev-gate/dev-runtime-provisioning-report.json", "runtimeMigration": "reports/dev-gate/dev-runtime-migration-report.json", "runtimePostflight": "reports/dev-gate/dev-runtime-postflight-report.json" }, "safety": { "prodTouched": false, "secretValuesRead": false, "secretValuesPrinted": false, "manualDbWrite": false, "oldPublicPortsUsed": false, "mutationAttempted": true, "singleLock": "Lease/hwlab-dev/hwlab-dev-cd-lock" } }, "blockers": [ { "type": "runtime_blocker", "scope": "runtime-durable-postflight", "status": "open", "reason": "M3 true/false durable postflight did not produce trusted green persisted evidence.", "impact": "M3 durable readiness cannot be accepted because trusted evidence is not green.", "safeNextAction": "Fix the M3 control path or trusted-record persistence and rerun DEV runtime postflight.", "retryable": true, "summary": "M3 true/false durable postflight did not produce trusted green persisted evidence. Impact: M3 durable readiness cannot be accepted because trusted evidence is not green. Safe next action: Fix the M3 control path or trusted-record persistence and rerun DEV runtime postflight.", "evidence": { "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-runtime-postflight.mjs --live --confirm-dev --confirmed-non-production --target api --write-report --fail-on-blocked", "code": 1, "reportPath": "reports/dev-gate/dev-runtime-postflight-report.json", "blockerScope": "m3-durable-postflight", "k8sJob": null } } ], "notes": "DEV-only CD transaction evidence. This does not claim M3 PASS or runtime durability." }