{ "$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": "48dfbf9", "acceptanceLevel": "dev_cd_apply", "devOnly": true, "prodDisabled": true, "status": "blocked", "generatedAt": "2026-05-24T00:18:39.740Z", "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": "5332b2f8-5619-490e-8100-e79fa427f6f9", "ownerTaskId": "DC-DCSN-P0-2026-003-D601", "targetNamespace": "hwlab-dev", "lockName": "hwlab-dev-cd-lock", "lockBackend": "Lease", "startedAt": "2026-05-24T00:07:29.282Z", "finishedAt": "2026-05-24T00:18:39.740Z", "ttlSeconds": 3600, "phases": [ { "phase": "publishing", "status": "entered", "at": "2026-05-24T00:07:31.483Z" }, { "phase": "applying", "status": "entered", "at": "2026-05-24T00:18:16.303Z" }, { "phase": "verifying", "status": "entered", "at": "2026-05-24T00:18:29.423Z" }, { "phase": "released", "status": "released", "at": "2026-05-24T00:18:39.740Z" } ], "release": { "status": "released", "command": "kubectl -n hwlab-dev replace -f - -o json", "lock": { "lockBackend": "Lease", "lockName": "hwlab-dev-cd-lock", "resourceVersion": "1519233", "holderIdentity": "", "promotionCommit": "48dfbf9", "deployJsonHash": "sha256:b23766b798d1ecacb87d30b94ee8ffe77e2ccbe7772ce27e5c94ee152d06f543", "ownerTaskId": "DC-DCSN-P0-2026-003-D601", "transactionId": "5332b2f8-5619-490e-8100-e79fa427f6f9", "phase": "released", "startedAt": "2026-05-24T00:07:29.483000Z", "updatedAt": "2026-05-24T00:18:39.700000Z", "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-24T00:07:29.593Z", "finishedAt": "2026-05-24T00:07:30.157Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "3df89fe", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "imageTag": "3df89fe", "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-24T00:07:29.594Z", "finishedAt": "2026-05-24T00:07:31.417Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "ok", "ready": true, "observedCommit": "3df89fe", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:3df89fe", "imageTag": "3df89fe", "observedAt": "2026-05-24T00:07:30.656Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] } ], "summary": { "checked": 2, "reachable": 2, "identityMatches": 2, "commitMatches": null, "ports": [ 16666, 16667 ] } }, "targetNamespace": "hwlab-dev", "targetRef": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "releasedAt": "2026-05-24T00:18:39.700000Z", "releaseStatus": "blocked", "staleLockBrokenAt": null, "staleLockPrevious": null } } }, "devCdApply": { "mode": "apply", "target": { "ref": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "promotionCommit": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "shortCommitId": "48dfbf9", "promotionSource": "target-ref", "publishRequired": true, "controlRef": { "ref": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "commitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "shortCommitId": "48dfbf9" }, "headCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "headMatchesTarget": true, "desiredStateCheck": null, "artifactBoundary": { "status": "degraded", "controlCommit": { "commitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "shortCommitId": "48dfbf9" }, "artifactMergeCommit": { "commitId": "b893116e59f54d671b88dcab34072c2f1671540e", "shortCommitId": "b893116", "isMergeCommit": true, "parents": [ "034c90763cdcff5083db02612cb9d0d137904860", "1f292ffd683a124acbfe019396ec2cd200c117e8" ], "promotionParent": "034c90763cdcff5083db02612cb9d0d137904860", "artifactParent": "1f292ffd683a124acbfe019396ec2cd200c117e8", "promotionParentMatches": false, "changedPaths": [ "deploy/deploy.json", "deploy/k8s/base/workloads.yaml" ] }, "artifactCommit": { "commitId": "1f292ffd683a124acbfe019396ec2cd200c117e8", "shortCommitId": "1f292ff", "parents": [ "034c90763cdcff5083db02612cb9d0d137904860" ], "promotionParentMatches": false }, "desiredState": { "deployCommitId": "48dfbf9", "deployJsonHash": "sha256:b23766b798d1ecacb87d30b94ee8ffe77e2ccbe7772ce27e5c94ee152d06f543", "catalogCommitId": "48dfbf9", "catalogHash": "sha256:0a501437652f961c9fad01c6036297efea318f1ef29ca14fb72f29ab6c3bdf8e", "reportCommitId": "606156f", "reportSourceCommitId": "606156f604e507f8725f6ae9040cea8204375a86", "reportHash": "sha256:a5a1818df4fa43f49270ee383a7dec77050a387420dfbea04ef5bc81f02018ee", "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:b23766b798d1ecacb87d30b94ee8ffe77e2ccbe7772ce27e5c94ee152d06f543", "commitId": "48dfbf9", "namespace": "hwlab-dev", "environment": "dev", "endpoint": "http://74.48.78.17:16667", "manifest": { "manifestVersion": "v1", "environment": "dev", "commitId": "48dfbf9", "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:48dfbf9", "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": "48dfbf9", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "HWLAB_IMAGE_TAG": "48dfbf9", "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": "150000", "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:48dfbf9", "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": "180000", "HWLAB_COMMIT_ID": "48dfbf9", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "HWLAB_IMAGE_TAG": "48dfbf9" } }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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": "180000" } }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "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:48dfbf9", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_SKILLS_COMMIT_ID": "48dfbf9" } } ], "createdAt": "2026-05-21T00:00:00Z" } }, "after": { "path": "deploy/deploy.json", "hash": "sha256:b23766b798d1ecacb87d30b94ee8ffe77e2ccbe7772ce27e5c94ee152d06f543", "commitId": "48dfbf9", "namespace": "hwlab-dev", "environment": "dev", "endpoint": "http://74.48.78.17:16667", "manifest": { "manifestVersion": "v1", "environment": "dev", "commitId": "48dfbf9", "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:48dfbf9", "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": "48dfbf9", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "HWLAB_IMAGE_TAG": "48dfbf9", "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": "150000", "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:48dfbf9", "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": "180000", "HWLAB_COMMIT_ID": "48dfbf9", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "HWLAB_IMAGE_TAG": "48dfbf9" } }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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:48dfbf9", "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": "180000" } }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "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:48dfbf9", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_SKILLS_COMMIT_ID": "48dfbf9" } } ], "createdAt": "2026-05-21T00:00:00Z" } } }, "lock": { "acquired": true, "current": { "lockBackend": "Lease", "lockName": "hwlab-dev-cd-lock", "resourceVersion": "1519083", "holderIdentity": "DC-DCSN-P0-2026-003-D601/5332b2f8-5619-490e-8100-e79fa427f6f9", "promotionCommit": "48dfbf9", "deployJsonHash": "sha256:b23766b798d1ecacb87d30b94ee8ffe77e2ccbe7772ce27e5c94ee152d06f543", "ownerTaskId": "DC-DCSN-P0-2026-003-D601", "transactionId": "5332b2f8-5619-490e-8100-e79fa427f6f9", "phase": "verifying", "startedAt": "2026-05-24T00:07:29.483000Z", "updatedAt": "2026-05-24T00:18:29.335000Z", "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-24T00:07:29.593Z", "finishedAt": "2026-05-24T00:07:30.157Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "3df89fe", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "imageTag": "3df89fe", "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-24T00:07:29.594Z", "finishedAt": "2026-05-24T00:07:31.417Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "ok", "ready": true, "observedCommit": "3df89fe", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:3df89fe", "imageTag": "3df89fe", "observedAt": "2026-05-24T00:07:30.656Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] } ], "summary": { "checked": 2, "reachable": 2, "identityMatches": 2, "commitMatches": null, "ports": [ 16666, 16667 ] } }, "targetNamespace": "hwlab-dev", "targetRef": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "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-24T00:07:31.483Z", "finishedAt": "2026-05-24T00:07:31.522Z", "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": "48dfbf9", "desiredImageTag": "48dfbf9", "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": "606156f", "matchesDesiredState": false, "artifactPublish": { "status": "published", "sourceCommitId": "606156f604e507f8725f6ae9040cea8204375a86", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "48dfbf9", "expected": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "48dfbf9", "expected": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "imageTag": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "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-24T00:07:31.523Z", "finishedAt": "2026-05-24T00:18:16.117Z", "stdoutJson": { "status": "published", "mode": "publish", "reportPath": "reports/dev-gate/dev-artifacts.json", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryPrefix": "127.0.0.1:5000/hwlab", "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", "generatedAt": "2026-05-24T00:07:33.358Z", "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 10 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-6f4cc98885-6bl9w", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:c5f796204e9609a191230d9faa3bd7740ad50c4977a7eee7ef545665ccf4097c" }, { "pod": "hwlab-agent-skills-69485c4dc4-mpgdb", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:4b006f52cf27438956f5269d39483d2ebcf8966b30cf19cd378616b423f93e1f" }, { "pod": "hwlab-box-simu-0", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:e8aa955c810724ca9990fede69c54866dd7abe789ccee9da83ded75a75a99850" }, { "pod": "hwlab-box-simu-1", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:e8aa955c810724ca9990fede69c54866dd7abe789ccee9da83ded75a75a99850" }, { "pod": "hwlab-cloud-api-54cdcb57dc-xw9gb", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:fff35a6eec4a70375122f87636759de62039465449053c584d9bc9572b7d1b0d" }, { "pod": "hwlab-cloud-web-5bd7bf9c6-d67jc", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:cd46ef24e97f430d7761b2cb7100990eda9f79ddf35f8ffc58fba81cd75e9acf" }, { "pod": "hwlab-edge-proxy-58984dcc7c-8bvqj", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:a95189dd0cabf9197b7a15dc4cc2995eccf27898e2b0e26c7fd9cbf952fe8119" }, { "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:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:1a5145313c95c6dfd1e8fca9f10f89cb81178dd545cd43fa158f8c9ac40ca25f" }, { "pod": "hwlab-gateway-simu-1", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:1a5145313c95c6dfd1e8fca9f10f89cb81178dd545cd43fa158f8c9ac40ca25f" }, { "pod": "hwlab-patch-panel-55b9c584d7-7rzqb", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:36f569ce71dd9da2c8432ded7f00be9b9e51d0ec5409eeee871dfc3efbd9dbc9" }, { "pod": "hwlab-router-76fd584bdb-t26cs", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:258cc4231a7e0c4de47cce9a8be37b60c9a8a942d09d91b695b006f0dfc396d9" }, { "pod": "hwlab-tunnel-client-69d7d6d6d8-pv8b9", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:e44e0a0f5b3e88014c85414feeecc892a34e73e2137160cc905d526aede6cf02" } ], "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": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "imageTag": "48dfbf9", "registryTarget": "127.0.0.1:5000/hwlab", "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", "generatedAt": "2026-05-24T00:07:33.358Z", "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 10 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-6f4cc98885-6bl9w", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:c5f796204e9609a191230d9faa3bd7740ad50c4977a7eee7ef545665ccf4097c" }, { "pod": "hwlab-agent-skills-69485c4dc4-mpgdb", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:4b006f52cf27438956f5269d39483d2ebcf8966b30cf19cd378616b423f93e1f" }, { "pod": "hwlab-box-simu-0", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:e8aa955c810724ca9990fede69c54866dd7abe789ccee9da83ded75a75a99850" }, { "pod": "hwlab-box-simu-1", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:e8aa955c810724ca9990fede69c54866dd7abe789ccee9da83ded75a75a99850" }, { "pod": "hwlab-cloud-api-54cdcb57dc-xw9gb", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:fff35a6eec4a70375122f87636759de62039465449053c584d9bc9572b7d1b0d" }, { "pod": "hwlab-cloud-web-5bd7bf9c6-d67jc", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:cd46ef24e97f430d7761b2cb7100990eda9f79ddf35f8ffc58fba81cd75e9acf" }, { "pod": "hwlab-edge-proxy-58984dcc7c-8bvqj", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:a95189dd0cabf9197b7a15dc4cc2995eccf27898e2b0e26c7fd9cbf952fe8119" }, { "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:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:1a5145313c95c6dfd1e8fca9f10f89cb81178dd545cd43fa158f8c9ac40ca25f" }, { "pod": "hwlab-gateway-simu-1", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:1a5145313c95c6dfd1e8fca9f10f89cb81178dd545cd43fa158f8c9ac40ca25f" }, { "pod": "hwlab-patch-panel-55b9c584d7-7rzqb", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:36f569ce71dd9da2c8432ded7f00be9b9e51d0ec5409eeee871dfc3efbd9dbc9" }, { "pod": "hwlab-router-76fd584bdb-t26cs", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:258cc4231a7e0c4de47cce9a8be37b60c9a8a942d09d91b695b006f0dfc396d9" }, { "pod": "hwlab-tunnel-client-69d7d6d6d8-pv8b9", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:3df89fe", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:e44e0a0f5b3e88014c85414feeecc892a34e73e2137160cc905d526aede6cf02" } ], "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": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:15a9dec43d0ad6b750ea4eda860c1c157c6502441732c1de20ef3b92696d0dfc", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:15a9dec43d0ad6b750ea4eda860c1c157c6502441732c1de20ef3b92696d0dfc", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-mgr", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:bdb3dffd0a82e7cf1c48de3d130cbd6e733c242dd5667be4ba098a46888a13d6", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:bdb3dffd0a82e7cf1c48de3d130cbd6e733c242dd5667be4ba098a46888a13d6", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:902590cd05c9af8dcf347b74c05e1fb9fb399eefa54d91ff105dd2fa276ae785", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:902590cd05c9af8dcf347b74c05e1fb9fb399eefa54d91ff105dd2fa276ae785", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:015916d05ccbd8448e3f32d754335f7c221aaaadf5ae2b63007d7698f7583d04", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:015916d05ccbd8448e3f32d754335f7c221aaaadf5ae2b63007d7698f7583d04", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:74793df73dfeb27fc45b1085ac1c29839f6545ccfea79d033dfddc89d6f3a553", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:74793df73dfeb27fc45b1085ac1c29839f6545ccfea79d033dfddc89d6f3a553", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:89d80def71130db7e0f4d9a0ec1dadfcb5d8963bd1f13b71c67eab0a301efb94", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:89d80def71130db7e0f4d9a0ec1dadfcb5d8963bd1f13b71c67eab0a301efb94", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:160a47204b2263e750cbf412f0d266047eeb6baf8b2be839e5d1987fc6082fea", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:160a47204b2263e750cbf412f0d266047eeb6baf8b2be839e5d1987fc6082fea", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-router", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:0ab02340575ec7e910427f8ea06db2b8f8095922e207ae5e11a64c065fa26df7", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:0ab02340575ec7e910427f8ea06db2b8f8095922e207ae5e11a64c065fa26df7", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:75af6caa96ec03d3f4130e512052f666d75b1e5470fa67f8f66f355e1068e43f", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:75af6caa96ec03d3f4130e512052f666d75b1e5470fa67f8f66f355e1068e43f", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:f8b954ad76ab0162e3df0edc26c115f6c697f8f5c4e9d93e24112285b57b9b05", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:f8b954ad76ab0162e3df0edc26c115f6c697f8f5c4e9d93e24112285b57b9b05", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-cli", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:ae6564b6b0f8ceaf35ab5d2e7f7c04ca8f5e51aa7daedb01e4a6aa31e4bcc16b", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:ae6564b6b0f8ceaf35ab5d2e7f7c04ca8f5e51aa7daedb01e4a6aa31e4bcc16b", "digestStatus": "real", "status": "published", "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "enabled": true, "required": true, "artifactScope": "required", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "buildSource": "pikasTech/HWLAB@48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "digest": "sha256:6fc9b4fda9bea32607774a24d72ecc7999007d910d17e11764abce2bdc35c03d", "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:6fc9b4fda9bea32607774a24d72ecc7999007d910d17e11764abce2bdc35c03d", "digestStatus": "real", "status": "published", "notPublishedReason": null } ] }, "services": [ { "serviceId": "hwlab-cloud-api", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:15a9dec43d0ad6b750ea4eda860c1c157c6502441732c1de20ef3b92696d0dfc", "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "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-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/index.html", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/index.html", "status": "match" }, { "kind": "runtime", "path": "styles.css", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/styles.css", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/styles.css", "status": "match" }, { "kind": "runtime", "path": "auth.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/auth.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/auth.mjs", "status": "match" }, { "kind": "runtime", "path": "app.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/app.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/app.mjs", "status": "match" }, { "kind": "runtime", "path": "code-agent-facts.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/code-agent-facts.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/code-agent-facts.mjs", "status": "match" }, { "kind": "runtime", "path": "code-agent-status.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/code-agent-status.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/code-agent-status.mjs", "status": "match" }, { "kind": "runtime", "path": "code-agent-m3-evidence.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/code-agent-m3-evidence.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/code-agent-m3-evidence.mjs", "status": "match" }, { "kind": "runtime", "path": "live-status.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/live-status.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/live-status.mjs", "status": "match" }, { "kind": "runtime", "path": "gate-summary.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/gate-summary.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/gate-summary.mjs", "status": "match" }, { "kind": "runtime", "path": "runtime.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/runtime.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/runtime.mjs", "status": "match" }, { "kind": "runtime", "path": "wiring-status.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/wiring-status.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/wiring-status.mjs", "status": "match" }, { "kind": "runtime", "path": "workbench-hardware-panel.mjs", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/workbench-hardware-panel.mjs", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/workbench-hardware-panel.mjs", "status": "match" }, { "kind": "runtime", "path": "help.md", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/help.md", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/help.md", "status": "match" }, { "kind": "runtime", "path": "third_party/marked/marked.esm.js", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/third_party/marked/marked.esm.js", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/third_party/marked/marked.esm.js", "status": "match" }, { "kind": "runtime", "path": "third_party/marked/LICENSE", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/third_party/marked/LICENSE", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/third_party/marked/LICENSE", "status": "match" }, { "kind": "alias", "path": "gate/index.html", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/index.html", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/gate/index.html", "status": "match" }, { "kind": "alias", "path": "diagnostics/gate/index.html", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/index.html", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/dist/diagnostics/gate/index.html", "status": "match" }, { "kind": "alias", "path": "help/index.html", "sourcePath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/web/hwlab-cloud-web/index.html", "distPath": "/home/ubuntu/hwlab-d601-dev-cd-48dfbf9/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:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:bdb3dffd0a82e7cf1c48de3d130cbd6e733c242dd5667be4ba098a46888a13d6", "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:902590cd05c9af8dcf347b74c05e1fb9fb399eefa54d91ff105dd2fa276ae785", "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:015916d05ccbd8448e3f32d754335f7c221aaaadf5ae2b63007d7698f7583d04", "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:74793df73dfeb27fc45b1085ac1c29839f6545ccfea79d033dfddc89d6f3a553", "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:89d80def71130db7e0f4d9a0ec1dadfcb5d8963bd1f13b71c67eab0a301efb94", "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:160a47204b2263e750cbf412f0d266047eeb6baf8b2be839e5d1987fc6082fea", "notPublishedReason": null }, { "serviceId": "hwlab-router", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:0ab02340575ec7e910427f8ea06db2b8f8095922e207ae5e11a64c065fa26df7", "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:75af6caa96ec03d3f4130e512052f666d75b1e5470fa67f8f66f355e1068e43f", "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:f8b954ad76ab0162e3df0edc26c115f6c697f8f5c4e9d93e24112285b57b9b05", "notPublishedReason": null }, { "serviceId": "hwlab-cli", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:ae6564b6b0f8ceaf35ab5d2e7f7c04ca8f5e51aa7daedb01e4a6aa31e4bcc16b", "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "status": "published", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:6fc9b4fda9bea32607774a24d72ecc7999007d910d17e11764abce2bdc35c03d", "notPublishedReason": null } ], "blockers": [] }, "stdoutTail": null, "stderrTail": "\"event\":\"publish_start\",\"serviceId\":\"hwlab-tunnel-client\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-tunnel-client\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9\",\"digest\":\"sha256:75af6caa96ec03d3f4130e512052f666d75b1e5470fa67f8f66f355e1068e43f\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9\",\"digest\":\"sha256:f8b954ad76ab0162e3df0edc26c115f6c697f8f5c4e9d93e24112285b57b9b05\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9\",\"digest\":\"sha256:ae6564b6b0f8ceaf35ab5d2e7f7c04ca8f5e51aa7daedb01e4a6aa31e4bcc16b\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9\",\"digest\":\"sha256:6fc9b4fda9bea32607774a24d72ecc7999007d910d17e11764abce2bdc35c03d\"}", "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 48dfbf9e7f85f2dd8e17505582e811bdacfd60d5 --publish-report reports/dev-gate/dev-artifacts.json", "code": 0, "startedAt": "2026-05-24T00:18:16.118Z", "finishedAt": "2026-05-24T00:18:16.162Z", "stdoutJson": { "status": "published", "targetRef": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "artifactCommitId": "48dfbf9", "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:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:15a9dec43d0ad6b750ea4eda860c1c157c6502441732c1de20ef3b92696d0dfc", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:bdb3dffd0a82e7cf1c48de3d130cbd6e733c242dd5667be4ba098a46888a13d6", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:902590cd05c9af8dcf347b74c05e1fb9fb399eefa54d91ff105dd2fa276ae785", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:015916d05ccbd8448e3f32d754335f7c221aaaadf5ae2b63007d7698f7583d04", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:74793df73dfeb27fc45b1085ac1c29839f6545ccfea79d033dfddc89d6f3a553", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:89d80def71130db7e0f4d9a0ec1dadfcb5d8963bd1f13b71c67eab0a301efb94", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:160a47204b2263e750cbf412f0d266047eeb6baf8b2be839e5d1987fc6082fea", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:0ab02340575ec7e910427f8ea06db2b8f8095922e207ae5e11a64c065fa26df7", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:75af6caa96ec03d3f4130e512052f666d75b1e5470fa67f8f66f355e1068e43f", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:f8b954ad76ab0162e3df0edc26c115f6c697f8f5c4e9d93e24112285b57b9b05", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:ae6564b6b0f8ceaf35ab5d2e7f7c04ca8f5e51aa7daedb01e4a6aa31e4bcc16b", "publishState": "published", "artifactRequired": true, "notPublishedReason": null }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "imageTag": "48dfbf9", "buildCreatedAt": "2026-05-24T00:07:33.363Z", "digest": "sha256:6fc9b4fda9bea32607774a24d72ecc7999007d910d17e11764abce2bdc35c03d", "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-24T00:18:16.163Z", "finishedAt": "2026-05-24T00:18:16.194Z", "stdoutJson": null, "stdoutTail": "validated 13 DEV artifact catalog services at 48dfbf9 (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 48dfbf9e7f85f2dd8e17505582e811bdacfd60d5 --check --pretty", "code": 0, "startedAt": "2026-05-24T00:18:16.194Z", "finishedAt": "2026-05-24T00:18:16.233Z", "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": "48dfbf9", "desiredImageTag": "48dfbf9", "artifactState": "published", "ciPublished": true, "registryVerified": true, "services": 13, "workloadContainers": 13, "presentMirrorCount": 14, "diagnostics": 0, "blockers": 0, "targetConvergence": "already_promoted" }, "target": { "targetRef": null, "promotionCommit": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "commitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "shortCommitId": "48dfbf9", "tag": "48dfbf9", "tagSource": "promotion-commit-short", "acceptedCurrentMain": null, "comparisonCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "comparisonTag": "48dfbf9", "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 48dfbf9e7f85f2dd8e17505582e811bdacfd60d5 --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": "48dfbf9", "matchesDesiredState": true, "artifactPublish": { "status": "published", "sourceCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:15a9dec43d0ad6b750ea4eda860c1c157c6502441732c1de20ef3b92696d0dfc", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "workloadImages": [ { "workload": "hwlab-cloud-api", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9" } ] } }, { "serviceId": "hwlab-cloud-web", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_COMMIT_ID": { "name": "HWLAB_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" }, "HWLAB_IMAGE": { "name": "HWLAB_IMAGE", "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "status": "match" }, "HWLAB_IMAGE_TAG": { "name": "HWLAB_IMAGE_TAG", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "workloadImages": [ { "workload": "hwlab-cloud-web", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9" } ] } }, { "serviceId": "hwlab-agent-mgr", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:bdb3dffd0a82e7cf1c48de3d130cbd6e733c242dd5667be4ba098a46888a13d6", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "workloadImages": [ { "workload": "hwlab-agent-mgr", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9" } ] } }, { "serviceId": "hwlab-agent-worker", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:902590cd05c9af8dcf347b74c05e1fb9fb399eefa54d91ff105dd2fa276ae785", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "workloadImages": [ { "workload": "hwlab-agent-worker-template", "container": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9" } ] } }, { "serviceId": "hwlab-gateway", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:015916d05ccbd8448e3f32d754335f7c221aaaadf5ae2b63007d7698f7583d04", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "workloadImages": [ { "workload": "hwlab-gateway", "container": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9" } ] } }, { "serviceId": "hwlab-gateway-simu", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:74793df73dfeb27fc45b1085ac1c29839f6545ccfea79d033dfddc89d6f3a553", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "workloadImages": [ { "workload": "hwlab-gateway-simu", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9" } ] } }, { "serviceId": "hwlab-box-simu", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:89d80def71130db7e0f4d9a0ec1dadfcb5d8963bd1f13b71c67eab0a301efb94", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "workloadImages": [ { "workload": "hwlab-box-simu", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9" } ] } }, { "serviceId": "hwlab-patch-panel", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:160a47204b2263e750cbf412f0d266047eeb6baf8b2be839e5d1987fc6082fea", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "workloadImages": [ { "workload": "hwlab-patch-panel", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9" } ] } }, { "serviceId": "hwlab-router", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:0ab02340575ec7e910427f8ea06db2b8f8095922e207ae5e11a64c065fa26df7", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "workloadImages": [ { "workload": "hwlab-router", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9" } ] } }, { "serviceId": "hwlab-tunnel-client", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:75af6caa96ec03d3f4130e512052f666d75b1e5470fa67f8f66f355e1068e43f", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "workloadImages": [ { "workload": "hwlab-tunnel-client", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9" } ] } }, { "serviceId": "hwlab-edge-proxy", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:f8b954ad76ab0162e3df0edc26c115f6c697f8f5c4e9d93e24112285b57b9b05", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "workloadImages": [ { "workload": "hwlab-edge-proxy", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9" } ] } }, { "serviceId": "hwlab-cli", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:ae6564b6b0f8ceaf35ab5d2e7f7c04ca8f5e51aa7daedb01e4a6aa31e4bcc16b", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": {}, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_SKILLS_COMMIT_ID", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "workloadImages": [ { "workload": "hwlab-cli-template", "container": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9" } ] } }, { "serviceId": "hwlab-agent-skills", "deploy": { "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } }, "catalog": { "commitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:6fc9b4fda9bea32607774a24d72ecc7999007d910d17e11764abce2bdc35c03d", "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:48dfbf9", "imageTag": "48dfbf9", "envMirrors": { "present": { "HWLAB_SKILLS_COMMIT_ID": { "name": "HWLAB_SKILLS_COMMIT_ID", "value": "48dfbf9", "expected": "48dfbf9", "status": "match" } }, "missing": [ "HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG", "HWLAB_IMAGE_DIGEST" ], "diagnostics": [] } } ], "promotion": { "targetCommitId": "48dfbf9e7f85f2dd8e17505582e811bdacfd60d5", "targetImageTag": "48dfbf9", "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "workloadImages": [ { "workload": "hwlab-agent-skills", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9" } ] } } ], "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-5332b2f8", "code": 0, "startedAt": "2026-05-24T00:18:16.303Z", "finishedAt": "2026-05-24T00:18:23.129Z", "stdoutJson": { "issue": "pikasTech/HWLAB#311", "mode": "apply", "generatedAt": "2026-05-24T00:18:19.999Z", "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-5332b2f8", "phase": "complete", "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "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-5332b2f8", "code": 0, "startedAt": "2026-05-24T00:18:23.129Z", "finishedAt": "2026-05-24T00:18:26.325Z", "stdoutJson": { "issue": "pikasTech/HWLAB#164", "mode": "apply", "generatedAt": "2026-05-24T00:18:23.761Z", "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-5332b2f8", "phase": "complete", "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "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-24T00:18:26.325Z", "finishedAt": "2026-05-24T00:18:29.334Z", "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": "48dfbf9", "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-24T00:18:29.328Z", "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: 48dfbf9", "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: pass", "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": "48dfbf9", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "sourceCommitId": "48dfbf9", "serviceCommitIds": [ "48dfbf9" ], "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] }, { "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:48dfbf9" } ] } ], "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:3df89fe", "newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "oldImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:3df89fe" } ], "newImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9" } ], "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:3df89fe", "newImage": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "oldImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:3df89fe" } ], "newImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9" } ], "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:48dfbf9", "oldImages": [], "newImages": [ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9" } ], "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:48dfbf9", "oldImages": [], "newImages": [ { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9" } ], "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": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "44", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageMatchesDesired": true, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "48dfbf9", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "HWLAB_IMAGE_TAG": "48dfbf9" }, "liveRuntimeEnv": { "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "48dfbf9", "actual": "48dfbf9", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "48dfbf9", "actual": "48dfbf9", "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": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "43", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "imageMatchesDesired": false, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "48dfbf9", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "HWLAB_IMAGE_TAG": "48dfbf9" }, "liveRuntimeEnv": { "status": "drift", "matchesDesired": false, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "48dfbf9", "actual": "3df89fe", "status": "drift" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "status": "drift" }, { "name": "HWLAB_IMAGE_TAG", "expected": "48dfbf9", "actual": "3df89fe", "status": "drift" } ], "drift": [ { "name": "HWLAB_COMMIT_ID", "expected": "48dfbf9", "actual": "3df89fe", "status": "drift" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "status": "drift" }, { "name": "HWLAB_IMAGE_TAG", "expected": "48dfbf9", "actual": "3df89fe", "status": "drift" } ] }, "runtimeEnvMatchesDesired": false, "runtimeEnvDrift": [ { "name": "HWLAB_COMMIT_ID", "expected": "48dfbf9", "actual": "3df89fe", "status": "drift" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "status": "drift" }, { "name": "HWLAB_IMAGE_TAG", "expected": "48dfbf9", "actual": "3df89fe", "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": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageTag": "48dfbf9", "digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "repositoryDigest": null, "publishState": "published", "rolloutRevision": "44", "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "imageMatchesDesired": true, "expectedRuntimeEnv": { "HWLAB_COMMIT_ID": "48dfbf9", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "HWLAB_IMAGE_TAG": "48dfbf9" }, "liveRuntimeEnv": { "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "48dfbf9", "actual": "48dfbf9", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "48dfbf9", "actual": "48dfbf9", "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": "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" }, "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": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9", "digest": "sha256:15a9dec43d0ad6b750ea4eda860c1c157c6502441732c1de20ef3b92696d0dfc", "publishState": "published" }, { "serviceId": "hwlab-cloud-web", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f", "publishState": "published" }, { "serviceId": "hwlab-agent-mgr", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "digest": "sha256:bdb3dffd0a82e7cf1c48de3d130cbd6e733c242dd5667be4ba098a46888a13d6", "publishState": "published" }, { "serviceId": "hwlab-agent-worker", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "digest": "sha256:902590cd05c9af8dcf347b74c05e1fb9fb399eefa54d91ff105dd2fa276ae785", "publishState": "published" }, { "serviceId": "hwlab-gateway", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "digest": "sha256:015916d05ccbd8448e3f32d754335f7c221aaaadf5ae2b63007d7698f7583d04", "publishState": "published" }, { "serviceId": "hwlab-gateway-simu", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "digest": "sha256:74793df73dfeb27fc45b1085ac1c29839f6545ccfea79d033dfddc89d6f3a553", "publishState": "published" }, { "serviceId": "hwlab-box-simu", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "digest": "sha256:89d80def71130db7e0f4d9a0ec1dadfcb5d8963bd1f13b71c67eab0a301efb94", "publishState": "published" }, { "serviceId": "hwlab-patch-panel", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "digest": "sha256:160a47204b2263e750cbf412f0d266047eeb6baf8b2be839e5d1987fc6082fea", "publishState": "published" }, { "serviceId": "hwlab-router", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "digest": "sha256:0ab02340575ec7e910427f8ea06db2b8f8095922e207ae5e11a64c065fa26df7", "publishState": "published" }, { "serviceId": "hwlab-tunnel-client", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "digest": "sha256:75af6caa96ec03d3f4130e512052f666d75b1e5470fa67f8f66f355e1068e43f", "publishState": "published" }, { "serviceId": "hwlab-edge-proxy", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "digest": "sha256:f8b954ad76ab0162e3df0edc26c115f6c697f8f5c4e9d93e24112285b57b9b05", "publishState": "published" }, { "serviceId": "hwlab-cli", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "digest": "sha256:ae6564b6b0f8ceaf35ab5d2e7f7c04ca8f5e51aa7daedb01e4a6aa31e4bcc16b", "publishState": "published" }, { "serviceId": "hwlab-agent-skills", "deployCommitId": "48dfbf9", "catalogCommitId": "48dfbf9", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "digest": "sha256:6fc9b4fda9bea32607774a24d72ecc7999007d910d17e11764abce2bdc35c03d", "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:48dfbf9", "kind": "Deployment", "name": "hwlab-cloud-api" }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "kind": "Deployment", "name": "hwlab-cloud-web" }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9", "kind": "Deployment", "name": "hwlab-agent-mgr" }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9", "kind": "Job", "name": "hwlab-agent-worker-template" }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9", "kind": "Deployment", "name": "hwlab-gateway" }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9", "kind": "StatefulSet", "name": "hwlab-gateway-simu" }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9", "kind": "StatefulSet", "name": "hwlab-box-simu" }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9", "kind": "Deployment", "name": "hwlab-patch-panel" }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9", "kind": "Deployment", "name": "hwlab-router" }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9", "kind": "Deployment", "name": "hwlab-tunnel-client" }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9", "kind": "Deployment", "name": "hwlab-edge-proxy" }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9", "kind": "Job", "name": "hwlab-cli-template" }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9", "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": "48dfbf9", "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "HWLAB_IMAGE_TAG": "48dfbf9" }, "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", "expected": "48dfbf9", "actual": "48dfbf9", "status": "match" }, { "name": "HWLAB_IMAGE", "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", "expected": "48dfbf9", "actual": "48dfbf9", "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-6f4cc98885-6bl9w", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-agent-skills-69485c4dc4-mpgdb", "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-54cdcb57dc-xw9gb", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-cloud-web-5bd7bf9c6-d67jc", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-edge-proxy-58984dcc7c-8bvqj", "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-55b9c584d7-7rzqb", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-router-76fd584bdb-t26cs", "phase": "Running" }, { "kind": "Pod", "name": "hwlab-runtime-migrate-5332b2f8-mlg9p", "phase": "Succeeded" }, { "kind": "Pod", "name": "hwlab-runtime-provision-5332b2f8-qdpq7", "phase": "Succeeded" }, { "kind": "Pod", "name": "hwlab-tunnel-client-69d7d6d6d8-pv8b9", "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-5332b2f8" }, { "kind": "Job", "name": "hwlab-runtime-provision-5332b2f8" } ] }, "liveProbe": { "status": "pass", "url": "http://74.48.78.17:16667/health/live", "httpStatus": 200, "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"ok\",\"ready\":true,\"revision\":\"3df89fe15100f3ef3c2e12e1a001b5370d54eff9\",\"readiness\":{\"contractVersion\":\"v3\",\"ready\":true,\"status\":\"ok\",\"blockerCodes\":[],\"blockers\":[],\"components\":{\"db\":\"ready\",\"codeAgent\":\"ready\",\"runtime\":\"ready\",\"provider\":\"ready\",\"dbDurable\":\"ready\",\"sessionRunner\":\"codex_stdio_ready\",\"codexStdio\":\"ready\"},\"provider\":{\"status\":\"ready\",\"ready\":true,\"configured\":true,\"provider\":\"codex-stdio\",\"model\":\"gpt-5.5\",\"backend" } }, "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-24T00:18:29.423Z", "finishedAt": "2026-05-24T00:18:39.661Z", "stdoutJson": { "issue": "pikasTech/HWLAB#311", "mode": "dev-live", "generatedAt": "2026-05-24T00:18:29.459Z", "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": "ok", "ready": true, "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": "ok", "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": true, "status": "ok", "durabilityReady": true, "durabilityBlockedLayer": null }, "blockerCodes": [], "m3IoControl": null, "error": null }, "apiV1": { "check": "GET /v1", "httpStatus": 200, "reachable": true, "serviceId": "hwlab-cloud-api", "environment": null, "status": "ok", "ready": true, "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": "ok", "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": true, "status": "ok", "durabilityReady": true, "durabilityBlockedLayer": null }, "blockerCodes": [], "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_63f8e5ee-3d78-4df2-b54f-d46b0308bd2a", "traceId": "trc_m3_io_e2e_write_do1_true_9d47c939-0464-437a-a2a5-90cff6714434", "auditId": "aud_m3_do_write_63f8e5ee-3d78-4df2-b54f-d46b0308bd2a_succeeded", "evidenceId": "evd_m3_do_write_63f8e5ee-3d78-4df2-b54f-d46b0308bd2a_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_73166d40-4572-4f6d-a96e-8e20f07a10dd", "traceId": "trc_m3_io_e2e_read_di1_true_a81f0788-33ab-42e1-a16e-16e2c171db1b", "auditId": "aud_m3_di_read_73166d40-4572-4f6d-a96e-8e20f07a10dd_succeeded", "evidenceId": "evd_m3_di_read_73166d40-4572-4f6d-a96e-8e20f07a10dd_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_0c0af96e-09e0-4e08-ba3f-b1fdf1d4668a", "traceId": "trc_m3_io_e2e_write_do1_false_9925768c-ca34-4b17-a9fa-344e7103ec97", "auditId": "aud_m3_do_write_0c0af96e-09e0-4e08-ba3f-b1fdf1d4668a_succeeded", "evidenceId": "evd_m3_do_write_0c0af96e-09e0-4e08-ba3f-b1fdf1d4668a_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_f656bcc9-3a3f-4aed-b59b-2d5d2edafff8", "traceId": "trc_m3_io_e2e_read_di1_false_83b6a1c9-cd8f-402b-bee4-d4c7f3973832", "auditId": "aud_m3_di_read_f656bcc9-3a3f-4aed-b59b-2d5d2edafff8_succeeded", "evidenceId": "evd_m3_di_read_f656bcc9-3a3f-4aed-b59b-2d5d2edafff8_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-24T00:07:29.593Z", "finishedAt": "2026-05-24T00:07:30.157Z", "expectedServiceId": "hwlab-cloud-web", "expectedCommit": null, "serviceId": "hwlab-cloud-web", "environment": "dev", "applicationStatus": "ok", "ready": null, "observedCommit": "3df89fe", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe", "imageTag": "3df89fe", "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-24T00:07:29.594Z", "finishedAt": "2026-05-24T00:07:31.417Z", "expectedServiceId": "hwlab-cloud-api", "expectedCommit": null, "serviceId": "hwlab-cloud-api", "environment": "dev", "applicationStatus": "ok", "ready": true, "observedCommit": "3df89fe", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:3df89fe", "imageTag": "3df89fe", "observedAt": "2026-05-24T00:07:30.656Z", "serviceMatches": true, "environmentMatches": true, "commitMatches": null, "blockerCodes": [] } ], "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-24T00:07:29.308Z", "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." }