Files
pikasTech-HWLAB/reports/dev-gate/dev-cd-apply.json
T
Lyon c59aff164d chore: record DEV CD promotion for 63acb59
Records DEV desired-state and reports for the successful 63acb59 DEV CD promotion. Validated artifact catalog, dev-gate reports, desired-state convergence, and live 16666/16667 health.
2026-05-23 17:47:22 +08:00

6115 lines
254 KiB
JSON

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