7395 lines
302 KiB
JSON
7395 lines
302 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": "e6d4bd5",
|
||
"acceptanceLevel": "dev_cd_apply",
|
||
"devOnly": true,
|
||
"prodDisabled": true,
|
||
"status": "blocked",
|
||
"generatedAt": "2026-05-23T21:48:18.309Z",
|
||
"reportLifecycle": {
|
||
"version": "v1",
|
||
"state": "active",
|
||
"activeEndpoint": "http://74.48.78.17:16667",
|
||
"activeBrowserEndpoint": "http://74.48.78.17:16666",
|
||
"deprecatedEndpoint": null,
|
||
"summary": "Current DEV CD transaction report; the only DEV side-effect entrypoint is scripts/dev-cd-apply.mjs."
|
||
},
|
||
"supports": [
|
||
"pikasTech/HWLAB#274",
|
||
"pikasTech/HWLAB#116",
|
||
"pikasTech/HWLAB#235",
|
||
"pikasTech/HWLAB#50",
|
||
"pikasTech/HWLAB#57",
|
||
"pikasTech/HWLAB#67",
|
||
"pikasTech/HWLAB#73"
|
||
],
|
||
"sourceContract": {
|
||
"status": "blocked",
|
||
"documents": [
|
||
"docs/reference/deployment-publish.md",
|
||
"docs/reference/dev-runtime-boundary.md",
|
||
"docs/dev-artifact-publish.md",
|
||
"docs/dev-deploy-apply.md",
|
||
"docs/artifact-catalog.md"
|
||
],
|
||
"summary": "DEV CD publish/apply/verify side effects are serialized by one Kubernetes Lease and use deploy/deploy.json as the apply desired-state source."
|
||
},
|
||
"validationCommands": [
|
||
"node --check scripts/dev-cd-apply.mjs",
|
||
"node --check scripts/src/dev-cd-apply.mjs",
|
||
"node --test scripts/src/dev-cd-apply.test.mjs",
|
||
"node --check scripts/dev-artifact-publish.mjs",
|
||
"node --check scripts/src/dev-deploy-apply.mjs",
|
||
"node --test scripts/src/dev-deploy-apply.test.mjs",
|
||
"node scripts/deploy-desired-state-plan.mjs --check",
|
||
"node scripts/validate-artifact-catalog.mjs",
|
||
"git diff --check"
|
||
],
|
||
"localSmoke": {
|
||
"status": "not_run",
|
||
"commands": [
|
||
"npm run check"
|
||
],
|
||
"evidence": [
|
||
"Local checks are listed as validation commands and are not implied by a DEV CD transaction."
|
||
],
|
||
"summary": "The transaction report records DEV publish/apply/verify evidence; local smoke is a separate gate."
|
||
},
|
||
"dryRun": {
|
||
"status": "not_run",
|
||
"commands": [
|
||
"node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked --write-report"
|
||
],
|
||
"evidence": [
|
||
"The transaction path owns live side effects; dry-run remains a preflight support mode."
|
||
],
|
||
"summary": "DEV CD mutation requires --apply and the transaction Lease lock."
|
||
},
|
||
"devPreconditions": {
|
||
"status": "blocked",
|
||
"requirements": [
|
||
"DEV CD apply must force KUBECONFIG=/etc/rancher/k3s/k3s.yaml and verify native node d601 before any Lease, Job, apply, or rollout side effect.",
|
||
"DEV CD apply must reject docker-desktop, desktop-control-plane, 127.0.0.1:11700, bare kubectl ambiguity, and second hwlab-dev control-plane signals before mutation.",
|
||
"DEV CD apply must verify required SecretRef existence and key names without reading or printing Secret values.",
|
||
"HEAD must match the requested target ref before publish.",
|
||
"Lease/hwlab-dev-cd-lock must be acquired before publish/apply.",
|
||
"Legacy publish/apply side-effect scripts must run with HWLAB_CD_TRANSACTION_ID.",
|
||
"DEV DB role/database provisioning and runtime migration must run through repo-owned commands before workload apply.",
|
||
"deploy/deploy.json, artifact catalog, and workloads must converge before apply.",
|
||
"When deploy/deploy.json already points to a published promotion commit, HEAD may be a later control commit and the transaction must consume that promotion without republishing HEAD.",
|
||
"Public 16666 and 16667 live health plus M3 durable postflight must be recorded in this report."
|
||
],
|
||
"summary": "One or more DEV CD transaction preconditions failed."
|
||
},
|
||
"transaction": {
|
||
"transactionId": "35e3d897-c90f-42bf-b41c-c1b042ffbae9",
|
||
"ownerTaskId": "DC-DCSN-P0-2026-003-HWLAB-DEV-CD-ROLLOUT-20260523T2138Z",
|
||
"targetNamespace": "hwlab-dev",
|
||
"lockName": "hwlab-dev-cd-lock",
|
||
"lockBackend": "Lease",
|
||
"startedAt": "2026-05-23T21:37:52.909Z",
|
||
"finishedAt": "2026-05-23T21:48:18.309Z",
|
||
"ttlSeconds": 3600,
|
||
"phases": [
|
||
{
|
||
"phase": "publishing",
|
||
"status": "entered",
|
||
"at": "2026-05-23T21:37:54.541Z"
|
||
},
|
||
{
|
||
"phase": "applying",
|
||
"status": "entered",
|
||
"at": "2026-05-23T21:47:57.434Z"
|
||
},
|
||
{
|
||
"phase": "verifying",
|
||
"status": "entered",
|
||
"at": "2026-05-23T21:48:14.217Z"
|
||
},
|
||
{
|
||
"phase": "released",
|
||
"status": "released",
|
||
"at": "2026-05-23T21:48:18.309Z"
|
||
}
|
||
],
|
||
"release": {
|
||
"status": "released",
|
||
"command": "kubectl -n hwlab-dev replace -f - -o json",
|
||
"lock": {
|
||
"lockBackend": "Lease",
|
||
"lockName": "hwlab-dev-cd-lock",
|
||
"resourceVersion": "1495698",
|
||
"holderIdentity": "",
|
||
"promotionCommit": "e6d4bd5",
|
||
"deployJsonHash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e",
|
||
"ownerTaskId": "DC-DCSN-P0-2026-003-HWLAB-DEV-CD-ROLLOUT-20260523T2138Z",
|
||
"transactionId": "35e3d897-c90f-42bf-b41c-c1b042ffbae9",
|
||
"phase": "released",
|
||
"startedAt": "2026-05-23T21:37:53.176000Z",
|
||
"updatedAt": "2026-05-23T21:48:18.271000Z",
|
||
"ttlSeconds": 3600,
|
||
"liveBefore": {
|
||
"status": "pass",
|
||
"expectedCommit": null,
|
||
"endpoints": [
|
||
{
|
||
"id": "cloud-web-16666",
|
||
"url": "http://74.48.78.17:16666/health/live",
|
||
"status": "pass",
|
||
"httpStatus": 200,
|
||
"reachable": true,
|
||
"identityMatches": true,
|
||
"startedAt": "2026-05-23T21:37:53.244Z",
|
||
"finishedAt": "2026-05-23T21:37:53.799Z",
|
||
"expectedServiceId": "hwlab-cloud-web",
|
||
"expectedCommit": null,
|
||
"serviceId": "hwlab-cloud-web",
|
||
"environment": "dev",
|
||
"applicationStatus": "ok",
|
||
"ready": null,
|
||
"observedCommit": "b02ac5b",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"imageTag": "b02ac5b",
|
||
"observedAt": null,
|
||
"serviceMatches": true,
|
||
"environmentMatches": true,
|
||
"commitMatches": null,
|
||
"blockerCodes": []
|
||
},
|
||
{
|
||
"id": "cloud-api-16667",
|
||
"url": "http://74.48.78.17:16667/health/live",
|
||
"status": "pass",
|
||
"httpStatus": 200,
|
||
"reachable": true,
|
||
"identityMatches": true,
|
||
"startedAt": "2026-05-23T21:37:53.246Z",
|
||
"finishedAt": "2026-05-23T21:37:54.477Z",
|
||
"expectedServiceId": "hwlab-cloud-api",
|
||
"expectedCommit": null,
|
||
"serviceId": "hwlab-cloud-api",
|
||
"environment": "dev",
|
||
"applicationStatus": "degraded",
|
||
"ready": false,
|
||
"observedCommit": "b02ac5b",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b",
|
||
"imageTag": "b02ac5b",
|
||
"observedAt": "2026-05-23T21:37:53.704Z",
|
||
"serviceMatches": true,
|
||
"environmentMatches": true,
|
||
"commitMatches": null,
|
||
"blockerCodes": [
|
||
"stdio_protocol_not_wired"
|
||
]
|
||
}
|
||
],
|
||
"summary": {
|
||
"checked": 2,
|
||
"reachable": 2,
|
||
"identityMatches": 2,
|
||
"commitMatches": null,
|
||
"ports": [
|
||
16666,
|
||
16667
|
||
]
|
||
}
|
||
},
|
||
"targetNamespace": "hwlab-dev",
|
||
"targetRef": "origin/main",
|
||
"releasedAt": "2026-05-23T21:48:18.271000Z",
|
||
"releaseStatus": "blocked",
|
||
"staleLockBrokenAt": null,
|
||
"staleLockPrevious": null
|
||
}
|
||
}
|
||
},
|
||
"devCdApply": {
|
||
"mode": "apply",
|
||
"target": {
|
||
"ref": "origin/main",
|
||
"promotionCommit": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"shortCommitId": "e6d4bd5",
|
||
"promotionSource": "target-ref",
|
||
"publishRequired": true,
|
||
"controlRef": {
|
||
"ref": "origin/main",
|
||
"commitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"shortCommitId": "e6d4bd5"
|
||
},
|
||
"headCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"headMatchesTarget": true,
|
||
"desiredStateCheck": null,
|
||
"artifactBoundary": {
|
||
"status": "degraded",
|
||
"controlCommit": {
|
||
"commitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"shortCommitId": "e6d4bd5"
|
||
},
|
||
"artifactMergeCommit": {
|
||
"commitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"shortCommitId": "e6d4bd5",
|
||
"isMergeCommit": true,
|
||
"parents": [
|
||
"cb79b9dac7815dd86d49e9b0c44502064713a37a",
|
||
"3c8a146eee8286315d11a60ac1a42de02c24e546"
|
||
],
|
||
"promotionParent": "cb79b9dac7815dd86d49e9b0c44502064713a37a",
|
||
"artifactParent": "3c8a146eee8286315d11a60ac1a42de02c24e546",
|
||
"promotionParentMatches": false,
|
||
"changedPaths": [
|
||
"deploy/deploy.json",
|
||
"deploy/k8s/base/workloads.yaml"
|
||
]
|
||
},
|
||
"artifactCommit": {
|
||
"commitId": "3c8a146eee8286315d11a60ac1a42de02c24e546",
|
||
"shortCommitId": "3c8a146",
|
||
"parents": [
|
||
"cb79b9dac7815dd86d49e9b0c44502064713a37a"
|
||
],
|
||
"promotionParentMatches": false
|
||
},
|
||
"desiredState": {
|
||
"deployCommitId": "e6d4bd5",
|
||
"deployJsonHash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"catalogHash": "sha256:6195e2ed01c7f0fcad407b454b306b07a81270f8b6e79119158af295c6fd744e",
|
||
"reportCommitId": "b02ac5b",
|
||
"reportSourceCommitId": "b02ac5becad13aeeab0d5cb7d8f01300bccb78c2",
|
||
"reportHash": "sha256:2679ba1b2f89d554e99031fd5fa7df6067a6b42ef7b3fdfc2ee04c0f1880b41b",
|
||
"deployCommitMatches": true,
|
||
"catalogCommitMatches": true,
|
||
"reportCommitMatches": false,
|
||
"desiredStatePaths": [
|
||
"deploy/artifact-catalog.dev.json",
|
||
"deploy/deploy.json",
|
||
"deploy/k8s/base/workloads.yaml",
|
||
"reports/dev-gate/dev-artifacts.json"
|
||
]
|
||
}
|
||
},
|
||
"namespace": "hwlab-dev",
|
||
"apiEndpoint": "http://74.48.78.17:16667",
|
||
"browserEndpoint": "http://74.48.78.17:16666/"
|
||
},
|
||
"deployJson": {
|
||
"before": {
|
||
"path": "deploy/deploy.json",
|
||
"hash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e",
|
||
"commitId": "e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"environment": "dev",
|
||
"endpoint": "http://74.48.78.17:16667",
|
||
"manifest": {
|
||
"manifestVersion": "v1",
|
||
"environment": "dev",
|
||
"commitId": "e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"endpoint": "http://74.48.78.17:16667",
|
||
"health": {
|
||
"method": "GET",
|
||
"path": "/health/live",
|
||
"responseFormat": "json"
|
||
},
|
||
"publicEndpoints": {
|
||
"frontend": {
|
||
"url": "http://74.48.78.17:16666",
|
||
"protocol": "http",
|
||
"host": "74.48.78.17",
|
||
"port": 16666,
|
||
"serviceId": "hwlab-cloud-web",
|
||
"frpProxy": "hwlab-dev-cloud-web"
|
||
},
|
||
"api": {
|
||
"url": "http://74.48.78.17:16667",
|
||
"protocol": "http",
|
||
"host": "74.48.78.17",
|
||
"port": 16667,
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"frpProxy": "hwlab-dev-edge-proxy"
|
||
}
|
||
},
|
||
"frp": {
|
||
"server": {
|
||
"address": "74.48.78.17",
|
||
"bindPort": 7000
|
||
},
|
||
"proxies": [
|
||
{
|
||
"name": "hwlab-dev-cloud-web",
|
||
"endpointId": "frontend",
|
||
"type": "tcp",
|
||
"localServiceId": "hwlab-cloud-web",
|
||
"localHost": "hwlab-cloud-web.hwlab-dev.svc.cluster.local",
|
||
"localPort": 8080,
|
||
"remotePort": 16666
|
||
},
|
||
{
|
||
"name": "hwlab-dev-edge-proxy",
|
||
"endpointId": "api",
|
||
"type": "tcp",
|
||
"localServiceId": "hwlab-edge-proxy",
|
||
"localHost": "hwlab-edge-proxy.hwlab-dev.svc.cluster.local",
|
||
"localPort": 6667,
|
||
"remotePort": 16667
|
||
},
|
||
{
|
||
"name": "hwlab-dev-tunnel-health",
|
||
"type": "tcp",
|
||
"localServiceId": "hwlab-tunnel-client",
|
||
"localHost": "hwlab-tunnel-client.hwlab-dev.svc.cluster.local",
|
||
"localPort": 7402,
|
||
"remotePort": 7402
|
||
}
|
||
]
|
||
},
|
||
"k3s": {
|
||
"serviceMappings": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"name": "hwlab-cloud-api",
|
||
"namespace": "hwlab-dev",
|
||
"port": 6667,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"name": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"port": 8080,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"name": "hwlab-gateway",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7001,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"name": "hwlab-cli",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7501,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"name": "hwlab-agent-skills",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7430,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"name": "hwlab-agent-mgr",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7410,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"name": "hwlab-gateway-simu-1",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7101,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"name": "hwlab-box-simu-1",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7201,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"name": "hwlab-gateway-simu-2",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7101,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"name": "hwlab-box-simu-2",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7201,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"name": "hwlab-patch-panel",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7301,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"name": "hwlab-router",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7401,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"name": "hwlab-tunnel-client",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7402,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"name": "hwlab-edge-proxy",
|
||
"namespace": "hwlab-dev",
|
||
"port": 6667,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
"profiles": {
|
||
"dev": {
|
||
"name": "dev",
|
||
"enabled": true,
|
||
"namespace": "hwlab-dev",
|
||
"endpoint": "http://74.48.78.17:16667",
|
||
"notes": "DEV-only k3s deployment skeleton. D601 reaches the master edge through frp reverse tunnel."
|
||
},
|
||
"prod": {
|
||
"name": "prod",
|
||
"enabled": false,
|
||
"namespace": "hwlab-prod",
|
||
"notes": "Reserved placeholder only. PROD deployment and acceptance are explicitly out of scope."
|
||
}
|
||
},
|
||
"services": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_ENVIRONMENT": "dev",
|
||
"HWLAB_PUBLIC_ENDPOINT": "http://74.48.78.17:16667",
|
||
"HWLAB_COMMIT_ID": "e6d4bd5",
|
||
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"HWLAB_IMAGE_TAG": "e6d4bd5",
|
||
"HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN": "unidesk-backend,provider-gateway,microservice-proxy",
|
||
"HWLAB_CLOUD_DB_URL": "secretRef:hwlab-cloud-api-dev-db/database-url",
|
||
"HWLAB_CLOUD_DB_SSL_MODE": "disable",
|
||
"HWLAB_CLOUD_DB_CONTRACT": "dev-redacted-presence-only",
|
||
"HWLAB_CLOUD_RUNTIME_ADAPTER": "postgres",
|
||
"HWLAB_CLOUD_RUNTIME_DURABLE": "true",
|
||
"HWLAB_M3_IO_CONTROL_ENABLED": "true",
|
||
"HWLAB_M3_GATEWAY_SIMU_1_URL": "http://hwlab-gateway-simu-1.hwlab-dev.svc.cluster.local:7101",
|
||
"HWLAB_M3_GATEWAY_SIMU_2_URL": "http://hwlab-gateway-simu-2.hwlab-dev.svc.cluster.local:7101",
|
||
"HWLAB_M3_PATCH_PANEL_URL": "http://hwlab-patch-panel.hwlab-dev.svc.cluster.local:7301",
|
||
"HWLAB_CODE_AGENT_PROVIDER": "codex-stdio",
|
||
"HWLAB_CODE_AGENT_MODEL": "gpt-5.5",
|
||
"HWLAB_CODE_AGENT_TIMEOUT_MS": "120000",
|
||
"HWLAB_CODE_AGENT_OPENAI_BASE_URL": "http://172.26.26.227:17680/v1/responses",
|
||
"HWLAB_CODE_AGENT_HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667",
|
||
"HWLAB_CODE_AGENT_CODEX_STDIO_ENABLED": "1",
|
||
"HWLAB_CODE_AGENT_CODEX_STDIO_SUPERVISOR": "repo-owned",
|
||
"HWLAB_CODE_AGENT_WORKSPACE": "/workspace/hwlab",
|
||
"HWLAB_CODE_AGENT_CODEX_WORKSPACE": "/workspace/hwlab",
|
||
"HWLAB_CODE_AGENT_CODEX_SANDBOX": "workspace-write",
|
||
"HWLAB_CODE_AGENT_CODEX_COMMAND": "/app/node_modules/.bin/codex",
|
||
"CODEX_HOME": "/codex-home",
|
||
"OPENAI_API_KEY": "secretRef:hwlab-code-agent-provider/openai-api-key",
|
||
"HWLAB_CODE_AGENT_SKILLS_DIRS": "/app/skills:/root/.agents/skills:/home/ubuntu/.agents/skills"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_ENVIRONMENT": "dev",
|
||
"HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667",
|
||
"HWLAB_CLOUD_WEB_PROXY_TIMEOUT_MS": "150000",
|
||
"HWLAB_COMMIT_ID": "e6d4bd5",
|
||
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"HWLAB_IMAGE_TAG": "e6d4bd5"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_AGENT_SESSION_MODE": "control-plane",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 0,
|
||
"env": {
|
||
"HWLAB_AGENT_SESSION_MODE": "session-scoped",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 0,
|
||
"env": {
|
||
"HWLAB_GATEWAY_MODE": "hardware-boundary",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 2,
|
||
"instanceNames": [
|
||
"hwlab-gateway-simu-1",
|
||
"hwlab-gateway-simu-2"
|
||
],
|
||
"identityStrategy": "indexed-workloads",
|
||
"env": {
|
||
"HWLAB_GATEWAY_MODE": "simulator",
|
||
"HWLAB_GATEWAY_ID": "gwsimu_1,gwsimu_2",
|
||
"HWLAB_BOX_IDS": "boxsimu_1,boxsimu_2",
|
||
"HWLAB_BOX_RESOURCES": "res_boxsimu_1,res_boxsimu_2",
|
||
"HWLAB_BOX_URLS": "http://hwlab-box-simu-1.hwlab-dev.svc.cluster.local:7201,http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 2,
|
||
"instanceNames": [
|
||
"hwlab-box-simu-1",
|
||
"hwlab-box-simu-2"
|
||
],
|
||
"identityStrategy": "indexed-workloads",
|
||
"env": {
|
||
"HWLAB_BOX_ID": "boxsimu_1,boxsimu_2",
|
||
"HWLAB_BOX_RESOURCE_ID": "res_boxsimu_1,res_boxsimu_2",
|
||
"HWLAB_GATEWAY_SESSION_ID": "gws_gwsimu_1,gws_gwsimu_2",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"m3Route": {
|
||
"fromResourceId": "res_boxsimu_1",
|
||
"fromPort": "DO1",
|
||
"patchPanelServiceId": "hwlab-patch-panel",
|
||
"toResourceId": "res_boxsimu_2",
|
||
"toPort": "DI1"
|
||
},
|
||
"env": {
|
||
"HWLAB_PATCH_PANEL_MODE": "dev-skeleton",
|
||
"HWLAB_PATCH_PANEL_ENDPOINT_MAP": "{\"res_boxsimu_2\":\"http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201\"}",
|
||
"HWLAB_PATCH_PANEL_WIRING_CONFIG": "{\"wiringConfigId\":\"wir_m3_do1_di1\",\"projectId\":\"prj_m3_hardware_loop\",\"gatewaySessionId\":\"gws_gwsimu_1\",\"name\":\"M3 simulated DO1 to DI1 patch wiring\",\"status\":\"active\",\"connections\":[{\"from\":{\"resourceId\":\"res_boxsimu_1\",\"port\":\"DO1\"},\"to\":{\"resourceId\":\"res_boxsimu_2\",\"port\":\"DI1\"},\"mode\":\"exclusive\"}],\"constraints\":{\"propagation\":\"patch-panel-only\",\"localLoopbackSubstituteAllowed\":false},\"createdAt\":\"2026-05-21T00:00:00.000Z\",\"updatedAt\":\"2026-05-21T00:00:00.000Z\"}",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_ROUTER_MODE": "edge-reachability",
|
||
"HWLAB_EDGE_PROXY_SERVICE": "hwlab-edge-proxy"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_TUNNEL_MODE": "frp-client",
|
||
"HWLAB_FRP_SERVER_ADDR": "74.48.78.17",
|
||
"HWLAB_FRP_PUBLIC_PORT": "16667",
|
||
"HWLAB_FRP_WEB_PUBLIC_PORT": "16666"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_EDGE_LISTEN": "0.0.0.0:6667",
|
||
"HWLAB_EDGE_UPSTREAM": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667",
|
||
"HWLAB_EDGE_PROXY_TIMEOUT_MS": "150000"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 0,
|
||
"env": {
|
||
"HWLAB_CLI_ENDPOINT": "http://74.48.78.17:16667"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_SKILLS_COMMIT_ID": "e6d4bd5"
|
||
}
|
||
}
|
||
],
|
||
"createdAt": "2026-05-21T00:00:00Z"
|
||
}
|
||
},
|
||
"after": {
|
||
"path": "deploy/deploy.json",
|
||
"hash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e",
|
||
"commitId": "e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"environment": "dev",
|
||
"endpoint": "http://74.48.78.17:16667",
|
||
"manifest": {
|
||
"manifestVersion": "v1",
|
||
"environment": "dev",
|
||
"commitId": "e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"endpoint": "http://74.48.78.17:16667",
|
||
"health": {
|
||
"method": "GET",
|
||
"path": "/health/live",
|
||
"responseFormat": "json"
|
||
},
|
||
"publicEndpoints": {
|
||
"frontend": {
|
||
"url": "http://74.48.78.17:16666",
|
||
"protocol": "http",
|
||
"host": "74.48.78.17",
|
||
"port": 16666,
|
||
"serviceId": "hwlab-cloud-web",
|
||
"frpProxy": "hwlab-dev-cloud-web"
|
||
},
|
||
"api": {
|
||
"url": "http://74.48.78.17:16667",
|
||
"protocol": "http",
|
||
"host": "74.48.78.17",
|
||
"port": 16667,
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"frpProxy": "hwlab-dev-edge-proxy"
|
||
}
|
||
},
|
||
"frp": {
|
||
"server": {
|
||
"address": "74.48.78.17",
|
||
"bindPort": 7000
|
||
},
|
||
"proxies": [
|
||
{
|
||
"name": "hwlab-dev-cloud-web",
|
||
"endpointId": "frontend",
|
||
"type": "tcp",
|
||
"localServiceId": "hwlab-cloud-web",
|
||
"localHost": "hwlab-cloud-web.hwlab-dev.svc.cluster.local",
|
||
"localPort": 8080,
|
||
"remotePort": 16666
|
||
},
|
||
{
|
||
"name": "hwlab-dev-edge-proxy",
|
||
"endpointId": "api",
|
||
"type": "tcp",
|
||
"localServiceId": "hwlab-edge-proxy",
|
||
"localHost": "hwlab-edge-proxy.hwlab-dev.svc.cluster.local",
|
||
"localPort": 6667,
|
||
"remotePort": 16667
|
||
},
|
||
{
|
||
"name": "hwlab-dev-tunnel-health",
|
||
"type": "tcp",
|
||
"localServiceId": "hwlab-tunnel-client",
|
||
"localHost": "hwlab-tunnel-client.hwlab-dev.svc.cluster.local",
|
||
"localPort": 7402,
|
||
"remotePort": 7402
|
||
}
|
||
]
|
||
},
|
||
"k3s": {
|
||
"serviceMappings": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"name": "hwlab-cloud-api",
|
||
"namespace": "hwlab-dev",
|
||
"port": 6667,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"name": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"port": 8080,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"name": "hwlab-gateway",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7001,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"name": "hwlab-cli",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7501,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"name": "hwlab-agent-skills",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7430,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"name": "hwlab-agent-mgr",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7410,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"name": "hwlab-gateway-simu-1",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7101,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"name": "hwlab-box-simu-1",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7201,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"name": "hwlab-gateway-simu-2",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7101,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"name": "hwlab-box-simu-2",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7201,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"name": "hwlab-patch-panel",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7301,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"name": "hwlab-router",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7401,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"name": "hwlab-tunnel-client",
|
||
"namespace": "hwlab-dev",
|
||
"port": 7402,
|
||
"targetPort": "http"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"name": "hwlab-edge-proxy",
|
||
"namespace": "hwlab-dev",
|
||
"port": 6667,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
"profiles": {
|
||
"dev": {
|
||
"name": "dev",
|
||
"enabled": true,
|
||
"namespace": "hwlab-dev",
|
||
"endpoint": "http://74.48.78.17:16667",
|
||
"notes": "DEV-only k3s deployment skeleton. D601 reaches the master edge through frp reverse tunnel."
|
||
},
|
||
"prod": {
|
||
"name": "prod",
|
||
"enabled": false,
|
||
"namespace": "hwlab-prod",
|
||
"notes": "Reserved placeholder only. PROD deployment and acceptance are explicitly out of scope."
|
||
}
|
||
},
|
||
"services": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_ENVIRONMENT": "dev",
|
||
"HWLAB_PUBLIC_ENDPOINT": "http://74.48.78.17:16667",
|
||
"HWLAB_COMMIT_ID": "e6d4bd5",
|
||
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"HWLAB_IMAGE_TAG": "e6d4bd5",
|
||
"HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN": "unidesk-backend,provider-gateway,microservice-proxy",
|
||
"HWLAB_CLOUD_DB_URL": "secretRef:hwlab-cloud-api-dev-db/database-url",
|
||
"HWLAB_CLOUD_DB_SSL_MODE": "disable",
|
||
"HWLAB_CLOUD_DB_CONTRACT": "dev-redacted-presence-only",
|
||
"HWLAB_CLOUD_RUNTIME_ADAPTER": "postgres",
|
||
"HWLAB_CLOUD_RUNTIME_DURABLE": "true",
|
||
"HWLAB_M3_IO_CONTROL_ENABLED": "true",
|
||
"HWLAB_M3_GATEWAY_SIMU_1_URL": "http://hwlab-gateway-simu-1.hwlab-dev.svc.cluster.local:7101",
|
||
"HWLAB_M3_GATEWAY_SIMU_2_URL": "http://hwlab-gateway-simu-2.hwlab-dev.svc.cluster.local:7101",
|
||
"HWLAB_M3_PATCH_PANEL_URL": "http://hwlab-patch-panel.hwlab-dev.svc.cluster.local:7301",
|
||
"HWLAB_CODE_AGENT_PROVIDER": "codex-stdio",
|
||
"HWLAB_CODE_AGENT_MODEL": "gpt-5.5",
|
||
"HWLAB_CODE_AGENT_TIMEOUT_MS": "120000",
|
||
"HWLAB_CODE_AGENT_OPENAI_BASE_URL": "http://172.26.26.227:17680/v1/responses",
|
||
"HWLAB_CODE_AGENT_HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667",
|
||
"HWLAB_CODE_AGENT_CODEX_STDIO_ENABLED": "1",
|
||
"HWLAB_CODE_AGENT_CODEX_STDIO_SUPERVISOR": "repo-owned",
|
||
"HWLAB_CODE_AGENT_WORKSPACE": "/workspace/hwlab",
|
||
"HWLAB_CODE_AGENT_CODEX_WORKSPACE": "/workspace/hwlab",
|
||
"HWLAB_CODE_AGENT_CODEX_SANDBOX": "workspace-write",
|
||
"HWLAB_CODE_AGENT_CODEX_COMMAND": "/app/node_modules/.bin/codex",
|
||
"CODEX_HOME": "/codex-home",
|
||
"OPENAI_API_KEY": "secretRef:hwlab-code-agent-provider/openai-api-key",
|
||
"HWLAB_CODE_AGENT_SKILLS_DIRS": "/app/skills:/root/.agents/skills:/home/ubuntu/.agents/skills"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_ENVIRONMENT": "dev",
|
||
"HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667",
|
||
"HWLAB_CLOUD_WEB_PROXY_TIMEOUT_MS": "150000",
|
||
"HWLAB_COMMIT_ID": "e6d4bd5",
|
||
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"HWLAB_IMAGE_TAG": "e6d4bd5"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_AGENT_SESSION_MODE": "control-plane",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 0,
|
||
"env": {
|
||
"HWLAB_AGENT_SESSION_MODE": "session-scoped",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 0,
|
||
"env": {
|
||
"HWLAB_GATEWAY_MODE": "hardware-boundary",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 2,
|
||
"instanceNames": [
|
||
"hwlab-gateway-simu-1",
|
||
"hwlab-gateway-simu-2"
|
||
],
|
||
"identityStrategy": "indexed-workloads",
|
||
"env": {
|
||
"HWLAB_GATEWAY_MODE": "simulator",
|
||
"HWLAB_GATEWAY_ID": "gwsimu_1,gwsimu_2",
|
||
"HWLAB_BOX_IDS": "boxsimu_1,boxsimu_2",
|
||
"HWLAB_BOX_RESOURCES": "res_boxsimu_1,res_boxsimu_2",
|
||
"HWLAB_BOX_URLS": "http://hwlab-box-simu-1.hwlab-dev.svc.cluster.local:7201,http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 2,
|
||
"instanceNames": [
|
||
"hwlab-box-simu-1",
|
||
"hwlab-box-simu-2"
|
||
],
|
||
"identityStrategy": "indexed-workloads",
|
||
"env": {
|
||
"HWLAB_BOX_ID": "boxsimu_1,boxsimu_2",
|
||
"HWLAB_BOX_RESOURCE_ID": "res_boxsimu_1,res_boxsimu_2",
|
||
"HWLAB_GATEWAY_SESSION_ID": "gws_gwsimu_1,gws_gwsimu_2",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"m3Route": {
|
||
"fromResourceId": "res_boxsimu_1",
|
||
"fromPort": "DO1",
|
||
"patchPanelServiceId": "hwlab-patch-panel",
|
||
"toResourceId": "res_boxsimu_2",
|
||
"toPort": "DI1"
|
||
},
|
||
"env": {
|
||
"HWLAB_PATCH_PANEL_MODE": "dev-skeleton",
|
||
"HWLAB_PATCH_PANEL_ENDPOINT_MAP": "{\"res_boxsimu_2\":\"http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201\"}",
|
||
"HWLAB_PATCH_PANEL_WIRING_CONFIG": "{\"wiringConfigId\":\"wir_m3_do1_di1\",\"projectId\":\"prj_m3_hardware_loop\",\"gatewaySessionId\":\"gws_gwsimu_1\",\"name\":\"M3 simulated DO1 to DI1 patch wiring\",\"status\":\"active\",\"connections\":[{\"from\":{\"resourceId\":\"res_boxsimu_1\",\"port\":\"DO1\"},\"to\":{\"resourceId\":\"res_boxsimu_2\",\"port\":\"DI1\"},\"mode\":\"exclusive\"}],\"constraints\":{\"propagation\":\"patch-panel-only\",\"localLoopbackSubstituteAllowed\":false},\"createdAt\":\"2026-05-21T00:00:00.000Z\",\"updatedAt\":\"2026-05-21T00:00:00.000Z\"}",
|
||
"HWLAB_ENVIRONMENT": "dev"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_ROUTER_MODE": "edge-reachability",
|
||
"HWLAB_EDGE_PROXY_SERVICE": "hwlab-edge-proxy"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_TUNNEL_MODE": "frp-client",
|
||
"HWLAB_FRP_SERVER_ADDR": "74.48.78.17",
|
||
"HWLAB_FRP_PUBLIC_PORT": "16667",
|
||
"HWLAB_FRP_WEB_PUBLIC_PORT": "16666"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_EDGE_LISTEN": "0.0.0.0:6667",
|
||
"HWLAB_EDGE_UPSTREAM": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667",
|
||
"HWLAB_EDGE_PROXY_TIMEOUT_MS": "150000"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 0,
|
||
"env": {
|
||
"HWLAB_CLI_ENDPOINT": "http://74.48.78.17:16667"
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"namespace": "hwlab-dev",
|
||
"healthPath": "/health/live",
|
||
"profile": "dev",
|
||
"replicas": 1,
|
||
"env": {
|
||
"HWLAB_SKILLS_COMMIT_ID": "e6d4bd5"
|
||
}
|
||
}
|
||
],
|
||
"createdAt": "2026-05-21T00:00:00Z"
|
||
}
|
||
}
|
||
},
|
||
"lock": {
|
||
"acquired": true,
|
||
"current": {
|
||
"lockBackend": "Lease",
|
||
"lockName": "hwlab-dev-cd-lock",
|
||
"resourceVersion": "1495618",
|
||
"holderIdentity": "DC-DCSN-P0-2026-003-HWLAB-DEV-CD-ROLLOUT-20260523T2138Z/35e3d897-c90f-42bf-b41c-c1b042ffbae9",
|
||
"promotionCommit": "e6d4bd5",
|
||
"deployJsonHash": "sha256:4a0a031deb54812637cc083d2cf1bc3dca9ed16418cd7da52970a6e9b2ace70e",
|
||
"ownerTaskId": "DC-DCSN-P0-2026-003-HWLAB-DEV-CD-ROLLOUT-20260523T2138Z",
|
||
"transactionId": "35e3d897-c90f-42bf-b41c-c1b042ffbae9",
|
||
"phase": "verifying",
|
||
"startedAt": "2026-05-23T21:37:53.176000Z",
|
||
"updatedAt": "2026-05-23T21:48:14.132000Z",
|
||
"ttlSeconds": 3600,
|
||
"liveBefore": {
|
||
"status": "pass",
|
||
"expectedCommit": null,
|
||
"endpoints": [
|
||
{
|
||
"id": "cloud-web-16666",
|
||
"url": "http://74.48.78.17:16666/health/live",
|
||
"status": "pass",
|
||
"httpStatus": 200,
|
||
"reachable": true,
|
||
"identityMatches": true,
|
||
"startedAt": "2026-05-23T21:37:53.244Z",
|
||
"finishedAt": "2026-05-23T21:37:53.799Z",
|
||
"expectedServiceId": "hwlab-cloud-web",
|
||
"expectedCommit": null,
|
||
"serviceId": "hwlab-cloud-web",
|
||
"environment": "dev",
|
||
"applicationStatus": "ok",
|
||
"ready": null,
|
||
"observedCommit": "b02ac5b",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"imageTag": "b02ac5b",
|
||
"observedAt": null,
|
||
"serviceMatches": true,
|
||
"environmentMatches": true,
|
||
"commitMatches": null,
|
||
"blockerCodes": []
|
||
},
|
||
{
|
||
"id": "cloud-api-16667",
|
||
"url": "http://74.48.78.17:16667/health/live",
|
||
"status": "pass",
|
||
"httpStatus": 200,
|
||
"reachable": true,
|
||
"identityMatches": true,
|
||
"startedAt": "2026-05-23T21:37:53.246Z",
|
||
"finishedAt": "2026-05-23T21:37:54.477Z",
|
||
"expectedServiceId": "hwlab-cloud-api",
|
||
"expectedCommit": null,
|
||
"serviceId": "hwlab-cloud-api",
|
||
"environment": "dev",
|
||
"applicationStatus": "degraded",
|
||
"ready": false,
|
||
"observedCommit": "b02ac5b",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b",
|
||
"imageTag": "b02ac5b",
|
||
"observedAt": "2026-05-23T21:37:53.704Z",
|
||
"serviceMatches": true,
|
||
"environmentMatches": true,
|
||
"commitMatches": null,
|
||
"blockerCodes": [
|
||
"stdio_protocol_not_wired"
|
||
]
|
||
}
|
||
],
|
||
"summary": {
|
||
"checked": 2,
|
||
"reachable": 2,
|
||
"identityMatches": 2,
|
||
"commitMatches": null,
|
||
"ports": [
|
||
16666,
|
||
16667
|
||
]
|
||
}
|
||
},
|
||
"targetNamespace": "hwlab-dev",
|
||
"targetRef": "origin/main",
|
||
"releasedAt": null,
|
||
"releaseStatus": "running",
|
||
"staleLockBrokenAt": null,
|
||
"staleLockPrevious": null
|
||
},
|
||
"staleBreak": null
|
||
},
|
||
"steps": [
|
||
{
|
||
"id": "desired-state-check-before-publish",
|
||
"phase": "publishing",
|
||
"status": "pass",
|
||
"command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/deploy-desired-state-plan.mjs --check --pretty",
|
||
"code": 0,
|
||
"startedAt": "2026-05-23T21:37:54.541Z",
|
||
"finishedAt": "2026-05-23T21:37:54.597Z",
|
||
"stdoutJson": {
|
||
"kind": "hwlab-deploy-desired-state-plan",
|
||
"mode": "read-only-plan",
|
||
"status": "pass",
|
||
"source": {
|
||
"deploy": "deploy/deploy.json",
|
||
"artifactCatalog": "deploy/artifact-catalog.dev.json",
|
||
"workloads": "deploy/k8s/base/workloads.yaml",
|
||
"optionalReport": "reports/dev-gate/dev-artifacts.json"
|
||
},
|
||
"safety": {
|
||
"readOnly": true,
|
||
"sourceOrDryRunSupportOnly": true,
|
||
"kubectlApply": false,
|
||
"registryPull": false,
|
||
"registryPush": false,
|
||
"imageBuild": false,
|
||
"serviceRestart": false,
|
||
"prod": false,
|
||
"devLiveClaim": false
|
||
},
|
||
"checkSemantics": "--check exits non-zero for missing/invalid desired-state sources, internal commit/image mirror drift, invalid target tags, partial target drift, or any mismatch with an explicit --target-ref, --target-tag, or --promotion-commit. When the checked target ref is the current checked-out merge commit, the comparable current-main target is its accepted first parent because a commit cannot embed its own content hash. Without --check, a uniform older desired-state under --target-ref/--target-tag is a read-only promotion plan.",
|
||
"summary": {
|
||
"desiredCommitId": "e6d4bd5",
|
||
"desiredImageTag": "e6d4bd5",
|
||
"artifactState": "contract-skeleton",
|
||
"ciPublished": false,
|
||
"registryVerified": false,
|
||
"services": 13,
|
||
"workloadContainers": 13,
|
||
"presentMirrorCount": 14,
|
||
"diagnostics": 0,
|
||
"blockers": 0,
|
||
"targetConvergence": "not_requested"
|
||
},
|
||
"target": null,
|
||
"promotionBoundary": {
|
||
"writes": [],
|
||
"authoritativeDesiredState": [
|
||
"deploy/deploy.json",
|
||
"deploy/artifact-catalog.dev.json",
|
||
"deploy/k8s/base/workloads.yaml"
|
||
],
|
||
"nonAuthoritativeEvidence": [
|
||
"reports/dev-gate/dev-artifacts.json"
|
||
],
|
||
"note": "This planner reviews source desired-state only. It does not prove image existence, registry reachability, a real DEV apply, or M3 DEV-LIVE hardware-loop evidence."
|
||
},
|
||
"cloudApiDb": {
|
||
"contractVersion": "v1",
|
||
"environment": "dev",
|
||
"status": "pass",
|
||
"ready": true,
|
||
"secretRef": {
|
||
"env": "HWLAB_CLOUD_DB_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url",
|
||
"deployPlaceholderPresent": true,
|
||
"workloadSecretRefPresent": true,
|
||
"present": true,
|
||
"redacted": true
|
||
},
|
||
"sslMode": {
|
||
"env": "HWLAB_CLOUD_DB_SSL_MODE",
|
||
"value": "disable",
|
||
"workloadValue": "disable",
|
||
"expected": "disable",
|
||
"deployMatches": true,
|
||
"workloadMatches": true,
|
||
"secret": false
|
||
},
|
||
"secretMaterialRead": false,
|
||
"valuesRedacted": true,
|
||
"liveDbEvidence": false,
|
||
"fixtureEvidence": false
|
||
},
|
||
"codeAgentProvider": {
|
||
"contractVersion": "v1",
|
||
"environment": "dev",
|
||
"provider": "codex-stdio",
|
||
"runtimeProvider": "openai-responses",
|
||
"backend": "hwlab-cloud-api/codex-mcp-stdio",
|
||
"model": "gpt-5.5",
|
||
"status": "pass",
|
||
"ready": true,
|
||
"requiredEnv": [
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_PROVIDER",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_MODEL",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "OPENAI_API_KEY",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": true,
|
||
"source": "k8s-secret-ref"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": true,
|
||
"source": "runtime-env"
|
||
}
|
||
],
|
||
"secretRef": {
|
||
"env": "OPENAI_API_KEY",
|
||
"secretName": "hwlab-code-agent-provider",
|
||
"secretKey": "openai-api-key",
|
||
"deployPlaceholderPresent": true,
|
||
"workloadSecretRefPresent": true,
|
||
"present": true,
|
||
"redacted": true
|
||
},
|
||
"egress": {
|
||
"env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"target": "dev-egress-proxy",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"deployMatchesDevProxy": true,
|
||
"workloadMatchesDevProxy": true,
|
||
"directPublicOpenAi": false,
|
||
"valueRedacted": true
|
||
},
|
||
"missingDeployEnv": [],
|
||
"missingWorkloadEnv": [],
|
||
"deployMismatches": [],
|
||
"workloadMismatches": [],
|
||
"missingSecretRefs": [],
|
||
"missingEgressContract": [],
|
||
"secretMaterialRead": false,
|
||
"valuesRedacted": true,
|
||
"providerConnected": false,
|
||
"fixtureEvidence": false
|
||
},
|
||
"reportHints": {
|
||
"path": "reports/dev-gate/dev-artifacts.json",
|
||
"present": true,
|
||
"authoritative": false,
|
||
"note": "report snapshots are contextual evidence only; deploy desired-state remains authoritative in deploy/, not reports/",
|
||
"commitId": "b02ac5b",
|
||
"matchesDesiredState": false,
|
||
"artifactPublish": {
|
||
"status": "published",
|
||
"sourceCommitId": "b02ac5becad13aeeab0d5cb7d8f01300bccb78c2",
|
||
"sourceMatchesDesiredState": false,
|
||
"publishedCount": 13,
|
||
"serviceCount": 13,
|
||
"registryVerified": null,
|
||
"registryCapabilitiesClassification": "degraded"
|
||
}
|
||
},
|
||
"services": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_COMMIT_ID": {
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE": {
|
||
"name": "HWLAB_IMAGE",
|
||
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE_TAG": {
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-api",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_COMMIT_ID": {
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE": {
|
||
"name": "HWLAB_IMAGE",
|
||
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE_TAG": {
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_COMMIT_ID": {
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE": {
|
||
"name": "HWLAB_IMAGE",
|
||
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE_TAG": {
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_COMMIT_ID": {
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE": {
|
||
"name": "HWLAB_IMAGE",
|
||
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE_TAG": {
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-mgr",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-agent-worker-template",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-gateway",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "StatefulSet",
|
||
"name": "hwlab-gateway-simu",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "StatefulSet",
|
||
"name": "hwlab-box-simu",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-patch-panel",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-router",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-tunnel-client",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-edge-proxy",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-cli-template",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_SKILLS_COMMIT_ID": {
|
||
"name": "HWLAB_SKILLS_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "not_published",
|
||
"publishState": "skeleton-only",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-skills",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_SKILLS_COMMIT_ID": {
|
||
"name": "HWLAB_SKILLS_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": null
|
||
}
|
||
],
|
||
"diagnostics": []
|
||
},
|
||
"stdoutTail": null,
|
||
"stderrTail": "",
|
||
"reportPath": null
|
||
},
|
||
{
|
||
"id": "artifact-publish",
|
||
"phase": "publishing",
|
||
"status": "pass",
|
||
"command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-artifact-publish.mjs --publish",
|
||
"code": 0,
|
||
"startedAt": "2026-05-23T21:37:54.597Z",
|
||
"finishedAt": "2026-05-23T21:47:57.243Z",
|
||
"stdoutJson": {
|
||
"status": "published",
|
||
"mode": "publish",
|
||
"reportPath": "reports/dev-gate/dev-artifacts.json",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryPrefix": "127.0.0.1:5000/hwlab",
|
||
"registryCapabilities": {
|
||
"version": "v1",
|
||
"registryPrefix": "127.0.0.1:5000/hwlab",
|
||
"generatedAt": "2026-05-23T21:37:56.100Z",
|
||
"classification": "degraded",
|
||
"dimensions": {
|
||
"processHttpAccess": {
|
||
"id": "process-http-access",
|
||
"status": "degraded",
|
||
"requiredForPublish": false,
|
||
"requiredForDeploy": false,
|
||
"endpoint": "http://127.0.0.1:5000/v2/",
|
||
"probeKind": "runner-process-http-v2",
|
||
"summary": "Runner process cannot reach http://127.0.0.1:5000/v2/; this is process HTTP access only and does not prove Docker daemon push failure.",
|
||
"evidence": {
|
||
"probe": {
|
||
"ok": false,
|
||
"url": "http://127.0.0.1:5000/v2/",
|
||
"method": "GET",
|
||
"error": "fetch failed ECONNREFUSED 127.0.0.1 5000"
|
||
},
|
||
"publishFailure": false
|
||
}
|
||
},
|
||
"dockerDaemonPushAccess": {
|
||
"id": "docker-daemon-push-access",
|
||
"status": "pass",
|
||
"requiredForPublish": true,
|
||
"requiredForDeploy": false,
|
||
"endpoint": "127.0.0.1:5000/hwlab",
|
||
"probeKind": "docker-ps-read-only",
|
||
"summary": "Docker daemon can see a local/internal registry target for publish preflight purposes; no push was attempted.",
|
||
"evidence": {
|
||
"dockerVersion": {
|
||
"command": "docker --version",
|
||
"ok": true,
|
||
"exitCode": 0,
|
||
"stdout": "Docker version 26.1.5+dfsg1, build a72d7cd",
|
||
"stderr": "",
|
||
"error": null
|
||
},
|
||
"registryPrefix": "127.0.0.1:5000/hwlab",
|
||
"loopbackPort5000": true,
|
||
"registryContainerVisible": true,
|
||
"matchingContainers": [
|
||
{
|
||
"id": "00091efce380",
|
||
"image": "registry:2.8.3",
|
||
"names": "unidesk-artifact-registry",
|
||
"ports": "127.0.0.1:5000->5000/tcp",
|
||
"state": "running",
|
||
"status": "Up 8 hours"
|
||
}
|
||
],
|
||
"pushAttempted": false,
|
||
"mutationAttempted": false
|
||
}
|
||
},
|
||
"k3sPullAccess": {
|
||
"id": "k3s-pull-access",
|
||
"status": "pass",
|
||
"requiredForPublish": false,
|
||
"requiredForDeploy": true,
|
||
"endpoint": "127.0.0.1:5000/hwlab",
|
||
"probeKind": "kubectl-read-only",
|
||
"summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.",
|
||
"evidence": {
|
||
"kubectlAvailable": true,
|
||
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
|
||
"context": {
|
||
"command": "env KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl config current-context",
|
||
"ok": true,
|
||
"exitCode": 0,
|
||
"stdout": "in-cluster",
|
||
"stderr": "",
|
||
"error": null
|
||
},
|
||
"canGetPods": {
|
||
"command": "env KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl auth can-i get pods -n hwlab-dev",
|
||
"ok": true,
|
||
"exitCode": 0,
|
||
"stdout": "yes",
|
||
"stderr": "",
|
||
"error": null
|
||
},
|
||
"podCount": 13,
|
||
"pulledImages": [
|
||
{
|
||
"pod": "hwlab-agent-mgr-99d44c747-mfqzj",
|
||
"container": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:1457c7141f0f6ddeee04c4342e87a0cda8d95718ac64d7b009bf76832c5c7bee"
|
||
},
|
||
{
|
||
"pod": "hwlab-agent-skills-7f99b49598-lqjdd",
|
||
"container": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:22c1ad255a1039ca148444664563ae76209ccbb0d3e7fba27613250c938e3f5b"
|
||
},
|
||
{
|
||
"pod": "hwlab-box-simu-0",
|
||
"container": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:9fde14a98f0850e139435cf7b473219c3d43231acd2f65b2410e8e3d0f49b858"
|
||
},
|
||
{
|
||
"pod": "hwlab-box-simu-1",
|
||
"container": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:9fde14a98f0850e139435cf7b473219c3d43231acd2f65b2410e8e3d0f49b858"
|
||
},
|
||
{
|
||
"pod": "hwlab-cloud-api-57cfcfc587-kdvg9",
|
||
"container": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:33b2075ed01c5cb77d8b5bbd3cc8e4acaa1dbd8566d091e15e663c43ff63af31"
|
||
},
|
||
{
|
||
"pod": "hwlab-cloud-web-67c684947b-lkvtj",
|
||
"container": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:a1c95841f6f2bd913c82751f603c164cbb8bfbfd186d14f98d0f2f91c17cd84f"
|
||
},
|
||
{
|
||
"pod": "hwlab-edge-proxy-85db66bcc9-mv8pv",
|
||
"container": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:eb0a165cc57428741a59ef953c8596631f9d85bc51117d16f16d5847803ebfef"
|
||
},
|
||
{
|
||
"pod": "hwlab-frpc-59f57d479c-tgjhl",
|
||
"container": "frpc",
|
||
"image": "127.0.0.1:5000/hwlab/frpc:v0.68.1",
|
||
"imageID": "127.0.0.1:5000/hwlab/frpc@sha256:ce400cda42a260964e40ab1ca68b868f72c569cdce4b243aef36ce40194d287b"
|
||
},
|
||
{
|
||
"pod": "hwlab-gateway-simu-0",
|
||
"container": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:4cfb1315aa93a11ea480ddb0da89994acc344834499d6cf322bbf0ff4b0c3137"
|
||
},
|
||
{
|
||
"pod": "hwlab-gateway-simu-1",
|
||
"container": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:4cfb1315aa93a11ea480ddb0da89994acc344834499d6cf322bbf0ff4b0c3137"
|
||
},
|
||
{
|
||
"pod": "hwlab-patch-panel-7cd9d9d597-kwnm6",
|
||
"container": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:2abe0cb87c3eef6d080a3d60bdd39037df89269b0b730a704a52e12405dceaea"
|
||
},
|
||
{
|
||
"pod": "hwlab-router-65dc5579fb-d2r8l",
|
||
"container": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:fcfa1c1f5231e48d07113fbbbec525b16cc5431b38d4fbacc263f517ad0b9120"
|
||
},
|
||
{
|
||
"pod": "hwlab-tunnel-client-54d968477d-mf2qk",
|
||
"container": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:687826d894137c5c471124f6f3cffdb1165acf23c80dc2cc6fd5bca98434b6e7"
|
||
}
|
||
],
|
||
"pullFailures": [],
|
||
"pullAttempted": false,
|
||
"mutationAttempted": false
|
||
}
|
||
}
|
||
},
|
||
"interpretation": {
|
||
"processHttpAccess": "Runner process HTTP access to /v2/ is diagnostic only and must not be treated as Docker daemon push access.",
|
||
"dockerDaemonPushAccess": "Docker daemon push access is the publish-path capability. This probe is read-only and does not push.",
|
||
"k3sPullAccess": "k3s pull access is the deploy-path capability. This probe is read-only and does not create pods or read secrets."
|
||
}
|
||
},
|
||
"baseImagePreflight": {
|
||
"status": "ready",
|
||
"imageSource": "local-docker-node:20-*",
|
||
"requestedImage": null,
|
||
"localTag": "node:20-bookworm-slim",
|
||
"imageId": "sha256:9da6b4e352d0d5c94963eba1832408f5b7b08839cd8be9b6610c05de5118c704",
|
||
"repoDigests": [
|
||
"node@sha256:2cf067cfed83d5ea958367df9f966191a942351a2df77d6f0193e162b5febfc0"
|
||
],
|
||
"candidates": [
|
||
{
|
||
"source": "local-docker-node:20-*",
|
||
"approval": {
|
||
"approved": true,
|
||
"reason": "local Node 20 builder base image"
|
||
},
|
||
"localTag": "node:20-bookworm-slim",
|
||
"imageId": "9da6b4e352d0",
|
||
"size": "200MB",
|
||
"createdSince": "4 weeks ago"
|
||
}
|
||
],
|
||
"rejectedCandidates": [],
|
||
"publishUsable": true,
|
||
"blockers": [],
|
||
"nextSteps": [
|
||
"Use the reported localTag as the DEV builder base image for artifact publish.",
|
||
"Keep publish DEV-only and record the produced HWLAB service image tags and digests separately."
|
||
],
|
||
"recommendation": {
|
||
"source": "Preloaded D601 local Docker cache or D601-local registry tag.",
|
||
"envVar": "HWLAB_DEV_BASE_IMAGE",
|
||
"preferredImageTag": "node:20-bookworm-slim",
|
||
"preferredHwlabImageTag": "127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim",
|
||
"recommendedEnvValue": "node:20-bookworm-slim"
|
||
},
|
||
"provision": {
|
||
"required": false,
|
||
"exactBlocker": null,
|
||
"expectedImageTag": "node:20-bookworm-slim",
|
||
"recommendedEnv": {
|
||
"name": "HWLAB_DEV_BASE_IMAGE",
|
||
"value": "node:20-bookworm-slim",
|
||
"assignment": "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim"
|
||
},
|
||
"recommendedHwlabImageTag": "127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim",
|
||
"nextHumanCommand": null,
|
||
"commands": {
|
||
"d601OnlinePreload": [
|
||
"docker pull node:20-bookworm-slim",
|
||
"HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/preflight-dev-base-image.mjs"
|
||
],
|
||
"d601HwlabTagProvision": [
|
||
"docker pull node:20-bookworm-slim",
|
||
"docker tag node:20-bookworm-slim 127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim",
|
||
"HWLAB_DEV_BASE_IMAGE=127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim node scripts/preflight-dev-base-image.mjs"
|
||
],
|
||
"offlineSourceExport": [
|
||
"docker pull node:20-bookworm-slim",
|
||
"docker save node:20-bookworm-slim -o hwlab-node20-bookworm-slim.tar"
|
||
],
|
||
"offlineD601Import": [
|
||
"docker load -i hwlab-node20-bookworm-slim.tar",
|
||
"HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/preflight-dev-base-image.mjs"
|
||
],
|
||
"artifactPublishDryRun": [
|
||
"HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/dev-artifact-publish.mjs --preflight --no-report"
|
||
]
|
||
}
|
||
},
|
||
"blockedReport": null,
|
||
"containerEngine": {
|
||
"command": "docker",
|
||
"available": true,
|
||
"version": "Docker version 26.1.5+dfsg1, build a72d7cd",
|
||
"errorCode": null,
|
||
"stderr": ""
|
||
}
|
||
},
|
||
"publishPlan": {
|
||
"version": "v2",
|
||
"mode": "publish",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"imageTag": "e6d4bd5",
|
||
"registryTarget": "127.0.0.1:5000/hwlab",
|
||
"registryCapabilities": {
|
||
"version": "v1",
|
||
"registryPrefix": "127.0.0.1:5000/hwlab",
|
||
"generatedAt": "2026-05-23T21:37:56.100Z",
|
||
"classification": "degraded",
|
||
"dimensions": {
|
||
"processHttpAccess": {
|
||
"id": "process-http-access",
|
||
"status": "degraded",
|
||
"requiredForPublish": false,
|
||
"requiredForDeploy": false,
|
||
"endpoint": "http://127.0.0.1:5000/v2/",
|
||
"probeKind": "runner-process-http-v2",
|
||
"summary": "Runner process cannot reach http://127.0.0.1:5000/v2/; this is process HTTP access only and does not prove Docker daemon push failure.",
|
||
"evidence": {
|
||
"probe": {
|
||
"ok": false,
|
||
"url": "http://127.0.0.1:5000/v2/",
|
||
"method": "GET",
|
||
"error": "fetch failed ECONNREFUSED 127.0.0.1 5000"
|
||
},
|
||
"publishFailure": false
|
||
}
|
||
},
|
||
"dockerDaemonPushAccess": {
|
||
"id": "docker-daemon-push-access",
|
||
"status": "pass",
|
||
"requiredForPublish": true,
|
||
"requiredForDeploy": false,
|
||
"endpoint": "127.0.0.1:5000/hwlab",
|
||
"probeKind": "docker-ps-read-only",
|
||
"summary": "Docker daemon can see a local/internal registry target for publish preflight purposes; no push was attempted.",
|
||
"evidence": {
|
||
"dockerVersion": {
|
||
"command": "docker --version",
|
||
"ok": true,
|
||
"exitCode": 0,
|
||
"stdout": "Docker version 26.1.5+dfsg1, build a72d7cd",
|
||
"stderr": "",
|
||
"error": null
|
||
},
|
||
"registryPrefix": "127.0.0.1:5000/hwlab",
|
||
"loopbackPort5000": true,
|
||
"registryContainerVisible": true,
|
||
"matchingContainers": [
|
||
{
|
||
"id": "00091efce380",
|
||
"image": "registry:2.8.3",
|
||
"names": "unidesk-artifact-registry",
|
||
"ports": "127.0.0.1:5000->5000/tcp",
|
||
"state": "running",
|
||
"status": "Up 8 hours"
|
||
}
|
||
],
|
||
"pushAttempted": false,
|
||
"mutationAttempted": false
|
||
}
|
||
},
|
||
"k3sPullAccess": {
|
||
"id": "k3s-pull-access",
|
||
"status": "pass",
|
||
"requiredForPublish": false,
|
||
"requiredForDeploy": true,
|
||
"endpoint": "127.0.0.1:5000/hwlab",
|
||
"probeKind": "kubectl-read-only",
|
||
"summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.",
|
||
"evidence": {
|
||
"kubectlAvailable": true,
|
||
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
|
||
"context": {
|
||
"command": "env KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl config current-context",
|
||
"ok": true,
|
||
"exitCode": 0,
|
||
"stdout": "in-cluster",
|
||
"stderr": "",
|
||
"error": null
|
||
},
|
||
"canGetPods": {
|
||
"command": "env KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl auth can-i get pods -n hwlab-dev",
|
||
"ok": true,
|
||
"exitCode": 0,
|
||
"stdout": "yes",
|
||
"stderr": "",
|
||
"error": null
|
||
},
|
||
"podCount": 13,
|
||
"pulledImages": [
|
||
{
|
||
"pod": "hwlab-agent-mgr-99d44c747-mfqzj",
|
||
"container": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:1457c7141f0f6ddeee04c4342e87a0cda8d95718ac64d7b009bf76832c5c7bee"
|
||
},
|
||
{
|
||
"pod": "hwlab-agent-skills-7f99b49598-lqjdd",
|
||
"container": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:22c1ad255a1039ca148444664563ae76209ccbb0d3e7fba27613250c938e3f5b"
|
||
},
|
||
{
|
||
"pod": "hwlab-box-simu-0",
|
||
"container": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:9fde14a98f0850e139435cf7b473219c3d43231acd2f65b2410e8e3d0f49b858"
|
||
},
|
||
{
|
||
"pod": "hwlab-box-simu-1",
|
||
"container": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:9fde14a98f0850e139435cf7b473219c3d43231acd2f65b2410e8e3d0f49b858"
|
||
},
|
||
{
|
||
"pod": "hwlab-cloud-api-57cfcfc587-kdvg9",
|
||
"container": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:33b2075ed01c5cb77d8b5bbd3cc8e4acaa1dbd8566d091e15e663c43ff63af31"
|
||
},
|
||
{
|
||
"pod": "hwlab-cloud-web-67c684947b-lkvtj",
|
||
"container": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:a1c95841f6f2bd913c82751f603c164cbb8bfbfd186d14f98d0f2f91c17cd84f"
|
||
},
|
||
{
|
||
"pod": "hwlab-edge-proxy-85db66bcc9-mv8pv",
|
||
"container": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:eb0a165cc57428741a59ef953c8596631f9d85bc51117d16f16d5847803ebfef"
|
||
},
|
||
{
|
||
"pod": "hwlab-frpc-59f57d479c-tgjhl",
|
||
"container": "frpc",
|
||
"image": "127.0.0.1:5000/hwlab/frpc:v0.68.1",
|
||
"imageID": "127.0.0.1:5000/hwlab/frpc@sha256:ce400cda42a260964e40ab1ca68b868f72c569cdce4b243aef36ce40194d287b"
|
||
},
|
||
{
|
||
"pod": "hwlab-gateway-simu-0",
|
||
"container": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:4cfb1315aa93a11ea480ddb0da89994acc344834499d6cf322bbf0ff4b0c3137"
|
||
},
|
||
{
|
||
"pod": "hwlab-gateway-simu-1",
|
||
"container": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:4cfb1315aa93a11ea480ddb0da89994acc344834499d6cf322bbf0ff4b0c3137"
|
||
},
|
||
{
|
||
"pod": "hwlab-patch-panel-7cd9d9d597-kwnm6",
|
||
"container": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:2abe0cb87c3eef6d080a3d60bdd39037df89269b0b730a704a52e12405dceaea"
|
||
},
|
||
{
|
||
"pod": "hwlab-router-65dc5579fb-d2r8l",
|
||
"container": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:fcfa1c1f5231e48d07113fbbbec525b16cc5431b38d4fbacc263f517ad0b9120"
|
||
},
|
||
{
|
||
"pod": "hwlab-tunnel-client-54d968477d-mf2qk",
|
||
"container": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:b02ac5b",
|
||
"imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:687826d894137c5c471124f6f3cffdb1165acf23c80dc2cc6fd5bca98434b6e7"
|
||
}
|
||
],
|
||
"pullFailures": [],
|
||
"pullAttempted": false,
|
||
"mutationAttempted": false
|
||
}
|
||
}
|
||
},
|
||
"interpretation": {
|
||
"processHttpAccess": "Runner process HTTP access to /v2/ is diagnostic only and must not be treated as Docker daemon push access.",
|
||
"dockerDaemonPushAccess": "Docker daemon push access is the publish-path capability. This probe is read-only and does not push.",
|
||
"k3sPullAccess": "k3s pull access is the deploy-path capability. This probe is read-only and does not create pods or read secrets."
|
||
}
|
||
},
|
||
"digestPlaceholder": "not_published",
|
||
"services": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"enabled": true,
|
||
"required": true,
|
||
"artifactScope": "required",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"buildSource": "pikasTech/HWLAB@e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f",
|
||
"repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f",
|
||
"digestStatus": "real",
|
||
"status": "published",
|
||
"notPublishedReason": null
|
||
}
|
||
]
|
||
},
|
||
"services": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"distFreshness": {
|
||
"status": "pass",
|
||
"distPath": "web/hwlab-cloud-web/dist",
|
||
"buildCommand": "node web/hwlab-cloud-web/scripts/build.mjs",
|
||
"freshnessCommand": "node web/hwlab-cloud-web/scripts/build.mjs",
|
||
"files": [
|
||
{
|
||
"kind": "runtime",
|
||
"path": "index.html",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/index.html",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/index.html",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "styles.css",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/styles.css",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/styles.css",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "auth.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/auth.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/auth.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "app.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/app.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/app.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "code-agent-facts.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/code-agent-facts.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/code-agent-facts.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "code-agent-status.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/code-agent-status.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/code-agent-status.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "code-agent-m3-evidence.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/code-agent-m3-evidence.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/code-agent-m3-evidence.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "live-status.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/live-status.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/live-status.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "gate-summary.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/gate-summary.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/gate-summary.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "runtime.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/runtime.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/runtime.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "wiring-status.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/wiring-status.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/wiring-status.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "workbench-hardware-panel.mjs",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/workbench-hardware-panel.mjs",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/workbench-hardware-panel.mjs",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "help.md",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/help.md",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/help.md",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "third_party/marked/marked.esm.js",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/third_party/marked/marked.esm.js",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/third_party/marked/marked.esm.js",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "runtime",
|
||
"path": "third_party/marked/LICENSE",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/third_party/marked/LICENSE",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/third_party/marked/LICENSE",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "alias",
|
||
"path": "gate/index.html",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/index.html",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/gate/index.html",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "alias",
|
||
"path": "diagnostics/gate/index.html",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/index.html",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/diagnostics/gate/index.html",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"kind": "alias",
|
||
"path": "help/index.html",
|
||
"sourcePath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/index.html",
|
||
"distPath": "/home/ubuntu/hwlab-cd-rollout-e6d4-20260523T213016Z/web/hwlab-cloud-web/dist/help/index.html",
|
||
"status": "match"
|
||
}
|
||
],
|
||
"mismatches": []
|
||
},
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f",
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"status": "published",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f",
|
||
"notPublishedReason": null
|
||
}
|
||
],
|
||
"blockers": []
|
||
},
|
||
"stdoutTail": null,
|
||
"stderrTail": "\"event\":\"publish_start\",\"serviceId\":\"hwlab-tunnel-client\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-tunnel-client\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5\",\"digest\":\"sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5\",\"digest\":\"sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5\",\"digest\":\"sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5\",\"digest\":\"sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f\"}",
|
||
"reportPath": "reports/dev-gate/dev-artifacts.json"
|
||
},
|
||
{
|
||
"id": "artifact-catalog-refresh",
|
||
"phase": "publishing",
|
||
"status": "pass",
|
||
"command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/refresh-artifact-catalog.mjs --target-ref e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96 --publish-report reports/dev-gate/dev-artifacts.json",
|
||
"code": 0,
|
||
"startedAt": "2026-05-23T21:47:57.244Z",
|
||
"finishedAt": "2026-05-23T21:47:57.286Z",
|
||
"stdoutJson": {
|
||
"status": "published",
|
||
"targetRef": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"artifactCommitId": "e6d4bd5",
|
||
"wrote": [
|
||
"deploy/deploy.json",
|
||
"deploy/artifact-catalog.dev.json",
|
||
"deploy/k8s/base/workloads.yaml"
|
||
],
|
||
"ciPublished": true,
|
||
"registryVerified": true,
|
||
"publishedCount": 13,
|
||
"requiredServiceCount": 13,
|
||
"disabledServiceCount": 0,
|
||
"notPublishedCount": 0,
|
||
"digestPolicy": "catalog digests copied only for required services from a published DEV artifact report; disabled services stay not_published",
|
||
"services": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"buildCreatedAt": "2026-05-23T21:37:56.106Z",
|
||
"digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f",
|
||
"publishState": "published",
|
||
"artifactRequired": true,
|
||
"notPublishedReason": null
|
||
}
|
||
]
|
||
},
|
||
"stdoutTail": null,
|
||
"stderrTail": "",
|
||
"reportPath": null
|
||
},
|
||
{
|
||
"id": "artifact-catalog-validate",
|
||
"phase": "publishing",
|
||
"status": "pass",
|
||
"command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/validate-artifact-catalog.mjs",
|
||
"code": 0,
|
||
"startedAt": "2026-05-23T21:47:57.286Z",
|
||
"finishedAt": "2026-05-23T21:47:57.319Z",
|
||
"stdoutJson": null,
|
||
"stdoutTail": "validated 13 DEV artifact catalog services at e6d4bd5 (published)",
|
||
"stderrTail": "",
|
||
"reportPath": null
|
||
},
|
||
{
|
||
"id": "desired-state-check-after-refresh",
|
||
"phase": "publishing",
|
||
"status": "pass",
|
||
"command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/deploy-desired-state-plan.mjs --promotion-commit e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96 --check --pretty",
|
||
"code": 0,
|
||
"startedAt": "2026-05-23T21:47:57.319Z",
|
||
"finishedAt": "2026-05-23T21:47:57.365Z",
|
||
"stdoutJson": {
|
||
"kind": "hwlab-deploy-desired-state-plan",
|
||
"mode": "read-only-plan",
|
||
"status": "pass",
|
||
"source": {
|
||
"deploy": "deploy/deploy.json",
|
||
"artifactCatalog": "deploy/artifact-catalog.dev.json",
|
||
"workloads": "deploy/k8s/base/workloads.yaml",
|
||
"optionalReport": "reports/dev-gate/dev-artifacts.json"
|
||
},
|
||
"safety": {
|
||
"readOnly": true,
|
||
"sourceOrDryRunSupportOnly": true,
|
||
"kubectlApply": false,
|
||
"registryPull": false,
|
||
"registryPush": false,
|
||
"imageBuild": false,
|
||
"serviceRestart": false,
|
||
"prod": false,
|
||
"devLiveClaim": false
|
||
},
|
||
"checkSemantics": "--check exits non-zero for missing/invalid desired-state sources, internal commit/image mirror drift, invalid target tags, partial target drift, or any mismatch with an explicit --target-ref, --target-tag, or --promotion-commit. When the checked target ref is the current checked-out merge commit, the comparable current-main target is its accepted first parent because a commit cannot embed its own content hash. Without --check, a uniform older desired-state under --target-ref/--target-tag is a read-only promotion plan.",
|
||
"summary": {
|
||
"desiredCommitId": "e6d4bd5",
|
||
"desiredImageTag": "e6d4bd5",
|
||
"artifactState": "published",
|
||
"ciPublished": true,
|
||
"registryVerified": true,
|
||
"services": 13,
|
||
"workloadContainers": 13,
|
||
"presentMirrorCount": 14,
|
||
"diagnostics": 0,
|
||
"blockers": 0,
|
||
"targetConvergence": "already_promoted"
|
||
},
|
||
"target": {
|
||
"targetRef": null,
|
||
"promotionCommit": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"commitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"shortCommitId": "e6d4bd5",
|
||
"tag": "e6d4bd5",
|
||
"tagSource": "promotion-commit-short",
|
||
"acceptedCurrentMain": null,
|
||
"comparisonCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"comparisonTag": "e6d4bd5",
|
||
"requireConvergence": true,
|
||
"convergenceRequirement": "promotion-commit",
|
||
"convergence": {
|
||
"state": "already_promoted",
|
||
"comparableFields": 81,
|
||
"matchingTargetFields": 81,
|
||
"pendingTargetFields": 0,
|
||
"matchingPaths": [
|
||
"deploy/deploy.json.commitId",
|
||
"deploy/artifact-catalog.dev.json.commitId",
|
||
"deploy/deploy.json.services.hwlab-cloud-api.image",
|
||
"deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_COMMIT_ID",
|
||
"deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_IMAGE",
|
||
"deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_IMAGE_TAG",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].image",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_COMMIT_ID",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_IMAGE",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_IMAGE_TAG",
|
||
"deploy/deploy.json.services.hwlab-cloud-web.image",
|
||
"deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_COMMIT_ID",
|
||
"deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_IMAGE",
|
||
"deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_IMAGE_TAG",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].image",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_COMMIT_ID",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_IMAGE",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_IMAGE_TAG",
|
||
"deploy/deploy.json.services.hwlab-agent-mgr.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-mgr.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-agent-worker.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Job.hwlab-agent-worker-template.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-gateway.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-gateway.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-gateway.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-gateway.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-gateway.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-gateway-simu.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.StatefulSet.hwlab-gateway-simu.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-box-simu.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-box-simu.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-box-simu.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-box-simu.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.StatefulSet.hwlab-box-simu.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-patch-panel.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-patch-panel.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-router.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-router.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-router.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-router.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-router.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-tunnel-client.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-tunnel-client.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-edge-proxy.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-edge-proxy.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-cli.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cli.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cli.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-cli.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Job.hwlab-cli-template.containers[0].image",
|
||
"deploy/deploy.json.services.hwlab-agent-skills.image",
|
||
"deploy/deploy.json.services.hwlab-agent-skills.env.HWLAB_SKILLS_COMMIT_ID",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.commitId",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.image",
|
||
"deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.imageTag",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-skills.containers[0].image",
|
||
"deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-skills.containers[0].env.HWLAB_SKILLS_COMMIT_ID"
|
||
],
|
||
"pendingPaths": []
|
||
},
|
||
"commands": [
|
||
"node scripts/deploy-desired-state-plan.mjs --promotion-commit e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96 --check --pretty"
|
||
]
|
||
},
|
||
"promotionBoundary": {
|
||
"writes": [],
|
||
"authoritativeDesiredState": [
|
||
"deploy/deploy.json",
|
||
"deploy/artifact-catalog.dev.json",
|
||
"deploy/k8s/base/workloads.yaml"
|
||
],
|
||
"nonAuthoritativeEvidence": [
|
||
"reports/dev-gate/dev-artifacts.json"
|
||
],
|
||
"note": "This planner reviews source desired-state only. It does not prove image existence, registry reachability, a real DEV apply, or M3 DEV-LIVE hardware-loop evidence."
|
||
},
|
||
"cloudApiDb": {
|
||
"contractVersion": "v1",
|
||
"environment": "dev",
|
||
"status": "pass",
|
||
"ready": true,
|
||
"secretRef": {
|
||
"env": "HWLAB_CLOUD_DB_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url",
|
||
"deployPlaceholderPresent": true,
|
||
"workloadSecretRefPresent": true,
|
||
"present": true,
|
||
"redacted": true
|
||
},
|
||
"sslMode": {
|
||
"env": "HWLAB_CLOUD_DB_SSL_MODE",
|
||
"value": "disable",
|
||
"workloadValue": "disable",
|
||
"expected": "disable",
|
||
"deployMatches": true,
|
||
"workloadMatches": true,
|
||
"secret": false
|
||
},
|
||
"secretMaterialRead": false,
|
||
"valuesRedacted": true,
|
||
"liveDbEvidence": false,
|
||
"fixtureEvidence": false
|
||
},
|
||
"codeAgentProvider": {
|
||
"contractVersion": "v1",
|
||
"environment": "dev",
|
||
"provider": "codex-stdio",
|
||
"runtimeProvider": "openai-responses",
|
||
"backend": "hwlab-cloud-api/codex-mcp-stdio",
|
||
"model": "gpt-5.5",
|
||
"status": "pass",
|
||
"ready": true,
|
||
"requiredEnv": [
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_PROVIDER",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_MODEL",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "OPENAI_API_KEY",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": true,
|
||
"source": "k8s-secret-ref"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": true,
|
||
"source": "runtime-env"
|
||
}
|
||
],
|
||
"secretRef": {
|
||
"env": "OPENAI_API_KEY",
|
||
"secretName": "hwlab-code-agent-provider",
|
||
"secretKey": "openai-api-key",
|
||
"deployPlaceholderPresent": true,
|
||
"workloadSecretRefPresent": true,
|
||
"present": true,
|
||
"redacted": true
|
||
},
|
||
"egress": {
|
||
"env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"target": "dev-egress-proxy",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"deployMatchesDevProxy": true,
|
||
"workloadMatchesDevProxy": true,
|
||
"directPublicOpenAi": false,
|
||
"valueRedacted": true
|
||
},
|
||
"missingDeployEnv": [],
|
||
"missingWorkloadEnv": [],
|
||
"deployMismatches": [],
|
||
"workloadMismatches": [],
|
||
"missingSecretRefs": [],
|
||
"missingEgressContract": [],
|
||
"secretMaterialRead": false,
|
||
"valuesRedacted": true,
|
||
"providerConnected": false,
|
||
"fixtureEvidence": false
|
||
},
|
||
"reportHints": {
|
||
"path": "reports/dev-gate/dev-artifacts.json",
|
||
"present": true,
|
||
"authoritative": false,
|
||
"note": "report snapshots are contextual evidence only; deploy desired-state remains authoritative in deploy/, not reports/",
|
||
"commitId": "e6d4bd5",
|
||
"matchesDesiredState": true,
|
||
"artifactPublish": {
|
||
"status": "published",
|
||
"sourceCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"sourceMatchesDesiredState": true,
|
||
"publishedCount": 13,
|
||
"serviceCount": 13,
|
||
"registryVerified": null,
|
||
"registryCapabilitiesClassification": "degraded"
|
||
}
|
||
},
|
||
"services": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_COMMIT_ID": {
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE": {
|
||
"name": "HWLAB_IMAGE",
|
||
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE_TAG": {
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-api",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_COMMIT_ID": {
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE": {
|
||
"name": "HWLAB_IMAGE",
|
||
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE_TAG": {
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-cloud-api",
|
||
"container": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_COMMIT_ID": {
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE": {
|
||
"name": "HWLAB_IMAGE",
|
||
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE_TAG": {
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_COMMIT_ID": {
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE": {
|
||
"name": "HWLAB_IMAGE",
|
||
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
"HWLAB_IMAGE_TAG": {
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-cloud-web",
|
||
"container": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-mgr",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-agent-mgr",
|
||
"container": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-agent-worker-template",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-agent-worker-template",
|
||
"container": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-gateway",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-gateway",
|
||
"container": "hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "StatefulSet",
|
||
"name": "hwlab-gateway-simu",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-gateway-simu",
|
||
"container": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "StatefulSet",
|
||
"name": "hwlab-box-simu",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-box-simu",
|
||
"container": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-patch-panel",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-patch-panel",
|
||
"container": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-router",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-router",
|
||
"container": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-tunnel-client",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-tunnel-client",
|
||
"container": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-edge-proxy",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-edge-proxy",
|
||
"container": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-cli-template",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_SKILLS_COMMIT_ID",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-cli-template",
|
||
"container": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"deploy": {
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_SKILLS_COMMIT_ID": {
|
||
"name": "HWLAB_SKILLS_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
},
|
||
"catalog": {
|
||
"commitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f",
|
||
"publishState": "published",
|
||
"artifactRequired": true
|
||
},
|
||
"workloads": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-skills",
|
||
"namespace": "hwlab-dev",
|
||
"container": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"envMirrors": {
|
||
"present": {
|
||
"HWLAB_SKILLS_COMMIT_ID": {
|
||
"name": "HWLAB_SKILLS_COMMIT_ID",
|
||
"value": "e6d4bd5",
|
||
"expected": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
},
|
||
"missing": [
|
||
"HWLAB_COMMIT_ID",
|
||
"HWLAB_IMAGE",
|
||
"HWLAB_IMAGE_TAG",
|
||
"HWLAB_IMAGE_DIGEST"
|
||
],
|
||
"diagnostics": []
|
||
}
|
||
}
|
||
],
|
||
"promotion": {
|
||
"targetCommitId": "e6d4bd5c72192ce7416849e93a93b1ffa0ebeb96",
|
||
"targetImageTag": "e6d4bd5",
|
||
"deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"workloadImages": [
|
||
{
|
||
"workload": "hwlab-agent-skills",
|
||
"container": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
],
|
||
"diagnostics": []
|
||
},
|
||
"stdoutTail": null,
|
||
"stderrTail": "",
|
||
"reportPath": null
|
||
},
|
||
{
|
||
"id": "runtime-db-provisioning",
|
||
"phase": "applying",
|
||
"status": "pass",
|
||
"command": "kubectl -n hwlab-dev apply/wait/logs job/hwlab-runtime-provision-35e3d897",
|
||
"code": 0,
|
||
"startedAt": "2026-05-23T21:47:57.434Z",
|
||
"finishedAt": "2026-05-23T21:48:04.828Z",
|
||
"stdoutJson": {
|
||
"issue": "pikasTech/HWLAB#311",
|
||
"mode": "apply",
|
||
"generatedAt": "2026-05-23T21:48:01.780Z",
|
||
"target": {
|
||
"environment": "dev",
|
||
"namespace": "hwlab-dev",
|
||
"prodAllowed": false,
|
||
"dbUrlEnv": "HWLAB_CLOUD_DB_URL",
|
||
"dbUrlSecretRef": {
|
||
"env": "HWLAB_CLOUD_DB_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url"
|
||
},
|
||
"adminUrlEnv": "HWLAB_CLOUD_DB_ADMIN_URL",
|
||
"adminUrlSecretRef": {
|
||
"env": "HWLAB_CLOUD_DB_ADMIN_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db-admin",
|
||
"secretKey": "admin-url"
|
||
},
|
||
"dbEndpointAuthority": "secret-url-host"
|
||
},
|
||
"db": {
|
||
"targetUrlPresent": true,
|
||
"targetUrlValueRedacted": true,
|
||
"targetEndpointRedacted": true,
|
||
"targetEndpointClass": "secret-url-host",
|
||
"targetParseStatus": "ready",
|
||
"targetErrorCode": null,
|
||
"targetRoleNamePresent": true,
|
||
"targetDatabaseNamePresent": true,
|
||
"targetDatabaseAllowed": true,
|
||
"targetPasswordPresent": true,
|
||
"sslMode": "disable",
|
||
"sslModeSecret": false,
|
||
"adminUrlPresent": true,
|
||
"adminUrlValueRedacted": true,
|
||
"adminEndpointRedacted": true,
|
||
"dbUrlSecretRef": {
|
||
"env": "HWLAB_CLOUD_DB_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url"
|
||
},
|
||
"adminUrlSecretRef": {
|
||
"env": "HWLAB_CLOUD_DB_ADMIN_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db-admin",
|
||
"secretKey": "admin-url"
|
||
},
|
||
"endpointAuthority": "secret-url-host"
|
||
},
|
||
"applyBoundary": {
|
||
"defaultMode": "check",
|
||
"mode": "apply",
|
||
"liveDbReads": true,
|
||
"liveDbWrites": true,
|
||
"requiresForLiveDbRead": [
|
||
"--confirm-dev",
|
||
"HWLAB_CLOUD_DB_URL from hwlab-cloud-api-dev-db/database-url",
|
||
"HWLAB_CLOUD_DB_ADMIN_URL from hwlab-cloud-api-dev-db-admin/admin-url unless runtime readiness already proves auth"
|
||
],
|
||
"requiresForApply": [
|
||
"--apply",
|
||
"--confirm-dev",
|
||
"--confirmed-non-production",
|
||
"HWLAB_CLOUD_DB_URL from hwlab-cloud-api-dev-db/database-url",
|
||
"HWLAB_CLOUD_DB_ADMIN_URL from hwlab-cloud-api-dev-db-admin/admin-url"
|
||
],
|
||
"writeScope": [
|
||
"DEV Postgres target role named by the redacted cloud-api DB URL",
|
||
"DEV Postgres target database named by the redacted cloud-api DB URL",
|
||
"DEV target DB CONNECT and public schema CREATE/USAGE grants for that role"
|
||
],
|
||
"noWriteScope": [
|
||
"Kubernetes Secret resources",
|
||
"PROD",
|
||
"service restarts",
|
||
"schema migrations",
|
||
"M3/M4/M5 acceptance"
|
||
],
|
||
"forbidden": [
|
||
"printing DB URLs, passwords, tokens, Secret values, or kubeconfig material",
|
||
"manual psql or node stdin database writes",
|
||
"mutating PROD"
|
||
]
|
||
},
|
||
"safety": {
|
||
"devOnly": true,
|
||
"environment": "dev",
|
||
"targetNamespace": "hwlab-dev",
|
||
"prodAllowed": false,
|
||
"sourceStoresSecretValues": false,
|
||
"printsSecretValues": false,
|
||
"secretValuesPrinted": false,
|
||
"dbUrlValueRedacted": true,
|
||
"adminUrlValueRedacted": true,
|
||
"endpointRedacted": true,
|
||
"readsKubernetesSecrets": false,
|
||
"writesKubernetesSecrets": false,
|
||
"liveDbWrites": true,
|
||
"fixtureEvidenceAllowed": false
|
||
},
|
||
"actions": {
|
||
"liveDbReadAttempted": true,
|
||
"liveDbWriteAttempted": true,
|
||
"adminInspectionAttempted": false,
|
||
"adminWriteAttempted": true,
|
||
"appRuntimeReadinessAttempted": true,
|
||
"roleCreated": false,
|
||
"roleExisted": true,
|
||
"rolePasswordSynchronized": true,
|
||
"databaseCreated": false,
|
||
"databaseExisted": true,
|
||
"databaseConnectGranted": true,
|
||
"schemaPrivilegesGranted": true,
|
||
"readinessVerified": true
|
||
},
|
||
"provisioning": {
|
||
"targetRole": {
|
||
"checked": true,
|
||
"exists": true,
|
||
"created": false,
|
||
"ready": true,
|
||
"targetNamePresent": true,
|
||
"inferredFromRuntime": true
|
||
},
|
||
"targetDatabase": {
|
||
"checked": true,
|
||
"exists": true,
|
||
"created": false,
|
||
"ready": true,
|
||
"targetNamePresent": true,
|
||
"inferredFromRuntime": true
|
||
},
|
||
"privileges": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"databaseConnectGranted": true,
|
||
"schemaPrivilegesGranted": true
|
||
},
|
||
"ready": true
|
||
},
|
||
"runtime": {
|
||
"adapter": "postgres",
|
||
"durable": true,
|
||
"durableRequested": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"liveRuntimeEvidence": true,
|
||
"fixtureEvidence": false,
|
||
"connection": {
|
||
"queryAttempted": true,
|
||
"queryResult": "durable_readiness_ready",
|
||
"endpointRedacted": true,
|
||
"valueRedacted": true,
|
||
"errorCode": null
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"missingTables": [],
|
||
"missingColumns": []
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"requiredMigrationId": "0001_cloud_core_skeleton",
|
||
"appliedMigrationId": "0001_cloud_core_skeleton",
|
||
"missing": false
|
||
},
|
||
"gates": {
|
||
"ssl": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"auth": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"durability": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
}
|
||
}
|
||
},
|
||
"gates": {
|
||
"ssl": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
},
|
||
"auth": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
},
|
||
"role": {
|
||
"checked": false,
|
||
"ready": false,
|
||
"status": "not_checked",
|
||
"blocker": null,
|
||
"summary": "role existence requires DEV admin catalog inspection"
|
||
},
|
||
"database": {
|
||
"checked": false,
|
||
"ready": false,
|
||
"status": "not_checked",
|
||
"blocker": null,
|
||
"summary": "database existence requires DEV admin catalog inspection"
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
},
|
||
"durability": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
}
|
||
},
|
||
"downstreamRuntimeGates": {
|
||
"ssl": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"auth": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"durability": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
}
|
||
},
|
||
"blockers": [],
|
||
"safetyRefusal": false,
|
||
"conclusion": {
|
||
"status": "ready",
|
||
"summary": "DEV DB role/database provisioning completed without printing secret values.",
|
||
"blockerCount": 0
|
||
}
|
||
},
|
||
"stdoutTail": null,
|
||
"stderrTail": "",
|
||
"reportPath": "reports/dev-gate/dev-runtime-provisioning-report.json",
|
||
"k8sJob": {
|
||
"jobName": "hwlab-runtime-provision-35e3d897",
|
||
"phase": "complete",
|
||
"serviceId": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"secretRefsOnly": true,
|
||
"secretValuesRead": false,
|
||
"secretValuesPrinted": false
|
||
}
|
||
},
|
||
{
|
||
"id": "runtime-db-migration",
|
||
"phase": "applying",
|
||
"status": "pass",
|
||
"command": "kubectl -n hwlab-dev apply/wait/logs job/hwlab-runtime-migrate-35e3d897",
|
||
"code": 0,
|
||
"startedAt": "2026-05-23T21:48:04.828Z",
|
||
"finishedAt": "2026-05-23T21:48:11.243Z",
|
||
"stdoutJson": {
|
||
"issue": "pikasTech/HWLAB#164",
|
||
"mode": "apply",
|
||
"generatedAt": "2026-05-23T21:48:05.450Z",
|
||
"target": {
|
||
"environment": "dev",
|
||
"namespace": "hwlab-dev",
|
||
"prodAllowed": false,
|
||
"dbUrlEnv": "HWLAB_CLOUD_DB_URL",
|
||
"dbUrlSecretRef": {
|
||
"env": "HWLAB_CLOUD_DB_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url"
|
||
},
|
||
"dbEndpointAuthority": "secret-url-host"
|
||
},
|
||
"migration": {
|
||
"id": "0001_cloud_core_skeleton",
|
||
"path": "internal/db/migrations/0001_cloud_core_skeleton.sql",
|
||
"sha256": "814c654ba17a4f515b0179940ee248462648d17c814ec76c034f398bd92c7a97",
|
||
"schemaVersion": "runtime-durable-postgres-v1",
|
||
"ledgerTable": "hwlab_schema_migrations",
|
||
"runtimeAdapter": "postgres"
|
||
},
|
||
"db": {
|
||
"requiredEnv": [
|
||
{
|
||
"name": "HWLAB_CLOUD_DB_URL",
|
||
"present": true,
|
||
"redacted": true,
|
||
"source": "k8s-secret-ref"
|
||
},
|
||
{
|
||
"name": "HWLAB_CLOUD_DB_SSL_MODE",
|
||
"present": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
}
|
||
],
|
||
"urlPresent": true,
|
||
"urlValueRedacted": true,
|
||
"sslMode": "disable",
|
||
"sslModeSecret": false,
|
||
"secretRef": {
|
||
"env": "HWLAB_CLOUD_DB_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url"
|
||
},
|
||
"endpointAuthority": "secret-url-host",
|
||
"optionalPublicDnsAliasRequired": false
|
||
},
|
||
"sourceCheck": {
|
||
"ready": true,
|
||
"checked": true,
|
||
"migrationPath": "internal/db/migrations/0001_cloud_core_skeleton.sql",
|
||
"requiredMigrationId": "0001_cloud_core_skeleton",
|
||
"requiredSchemaVersion": "runtime-durable-postgres-v1",
|
||
"requiredTables": [
|
||
"gateway_sessions",
|
||
"box_resources",
|
||
"box_capabilities",
|
||
"hardware_operations",
|
||
"audit_events",
|
||
"evidence_records"
|
||
],
|
||
"requiredLedgerTable": "hwlab_schema_migrations",
|
||
"missing": [],
|
||
"connectsToDatabase": false,
|
||
"fixtureEvidence": false
|
||
},
|
||
"applyBoundary": {
|
||
"defaultMode": "check",
|
||
"mode": "apply",
|
||
"liveDbReads": true,
|
||
"liveDbWrites": true,
|
||
"requiresForLiveDbRead": [
|
||
"--confirm-dev",
|
||
"HWLAB_CLOUD_DB_URL from hwlab-cloud-api-dev-db/database-url"
|
||
],
|
||
"requiresForApply": [
|
||
"--apply",
|
||
"--confirm-dev",
|
||
"--confirmed-non-production",
|
||
"HWLAB_CLOUD_DB_URL from hwlab-cloud-api-dev-db/database-url"
|
||
],
|
||
"writeScope": [
|
||
"DEV Postgres schema objects declared by internal/db/migrations/0001_cloud_core_skeleton.sql",
|
||
"DEV hwlab_schema_migrations ledger row 0001_cloud_core_skeleton"
|
||
],
|
||
"noWriteScope": [
|
||
"Kubernetes Secret resources",
|
||
"PROD",
|
||
"service restarts",
|
||
"M3/M4/M5 acceptance"
|
||
],
|
||
"forbidden": [
|
||
"printing DB URLs, passwords, tokens, Secret values, or kubeconfig material",
|
||
"using fixture output as DEV-LIVE runtime evidence",
|
||
"mutating PROD"
|
||
]
|
||
},
|
||
"safety": {
|
||
"devOnly": true,
|
||
"environment": "dev",
|
||
"targetNamespace": "hwlab-dev",
|
||
"prodAllowed": false,
|
||
"sourceStoresSecretValues": false,
|
||
"printsSecretValues": false,
|
||
"dbUrlValueRedacted": true,
|
||
"endpointRedacted": true,
|
||
"readsKubernetesSecrets": false,
|
||
"writesKubernetesSecrets": false,
|
||
"liveDbWrites": true,
|
||
"fixtureEvidenceAllowed": false
|
||
},
|
||
"actions": {
|
||
"sourceValidated": true,
|
||
"liveDbReadAttempted": true,
|
||
"liveDbWriteAttempted": true,
|
||
"migrationApplied": true,
|
||
"readinessVerified": true
|
||
},
|
||
"gates": {
|
||
"auth": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
},
|
||
"readiness": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"summary": "ready"
|
||
}
|
||
},
|
||
"blockers": [],
|
||
"safetyRefusal": false,
|
||
"runtime": {
|
||
"adapter": "postgres",
|
||
"durable": true,
|
||
"durableRequested": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"liveRuntimeEvidence": true,
|
||
"fixtureEvidence": false,
|
||
"connection": {
|
||
"queryAttempted": true,
|
||
"queryResult": "durable_readiness_ready",
|
||
"endpointRedacted": true,
|
||
"valueRedacted": true,
|
||
"errorCode": null
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"requiredTables": [
|
||
"gateway_sessions",
|
||
"box_resources",
|
||
"box_capabilities",
|
||
"hardware_operations",
|
||
"audit_events",
|
||
"evidence_records"
|
||
],
|
||
"missingTables": [],
|
||
"missingColumns": []
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"table": "hwlab_schema_migrations",
|
||
"requiredMigrationId": "0001_cloud_core_skeleton",
|
||
"requiredSchemaVersion": "runtime-durable-postgres-v1",
|
||
"appliedMigrationId": "0001_cloud_core_skeleton",
|
||
"appliedSchemaVersion": "runtime-durable-postgres-v1",
|
||
"missing": false
|
||
}
|
||
},
|
||
"conclusion": {
|
||
"status": "ready",
|
||
"summary": "DEV runtime migration applied and durable runtime readiness was verified without printing secret values.",
|
||
"blockerCount": 0
|
||
}
|
||
},
|
||
"stdoutTail": null,
|
||
"stderrTail": "",
|
||
"reportPath": "reports/dev-gate/dev-runtime-migration-report.json",
|
||
"k8sJob": {
|
||
"jobName": "hwlab-runtime-migrate-35e3d897",
|
||
"phase": "complete",
|
||
"serviceId": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"secretRefsOnly": true,
|
||
"secretValuesRead": false,
|
||
"secretValuesPrinted": false
|
||
}
|
||
},
|
||
{
|
||
"id": "dev-deploy-apply",
|
||
"phase": "applying",
|
||
"status": "pass",
|
||
"command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-deploy-apply.mjs --apply --confirm-dev --confirmed-non-production --write-report --kubeconfig /etc/rancher/k3s/k3s.yaml",
|
||
"code": 0,
|
||
"startedAt": "2026-05-23T21:48:11.243Z",
|
||
"finishedAt": "2026-05-23T21:48:14.131Z",
|
||
"stdoutJson": {
|
||
"$schema": "https://hwlab.pikastech.local/schemas/dev-gate-report.schema.json",
|
||
"$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-deploy-report.json",
|
||
"reportVersion": "v1",
|
||
"issue": "pikasTech/HWLAB#33",
|
||
"supports": [
|
||
"pikasTech/HWLAB#164",
|
||
"pikasTech/HWLAB#143",
|
||
"pikasTech/HWLAB#99",
|
||
"pikasTech/HWLAB#63",
|
||
"pikasTech/HWLAB#50",
|
||
"pikasTech/HWLAB#7",
|
||
"pikasTech/HWLAB#33",
|
||
"pikasTech/HWLAB#17",
|
||
"pikasTech/HWLAB#32",
|
||
"pikasTech/HWLAB#30"
|
||
],
|
||
"taskId": "dev-deploy-apply",
|
||
"commitId": "e6d4bd5",
|
||
"acceptanceLevel": "dev_deploy_apply",
|
||
"devOnly": true,
|
||
"prodDisabled": true,
|
||
"reportLifecycle": {
|
||
"version": "v1",
|
||
"state": "active",
|
||
"activeEndpoint": "http://74.48.78.17:16667",
|
||
"activeBrowserEndpoint": "http://74.48.78.17:16666",
|
||
"deprecatedEndpoint": null,
|
||
"summary": "Current DEV deploy apply report; active public API/health endpoint is 16667 and browser endpoint is 16666."
|
||
},
|
||
"status": "pass",
|
||
"generatedAt": "2026-05-23T21:48:14.125Z",
|
||
"namespace": "hwlab-dev",
|
||
"endpoint": "http://74.48.78.17:16667",
|
||
"sourceContract": {
|
||
"status": "pass",
|
||
"documents": [
|
||
"docs/dev-acceptance-matrix.md",
|
||
"docs/m0-contract-audit.md",
|
||
"docs/dev-deploy-apply.md",
|
||
"docs/artifact-catalog.md",
|
||
"deploy/README.md"
|
||
],
|
||
"summary": "DEV deploy apply is pinned to hwlab-dev and the frozen HWLAB service IDs"
|
||
},
|
||
"validationCommands": [
|
||
"node --check scripts/validate-dev-gate-report.mjs",
|
||
"node scripts/validate-dev-gate-report.mjs",
|
||
"node --check scripts/dev-deploy-apply.mjs",
|
||
"node --check scripts/src/dev-deploy-apply.mjs",
|
||
"node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked"
|
||
],
|
||
"localSmoke": {
|
||
"status": "not_run",
|
||
"commands": [
|
||
"node scripts/m1-contract-smoke.mjs"
|
||
],
|
||
"evidence": [
|
||
"This deploy apply task did not run local smoke because artifact/executor blockers stop promotion first."
|
||
],
|
||
"summary": "Local smoke remains available but is not a substitute for DEV artifact publish evidence."
|
||
},
|
||
"dryRun": {
|
||
"status": "pass",
|
||
"commands": [
|
||
"node tools/hwlab-cli/bin/hwlab-cli.mjs test e2e --env dev --mvp --dry-run",
|
||
"node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked"
|
||
],
|
||
"evidence": [
|
||
"artifact services checked: 13",
|
||
"expected artifact commit: e6d4bd5",
|
||
"namespace: hwlab-dev",
|
||
"workloads planned: 13",
|
||
"kubectl executor: /usr/local/bin/kubectl",
|
||
"kubectl kubeconfig source: flag:--kubeconfig",
|
||
"kubectl kubeconfig: /etc/rancher/k3s/k3s.yaml",
|
||
"live health: pass",
|
||
"code agent provider desired-state: pass",
|
||
"code agent provider live env before apply: blocked",
|
||
"template job replacements: 2",
|
||
"legacy simulator deployment cleanups: 0"
|
||
],
|
||
"summary": "DEV dry-run preflight passed."
|
||
},
|
||
"devPreconditions": {
|
||
"status": "pass",
|
||
"requirements": [
|
||
"DEV artifact catalog must contain CI publish evidence and registry digests",
|
||
"kubectl must be available for D601 hwlab-dev and must not target PROD",
|
||
"hwlab-cloud-api /health/live must report serviceId, dev environment, and DB env readiness without exposing secret values",
|
||
"hwlab-cloud-api must declare and preserve OPENAI_API_KEY from hwlab-code-agent-provider/openai-api-key plus the DEV Code Agent egress proxy env without reading Secret values",
|
||
"pods, services, configmaps, and image commit tags must be observable in hwlab-dev"
|
||
],
|
||
"summary": "DEV deploy preconditions are satisfied."
|
||
},
|
||
"devDeployApply": {
|
||
"mode": "apply",
|
||
"conclusion": {
|
||
"status": "ready",
|
||
"reason": "All DEV-only preconditions passed; human approval is still required before apply.",
|
||
"blockerCount": 0
|
||
},
|
||
"applyBoundary": {
|
||
"currentMode": "apply-requested",
|
||
"defaultNoWrite": false,
|
||
"mutationAttempted": true,
|
||
"mutationAllowed": true,
|
||
"applyRequiresFlags": [
|
||
"--apply",
|
||
"--confirm-dev",
|
||
"--confirmed-non-production"
|
||
],
|
||
"kubeconfigSource": "flag:--kubeconfig",
|
||
"writeScope": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl apply -k deploy/k8s/dev, namespace hwlab-dev only; delete/recreate is allowed only for explicitly allowlisted suspended DEV template Jobs and stale legacy simulator Deployments",
|
||
"noWriteScope": "source/catalog/k8s validation, optional DEV health probe, KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl read, replacement planning, and server-side dry-run only",
|
||
"forbiddenActions": [
|
||
"prod-deploy",
|
||
"secret-read",
|
||
"runtime-substitute",
|
||
"unidesk-restart",
|
||
"code-queue-restart",
|
||
"backend-core-restart",
|
||
"heavy-master-e2e",
|
||
"force-push"
|
||
]
|
||
},
|
||
"mutationAttempted": true,
|
||
"target": {
|
||
"environment": "dev",
|
||
"namespace": "hwlab-dev",
|
||
"endpoint": "http://74.48.78.17:16667",
|
||
"prodDisabled": true
|
||
},
|
||
"artifactPlan": {
|
||
"expectedArtifactCommit": "e6d4bd5",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"sourceCommitId": "e6d4bd5",
|
||
"serviceCommitIds": [
|
||
"e6d4bd5"
|
||
],
|
||
"matchesSourceCommit": true,
|
||
"published": true,
|
||
"registryVerified": true,
|
||
"imageCount": 13,
|
||
"requiredServiceCount": 13,
|
||
"disabledServiceCount": 0,
|
||
"unpublishedServices": []
|
||
},
|
||
"workloadPlan": [
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-api",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 1,
|
||
"serviceIds": [
|
||
"hwlab-cloud-api"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-cloud-api",
|
||
"serviceId": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 1,
|
||
"serviceIds": [
|
||
"hwlab-cloud-web"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-cloud-web",
|
||
"serviceId": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-mgr",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 1,
|
||
"serviceIds": [
|
||
"hwlab-agent-mgr"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-agent-mgr",
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-agent-worker-template",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 0,
|
||
"serviceIds": [
|
||
"hwlab-agent-worker"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-agent-worker",
|
||
"serviceId": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-gateway",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 0,
|
||
"serviceIds": [
|
||
"hwlab-gateway"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-gateway",
|
||
"serviceId": "hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "StatefulSet",
|
||
"name": "hwlab-gateway-simu",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 2,
|
||
"serviceIds": [
|
||
"hwlab-gateway-simu"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-gateway-simu",
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "StatefulSet",
|
||
"name": "hwlab-box-simu",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 2,
|
||
"serviceIds": [
|
||
"hwlab-box-simu"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-box-simu",
|
||
"serviceId": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-patch-panel",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 1,
|
||
"serviceIds": [
|
||
"hwlab-patch-panel"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-patch-panel",
|
||
"serviceId": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-router",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 1,
|
||
"serviceIds": [
|
||
"hwlab-router"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-router",
|
||
"serviceId": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-tunnel-client",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 1,
|
||
"serviceIds": [
|
||
"hwlab-tunnel-client"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-tunnel-client",
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-edge-proxy",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 1,
|
||
"serviceIds": [
|
||
"hwlab-edge-proxy"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-edge-proxy",
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-cli-template",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 0,
|
||
"serviceIds": [
|
||
"hwlab-cli"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-cli",
|
||
"serviceId": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-skills",
|
||
"namespace": "hwlab-dev",
|
||
"replicas": 1,
|
||
"serviceIds": [
|
||
"hwlab-agent-skills"
|
||
],
|
||
"containers": [
|
||
{
|
||
"name": "hwlab-agent-skills",
|
||
"serviceId": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"servicePlan": [
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-cloud-api",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-cloud-api",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 6667,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-gateway-simu-1",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7101,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-gateway-simu-2",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7101,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-cloud-web",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 8080,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-box-simu-1",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-box-simu",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7201,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-box-simu-2",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-box-simu",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7201,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-gateway",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-gateway",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7001,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-cli",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-cli",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7501,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-agent-skills",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-agent-skills",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7430,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-agent-mgr",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7410,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-gateway-simu",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7101,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-box-simu",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-box-simu",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7201,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-patch-panel",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-patch-panel",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7301,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-router",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-router",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7401,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-tunnel-client",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 7402,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-edge-proxy",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"type": "ClusterIP",
|
||
"ports": [
|
||
{
|
||
"name": "http",
|
||
"port": 6667,
|
||
"targetPort": "http"
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"templateJobReplacementPolicy": {
|
||
"status": "active",
|
||
"namespace": "hwlab-dev",
|
||
"scope": "DEV-only suspended template Jobs",
|
||
"allowedJobs": [
|
||
{
|
||
"name": "hwlab-agent-worker-template",
|
||
"serviceId": "hwlab-agent-worker",
|
||
"reason": "suspended session worker template Job has immutable spec.template"
|
||
},
|
||
{
|
||
"name": "hwlab-cli-template",
|
||
"serviceId": "hwlab-cli",
|
||
"reason": "suspended CLI template Job has immutable spec.template"
|
||
}
|
||
]
|
||
},
|
||
"templateJobReplacements": [
|
||
{
|
||
"namespace": "hwlab-dev",
|
||
"jobName": "hwlab-agent-worker-template",
|
||
"allowed": true,
|
||
"desiredSuspended": true,
|
||
"liveExists": true,
|
||
"liveSuspended": true,
|
||
"oldImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:b02ac5b",
|
||
"newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"oldImages": [
|
||
{
|
||
"name": "hwlab-agent-worker",
|
||
"serviceId": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:b02ac5b"
|
||
}
|
||
],
|
||
"newImages": [
|
||
{
|
||
"name": "hwlab-agent-worker",
|
||
"serviceId": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5"
|
||
}
|
||
],
|
||
"replace": true,
|
||
"result": "replaced",
|
||
"reason": "Live suspended template Job was deleted and recreated by kubectl apply.",
|
||
"deleteCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found=true",
|
||
"deleteStdout": "job.batch \"hwlab-agent-worker-template\" deleted from hwlab-dev namespace",
|
||
"deleteStderr": ""
|
||
},
|
||
{
|
||
"namespace": "hwlab-dev",
|
||
"jobName": "hwlab-cli-template",
|
||
"allowed": true,
|
||
"desiredSuspended": true,
|
||
"liveExists": true,
|
||
"liveSuspended": true,
|
||
"oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:b02ac5b",
|
||
"newImage": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"oldImages": [
|
||
{
|
||
"name": "hwlab-cli",
|
||
"serviceId": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:b02ac5b"
|
||
}
|
||
],
|
||
"newImages": [
|
||
{
|
||
"name": "hwlab-cli",
|
||
"serviceId": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5"
|
||
}
|
||
],
|
||
"replace": true,
|
||
"result": "replaced",
|
||
"reason": "Live suspended template Job was deleted and recreated by kubectl apply.",
|
||
"deleteCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found=true",
|
||
"deleteStdout": "job.batch \"hwlab-cli-template\" deleted from hwlab-dev namespace",
|
||
"deleteStderr": ""
|
||
}
|
||
],
|
||
"legacySimulatorDeploymentCleanupPolicy": {
|
||
"status": "active",
|
||
"namespace": "hwlab-dev",
|
||
"scope": "DEV-only stale simulator Deployments replaced by indexed StatefulSets",
|
||
"allowedDeployments": [
|
||
{
|
||
"name": "hwlab-gateway-simu",
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"replacementKind": "StatefulSet",
|
||
"reason": "M3 DEV requires exactly two indexed gateway-simu identities/sessions"
|
||
},
|
||
{
|
||
"name": "hwlab-box-simu",
|
||
"serviceId": "hwlab-box-simu",
|
||
"replacementKind": "StatefulSet",
|
||
"reason": "M3 DEV requires exactly two indexed box-simu resource identities"
|
||
}
|
||
]
|
||
},
|
||
"legacySimulatorDeploymentCleanups": [
|
||
{
|
||
"namespace": "hwlab-dev",
|
||
"deploymentName": "hwlab-gateway-simu",
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"allowed": true,
|
||
"desiredReplacementExists": true,
|
||
"desiredReplacementKind": "StatefulSet",
|
||
"liveExists": false,
|
||
"oldImage": null,
|
||
"newImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"oldImages": [],
|
||
"newImages": [
|
||
{
|
||
"name": "hwlab-gateway-simu",
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5"
|
||
}
|
||
],
|
||
"cleanup": false,
|
||
"result": "not_found",
|
||
"reason": "Live legacy Deployment is absent; no cleanup is needed."
|
||
},
|
||
{
|
||
"namespace": "hwlab-dev",
|
||
"deploymentName": "hwlab-box-simu",
|
||
"serviceId": "hwlab-box-simu",
|
||
"allowed": true,
|
||
"desiredReplacementExists": true,
|
||
"desiredReplacementKind": "StatefulSet",
|
||
"liveExists": false,
|
||
"oldImage": null,
|
||
"newImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"oldImages": [],
|
||
"newImages": [
|
||
{
|
||
"name": "hwlab-box-simu",
|
||
"serviceId": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5"
|
||
}
|
||
],
|
||
"cleanup": false,
|
||
"result": "not_found",
|
||
"reason": "Live legacy Deployment is absent; no cleanup is needed."
|
||
}
|
||
],
|
||
"cloudWebRollout": {
|
||
"serviceId": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"status": "observed",
|
||
"observationPhase": "after_apply",
|
||
"sourceCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"repositoryDigest": null,
|
||
"publishState": "published",
|
||
"rolloutRevision": "41",
|
||
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageMatchesDesired": true,
|
||
"expectedRuntimeEnv": {
|
||
"HWLAB_COMMIT_ID": "e6d4bd5",
|
||
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"HWLAB_IMAGE_TAG": "e6d4bd5"
|
||
},
|
||
"liveRuntimeEnv": {
|
||
"status": "match",
|
||
"matchesDesired": true,
|
||
"fields": [
|
||
{
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"expected": "e6d4bd5",
|
||
"actual": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"expected": "e6d4bd5",
|
||
"actual": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
],
|
||
"drift": []
|
||
},
|
||
"runtimeEnvMatchesDesired": true,
|
||
"runtimeEnvDrift": [],
|
||
"verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s",
|
||
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json",
|
||
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
|
||
"kubeconfigSource": "flag:--kubeconfig"
|
||
},
|
||
"cloudWebRolloutBeforeApply": {
|
||
"serviceId": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"status": "observed",
|
||
"observationPhase": "before_apply",
|
||
"sourceCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"repositoryDigest": null,
|
||
"publishState": "published",
|
||
"rolloutRevision": "40",
|
||
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"imageMatchesDesired": false,
|
||
"expectedRuntimeEnv": {
|
||
"HWLAB_COMMIT_ID": "e6d4bd5",
|
||
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"HWLAB_IMAGE_TAG": "e6d4bd5"
|
||
},
|
||
"liveRuntimeEnv": {
|
||
"status": "drift",
|
||
"matchesDesired": false,
|
||
"fields": [
|
||
{
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"expected": "e6d4bd5",
|
||
"actual": "b02ac5b",
|
||
"status": "drift"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"status": "drift"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"expected": "e6d4bd5",
|
||
"actual": "b02ac5b",
|
||
"status": "drift"
|
||
}
|
||
],
|
||
"drift": [
|
||
{
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"expected": "e6d4bd5",
|
||
"actual": "b02ac5b",
|
||
"status": "drift"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"status": "drift"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"expected": "e6d4bd5",
|
||
"actual": "b02ac5b",
|
||
"status": "drift"
|
||
}
|
||
]
|
||
},
|
||
"runtimeEnvMatchesDesired": false,
|
||
"runtimeEnvDrift": [
|
||
{
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"expected": "e6d4bd5",
|
||
"actual": "b02ac5b",
|
||
"status": "drift"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"status": "drift"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"expected": "e6d4bd5",
|
||
"actual": "b02ac5b",
|
||
"status": "drift"
|
||
}
|
||
],
|
||
"verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s",
|
||
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json",
|
||
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
|
||
"kubeconfigSource": "flag:--kubeconfig"
|
||
},
|
||
"cloudWebRolloutAfterApply": {
|
||
"serviceId": "hwlab-cloud-web",
|
||
"namespace": "hwlab-dev",
|
||
"status": "observed",
|
||
"observationPhase": "after_apply",
|
||
"sourceCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageTag": "e6d4bd5",
|
||
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"repositoryDigest": null,
|
||
"publishState": "published",
|
||
"rolloutRevision": "41",
|
||
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"imageMatchesDesired": true,
|
||
"expectedRuntimeEnv": {
|
||
"HWLAB_COMMIT_ID": "e6d4bd5",
|
||
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"HWLAB_IMAGE_TAG": "e6d4bd5"
|
||
},
|
||
"liveRuntimeEnv": {
|
||
"status": "match",
|
||
"matchesDesired": true,
|
||
"fields": [
|
||
{
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"expected": "e6d4bd5",
|
||
"actual": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"expected": "e6d4bd5",
|
||
"actual": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
],
|
||
"drift": []
|
||
},
|
||
"runtimeEnvMatchesDesired": true,
|
||
"runtimeEnvDrift": [],
|
||
"verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s",
|
||
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json",
|
||
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
|
||
"kubeconfigSource": "flag:--kubeconfig"
|
||
},
|
||
"codeAgentProvider": {
|
||
"desiredState": {
|
||
"contractVersion": "v1",
|
||
"environment": "dev",
|
||
"provider": "codex-stdio",
|
||
"runtimeProvider": "openai-responses",
|
||
"backend": "hwlab-cloud-api/codex-mcp-stdio",
|
||
"model": "gpt-5.5",
|
||
"status": "pass",
|
||
"ready": true,
|
||
"requiredEnv": [
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_PROVIDER",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_MODEL",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "OPENAI_API_KEY",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": true,
|
||
"source": "k8s-secret-ref"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"redacted": true,
|
||
"source": "runtime-env"
|
||
}
|
||
],
|
||
"secretRef": {
|
||
"env": "OPENAI_API_KEY",
|
||
"secretName": "hwlab-code-agent-provider",
|
||
"secretKey": "openai-api-key",
|
||
"deployPlaceholderPresent": true,
|
||
"workloadSecretRefPresent": true,
|
||
"present": true,
|
||
"redacted": true
|
||
},
|
||
"egress": {
|
||
"env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"target": "dev-egress-proxy",
|
||
"deployPresent": true,
|
||
"workloadPresent": true,
|
||
"deployMatchesDevProxy": true,
|
||
"workloadMatchesDevProxy": true,
|
||
"directPublicOpenAi": false,
|
||
"valueRedacted": true
|
||
},
|
||
"missingDeployEnv": [],
|
||
"missingWorkloadEnv": [],
|
||
"deployMismatches": [],
|
||
"workloadMismatches": [],
|
||
"missingSecretRefs": [],
|
||
"missingEgressContract": [],
|
||
"secretMaterialRead": false,
|
||
"valuesRedacted": true,
|
||
"providerConnected": false,
|
||
"fixtureEvidence": false
|
||
},
|
||
"liveBeforeApply": {
|
||
"phase": "before_apply",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-cloud-api",
|
||
"status": "blocked",
|
||
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json",
|
||
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
|
||
"expectedSecretRef": "hwlab-code-agent-provider/openai-api-key",
|
||
"expectedEgressTarget": "dev-egress-proxy",
|
||
"secretValuesRead": false,
|
||
"kubernetesSecretDataRead": false,
|
||
"valuesRedacted": true,
|
||
"contractVersion": "v1",
|
||
"environment": "dev",
|
||
"provider": "codex-stdio",
|
||
"runtimeProvider": "openai-responses",
|
||
"backend": "hwlab-cloud-api/codex-mcp-stdio",
|
||
"model": "gpt-5.5",
|
||
"ready": false,
|
||
"requiredEnv": [
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_PROVIDER",
|
||
"present": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_MODEL",
|
||
"present": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "OPENAI_API_KEY",
|
||
"present": true,
|
||
"redacted": true,
|
||
"source": "k8s-secret-ref"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"present": true,
|
||
"redacted": true,
|
||
"source": "runtime-env"
|
||
}
|
||
],
|
||
"missingEnv": [],
|
||
"mismatchedEnv": [
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_PROVIDER",
|
||
"expected": "codex-stdio",
|
||
"redacted": false
|
||
}
|
||
],
|
||
"secretRef": {
|
||
"env": "OPENAI_API_KEY",
|
||
"secretName": "hwlab-code-agent-provider",
|
||
"secretKey": "openai-api-key",
|
||
"present": true,
|
||
"redacted": true
|
||
},
|
||
"egress": {
|
||
"env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"target": "dev-egress-proxy",
|
||
"present": true,
|
||
"matchesDevProxy": true,
|
||
"directPublicOpenAi": false,
|
||
"valueRedacted": true
|
||
},
|
||
"secretMaterialRead": false,
|
||
"providerConnected": false,
|
||
"deployment": "hwlab-cloud-api",
|
||
"container": "hwlab-cloud-api",
|
||
"validationScope": "deployment-env-and-secretKeyRef-metadata-only"
|
||
},
|
||
"liveAfterApply": {
|
||
"phase": "after_apply",
|
||
"namespace": "hwlab-dev",
|
||
"serviceId": "hwlab-cloud-api",
|
||
"status": "pass",
|
||
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json",
|
||
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
|
||
"expectedSecretRef": "hwlab-code-agent-provider/openai-api-key",
|
||
"expectedEgressTarget": "dev-egress-proxy",
|
||
"secretValuesRead": false,
|
||
"kubernetesSecretDataRead": false,
|
||
"valuesRedacted": true,
|
||
"contractVersion": "v1",
|
||
"environment": "dev",
|
||
"provider": "codex-stdio",
|
||
"runtimeProvider": "openai-responses",
|
||
"backend": "hwlab-cloud-api/codex-mcp-stdio",
|
||
"model": "gpt-5.5",
|
||
"ready": true,
|
||
"requiredEnv": [
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_PROVIDER",
|
||
"present": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_MODEL",
|
||
"present": true,
|
||
"redacted": false,
|
||
"source": "runtime-env"
|
||
},
|
||
{
|
||
"name": "OPENAI_API_KEY",
|
||
"present": true,
|
||
"redacted": true,
|
||
"source": "k8s-secret-ref"
|
||
},
|
||
{
|
||
"name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"present": true,
|
||
"redacted": true,
|
||
"source": "runtime-env"
|
||
}
|
||
],
|
||
"missingEnv": [],
|
||
"mismatchedEnv": [],
|
||
"secretRef": {
|
||
"env": "OPENAI_API_KEY",
|
||
"secretName": "hwlab-code-agent-provider",
|
||
"secretKey": "openai-api-key",
|
||
"present": true,
|
||
"redacted": true
|
||
},
|
||
"egress": {
|
||
"env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL",
|
||
"target": "dev-egress-proxy",
|
||
"present": true,
|
||
"matchesDevProxy": true,
|
||
"directPublicOpenAi": false,
|
||
"valueRedacted": true
|
||
},
|
||
"secretMaterialRead": false,
|
||
"providerConnected": false,
|
||
"deployment": "hwlab-cloud-api",
|
||
"container": "hwlab-cloud-api",
|
||
"validationScope": "deployment-env-and-secretKeyRef-metadata-only"
|
||
},
|
||
"validationGate": "no-secret provider env/secretKeyRef preservation",
|
||
"providerCallAttempted": false,
|
||
"secretValuesRead": false,
|
||
"kubernetesSecretDataRead": false,
|
||
"valuesRedacted": true
|
||
},
|
||
"applyStep": {
|
||
"status": "pass",
|
||
"command": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl apply -k deploy/k8s/dev",
|
||
"stdout": "namespace/hwlab-dev unchanged\nconfigmap/hwlab-dev-health-contract unchanged\nservice/hwlab-agent-mgr unchanged\nservice/hwlab-agent-skills unchanged\nservice/hwlab-box-simu unchanged\nservice/hwlab-box-simu-1 unchanged\nservice/hwlab-box-simu-2 unchanged\nservice/hwlab-cli unchanged\nservice/hwlab-cloud-api unchanged\nservice/hwlab-cloud-web unchanged\nservice/hwlab-edge-proxy unchanged\nservice/hwlab-gateway unchanged\nservice/hwlab-gateway-simu unchanged\nservice/hwlab-gateway-simu-1 unchanged\nservice/hwlab-gateway-simu-2 unchanged\nservice/hwlab-patch-panel unchanged\nservice/hwlab-router unchanged\nservice/hwlab-tunnel-client unchanged\ndeployment.apps/hwlab-agent-mgr configured\ndeployment.apps/hwlab-agent-skills configured\ndeployment.apps/hwlab-cloud-api configured\ndeployment.apps/hwlab-cloud-web configured\ndeployment.apps/hwlab-edge-proxy configured\ndeployment.apps/hwlab-gateway configured\ndeployment.apps/hwlab-patch-panel configured\ndeployment.apps/hwlab-router configured\ndeployment.apps/hwlab-tunnel-client configured\nstatefulset.apps/hwlab-box-simu configured\nstatefulset.apps/hwlab-gateway-simu configured\njob.batch/hwlab-agent-worker-template created\njob.batch/hwlab-cli-template created",
|
||
"stderr": "# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.\n# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.",
|
||
"mutationAttempted": true,
|
||
"expectedImmutableTemplateJobDryRun": false,
|
||
"expectedImmutableTemplateJobs": []
|
||
},
|
||
"manualCommands": {
|
||
"status": "ready",
|
||
"beforeHumanApproval": [
|
||
"node scripts/dev-deploy-apply.mjs --dry-run --write-report",
|
||
"node scripts/validate-dev-gate-report.mjs"
|
||
],
|
||
"afterHumanApproval": [
|
||
"node scripts/dev-cd-apply.mjs --apply --confirm-dev --confirmed-non-production --write-report"
|
||
],
|
||
"summary": "Run the dry-run plan and validator immediately before requesting human approval; live apply still requires the explicit DEV confirmation flags."
|
||
},
|
||
"rollbackHint": {
|
||
"namespace": "hwlab-dev",
|
||
"strategy": "DEV-only Kubernetes rollback using deployment revision history; do not touch PROD or UniDesk services.",
|
||
"captureBeforeApply": [
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get pods,services,configmaps,deployments,jobs -o wide",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployments -o json"
|
||
],
|
||
"deploymentRollbackCommands": [
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-api",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-web",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-mgr",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-gateway",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-patch-panel",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-router",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-tunnel-client",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-edge-proxy",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-skills"
|
||
],
|
||
"jobCleanupCommands": [
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found",
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found"
|
||
],
|
||
"postRollbackChecks": [
|
||
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-api --timeout=120s",
|
||
"curl -fsS http://74.48.78.17:16667/health/live"
|
||
]
|
||
},
|
||
"remainingBlockers": [],
|
||
"artifactEvidence": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f",
|
||
"publishState": "published"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"deployCommitId": "e6d4bd5",
|
||
"catalogCommitId": "e6d4bd5",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f",
|
||
"publishState": "published"
|
||
}
|
||
],
|
||
"cloudApiDb": {
|
||
"status": "contract-ready",
|
||
"requiredEnv": [
|
||
{
|
||
"name": "HWLAB_CLOUD_DB_URL",
|
||
"manifestPresent": true,
|
||
"k8sPresent": true,
|
||
"redacted": true,
|
||
"source": "k8s-secret-ref",
|
||
"secretRef": {
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url",
|
||
"present": true,
|
||
"redacted": true
|
||
}
|
||
},
|
||
{
|
||
"name": "HWLAB_CLOUD_DB_SSL_MODE",
|
||
"manifestPresent": true,
|
||
"k8sPresent": true,
|
||
"redacted": false,
|
||
"source": "runtime-env",
|
||
"secretRef": null
|
||
}
|
||
],
|
||
"missingManifest": [],
|
||
"missingK8s": [],
|
||
"missingSecretRefs": [],
|
||
"mismatchedNonSecretEnv": [],
|
||
"missingDnsContract": [],
|
||
"dns": {
|
||
"ready": true,
|
||
"source": "optional-public-dns-alias",
|
||
"serviceName": "cloud-api-db",
|
||
"namespace": "hwlab-dev",
|
||
"port": 5432,
|
||
"portName": "postgres",
|
||
"requiredForReadiness": false,
|
||
"usedForProbe": false,
|
||
"servicePresent": false,
|
||
"secretMaterialRead": false,
|
||
"liveDbEvidence": false,
|
||
"missing": [],
|
||
"actual": {}
|
||
},
|
||
"runtimeHealth": {
|
||
"status": "degraded",
|
||
"ready": false,
|
||
"configReady": true,
|
||
"connected": false,
|
||
"liveConnected": false,
|
||
"connectionChecked": false,
|
||
"connectionAttempted": false,
|
||
"connectionResult": "unknown",
|
||
"liveDbEvidence": false,
|
||
"requiredEnv": [
|
||
{
|
||
"name": "HWLAB_CLOUD_DB_URL",
|
||
"present": true,
|
||
"redacted": true
|
||
},
|
||
{
|
||
"name": "HWLAB_CLOUD_DB_SSL_MODE",
|
||
"present": true,
|
||
"redacted": false
|
||
}
|
||
],
|
||
"missingEnv": [],
|
||
"secretRefs": [
|
||
{
|
||
"env": "HWLAB_CLOUD_DB_URL",
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url",
|
||
"present": true,
|
||
"envInjected": true,
|
||
"secretPresent": "not_observed",
|
||
"secretKeyPresent": "not_observed",
|
||
"redacted": true
|
||
}
|
||
],
|
||
"endpointSource": "secret-url-host",
|
||
"optionalPublicDnsAlias": {
|
||
"source": "optional-public-dns-alias",
|
||
"serviceName": "cloud-api-db",
|
||
"namespace": "hwlab-dev",
|
||
"port": 5432,
|
||
"portName": "postgres",
|
||
"requiredForReadiness": false,
|
||
"usedForProbe": false,
|
||
"envPresent": false,
|
||
"readyGate": "not_readiness_authority"
|
||
},
|
||
"connection": {
|
||
"attempted": false,
|
||
"result": "unknown",
|
||
"endpointRedacted": true,
|
||
"valueRedacted": true
|
||
},
|
||
"redaction": {
|
||
"valuesRedacted": true,
|
||
"endpointRedacted": true,
|
||
"valueRedacted": true,
|
||
"secretMaterialRead": false,
|
||
"secretRefsOnly": true
|
||
},
|
||
"readinessLayers": {
|
||
"dns": {
|
||
"status": "not_proven",
|
||
"result": "unknown"
|
||
},
|
||
"tcp": {
|
||
"status": "not_proven",
|
||
"result": "unknown"
|
||
},
|
||
"ssl": {
|
||
"status": "not_proven",
|
||
"result": "unknown"
|
||
},
|
||
"auth": {
|
||
"status": "not_proven",
|
||
"result": "unknown"
|
||
},
|
||
"schema": {
|
||
"status": "not_proven",
|
||
"result": "unknown"
|
||
},
|
||
"migration": {
|
||
"status": "not_proven",
|
||
"result": "unknown"
|
||
},
|
||
"durability": {
|
||
"status": "not_proven",
|
||
"result": "unknown"
|
||
}
|
||
},
|
||
"blocker": null,
|
||
"fixtureEvidence": false
|
||
},
|
||
"secretMaterialRead": false,
|
||
"valuesRedacted": true,
|
||
"liveDbEvidence": false,
|
||
"fixtureEvidence": false,
|
||
"note": "This check records DB env, Secret reference, and Secret URL host authority only. Optional cloud-api-db alias presence is diagnostic and is not live DB evidence."
|
||
},
|
||
"k8sManifest": {
|
||
"resourceCounts": {
|
||
"workloads": 13,
|
||
"services": 16,
|
||
"configMaps": 1
|
||
},
|
||
"images": [
|
||
{
|
||
"serviceId": "hwlab-cloud-api",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-api"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-web"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-mgr",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-mgr"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-worker",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
|
||
"kind": "Job",
|
||
"name": "hwlab-agent-worker-template"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-gateway"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-gateway-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
|
||
"kind": "StatefulSet",
|
||
"name": "hwlab-gateway-simu"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-box-simu",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
|
||
"kind": "StatefulSet",
|
||
"name": "hwlab-box-simu"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-patch-panel",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-patch-panel"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-router",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-router"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-tunnel-client",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-tunnel-client"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-edge-proxy",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-edge-proxy"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-cli",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
|
||
"kind": "Job",
|
||
"name": "hwlab-cli-template"
|
||
},
|
||
{
|
||
"serviceId": "hwlab-agent-skills",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-skills"
|
||
}
|
||
],
|
||
"runtimeIdentityEnv": [
|
||
{
|
||
"serviceId": "hwlab-cloud-web",
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-web",
|
||
"container": "hwlab-cloud-web",
|
||
"expected": {
|
||
"HWLAB_COMMIT_ID": "e6d4bd5",
|
||
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"HWLAB_IMAGE_TAG": "e6d4bd5"
|
||
},
|
||
"status": "match",
|
||
"matchesDesired": true,
|
||
"fields": [
|
||
{
|
||
"name": "HWLAB_COMMIT_ID",
|
||
"expected": "e6d4bd5",
|
||
"actual": "e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE",
|
||
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
|
||
"status": "match"
|
||
},
|
||
{
|
||
"name": "HWLAB_IMAGE_TAG",
|
||
"expected": "e6d4bd5",
|
||
"actual": "e6d4bd5",
|
||
"status": "match"
|
||
}
|
||
],
|
||
"drift": []
|
||
}
|
||
]
|
||
},
|
||
"clusterObservation": {
|
||
"status": "pass",
|
||
"executor": "/usr/local/bin/kubectl",
|
||
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
|
||
"kubeconfigSource": "flag:--kubeconfig",
|
||
"commandPrefix": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl",
|
||
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl get pods,services,configmaps,deployments,jobs -n hwlab-dev -o json",
|
||
"version": "clientVersion:\n buildDate: \"2026-05-12T09:54:35Z\"\n compiler: gc\n gitCommit: 756939600b9a7180fc2df6550a4585b638875e67\n gitTreeState: clean\n gitVersion: v1.36.1\n goVersion: go1.26.2\n major: \"1\"\n minor: \"36\"\n platform: linux/amd64\nkustomizeVersion: v5.8.1",
|
||
"resources": [
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-agent-mgr-99d44c747-mfqzj",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-agent-skills-7f99b49598-lqjdd",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-box-simu-0",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-box-simu-1",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-cloud-api-57cfcfc587-kdvg9",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-cloud-web-67c684947b-lkvtj",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-edge-proxy-85db66bcc9-mv8pv",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-frpc-59f57d479c-tgjhl",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-gateway-simu-0",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-gateway-simu-1",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-patch-panel-7cd9d9d597-kwnm6",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-router-65dc5579fb-d2r8l",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-runtime-migrate-35e3d897-kfr4m",
|
||
"phase": "Succeeded"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-runtime-provision-35e3d897-jk2rc",
|
||
"phase": "Succeeded"
|
||
},
|
||
{
|
||
"kind": "Pod",
|
||
"name": "hwlab-tunnel-client-54d968477d-mf2qk",
|
||
"phase": "Running"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-agent-mgr"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-agent-skills"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-box-simu"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-box-simu-1"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-box-simu-2"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-cli"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-cloud-api"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-cloud-web"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-edge-proxy"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-gateway"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-gateway-simu"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-gateway-simu-1"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-gateway-simu-2"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-patch-panel"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-router"
|
||
},
|
||
{
|
||
"kind": "Service",
|
||
"name": "hwlab-tunnel-client"
|
||
},
|
||
{
|
||
"kind": "ConfigMap",
|
||
"name": "hwlab-dev-health-contract"
|
||
},
|
||
{
|
||
"kind": "ConfigMap",
|
||
"name": "hwlab-frpc-config"
|
||
},
|
||
{
|
||
"kind": "ConfigMap",
|
||
"name": "kube-root-ca.crt"
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-mgr",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-agent-skills",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-api",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-cloud-web",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-edge-proxy",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-frpc",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-gateway"
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-patch-panel",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-router",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Deployment",
|
||
"name": "hwlab-tunnel-client",
|
||
"readyReplicas": 1,
|
||
"replicas": 1
|
||
},
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-agent-worker-template"
|
||
},
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-cli-template"
|
||
},
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-runtime-migrate-35e3d897"
|
||
},
|
||
{
|
||
"kind": "Job",
|
||
"name": "hwlab-runtime-provision-35e3d897"
|
||
}
|
||
]
|
||
},
|
||
"liveProbe": {
|
||
"status": "pass",
|
||
"url": "http://74.48.78.17:16667/health/live",
|
||
"httpStatus": 200,
|
||
"body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"degraded\",\"ready\":false,\"revision\":\"b02ac5becad13aeeab0d5cb7d8f01300bccb78c2\",\"readiness\":{\"contractVersion\":\"v3\",\"ready\":false,\"status\":\"degraded\",\"blockerCodes\":[\"stdio_protocol_not_wired\"],\"blockers\":[{\"code\":\"stdio_protocol_not_wired\",\"type\":\"agent_blocker\",\"scope\":\"code-agent-long-lived-session\",\"status\":\"open\",\"sourceIssue\":\"pikasTech/HWLAB#275\",\"summary\":\"普通聊天可走 OpenAI Responses fallback,pwd/skills 走受控只读 runner,M3 IO 走 Skill CLI"
|
||
}
|
||
},
|
||
"blockers": [],
|
||
"notes": "DEV-only result. No PROD resources, secret values, force push, heavy e2e, browser e2e, or UniDesk runtime substitute were used."
|
||
},
|
||
"stdoutTail": null,
|
||
"stderrTail": "",
|
||
"reportPath": "reports/dev-gate/dev-deploy-report.json"
|
||
},
|
||
{
|
||
"id": "runtime-durable-postflight",
|
||
"phase": "verifying",
|
||
"status": "blocked",
|
||
"command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-runtime-postflight.mjs --live --confirm-dev --confirmed-non-production --target api --write-report --fail-on-blocked",
|
||
"code": 1,
|
||
"startedAt": "2026-05-23T21:48:14.217Z",
|
||
"finishedAt": "2026-05-23T21:48:18.238Z",
|
||
"stdoutJson": {
|
||
"issue": "pikasTech/HWLAB#311",
|
||
"mode": "dev-live",
|
||
"generatedAt": "2026-05-23T21:48:14.250Z",
|
||
"target": {
|
||
"environment": "dev",
|
||
"namespace": "hwlab-dev",
|
||
"prodAllowed": false,
|
||
"apiHealthUrl": "http://74.48.78.17:16667/health/live",
|
||
"apiV1Url": "http://74.48.78.17:16667/v1",
|
||
"m3Target": "api"
|
||
},
|
||
"actions": {
|
||
"healthLiveReadAttempted": true,
|
||
"v1ReadAttempted": true,
|
||
"m3MutationAttempted": true,
|
||
"m3MutationAllowed": true
|
||
},
|
||
"apiHealth": {
|
||
"check": "GET /health/live",
|
||
"httpStatus": 200,
|
||
"reachable": true,
|
||
"serviceId": "hwlab-cloud-api",
|
||
"environment": "dev",
|
||
"status": "degraded",
|
||
"ready": false,
|
||
"runtime": {
|
||
"adapter": "postgres",
|
||
"durable": true,
|
||
"durableRequested": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"liveRuntimeEvidence": true,
|
||
"requiredEvidence": "runtime_adapter_schema_migration_read_query",
|
||
"blockedLayer": null,
|
||
"gates": {
|
||
"ssl": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"auth": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"durability": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
}
|
||
}
|
||
},
|
||
"runtimeDurableReadiness": {
|
||
"status": "ready",
|
||
"ready": true,
|
||
"classification": "runtime_durable_ready",
|
||
"reasonCode": "runtime_durable_ready",
|
||
"reason": "runtime durable ready; adapter=postgres; queryResult=durable_readiness_ready",
|
||
"impact": "M3 durable postflight may run because runtime persistence readiness is green.",
|
||
"safeNextAction": "Continue with repo-owned DEV CD postflight; do not read or print Secret values.",
|
||
"retryable": true,
|
||
"readonly": false,
|
||
"evidence": {
|
||
"adapter": "postgres",
|
||
"durable": true,
|
||
"runtimeReady": true,
|
||
"durabilityReady": true,
|
||
"liveRuntimeEvidence": true,
|
||
"blocker": null,
|
||
"blockedLayer": null,
|
||
"queryResult": "durable_readiness_ready",
|
||
"readyQueryResult": true,
|
||
"rawStatus": "degraded",
|
||
"postgresRequired": true,
|
||
"gates": {
|
||
"ssl": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"auth": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"durability": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
}
|
||
},
|
||
"secretMaterialRead": false
|
||
}
|
||
},
|
||
"db": {
|
||
"ready": true,
|
||
"connected": true,
|
||
"liveDbEvidence": true,
|
||
"endpointSource": "secret-url-host",
|
||
"connectionResult": "connected",
|
||
"endpointRedacted": true,
|
||
"valueRedacted": true,
|
||
"runtimeReadiness": {
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"queryResult": "durable_readiness_ready",
|
||
"requiredEvidence": "runtime_adapter_schema_migration_read_query"
|
||
}
|
||
},
|
||
"readiness": {
|
||
"ready": false,
|
||
"status": "degraded",
|
||
"durabilityReady": true,
|
||
"durabilityBlockedLayer": null
|
||
},
|
||
"blockerCodes": [
|
||
"stdio_protocol_not_wired"
|
||
],
|
||
"m3IoControl": null,
|
||
"error": null
|
||
},
|
||
"apiV1": {
|
||
"check": "GET /v1",
|
||
"httpStatus": 200,
|
||
"reachable": true,
|
||
"serviceId": "hwlab-cloud-api",
|
||
"environment": null,
|
||
"status": "degraded",
|
||
"ready": false,
|
||
"runtime": {
|
||
"adapter": "postgres",
|
||
"durable": true,
|
||
"durableRequested": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"liveRuntimeEvidence": true,
|
||
"requiredEvidence": "runtime_adapter_schema_migration_read_query",
|
||
"blockedLayer": null,
|
||
"gates": {
|
||
"ssl": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"auth": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"durability": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
}
|
||
}
|
||
},
|
||
"runtimeDurableReadiness": {
|
||
"status": "ready",
|
||
"ready": true,
|
||
"classification": "runtime_durable_ready",
|
||
"reasonCode": "runtime_durable_ready",
|
||
"reason": "runtime durable ready; adapter=postgres; queryResult=durable_readiness_ready",
|
||
"impact": "M3 durable postflight may run because runtime persistence readiness is green.",
|
||
"safeNextAction": "Continue with repo-owned DEV CD postflight; do not read or print Secret values.",
|
||
"retryable": true,
|
||
"readonly": false,
|
||
"evidence": {
|
||
"adapter": "postgres",
|
||
"durable": true,
|
||
"runtimeReady": true,
|
||
"durabilityReady": true,
|
||
"liveRuntimeEvidence": true,
|
||
"blocker": null,
|
||
"blockedLayer": null,
|
||
"queryResult": "durable_readiness_ready",
|
||
"readyQueryResult": true,
|
||
"rawStatus": "degraded",
|
||
"postgresRequired": true,
|
||
"gates": {
|
||
"ssl": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"auth": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"schema": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"migration": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
},
|
||
"durability": {
|
||
"checked": true,
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null
|
||
}
|
||
},
|
||
"secretMaterialRead": false
|
||
}
|
||
},
|
||
"db": {
|
||
"ready": true,
|
||
"connected": true,
|
||
"liveDbEvidence": true,
|
||
"endpointSource": "secret-url-host",
|
||
"connectionResult": "connected",
|
||
"endpointRedacted": true,
|
||
"valueRedacted": true,
|
||
"runtimeReadiness": {
|
||
"ready": true,
|
||
"status": "ready",
|
||
"blocker": null,
|
||
"queryResult": "durable_readiness_ready",
|
||
"requiredEvidence": "runtime_adapter_schema_migration_read_query"
|
||
}
|
||
},
|
||
"readiness": {
|
||
"ready": false,
|
||
"status": "degraded",
|
||
"durabilityReady": true,
|
||
"durabilityBlockedLayer": null
|
||
},
|
||
"blockerCodes": [
|
||
"stdio_protocol_not_wired"
|
||
],
|
||
"m3IoControl": {
|
||
"route": "/v1/m3/io",
|
||
"status": "available",
|
||
"enabled": true,
|
||
"contractVersion": "m3-io-control-v1",
|
||
"directFrontendGatewayOrBoxAccess": false,
|
||
"genericHardwareRpcExposedToFrontend": false
|
||
},
|
||
"error": null
|
||
},
|
||
"m3": {
|
||
"mode": "dev-live",
|
||
"status": "blocked",
|
||
"classification": "source_contract_failed",
|
||
"trustedGreen": false,
|
||
"result": "SOURCE/static contract failed.",
|
||
"operationCount": 4,
|
||
"persisted": true,
|
||
"persistenceContract": {
|
||
"contractVersion": "m3-do1-true-false-persisted-v1",
|
||
"requiredRoute": "res_boxsimu_1:DO1 -> hwlab-patch-panel -> res_boxsimu_2:DI1",
|
||
"requiredValues": [
|
||
true,
|
||
true,
|
||
false,
|
||
false
|
||
],
|
||
"ready": true,
|
||
"sequence": [
|
||
{
|
||
"id": "write-do1-true",
|
||
"action": "do.write",
|
||
"expectedValue": true,
|
||
"observedValue": true,
|
||
"status": "succeeded",
|
||
"idsPresent": true,
|
||
"valueMatches": true,
|
||
"evidenceGreen": true,
|
||
"persisted": true
|
||
},
|
||
{
|
||
"id": "read-di1-true",
|
||
"action": "di.read",
|
||
"expectedValue": true,
|
||
"observedValue": true,
|
||
"status": "succeeded",
|
||
"idsPresent": true,
|
||
"valueMatches": true,
|
||
"evidenceGreen": true,
|
||
"persisted": true
|
||
},
|
||
{
|
||
"id": "write-do1-false",
|
||
"action": "do.write",
|
||
"expectedValue": false,
|
||
"observedValue": false,
|
||
"status": "succeeded",
|
||
"idsPresent": true,
|
||
"valueMatches": true,
|
||
"evidenceGreen": true,
|
||
"persisted": true
|
||
},
|
||
{
|
||
"id": "read-di1-false",
|
||
"action": "di.read",
|
||
"expectedValue": false,
|
||
"observedValue": false,
|
||
"status": "succeeded",
|
||
"idsPresent": true,
|
||
"valueMatches": true,
|
||
"evidenceGreen": true,
|
||
"persisted": true
|
||
}
|
||
]
|
||
},
|
||
"operations": [
|
||
{
|
||
"id": "write-do1-true",
|
||
"action": "do.write",
|
||
"status": "succeeded",
|
||
"operationId": "op_m3_do_write_04f30c71-8cfd-46f9-8d91-aa506ae20f0b",
|
||
"traceId": "trc_m3_io_e2e_write_do1_true_338f3beb-810b-447b-9612-071ba131fe16",
|
||
"auditId": "aud_m3_do_write_04f30c71-8cfd-46f9-8d91-aa506ae20f0b_succeeded",
|
||
"evidenceId": "evd_m3_do_write_04f30c71-8cfd-46f9-8d91-aa506ae20f0b_succeeded",
|
||
"resultValue": true,
|
||
"evidenceState": {
|
||
"status": "green",
|
||
"durable": true,
|
||
"sourceKind": "DEV-LIVE",
|
||
"writeStatus": "persisted"
|
||
},
|
||
"blocker": null
|
||
},
|
||
{
|
||
"id": "read-di1-true",
|
||
"action": "di.read",
|
||
"status": "succeeded",
|
||
"operationId": "op_m3_di_read_a40696ff-1581-4789-a1ad-7778bb4b2da7",
|
||
"traceId": "trc_m3_io_e2e_read_di1_true_e4587f6a-2ab4-492f-a924-f160c9cfdc2d",
|
||
"auditId": "aud_m3_di_read_a40696ff-1581-4789-a1ad-7778bb4b2da7_succeeded",
|
||
"evidenceId": "evd_m3_di_read_a40696ff-1581-4789-a1ad-7778bb4b2da7_succeeded",
|
||
"resultValue": true,
|
||
"evidenceState": {
|
||
"status": "green",
|
||
"durable": true,
|
||
"sourceKind": "DEV-LIVE",
|
||
"writeStatus": "persisted"
|
||
},
|
||
"blocker": null
|
||
},
|
||
{
|
||
"id": "write-do1-false",
|
||
"action": "do.write",
|
||
"status": "succeeded",
|
||
"operationId": "op_m3_do_write_eb8b7b21-c8c5-45f4-8c08-a1e87b62b2aa",
|
||
"traceId": "trc_m3_io_e2e_write_do1_false_e5f378b1-38d0-4307-8aef-dc94b633b0e8",
|
||
"auditId": "aud_m3_do_write_eb8b7b21-c8c5-45f4-8c08-a1e87b62b2aa_succeeded",
|
||
"evidenceId": "evd_m3_do_write_eb8b7b21-c8c5-45f4-8c08-a1e87b62b2aa_succeeded",
|
||
"resultValue": false,
|
||
"evidenceState": {
|
||
"status": "green",
|
||
"durable": true,
|
||
"sourceKind": "DEV-LIVE",
|
||
"writeStatus": "persisted"
|
||
},
|
||
"blocker": null
|
||
},
|
||
{
|
||
"id": "read-di1-false",
|
||
"action": "di.read",
|
||
"status": "succeeded",
|
||
"operationId": "op_m3_di_read_c92ea3cf-c3e0-4a0f-80e8-cf719d215aae",
|
||
"traceId": "trc_m3_io_e2e_read_di1_false_c06468ba-3ae4-4436-a4a4-64b0e6754dfa",
|
||
"auditId": "aud_m3_di_read_c92ea3cf-c3e0-4a0f-80e8-cf719d215aae_succeeded",
|
||
"evidenceId": "evd_m3_di_read_c92ea3cf-c3e0-4a0f-80e8-cf719d215aae_succeeded",
|
||
"resultValue": false,
|
||
"evidenceState": {
|
||
"status": "green",
|
||
"durable": true,
|
||
"sourceKind": "DEV-LIVE",
|
||
"writeStatus": "persisted"
|
||
},
|
||
"blocker": null
|
||
}
|
||
]
|
||
},
|
||
"blockers": [
|
||
{
|
||
"type": "runtime_blocker",
|
||
"scope": "m3-durable-postflight",
|
||
"status": "open",
|
||
"reason": "M3 true/false durable postflight did not produce trusted green persisted evidence.",
|
||
"impact": "M3 durable readiness cannot be accepted because trusted evidence is not green.",
|
||
"safeNextAction": "Fix the M3 control path or trusted-record persistence and rerun DEV runtime postflight.",
|
||
"retryable": true,
|
||
"summary": "M3 true/false durable postflight did not produce trusted green persisted evidence. Impact: M3 durable readiness cannot be accepted because trusted evidence is not green. Safe next action: Fix the M3 control path or trusted-record persistence and rerun DEV runtime postflight.",
|
||
"sourceIssue": "pikasTech/HWLAB#311",
|
||
"evidence": {
|
||
"classification": "source_contract_failed",
|
||
"trustedGreen": false,
|
||
"operationCount": 4
|
||
}
|
||
}
|
||
],
|
||
"safety": {
|
||
"devOnly": true,
|
||
"environment": "dev",
|
||
"prodAllowed": false,
|
||
"liveHttpReads": true,
|
||
"liveM3Writes": true,
|
||
"liveM3WritesRequireDurableRuntimeReady": true,
|
||
"readsKubernetesSecrets": false,
|
||
"writesKubernetesSecrets": false,
|
||
"secretValuesPrinted": false,
|
||
"dbUrlValueRedacted": true,
|
||
"endpointRedacted": true
|
||
},
|
||
"safetyRefusal": false,
|
||
"conclusion": {
|
||
"status": "blocked",
|
||
"summary": "DEV runtime postflight is blocked; M3 is skipped unless durable runtime readiness is proven first.",
|
||
"blockerCount": 1
|
||
}
|
||
},
|
||
"stdoutTail": null,
|
||
"stderrTail": "",
|
||
"reportPath": "reports/dev-gate/dev-runtime-postflight-report.json"
|
||
}
|
||
],
|
||
"liveBefore": {
|
||
"status": "pass",
|
||
"expectedCommit": null,
|
||
"endpoints": [
|
||
{
|
||
"id": "cloud-web-16666",
|
||
"url": "http://74.48.78.17:16666/health/live",
|
||
"status": "pass",
|
||
"httpStatus": 200,
|
||
"reachable": true,
|
||
"identityMatches": true,
|
||
"startedAt": "2026-05-23T21:37:53.244Z",
|
||
"finishedAt": "2026-05-23T21:37:53.799Z",
|
||
"expectedServiceId": "hwlab-cloud-web",
|
||
"expectedCommit": null,
|
||
"serviceId": "hwlab-cloud-web",
|
||
"environment": "dev",
|
||
"applicationStatus": "ok",
|
||
"ready": null,
|
||
"observedCommit": "b02ac5b",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
|
||
"imageTag": "b02ac5b",
|
||
"observedAt": null,
|
||
"serviceMatches": true,
|
||
"environmentMatches": true,
|
||
"commitMatches": null,
|
||
"blockerCodes": []
|
||
},
|
||
{
|
||
"id": "cloud-api-16667",
|
||
"url": "http://74.48.78.17:16667/health/live",
|
||
"status": "pass",
|
||
"httpStatus": 200,
|
||
"reachable": true,
|
||
"identityMatches": true,
|
||
"startedAt": "2026-05-23T21:37:53.246Z",
|
||
"finishedAt": "2026-05-23T21:37:54.477Z",
|
||
"expectedServiceId": "hwlab-cloud-api",
|
||
"expectedCommit": null,
|
||
"serviceId": "hwlab-cloud-api",
|
||
"environment": "dev",
|
||
"applicationStatus": "degraded",
|
||
"ready": false,
|
||
"observedCommit": "b02ac5b",
|
||
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:b02ac5b",
|
||
"imageTag": "b02ac5b",
|
||
"observedAt": "2026-05-23T21:37:53.704Z",
|
||
"serviceMatches": true,
|
||
"environmentMatches": true,
|
||
"commitMatches": null,
|
||
"blockerCodes": [
|
||
"stdio_protocol_not_wired"
|
||
]
|
||
}
|
||
],
|
||
"summary": {
|
||
"checked": 2,
|
||
"reachable": 2,
|
||
"identityMatches": 2,
|
||
"commitMatches": null,
|
||
"ports": [
|
||
16666,
|
||
16667
|
||
]
|
||
}
|
||
},
|
||
"liveVerify": {
|
||
"status": "not_run",
|
||
"reason": "transaction blocked before live verify",
|
||
"endpoints": [],
|
||
"summary": {
|
||
"checked": 0
|
||
}
|
||
},
|
||
"preflight": {
|
||
"status": "pass",
|
||
"scope": "pre-lock-pre-side-effect",
|
||
"generatedAt": "2026-05-23T21:37:52.937Z",
|
||
"namespace": "hwlab-dev",
|
||
"kubeconfig": {
|
||
"required": "/etc/rancher/k3s/k3s.yaml",
|
||
"selected": "/etc/rancher/k3s/k3s.yaml",
|
||
"source": "flag:--kubeconfig",
|
||
"enforcedEnv": true
|
||
},
|
||
"kubectl": {
|
||
"executor": "/usr/local/bin/kubectl",
|
||
"commandPrefix": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl"
|
||
},
|
||
"controlPlane": {
|
||
"forced": {
|
||
"label": "forced-d601-k3s",
|
||
"contextCommand": {
|
||
"command": "kubectl config current-context",
|
||
"code": 0,
|
||
"ok": true,
|
||
"summary": "in-cluster"
|
||
},
|
||
"serverCommand": {
|
||
"command": "kubectl config view --minify -o jsonpath={.clusters[0].cluster.server}",
|
||
"code": 0,
|
||
"ok": true,
|
||
"summary": "https://10.43.0.1:443"
|
||
},
|
||
"nodesCommand": {
|
||
"command": "kubectl get nodes -o jsonpath={.items[*].metadata.name}",
|
||
"code": 0,
|
||
"ok": true,
|
||
"summary": "d601"
|
||
},
|
||
"contextName": "in-cluster",
|
||
"serverUrl": "https://10.43.0.1:443",
|
||
"nodeNames": [
|
||
"d601"
|
||
],
|
||
"status": "observed"
|
||
},
|
||
"bare": {
|
||
"label": "bare-kubectl",
|
||
"contextCommand": {
|
||
"command": "kubectl config current-context",
|
||
"code": 1,
|
||
"ok": false,
|
||
"summary": "error: current-context is not set"
|
||
},
|
||
"serverCommand": {
|
||
"command": "kubectl config view --minify -o jsonpath={.clusters[0].cluster.server}",
|
||
"code": 1,
|
||
"ok": false,
|
||
"summary": "error: current-context must exist in order to minify"
|
||
},
|
||
"nodesCommand": {
|
||
"command": "kubectl get nodes -o jsonpath={.items[*].metadata.name}",
|
||
"code": 0,
|
||
"ok": true,
|
||
"summary": "d601"
|
||
},
|
||
"contextName": null,
|
||
"serverUrl": null,
|
||
"nodeNames": [
|
||
"d601"
|
||
],
|
||
"status": "unavailable",
|
||
"namespace": {
|
||
"command": "kubectl get namespace hwlab-dev -o name",
|
||
"code": 0,
|
||
"ok": true,
|
||
"summary": "namespace/hwlab-dev"
|
||
},
|
||
"hwlabDevNamespaceObserved": true,
|
||
"secondControlPlaneCandidate": null
|
||
}
|
||
},
|
||
"secretRefs": [
|
||
{
|
||
"secretName": "hwlab-cloud-api-dev-db",
|
||
"secretKey": "database-url",
|
||
"status": "present",
|
||
"exists": true,
|
||
"keyPresent": true,
|
||
"keysObserved": [
|
||
"database-url"
|
||
],
|
||
"existenceCommand": "kubectl -n hwlab-dev get secret hwlab-cloud-api-dev-db -o name",
|
||
"keyCommand": "kubectl -n hwlab-dev describe secret hwlab-cloud-api-dev-db",
|
||
"secretValueRead": false,
|
||
"secretValuePrinted": false
|
||
},
|
||
{
|
||
"secretName": "hwlab-cloud-api-dev-db-admin",
|
||
"secretKey": "admin-url",
|
||
"status": "present",
|
||
"exists": true,
|
||
"keyPresent": true,
|
||
"keysObserved": [
|
||
"admin-url"
|
||
],
|
||
"existenceCommand": "kubectl -n hwlab-dev get secret hwlab-cloud-api-dev-db-admin -o name",
|
||
"keyCommand": "kubectl -n hwlab-dev describe secret hwlab-cloud-api-dev-db-admin",
|
||
"secretValueRead": false,
|
||
"secretValuePrinted": false
|
||
},
|
||
{
|
||
"secretName": "hwlab-code-agent-provider",
|
||
"secretKey": "openai-api-key",
|
||
"status": "present",
|
||
"exists": true,
|
||
"keyPresent": true,
|
||
"keysObserved": [
|
||
"openai-api-key"
|
||
],
|
||
"existenceCommand": "kubectl -n hwlab-dev get secret hwlab-code-agent-provider -o name",
|
||
"keyCommand": "kubectl -n hwlab-dev describe secret hwlab-code-agent-provider",
|
||
"secretValueRead": false,
|
||
"secretValuePrinted": false
|
||
}
|
||
],
|
||
"safety": {
|
||
"writeSideEffectsAttempted": false,
|
||
"prodTouched": false,
|
||
"secretValuesRead": false,
|
||
"secretValuesPrinted": false,
|
||
"secretKeyNamesOnly": true
|
||
},
|
||
"blockers": []
|
||
},
|
||
"reportPaths": {
|
||
"transaction": "reports/dev-gate/dev-cd-apply.json",
|
||
"artifacts": "reports/dev-gate/dev-artifacts.json",
|
||
"deployApply": "reports/dev-gate/dev-deploy-report.json",
|
||
"runtimeProvisioning": "reports/dev-gate/dev-runtime-provisioning-report.json",
|
||
"runtimeMigration": "reports/dev-gate/dev-runtime-migration-report.json",
|
||
"runtimePostflight": "reports/dev-gate/dev-runtime-postflight-report.json"
|
||
},
|
||
"safety": {
|
||
"prodTouched": false,
|
||
"secretValuesRead": false,
|
||
"secretValuesPrinted": false,
|
||
"manualDbWrite": false,
|
||
"oldPublicPortsUsed": false,
|
||
"mutationAttempted": true,
|
||
"singleLock": "Lease/hwlab-dev/hwlab-dev-cd-lock"
|
||
}
|
||
},
|
||
"blockers": [
|
||
{
|
||
"type": "runtime_blocker",
|
||
"scope": "runtime-durable-postflight",
|
||
"status": "open",
|
||
"reason": "M3 true/false durable postflight did not produce trusted green persisted evidence.",
|
||
"impact": "M3 durable readiness cannot be accepted because trusted evidence is not green.",
|
||
"safeNextAction": "Fix the M3 control path or trusted-record persistence and rerun DEV runtime postflight.",
|
||
"retryable": true,
|
||
"summary": "M3 true/false durable postflight did not produce trusted green persisted evidence. Impact: M3 durable readiness cannot be accepted because trusted evidence is not green. Safe next action: Fix the M3 control path or trusted-record persistence and rerun DEV runtime postflight.",
|
||
"evidence": {
|
||
"command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-runtime-postflight.mjs --live --confirm-dev --confirmed-non-production --target api --write-report --fail-on-blocked",
|
||
"code": 1,
|
||
"reportPath": "reports/dev-gate/dev-runtime-postflight-report.json",
|
||
"blockerScope": "m3-durable-postflight",
|
||
"k8sJob": null
|
||
}
|
||
}
|
||
],
|
||
"notes": "DEV-only CD transaction evidence. This does not claim M3 PASS or runtime durability."
|
||
}
|