From c59aff164d4d80d05f1696402c652e3bc03efe53 Mon Sep 17 00:00:00 2001 From: Lyon <88232613+pikasTech@users.noreply.github.com> Date: Sat, 23 May 2026 17:47:22 +0800 Subject: [PATCH] chore: record DEV CD promotion for 63acb59 Records DEV desired-state and reports for the successful 63acb59 DEV CD promotion. Validated artifact catalog, dev-gate reports, desired-state convergence, and live 16666/16667 health. --- deploy/artifact-catalog.dev.json | 106 +- deploy/deploy.json | 42 +- deploy/k8s/base/workloads.yaml | 40 +- reports/dev-gate/dev-artifacts.json | 550 +- reports/dev-gate/dev-cd-apply.json | 6114 +++++++++++++++++++++++ reports/dev-gate/dev-deploy-report.json | 400 +- 6 files changed, 6709 insertions(+), 543 deletions(-) create mode 100644 reports/dev-gate/dev-cd-apply.json diff --git a/deploy/artifact-catalog.dev.json b/deploy/artifact-catalog.dev.json index 65a552dc..5637e689 100644 --- a/deploy/artifact-catalog.dev.json +++ b/deploy/artifact-catalog.dev.json @@ -5,7 +5,7 @@ "profile": "dev", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", - "commitId": "6963ed2", + "commitId": "63acb59", "artifactState": "published", "publish": { "ciPublished": true, @@ -66,10 +66,10 @@ "services": [ { "serviceId": "hwlab-cloud-api", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -82,10 +82,10 @@ }, { "serviceId": "hwlab-cloud-web", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:3c3a4ef374bf843ad1c170696c5a122fdbf35a872a17c086ed06ffd50c5a0e06", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -98,10 +98,10 @@ }, { "serviceId": "hwlab-agent-mgr", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -114,10 +114,10 @@ }, { "serviceId": "hwlab-agent-worker", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:8131839bd8f08fc654bf96ba7c713ba917e198ebab04cf051b9e384392eb95e9", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -130,10 +130,10 @@ }, { "serviceId": "hwlab-gateway", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:808d609ef4873b64faf5eeb13f8eb6bf280bcd9f799d90f00bab44c2c7ad3fd8", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -146,10 +146,10 @@ }, { "serviceId": "hwlab-gateway-simu", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -162,10 +162,10 @@ }, { "serviceId": "hwlab-box-simu", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -178,10 +178,10 @@ }, { "serviceId": "hwlab-patch-panel", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -194,10 +194,10 @@ }, { "serviceId": "hwlab-router", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -210,10 +210,10 @@ }, { "serviceId": "hwlab-tunnel-client", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -226,10 +226,10 @@ }, { "serviceId": "hwlab-edge-proxy", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -242,10 +242,10 @@ }, { "serviceId": "hwlab-cli", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:7e5ac811644c83237542c95f4a6302d607a070a4b4f9f247191ce529577ead99", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", @@ -258,10 +258,10 @@ }, { "serviceId": "hwlab-agent-skills", - "commitId": "6963ed2", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:6881f9d417b91705cca9d134f2df85da3a3ec2af393882f0f24ea113a20d6efd", + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "publishState": "published", "profile": "dev", "namespace": "hwlab-dev", diff --git a/deploy/deploy.json b/deploy/deploy.json index 6eb9cd64..dceba2ca 100644 --- a/deploy/deploy.json +++ b/deploy/deploy.json @@ -1,7 +1,7 @@ { "manifestVersion": "v1", "environment": "dev", - "commitId": "6963ed2", + "commitId": "63acb59", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "health": { @@ -181,7 +181,7 @@ "services": [ { "serviceId": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -189,9 +189,9 @@ "env": { "HWLAB_ENVIRONMENT": "dev", "HWLAB_PUBLIC_ENDPOINT": "http://74.48.78.17:16667", - "HWLAB_COMMIT_ID": "6963ed2", - "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", - "HWLAB_IMAGE_TAG": "6963ed2", + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "HWLAB_IMAGE_TAG": "63acb59", "HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN": "unidesk-backend,provider-gateway,microservice-proxy", "HWLAB_CLOUD_DB_URL": "secretRef:hwlab-cloud-api-dev-db/database-url", "HWLAB_CLOUD_DB_SSL_MODE": "disable", @@ -210,7 +210,7 @@ }, { "serviceId": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -218,14 +218,14 @@ "env": { "HWLAB_ENVIRONMENT": "dev", "HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667", - "HWLAB_COMMIT_ID": "6963ed2", - "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", - "HWLAB_IMAGE_TAG": "6963ed2" + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" } }, { "serviceId": "hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -237,7 +237,7 @@ }, { "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -249,7 +249,7 @@ }, { "serviceId": "hwlab-gateway", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -261,7 +261,7 @@ }, { "serviceId": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -281,7 +281,7 @@ }, { "serviceId": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -300,7 +300,7 @@ }, { "serviceId": "hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -321,7 +321,7 @@ }, { "serviceId": "hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -333,7 +333,7 @@ }, { "serviceId": "hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -347,7 +347,7 @@ }, { "serviceId": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -359,7 +359,7 @@ }, { "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", @@ -370,13 +370,13 @@ }, { "serviceId": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { - "HWLAB_SKILLS_COMMIT_ID": "6963ed2" + "HWLAB_SKILLS_COMMIT_ID": "63acb59" } } ], diff --git a/deploy/k8s/base/workloads.yaml b/deploy/k8s/base/workloads.yaml index 1031d957..36daf9eb 100644 --- a/deploy/k8s/base/workloads.yaml +++ b/deploy/k8s/base/workloads.yaml @@ -31,7 +31,7 @@ "containers": [ { "name": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "ports": [ { "name": "http", @@ -49,15 +49,15 @@ }, { "name": "HWLAB_COMMIT_ID", - "value": "6963ed2" + "value": "63acb59" }, { "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2" + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59" }, { "name": "HWLAB_IMAGE_TAG", - "value": "6963ed2" + "value": "63acb59" }, { "name": "HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN", @@ -175,7 +175,7 @@ "containers": [ { "name": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "ports": [ { "name": "http", @@ -189,15 +189,15 @@ }, { "name": "HWLAB_COMMIT_ID", - "value": "6963ed2" + "value": "63acb59" }, { "name": "HWLAB_IMAGE", - "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2" + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59" }, { "name": "HWLAB_IMAGE_TAG", - "value": "6963ed2" + "value": "63acb59" } ], "readinessProbe": { @@ -247,7 +247,7 @@ "containers": [ { "name": "hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "ports": [ { "name": "http", @@ -303,7 +303,7 @@ "containers": [ { "name": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "env": [ { "name": "HWLAB_AGENT_SESSION_MODE", @@ -346,7 +346,7 @@ "containers": [ { "name": "hwlab-gateway", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "ports": [ { "name": "http", @@ -407,7 +407,7 @@ "containers": [ { "name": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "ports": [ { "name": "http", @@ -480,7 +480,7 @@ "containers": [ { "name": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "ports": [ { "name": "http", @@ -548,7 +548,7 @@ "containers": [ { "name": "hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "ports": [ { "name": "http", @@ -612,7 +612,7 @@ "containers": [ { "name": "hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "ports": [ { "name": "http", @@ -672,7 +672,7 @@ "containers": [ { "name": "hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "ports": [ { "name": "http", @@ -744,7 +744,7 @@ "containers": [ { "name": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "ports": [ { "name": "http", @@ -805,7 +805,7 @@ "containers": [ { "name": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "env": [ { "name": "HWLAB_CLI_ENDPOINT", @@ -847,7 +847,7 @@ "containers": [ { "name": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "ports": [ { "name": "http", @@ -857,7 +857,7 @@ "env": [ { "name": "HWLAB_SKILLS_COMMIT_ID", - "value": "6963ed2" + "value": "63acb59" } ], "readinessProbe": { diff --git a/reports/dev-gate/dev-artifacts.json b/reports/dev-gate/dev-artifacts.json index e7a0b66c..1492f901 100644 --- a/reports/dev-gate/dev-artifacts.json +++ b/reports/dev-gate/dev-artifacts.json @@ -4,7 +4,7 @@ "reportVersion": "v1", "issue": "pikasTech/HWLAB#35", "taskId": "dev-artifact-publish", - "commitId": "6963ed2", + "commitId": "63acb59", "acceptanceLevel": "dev_artifact_publish", "devOnly": true, "prodDisabled": true, @@ -75,12 +75,12 @@ "status": "published", "mode": "publish", "repo": "pikasTech/HWLAB", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryPrefix": "127.0.0.1:5000/hwlab", "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", - "generatedAt": "2026-05-23T08:51:04.801Z", + "generatedAt": "2026-05-23T09:40:15.352Z", "classification": "degraded", "dimensions": { "processHttpAccess": { @@ -161,49 +161,79 @@ "stderr": "", "error": null }, - "podCount": 13, + "podCount": 21, "pulledImages": [ { - "pod": "hwlab-agent-mgr-7d886f475b-2jsms", + "pod": "hwlab-agent-mgr-57d8bc9f89-5kv4p", "container": "hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:7df780347df148f1303c498f35aba19d9c10f2f86899e9729afda978e7a27b2d" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80" }, { - "pod": "hwlab-agent-skills-57bbbff6f4-l8lv9", + "pod": "hwlab-agent-mgr-6c6f64bf5-zjbf7", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82" + }, + { + "pod": "hwlab-agent-skills-75b55bc498-gjjj2", "container": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:fd88f8f2d2d43d4420c5f70306f5810cb756bea9c0b206410cb7fa694cb67ce1" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cd6003a7e8694a31a5cc116a7af38c8790ef3931edb7ae596455ee4aa8ec5dc1" + }, + { + "pod": "hwlab-agent-skills-8687f446fd-lqtgt", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7" }, { "pod": "hwlab-box-simu-0", "container": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:d05966d151fb2435b138c6dc2a4f69663724a2d15d8bb1b1415f1fb38314d760" + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" }, { "pod": "hwlab-box-simu-1", "container": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:d05966d151fb2435b138c6dc2a4f69663724a2d15d8bb1b1415f1fb38314d760" + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" }, { - "pod": "hwlab-cloud-api-79f7b7c98-c29dr", + "pod": "hwlab-cloud-api-668549d448-gnct8", "container": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:a156448e6e1dd9e5ed50233325347f5d90be5b100a0fd72e622eb204815e980c" + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:08d9ec3943b6b2530af9a67cfba440460a0357fb6b0ed585cc4537c3ee36f3a9" }, { - "pod": "hwlab-cloud-web-5f8458d958-99rmw", + "pod": "hwlab-cloud-api-858f6df96d-tcrbg", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f" + }, + { + "pod": "hwlab-cloud-web-576b7bb89d-dxk6w", "container": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200" + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:58b891a", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:820804a6fe2da63d36951dcbbd8753077c923c252648b9e261eaea973908a379" }, { - "pod": "hwlab-edge-proxy-86cf7d5cdf-zfmfh", + "pod": "hwlab-cloud-web-fc896cddb-gwh58", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e" + }, + { + "pod": "hwlab-edge-proxy-5889fb8fb8-gblw8", "container": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:a48a40a071475a14694890e29074c4aafd358672dd9a4816cb43bee451c81d6e" + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b" + }, + { + "pod": "hwlab-edge-proxy-5ff8d747d-rgdjm", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314" }, { "pod": "hwlab-frpc-59f57d479c-wm5l2", @@ -214,32 +244,50 @@ { "pod": "hwlab-gateway-simu-0", "container": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:daae618cdc7fb176d7dc769956e3d5948d1abade09e35dd29daf9c86a37f8fd1" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" }, { "pod": "hwlab-gateway-simu-1", "container": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:daae618cdc7fb176d7dc769956e3d5948d1abade09e35dd29daf9c86a37f8fd1" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" }, { - "pod": "hwlab-patch-panel-599598cb6b-b5s5t", + "pod": "hwlab-patch-panel-5dd8fdf4f7-7cg4w", "container": "hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:0fd85a67451dad95936cafa98e656f01a0209236c153a6790a0f6d61716ad979" + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce" }, { - "pod": "hwlab-router-59bc75b5f7-qbw6r", + "pod": "hwlab-patch-panel-79c59cd5b7-dl4sz", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a" + }, + { + "pod": "hwlab-router-59458f576d-l2j27", "container": "hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:e3795c1de2aa0ea2d98af39a88e85f0f789b15d6f3e8fc79ec8815c87906c95f" + "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40" }, { - "pod": "hwlab-tunnel-client-7885888f9-9kwv8", + "pod": "hwlab-router-7d47d6dfc4-gzcw9", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024" + }, + { + "pod": "hwlab-tunnel-client-64779fc4bd-pz8lz", "container": "hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:1a5d0a22118b4ddcbff49d1d111e027dc17bbd813d527b5e7978d53b127abf29" + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e" + }, + { + "pod": "hwlab-tunnel-client-65ff794986-5z2s6", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707" } ], "pullFailures": [], @@ -512,13 +560,13 @@ "publishPlan": { "version": "v2", "mode": "publish", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", - "imageTag": "6963ed2", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "imageTag": "63acb59", "registryTarget": "127.0.0.1:5000/hwlab", "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", - "generatedAt": "2026-05-23T08:51:04.801Z", + "generatedAt": "2026-05-23T09:40:15.352Z", "classification": "degraded", "dimensions": { "processHttpAccess": { @@ -599,49 +647,79 @@ "stderr": "", "error": null }, - "podCount": 13, + "podCount": 21, "pulledImages": [ { - "pod": "hwlab-agent-mgr-7d886f475b-2jsms", + "pod": "hwlab-agent-mgr-57d8bc9f89-5kv4p", "container": "hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:7df780347df148f1303c498f35aba19d9c10f2f86899e9729afda978e7a27b2d" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80" }, { - "pod": "hwlab-agent-skills-57bbbff6f4-l8lv9", + "pod": "hwlab-agent-mgr-6c6f64bf5-zjbf7", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82" + }, + { + "pod": "hwlab-agent-skills-75b55bc498-gjjj2", "container": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:fd88f8f2d2d43d4420c5f70306f5810cb756bea9c0b206410cb7fa694cb67ce1" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cd6003a7e8694a31a5cc116a7af38c8790ef3931edb7ae596455ee4aa8ec5dc1" + }, + { + "pod": "hwlab-agent-skills-8687f446fd-lqtgt", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7" }, { "pod": "hwlab-box-simu-0", "container": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:d05966d151fb2435b138c6dc2a4f69663724a2d15d8bb1b1415f1fb38314d760" + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" }, { "pod": "hwlab-box-simu-1", "container": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:d05966d151fb2435b138c6dc2a4f69663724a2d15d8bb1b1415f1fb38314d760" + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" }, { - "pod": "hwlab-cloud-api-79f7b7c98-c29dr", + "pod": "hwlab-cloud-api-668549d448-gnct8", "container": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:a156448e6e1dd9e5ed50233325347f5d90be5b100a0fd72e622eb204815e980c" + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:08d9ec3943b6b2530af9a67cfba440460a0357fb6b0ed585cc4537c3ee36f3a9" }, { - "pod": "hwlab-cloud-web-5f8458d958-99rmw", + "pod": "hwlab-cloud-api-858f6df96d-tcrbg", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f" + }, + { + "pod": "hwlab-cloud-web-576b7bb89d-dxk6w", "container": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200" + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:58b891a", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:820804a6fe2da63d36951dcbbd8753077c923c252648b9e261eaea973908a379" }, { - "pod": "hwlab-edge-proxy-86cf7d5cdf-zfmfh", + "pod": "hwlab-cloud-web-fc896cddb-gwh58", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e" + }, + { + "pod": "hwlab-edge-proxy-5889fb8fb8-gblw8", "container": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:a48a40a071475a14694890e29074c4aafd358672dd9a4816cb43bee451c81d6e" + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b" + }, + { + "pod": "hwlab-edge-proxy-5ff8d747d-rgdjm", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314" }, { "pod": "hwlab-frpc-59f57d479c-wm5l2", @@ -652,32 +730,50 @@ { "pod": "hwlab-gateway-simu-0", "container": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:daae618cdc7fb176d7dc769956e3d5948d1abade09e35dd29daf9c86a37f8fd1" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" }, { "pod": "hwlab-gateway-simu-1", "container": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:daae618cdc7fb176d7dc769956e3d5948d1abade09e35dd29daf9c86a37f8fd1" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" }, { - "pod": "hwlab-patch-panel-599598cb6b-b5s5t", + "pod": "hwlab-patch-panel-5dd8fdf4f7-7cg4w", "container": "hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:0fd85a67451dad95936cafa98e656f01a0209236c153a6790a0f6d61716ad979" + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce" }, { - "pod": "hwlab-router-59bc75b5f7-qbw6r", + "pod": "hwlab-patch-panel-79c59cd5b7-dl4sz", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a" + }, + { + "pod": "hwlab-router-59458f576d-l2j27", "container": "hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:e3795c1de2aa0ea2d98af39a88e85f0f789b15d6f3e8fc79ec8815c87906c95f" + "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40" }, { - "pod": "hwlab-tunnel-client-7885888f9-9kwv8", + "pod": "hwlab-router-7d47d6dfc4-gzcw9", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024" + }, + { + "pod": "hwlab-tunnel-client-64779fc4bd-pz8lz", "container": "hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:4d2a0ba", - "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:1a5d0a22118b4ddcbff49d1d111e027dc17bbd813d527b5e7978d53b127abf29" + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e" + }, + { + "pod": "hwlab-tunnel-client-65ff794986-5z2s6", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707" } ], "pullFailures": [], @@ -699,12 +795,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -714,12 +810,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:3c3a4ef374bf843ad1c170696c5a122fdbf35a872a17c086ed06ffd50c5a0e06", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c3a4ef374bf843ad1c170696c5a122fdbf35a872a17c086ed06ffd50c5a0e06", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -729,12 +825,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -744,12 +840,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:8131839bd8f08fc654bf96ba7c713ba917e198ebab04cf051b9e384392eb95e9", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:8131839bd8f08fc654bf96ba7c713ba917e198ebab04cf051b9e384392eb95e9", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -759,12 +855,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:808d609ef4873b64faf5eeb13f8eb6bf280bcd9f799d90f00bab44c2c7ad3fd8", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:808d609ef4873b64faf5eeb13f8eb6bf280bcd9f799d90f00bab44c2c7ad3fd8", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -774,12 +870,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -789,12 +885,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -804,12 +900,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -819,12 +915,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -834,12 +930,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -849,12 +945,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -864,12 +960,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:7e5ac811644c83237542c95f4a6302d607a070a4b4f9f247191ce529577ead99", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:7e5ac811644c83237542c95f4a6302d607a070a4b4f9f247191ce529577ead99", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -879,12 +975,12 @@ "enabled": true, "required": true, "artifactScope": "required", - "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:6881f9d417b91705cca9d134f2df85da3a3ec2af393882f0f24ea113a20d6efd", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:6881f9d417b91705cca9d134f2df85da3a3ec2af393882f0f24ea113a20d6efd", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "digestStatus": "real", "status": "published", "notPublishedReason": null @@ -896,15 +992,15 @@ "disabledServiceCount": 0, "builtCount": 13, "publishedCount": 13, - "generatedAt": "2026-05-23T08:56:17.866Z", + "generatedAt": "2026-05-23T09:40:32.793Z", "services": [ { "serviceId": "hwlab-cloud-api", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -913,15 +1009,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:7ed1c1d36ac19979fce7a4491cf41e2508bdc7c98b5ec64344383d279e99b04e" + "localImageId": "sha256:d6d4a6a6820fe7c3b051ecbd6259b83f2261394af94e5d30c2f66048d79c8b4c" }, { "serviceId": "hwlab-cloud-web", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:3c3a4ef374bf843ad1c170696c5a122fdbf35a872a17c086ed06ffd50c5a0e06", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c3a4ef374bf843ad1c170696c5a122fdbf35a872a17c086ed06ffd50c5a0e06", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "runtimeKind": "cloud-web", "distFreshness": { "status": "pass", @@ -932,85 +1028,85 @@ { "kind": "runtime", "path": "index.html", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/index.html", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/index.html", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/index.html", "status": "match" }, { "kind": "runtime", "path": "styles.css", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/styles.css", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/styles.css", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/styles.css", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/styles.css", "status": "match" }, { "kind": "runtime", "path": "app.mjs", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/app.mjs", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/app.mjs", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/app.mjs", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/app.mjs", "status": "match" }, { "kind": "runtime", "path": "gate-summary.mjs", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/gate-summary.mjs", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/gate-summary.mjs", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/gate-summary.mjs", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/gate-summary.mjs", "status": "match" }, { "kind": "runtime", "path": "runtime.mjs", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/runtime.mjs", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/runtime.mjs", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/runtime.mjs", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/runtime.mjs", "status": "match" }, { "kind": "runtime", "path": "workbench-hardware-panel.mjs", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/workbench-hardware-panel.mjs", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/workbench-hardware-panel.mjs", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/workbench-hardware-panel.mjs", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/workbench-hardware-panel.mjs", "status": "match" }, { "kind": "runtime", "path": "help.md", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/help.md", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/help.md", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/help.md", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/help.md", "status": "match" }, { "kind": "runtime", "path": "third_party/marked/marked.esm.js", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/third_party/marked/marked.esm.js", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/third_party/marked/marked.esm.js", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/third_party/marked/marked.esm.js", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/third_party/marked/marked.esm.js", "status": "match" }, { "kind": "runtime", "path": "third_party/marked/LICENSE", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/third_party/marked/LICENSE", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/third_party/marked/LICENSE", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/third_party/marked/LICENSE", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/third_party/marked/LICENSE", "status": "match" }, { "kind": "alias", "path": "gate/index.html", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/index.html", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/gate/index.html", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/gate/index.html", "status": "match" }, { "kind": "alias", "path": "diagnostics/gate/index.html", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/index.html", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/diagnostics/gate/index.html", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/diagnostics/gate/index.html", "status": "match" }, { "kind": "alias", "path": "help/index.html", - "sourcePath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/index.html", - "distPath": "/home/ubuntu/workspace/hwlab-artifacts-6963ed2/web/hwlab-cloud-web/dist/help/index.html", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/help/index.html", "status": "match" } ], @@ -1023,15 +1119,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:6e618f66b2da1f59fefcf845dc10b03864498c6ef54b4b061fccc991a232f809" + "localImageId": "sha256:80340a3de814a924e9bde5431d700a3c85760c8e30596910c8b3cce3423ed659" }, { "serviceId": "hwlab-agent-mgr", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1040,15 +1136,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:499e68bd0edcb74f47f5d920ff754e45146dd61e6fa65051c6657a46f15f96c1" + "localImageId": "sha256:d079bf1bbc7600efc273f4b3a1f22ac1fedf3df8435970f3111430e0aab468ab" }, { "serviceId": "hwlab-agent-worker", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:8131839bd8f08fc654bf96ba7c713ba917e198ebab04cf051b9e384392eb95e9", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:8131839bd8f08fc654bf96ba7c713ba917e198ebab04cf051b9e384392eb95e9", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1057,15 +1153,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:d3e4e9d718ea64f716661f6e06896cbe042da569ab768195246f9496d377138e" + "localImageId": "sha256:67728e1a933ab6d01407f600bca31e9c271c57ff92b55eaac4e90e39da6a6432" }, { "serviceId": "hwlab-gateway", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:808d609ef4873b64faf5eeb13f8eb6bf280bcd9f799d90f00bab44c2c7ad3fd8", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:808d609ef4873b64faf5eeb13f8eb6bf280bcd9f799d90f00bab44c2c7ad3fd8", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1074,15 +1170,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:d5d44b9f298eb82370d68d8d9f40cc40db8d565cd88eeb2be73fc86da96e001c" + "localImageId": "sha256:374faf543165a060efe151d3ad4b5ab647d5b1763f58e7e96f9d4e1cf2e20599" }, { "serviceId": "hwlab-gateway-simu", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1091,15 +1187,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:863018710b808de2cf077e73467b2429ee693aa821b7df609c8e65197a00db58" + "localImageId": "sha256:d7835c8352cc86168a430ed77bd482d9ca16bdc0f2da0c7332561bcf11a69bc1" }, { "serviceId": "hwlab-box-simu", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1108,15 +1204,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:b75bc7d11a8ca5585f9ff7fafc9acb579d54b3b69fcebb4ae1aceeff556aff50" + "localImageId": "sha256:e9e81dd9ca356efef8b2e99ad70ad2af3217f0e8140c6eab8c2cba3fe7323759" }, { "serviceId": "hwlab-patch-panel", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1125,15 +1221,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:b422258c065694d822f6ba13d9c354ca9620c17a0fe3ed09008f2ddeceaf69c8" + "localImageId": "sha256:a2a48592b35770afd07a1a6cd8253ce528a7676fc7b90571a4cc09853003b515" }, { "serviceId": "hwlab-router", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1142,15 +1238,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:1453aa476485574fbd7fc70c799f49cf2a329d82e9c6394a5ca2d1d3eca4940c" + "localImageId": "sha256:ff7e3a1d4d3e9d9ca261cf7fe39c25a4fdd69d6488d1d48075a1a1ed583bbaa0" }, { "serviceId": "hwlab-tunnel-client", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1159,15 +1255,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:59085206297ce1083d87f78739ebc5ce17c87b2d17b3b5b4d2588b833ef4a468" + "localImageId": "sha256:577f8d230bacca4d29fd7279dc2ecf978e1c3aac8e7792db7277f2d041870997" }, { "serviceId": "hwlab-edge-proxy", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "runtimeKind": "node-command", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1176,15 +1272,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:f00cac463267fb181061ff48aadf55672f531339532aa42be26aa1957faf2038" + "localImageId": "sha256:900ffdd9477dd45c31ca75a265de9d8c1094df1d4b0466c4c0f4cabf848816d2" }, { "serviceId": "hwlab-cli", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:7e5ac811644c83237542c95f4a6302d607a070a4b4f9f247191ce529577ead99", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:7e5ac811644c83237542c95f4a6302d607a070a4b4f9f247191ce529577ead99", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "runtimeKind": "cli", "implementationState": "repo-entrypoint", "sourceState": "source-present", @@ -1193,15 +1289,15 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:f4f1d7d665d0072e3e6008b27cdc6a4ea4fbbaf3ec0f77146eeab13b0b9034d7" + "localImageId": "sha256:1f68c6d2fd51f56f0aebce5db10b8fcbb7a689bca3cd90ff6d128426a12fbf13" }, { "serviceId": "hwlab-agent-skills", "status": "published", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", - "imageTag": "6963ed2", - "digest": "sha256:6881f9d417b91705cca9d134f2df85da3a3ec2af393882f0f24ea113a20d6efd", - "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:6881f9d417b91705cca9d134f2df85da3a3ec2af393882f0f24ea113a20d6efd", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "runtimeKind": "skills-bundle", "implementationState": "repo-bundle", "sourceState": "source-present", @@ -1210,7 +1306,7 @@ "artifactRequired": true, "artifactScope": "required", "notPublishedReason": null, - "localImageId": "sha256:625af8424a2ea610c16da7e1916b90fd92c4f52c99ad8b1a7bbfe7ae733a31c5" + "localImageId": "sha256:f628a70b9bc10592908078bd627e910bc6ed01978ad9184632741f742d2f8d38" } ], "blockers": [] diff --git a/reports/dev-gate/dev-cd-apply.json b/reports/dev-gate/dev-cd-apply.json new file mode 100644 index 00000000..cab87f0e --- /dev/null +++ b/reports/dev-gate/dev-cd-apply.json @@ -0,0 +1,6114 @@ +{ + "$schema": "https://hwlab.pikastech.local/schemas/dev-cd-apply.schema.json", + "$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-cd-apply.json", + "reportVersion": "v1", + "issue": "pikasTech/HWLAB#274", + "taskId": "dev-cd-apply", + "commitId": "63acb59", + "acceptanceLevel": "dev_cd_apply", + "devOnly": true, + "prodDisabled": true, + "status": "pass", + "generatedAt": "2026-05-23T09:40:36.676Z", + "reportLifecycle": { + "version": "v1", + "state": "active", + "activeEndpoint": "http://74.48.78.17:16667", + "activeBrowserEndpoint": "http://74.48.78.17:16666", + "deprecatedEndpoint": null, + "summary": "Current DEV CD transaction report; the only DEV side-effect entrypoint is scripts/dev-cd-apply.mjs." + }, + "supports": [ + "pikasTech/HWLAB#274", + "pikasTech/HWLAB#116", + "pikasTech/HWLAB#235", + "pikasTech/HWLAB#50", + "pikasTech/HWLAB#57", + "pikasTech/HWLAB#67", + "pikasTech/HWLAB#73" + ], + "sourceContract": { + "status": "pass", + "documents": [ + "docs/reference/deployment-publish.md", + "docs/reference/dev-runtime-boundary.md", + "docs/dev-artifact-publish.md", + "docs/dev-deploy-apply.md", + "docs/artifact-catalog.md" + ], + "summary": "DEV CD publish/apply/verify side effects are serialized by one Kubernetes Lease and use deploy/deploy.json as the apply desired-state source." + }, + "validationCommands": [ + "node --check scripts/dev-cd-apply.mjs", + "node --check scripts/src/dev-cd-apply.mjs", + "node --test scripts/src/dev-cd-apply.test.mjs", + "node --check scripts/dev-artifact-publish.mjs", + "node --check scripts/src/dev-deploy-apply.mjs", + "node --test scripts/src/dev-deploy-apply.test.mjs", + "node scripts/deploy-desired-state-plan.mjs --check", + "node scripts/validate-artifact-catalog.mjs", + "git diff --check" + ], + "localSmoke": { + "status": "not_run", + "commands": [ + "npm run check" + ], + "evidence": [ + "Local checks are listed as validation commands and are not implied by a DEV CD transaction." + ], + "summary": "The transaction report records DEV publish/apply/verify evidence; local smoke is a separate gate." + }, + "dryRun": { + "status": "not_run", + "commands": [ + "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked --write-report" + ], + "evidence": [ + "The transaction path owns live side effects; dry-run remains a preflight support mode." + ], + "summary": "DEV CD mutation requires --apply and the transaction Lease lock." + }, + "devPreconditions": { + "status": "pass", + "requirements": [ + "HEAD must match the requested target ref before publish.", + "Lease/hwlab-dev-cd-lock must be acquired before publish/apply.", + "Legacy publish/apply side-effect scripts must run with HWLAB_CD_TRANSACTION_ID.", + "deploy/deploy.json, artifact catalog, and workloads must converge before apply.", + "Public 16666 and 16667 live health must be recorded in this report." + ], + "summary": "DEV CD transaction preconditions passed." + }, + "transaction": { + "transactionId": "fdb50204-3968-48f8-82ee-cd8f172b0c5a", + "ownerTaskId": "DC-DCSN-P0-2026-003", + "targetNamespace": "hwlab-dev", + "lockName": "hwlab-dev-cd-lock", + "lockBackend": "Lease", + "startedAt": "2026-05-23T09:40:07.734Z", + "finishedAt": "2026-05-23T09:40:36.676Z", + "ttlSeconds": 3600, + "phases": [ + { + "phase": "publishing", + "status": "entered", + "at": "2026-05-23T09:40:11.742Z" + }, + { + "phase": "applying", + "status": "entered", + "at": "2026-05-23T09:40:33.012Z" + }, + { + "phase": "verifying", + "status": "entered", + "at": "2026-05-23T09:40:35.398Z" + }, + { + "phase": "released", + "status": "released", + "at": "2026-05-23T09:40:36.676Z" + } + ], + "release": { + "status": "released", + "command": "kubectl -n hwlab-dev replace -f - -o json", + "lock": { + "lockBackend": "Lease", + "lockName": "hwlab-dev-cd-lock", + "resourceVersion": "1387022", + "holderIdentity": "", + "promotionCommit": "63acb59", + "deployJsonHash": "sha256:d1e1c344b8b36913ba39985c0b91531bc377e4ef293b0a28cee44d4f3c025b67", + "ownerTaskId": "DC-DCSN-P0-2026-003", + "transactionId": "fdb50204-3968-48f8-82ee-cd8f172b0c5a", + "phase": "released", + "startedAt": "2026-05-23T09:40:07.746000Z", + "updatedAt": "2026-05-23T09:40:36.631000Z", + "ttlSeconds": 3600, + "liveBefore": { + "status": "pass", + "expectedCommit": null, + "endpoints": [ + { + "id": "cloud-web-16666", + "url": "http://74.48.78.17:16666/health/live", + "status": "pass", + "httpStatus": 200, + "reachable": true, + "identityMatches": true, + "startedAt": "2026-05-23T09:40:07.823Z", + "finishedAt": "2026-05-23T09:40:08.574Z", + "expectedServiceId": "hwlab-cloud-web", + "expectedCommit": null, + "serviceId": "hwlab-cloud-web", + "environment": "dev", + "applicationStatus": "ok", + "ready": null, + "observedCommit": "63acb59", + "image": null, + "imageTag": null, + "observedAt": null, + "serviceMatches": true, + "environmentMatches": true, + "commitMatches": null, + "blockerCodes": [] + }, + { + "id": "cloud-api-16667", + "url": "http://74.48.78.17:16667/health/live", + "status": "pass", + "httpStatus": 200, + "reachable": true, + "identityMatches": true, + "startedAt": "2026-05-23T09:40:07.825Z", + "finishedAt": "2026-05-23T09:40:11.666Z", + "expectedServiceId": "hwlab-cloud-api", + "expectedCommit": null, + "serviceId": "hwlab-cloud-api", + "environment": "dev", + "applicationStatus": "ok", + "ready": true, + "observedCommit": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "observedAt": "2026-05-23T09:40:09.312Z", + "serviceMatches": true, + "environmentMatches": true, + "commitMatches": null, + "blockerCodes": [] + } + ], + "summary": { + "checked": 2, + "reachable": 2, + "identityMatches": 2, + "commitMatches": null, + "ports": [ + 16666, + 16667 + ] + } + }, + "targetNamespace": "hwlab-dev", + "targetRef": "origin/main", + "releasedAt": "2026-05-23T09:40:36.631000Z", + "releaseStatus": "pass", + "staleLockBrokenAt": null, + "staleLockPrevious": null + } + } + }, + "devCdApply": { + "mode": "apply", + "target": { + "ref": "origin/main", + "promotionCommit": "63acb5989baa9f12266ca3467eb896a454593efc", + "shortCommitId": "63acb59", + "headCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "headMatchesTarget": true, + "namespace": "hwlab-dev", + "apiEndpoint": "http://74.48.78.17:16667", + "browserEndpoint": "http://74.48.78.17:16666/" + }, + "deployJson": { + "before": { + "path": "deploy/deploy.json", + "hash": "sha256:d1e1c344b8b36913ba39985c0b91531bc377e4ef293b0a28cee44d4f3c025b67", + "commitId": "6963ed2", + "namespace": "hwlab-dev", + "environment": "dev", + "endpoint": "http://74.48.78.17:16667", + "manifest": { + "manifestVersion": "v1", + "environment": "dev", + "commitId": "6963ed2", + "namespace": "hwlab-dev", + "endpoint": "http://74.48.78.17:16667", + "health": { + "method": "GET", + "path": "/health/live", + "responseFormat": "json" + }, + "publicEndpoints": { + "frontend": { + "url": "http://74.48.78.17:16666", + "protocol": "http", + "host": "74.48.78.17", + "port": 16666, + "serviceId": "hwlab-cloud-web", + "frpProxy": "hwlab-dev-cloud-web" + }, + "api": { + "url": "http://74.48.78.17:16667", + "protocol": "http", + "host": "74.48.78.17", + "port": 16667, + "serviceId": "hwlab-edge-proxy", + "frpProxy": "hwlab-dev-edge-proxy" + } + }, + "frp": { + "server": { + "address": "74.48.78.17", + "bindPort": 7000 + }, + "proxies": [ + { + "name": "hwlab-dev-cloud-web", + "endpointId": "frontend", + "type": "tcp", + "localServiceId": "hwlab-cloud-web", + "localHost": "hwlab-cloud-web.hwlab-dev.svc.cluster.local", + "localPort": 8080, + "remotePort": 16666 + }, + { + "name": "hwlab-dev-edge-proxy", + "endpointId": "api", + "type": "tcp", + "localServiceId": "hwlab-edge-proxy", + "localHost": "hwlab-edge-proxy.hwlab-dev.svc.cluster.local", + "localPort": 6667, + "remotePort": 16667 + }, + { + "name": "hwlab-dev-tunnel-health", + "type": "tcp", + "localServiceId": "hwlab-tunnel-client", + "localHost": "hwlab-tunnel-client.hwlab-dev.svc.cluster.local", + "localPort": 7402, + "remotePort": 7402 + } + ] + }, + "k3s": { + "serviceMappings": [ + { + "serviceId": "hwlab-cloud-api", + "name": "hwlab-cloud-api", + "namespace": "hwlab-dev", + "port": 6667, + "targetPort": "http" + }, + { + "serviceId": "hwlab-cloud-web", + "name": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "port": 8080, + "targetPort": "http" + }, + { + "serviceId": "hwlab-gateway", + "name": "hwlab-gateway", + "namespace": "hwlab-dev", + "port": 7001, + "targetPort": "http" + }, + { + "serviceId": "hwlab-cli", + "name": "hwlab-cli", + "namespace": "hwlab-dev", + "port": 7501, + "targetPort": "http" + }, + { + "serviceId": "hwlab-agent-skills", + "name": "hwlab-agent-skills", + "namespace": "hwlab-dev", + "port": 7430, + "targetPort": "http" + }, + { + "serviceId": "hwlab-agent-mgr", + "name": "hwlab-agent-mgr", + "namespace": "hwlab-dev", + "port": 7410, + "targetPort": "http" + }, + { + "serviceId": "hwlab-gateway-simu", + "name": "hwlab-gateway-simu-1", + "namespace": "hwlab-dev", + "port": 7101, + "targetPort": "http" + }, + { + "serviceId": "hwlab-box-simu", + "name": "hwlab-box-simu-1", + "namespace": "hwlab-dev", + "port": 7201, + "targetPort": "http" + }, + { + "serviceId": "hwlab-gateway-simu", + "name": "hwlab-gateway-simu-2", + "namespace": "hwlab-dev", + "port": 7101, + "targetPort": "http" + }, + { + "serviceId": "hwlab-box-simu", + "name": "hwlab-box-simu-2", + "namespace": "hwlab-dev", + "port": 7201, + "targetPort": "http" + }, + { + "serviceId": "hwlab-patch-panel", + "name": "hwlab-patch-panel", + "namespace": "hwlab-dev", + "port": 7301, + "targetPort": "http" + }, + { + "serviceId": "hwlab-router", + "name": "hwlab-router", + "namespace": "hwlab-dev", + "port": 7401, + "targetPort": "http" + }, + { + "serviceId": "hwlab-tunnel-client", + "name": "hwlab-tunnel-client", + "namespace": "hwlab-dev", + "port": 7402, + "targetPort": "http" + }, + { + "serviceId": "hwlab-edge-proxy", + "name": "hwlab-edge-proxy", + "namespace": "hwlab-dev", + "port": 6667, + "targetPort": "http" + } + ] + }, + "profiles": { + "dev": { + "name": "dev", + "enabled": true, + "namespace": "hwlab-dev", + "endpoint": "http://74.48.78.17:16667", + "notes": "DEV-only k3s deployment skeleton. D601 reaches the master edge through frp reverse tunnel." + }, + "prod": { + "name": "prod", + "enabled": false, + "namespace": "hwlab-prod", + "notes": "Reserved placeholder only. PROD deployment and acceptance are explicitly out of scope." + } + }, + "services": [ + { + "serviceId": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_ENVIRONMENT": "dev", + "HWLAB_PUBLIC_ENDPOINT": "http://74.48.78.17:16667", + "HWLAB_COMMIT_ID": "6963ed2", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "HWLAB_IMAGE_TAG": "6963ed2", + "HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN": "unidesk-backend,provider-gateway,microservice-proxy", + "HWLAB_CLOUD_DB_URL": "secretRef:hwlab-cloud-api-dev-db/database-url", + "HWLAB_CLOUD_DB_SSL_MODE": "disable", + "HWLAB_CLOUD_DB_CONTRACT": "dev-redacted-presence-only", + "HWLAB_CLOUD_RUNTIME_ADAPTER": "postgres", + "HWLAB_CLOUD_RUNTIME_DURABLE": "true", + "HWLAB_M3_IO_CONTROL_ENABLED": "true", + "HWLAB_M3_GATEWAY_SIMU_1_URL": "http://hwlab-gateway-simu-1.hwlab-dev.svc.cluster.local:7101", + "HWLAB_M3_GATEWAY_SIMU_2_URL": "http://hwlab-gateway-simu-2.hwlab-dev.svc.cluster.local:7101", + "HWLAB_M3_PATCH_PANEL_URL": "http://hwlab-patch-panel.hwlab-dev.svc.cluster.local:7301", + "HWLAB_CODE_AGENT_PROVIDER": "openai", + "HWLAB_CODE_AGENT_MODEL": "gpt-5.5", + "HWLAB_CODE_AGENT_OPENAI_BASE_URL": "http://172.26.26.227:17680/v1/responses", + "OPENAI_API_KEY": "secretRef:hwlab-code-agent-provider/openai-api-key" + } + }, + { + "serviceId": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_ENVIRONMENT": "dev", + "HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667", + "HWLAB_COMMIT_ID": "6963ed2", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "HWLAB_IMAGE_TAG": "6963ed2" + } + }, + { + "serviceId": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_AGENT_SESSION_MODE": "control-plane", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 0, + "env": { + "HWLAB_AGENT_SESSION_MODE": "session-scoped", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 0, + "env": { + "HWLAB_GATEWAY_MODE": "hardware-boundary", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 2, + "instanceNames": [ + "hwlab-gateway-simu-1", + "hwlab-gateway-simu-2" + ], + "identityStrategy": "indexed-workloads", + "env": { + "HWLAB_GATEWAY_MODE": "simulator", + "HWLAB_GATEWAY_ID": "gwsimu_1,gwsimu_2", + "HWLAB_BOX_IDS": "boxsimu_1,boxsimu_2", + "HWLAB_BOX_RESOURCES": "res_boxsimu_1,res_boxsimu_2", + "HWLAB_BOX_URLS": "http://hwlab-box-simu-1.hwlab-dev.svc.cluster.local:7201,http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201" + } + }, + { + "serviceId": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 2, + "instanceNames": [ + "hwlab-box-simu-1", + "hwlab-box-simu-2" + ], + "identityStrategy": "indexed-workloads", + "env": { + "HWLAB_BOX_ID": "boxsimu_1,boxsimu_2", + "HWLAB_BOX_RESOURCE_ID": "res_boxsimu_1,res_boxsimu_2", + "HWLAB_GATEWAY_SESSION_ID": "gws_gwsimu_1,gws_gwsimu_2", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "m3Route": { + "fromResourceId": "res_boxsimu_1", + "fromPort": "DO1", + "patchPanelServiceId": "hwlab-patch-panel", + "toResourceId": "res_boxsimu_2", + "toPort": "DI1" + }, + "env": { + "HWLAB_PATCH_PANEL_MODE": "dev-skeleton", + "HWLAB_PATCH_PANEL_ENDPOINT_MAP": "{\"res_boxsimu_2\":\"http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201\"}", + "HWLAB_PATCH_PANEL_WIRING_CONFIG": "{\"wiringConfigId\":\"wir_m3_do1_di1\",\"projectId\":\"prj_m3_hardware_loop\",\"gatewaySessionId\":\"gws_gwsimu_1\",\"name\":\"M3 simulated DO1 to DI1 patch wiring\",\"status\":\"active\",\"connections\":[{\"from\":{\"resourceId\":\"res_boxsimu_1\",\"port\":\"DO1\"},\"to\":{\"resourceId\":\"res_boxsimu_2\",\"port\":\"DI1\"},\"mode\":\"exclusive\"}],\"constraints\":{\"propagation\":\"patch-panel-only\",\"localLoopbackSubstituteAllowed\":false},\"createdAt\":\"2026-05-21T00:00:00.000Z\",\"updatedAt\":\"2026-05-21T00:00:00.000Z\"}", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_ROUTER_MODE": "edge-reachability", + "HWLAB_EDGE_PROXY_SERVICE": "hwlab-edge-proxy" + } + }, + { + "serviceId": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_TUNNEL_MODE": "frp-client", + "HWLAB_FRP_SERVER_ADDR": "74.48.78.17", + "HWLAB_FRP_PUBLIC_PORT": "16667", + "HWLAB_FRP_WEB_PUBLIC_PORT": "16666" + } + }, + { + "serviceId": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_EDGE_LISTEN": "0.0.0.0:6667", + "HWLAB_EDGE_UPSTREAM": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667" + } + }, + { + "serviceId": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 0, + "env": { + "HWLAB_CLI_ENDPOINT": "http://74.48.78.17:16667" + } + }, + { + "serviceId": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_SKILLS_COMMIT_ID": "6963ed2" + } + } + ], + "createdAt": "2026-05-21T00:00:00Z" + } + }, + "after": { + "path": "deploy/deploy.json", + "hash": "sha256:a9e8d6019ffc8e40548f70a0d7ea119a37f6384113fc16eea8ea259dcbeea0e8", + "commitId": "63acb59", + "namespace": "hwlab-dev", + "environment": "dev", + "endpoint": "http://74.48.78.17:16667", + "manifest": { + "manifestVersion": "v1", + "environment": "dev", + "commitId": "63acb59", + "namespace": "hwlab-dev", + "endpoint": "http://74.48.78.17:16667", + "health": { + "method": "GET", + "path": "/health/live", + "responseFormat": "json" + }, + "publicEndpoints": { + "frontend": { + "url": "http://74.48.78.17:16666", + "protocol": "http", + "host": "74.48.78.17", + "port": 16666, + "serviceId": "hwlab-cloud-web", + "frpProxy": "hwlab-dev-cloud-web" + }, + "api": { + "url": "http://74.48.78.17:16667", + "protocol": "http", + "host": "74.48.78.17", + "port": 16667, + "serviceId": "hwlab-edge-proxy", + "frpProxy": "hwlab-dev-edge-proxy" + } + }, + "frp": { + "server": { + "address": "74.48.78.17", + "bindPort": 7000 + }, + "proxies": [ + { + "name": "hwlab-dev-cloud-web", + "endpointId": "frontend", + "type": "tcp", + "localServiceId": "hwlab-cloud-web", + "localHost": "hwlab-cloud-web.hwlab-dev.svc.cluster.local", + "localPort": 8080, + "remotePort": 16666 + }, + { + "name": "hwlab-dev-edge-proxy", + "endpointId": "api", + "type": "tcp", + "localServiceId": "hwlab-edge-proxy", + "localHost": "hwlab-edge-proxy.hwlab-dev.svc.cluster.local", + "localPort": 6667, + "remotePort": 16667 + }, + { + "name": "hwlab-dev-tunnel-health", + "type": "tcp", + "localServiceId": "hwlab-tunnel-client", + "localHost": "hwlab-tunnel-client.hwlab-dev.svc.cluster.local", + "localPort": 7402, + "remotePort": 7402 + } + ] + }, + "k3s": { + "serviceMappings": [ + { + "serviceId": "hwlab-cloud-api", + "name": "hwlab-cloud-api", + "namespace": "hwlab-dev", + "port": 6667, + "targetPort": "http" + }, + { + "serviceId": "hwlab-cloud-web", + "name": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "port": 8080, + "targetPort": "http" + }, + { + "serviceId": "hwlab-gateway", + "name": "hwlab-gateway", + "namespace": "hwlab-dev", + "port": 7001, + "targetPort": "http" + }, + { + "serviceId": "hwlab-cli", + "name": "hwlab-cli", + "namespace": "hwlab-dev", + "port": 7501, + "targetPort": "http" + }, + { + "serviceId": "hwlab-agent-skills", + "name": "hwlab-agent-skills", + "namespace": "hwlab-dev", + "port": 7430, + "targetPort": "http" + }, + { + "serviceId": "hwlab-agent-mgr", + "name": "hwlab-agent-mgr", + "namespace": "hwlab-dev", + "port": 7410, + "targetPort": "http" + }, + { + "serviceId": "hwlab-gateway-simu", + "name": "hwlab-gateway-simu-1", + "namespace": "hwlab-dev", + "port": 7101, + "targetPort": "http" + }, + { + "serviceId": "hwlab-box-simu", + "name": "hwlab-box-simu-1", + "namespace": "hwlab-dev", + "port": 7201, + "targetPort": "http" + }, + { + "serviceId": "hwlab-gateway-simu", + "name": "hwlab-gateway-simu-2", + "namespace": "hwlab-dev", + "port": 7101, + "targetPort": "http" + }, + { + "serviceId": "hwlab-box-simu", + "name": "hwlab-box-simu-2", + "namespace": "hwlab-dev", + "port": 7201, + "targetPort": "http" + }, + { + "serviceId": "hwlab-patch-panel", + "name": "hwlab-patch-panel", + "namespace": "hwlab-dev", + "port": 7301, + "targetPort": "http" + }, + { + "serviceId": "hwlab-router", + "name": "hwlab-router", + "namespace": "hwlab-dev", + "port": 7401, + "targetPort": "http" + }, + { + "serviceId": "hwlab-tunnel-client", + "name": "hwlab-tunnel-client", + "namespace": "hwlab-dev", + "port": 7402, + "targetPort": "http" + }, + { + "serviceId": "hwlab-edge-proxy", + "name": "hwlab-edge-proxy", + "namespace": "hwlab-dev", + "port": 6667, + "targetPort": "http" + } + ] + }, + "profiles": { + "dev": { + "name": "dev", + "enabled": true, + "namespace": "hwlab-dev", + "endpoint": "http://74.48.78.17:16667", + "notes": "DEV-only k3s deployment skeleton. D601 reaches the master edge through frp reverse tunnel." + }, + "prod": { + "name": "prod", + "enabled": false, + "namespace": "hwlab-prod", + "notes": "Reserved placeholder only. PROD deployment and acceptance are explicitly out of scope." + } + }, + "services": [ + { + "serviceId": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_ENVIRONMENT": "dev", + "HWLAB_PUBLIC_ENDPOINT": "http://74.48.78.17:16667", + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "HWLAB_IMAGE_TAG": "63acb59", + "HWLAB_RUNTIME_SUBSTITUTE_FORBIDDEN": "unidesk-backend,provider-gateway,microservice-proxy", + "HWLAB_CLOUD_DB_URL": "secretRef:hwlab-cloud-api-dev-db/database-url", + "HWLAB_CLOUD_DB_SSL_MODE": "disable", + "HWLAB_CLOUD_DB_CONTRACT": "dev-redacted-presence-only", + "HWLAB_CLOUD_RUNTIME_ADAPTER": "postgres", + "HWLAB_CLOUD_RUNTIME_DURABLE": "true", + "HWLAB_M3_IO_CONTROL_ENABLED": "true", + "HWLAB_M3_GATEWAY_SIMU_1_URL": "http://hwlab-gateway-simu-1.hwlab-dev.svc.cluster.local:7101", + "HWLAB_M3_GATEWAY_SIMU_2_URL": "http://hwlab-gateway-simu-2.hwlab-dev.svc.cluster.local:7101", + "HWLAB_M3_PATCH_PANEL_URL": "http://hwlab-patch-panel.hwlab-dev.svc.cluster.local:7301", + "HWLAB_CODE_AGENT_PROVIDER": "openai", + "HWLAB_CODE_AGENT_MODEL": "gpt-5.5", + "HWLAB_CODE_AGENT_OPENAI_BASE_URL": "http://172.26.26.227:17680/v1/responses", + "OPENAI_API_KEY": "secretRef:hwlab-code-agent-provider/openai-api-key" + } + }, + { + "serviceId": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_ENVIRONMENT": "dev", + "HWLAB_API_BASE_URL": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667", + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" + } + }, + { + "serviceId": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_AGENT_SESSION_MODE": "control-plane", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 0, + "env": { + "HWLAB_AGENT_SESSION_MODE": "session-scoped", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 0, + "env": { + "HWLAB_GATEWAY_MODE": "hardware-boundary", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 2, + "instanceNames": [ + "hwlab-gateway-simu-1", + "hwlab-gateway-simu-2" + ], + "identityStrategy": "indexed-workloads", + "env": { + "HWLAB_GATEWAY_MODE": "simulator", + "HWLAB_GATEWAY_ID": "gwsimu_1,gwsimu_2", + "HWLAB_BOX_IDS": "boxsimu_1,boxsimu_2", + "HWLAB_BOX_RESOURCES": "res_boxsimu_1,res_boxsimu_2", + "HWLAB_BOX_URLS": "http://hwlab-box-simu-1.hwlab-dev.svc.cluster.local:7201,http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201" + } + }, + { + "serviceId": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 2, + "instanceNames": [ + "hwlab-box-simu-1", + "hwlab-box-simu-2" + ], + "identityStrategy": "indexed-workloads", + "env": { + "HWLAB_BOX_ID": "boxsimu_1,boxsimu_2", + "HWLAB_BOX_RESOURCE_ID": "res_boxsimu_1,res_boxsimu_2", + "HWLAB_GATEWAY_SESSION_ID": "gws_gwsimu_1,gws_gwsimu_2", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "m3Route": { + "fromResourceId": "res_boxsimu_1", + "fromPort": "DO1", + "patchPanelServiceId": "hwlab-patch-panel", + "toResourceId": "res_boxsimu_2", + "toPort": "DI1" + }, + "env": { + "HWLAB_PATCH_PANEL_MODE": "dev-skeleton", + "HWLAB_PATCH_PANEL_ENDPOINT_MAP": "{\"res_boxsimu_2\":\"http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201\"}", + "HWLAB_PATCH_PANEL_WIRING_CONFIG": "{\"wiringConfigId\":\"wir_m3_do1_di1\",\"projectId\":\"prj_m3_hardware_loop\",\"gatewaySessionId\":\"gws_gwsimu_1\",\"name\":\"M3 simulated DO1 to DI1 patch wiring\",\"status\":\"active\",\"connections\":[{\"from\":{\"resourceId\":\"res_boxsimu_1\",\"port\":\"DO1\"},\"to\":{\"resourceId\":\"res_boxsimu_2\",\"port\":\"DI1\"},\"mode\":\"exclusive\"}],\"constraints\":{\"propagation\":\"patch-panel-only\",\"localLoopbackSubstituteAllowed\":false},\"createdAt\":\"2026-05-21T00:00:00.000Z\",\"updatedAt\":\"2026-05-21T00:00:00.000Z\"}", + "HWLAB_ENVIRONMENT": "dev" + } + }, + { + "serviceId": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_ROUTER_MODE": "edge-reachability", + "HWLAB_EDGE_PROXY_SERVICE": "hwlab-edge-proxy" + } + }, + { + "serviceId": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_TUNNEL_MODE": "frp-client", + "HWLAB_FRP_SERVER_ADDR": "74.48.78.17", + "HWLAB_FRP_PUBLIC_PORT": "16667", + "HWLAB_FRP_WEB_PUBLIC_PORT": "16666" + } + }, + { + "serviceId": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_EDGE_LISTEN": "0.0.0.0:6667", + "HWLAB_EDGE_UPSTREAM": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667" + } + }, + { + "serviceId": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 0, + "env": { + "HWLAB_CLI_ENDPOINT": "http://74.48.78.17:16667" + } + }, + { + "serviceId": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "namespace": "hwlab-dev", + "healthPath": "/health/live", + "profile": "dev", + "replicas": 1, + "env": { + "HWLAB_SKILLS_COMMIT_ID": "63acb59" + } + } + ], + "createdAt": "2026-05-21T00:00:00Z" + } + } + }, + "lock": { + "acquired": true, + "current": { + "lockBackend": "Lease", + "lockName": "hwlab-dev-cd-lock", + "resourceVersion": "1387021", + "holderIdentity": "DC-DCSN-P0-2026-003/fdb50204-3968-48f8-82ee-cd8f172b0c5a", + "promotionCommit": "63acb59", + "deployJsonHash": "sha256:d1e1c344b8b36913ba39985c0b91531bc377e4ef293b0a28cee44d4f3c025b67", + "ownerTaskId": "DC-DCSN-P0-2026-003", + "transactionId": "fdb50204-3968-48f8-82ee-cd8f172b0c5a", + "phase": "verifying", + "startedAt": "2026-05-23T09:40:07.746000Z", + "updatedAt": "2026-05-23T09:40:35.317000Z", + "ttlSeconds": 3600, + "liveBefore": { + "status": "pass", + "expectedCommit": null, + "endpoints": [ + { + "id": "cloud-web-16666", + "url": "http://74.48.78.17:16666/health/live", + "status": "pass", + "httpStatus": 200, + "reachable": true, + "identityMatches": true, + "startedAt": "2026-05-23T09:40:07.823Z", + "finishedAt": "2026-05-23T09:40:08.574Z", + "expectedServiceId": "hwlab-cloud-web", + "expectedCommit": null, + "serviceId": "hwlab-cloud-web", + "environment": "dev", + "applicationStatus": "ok", + "ready": null, + "observedCommit": "63acb59", + "image": null, + "imageTag": null, + "observedAt": null, + "serviceMatches": true, + "environmentMatches": true, + "commitMatches": null, + "blockerCodes": [] + }, + { + "id": "cloud-api-16667", + "url": "http://74.48.78.17:16667/health/live", + "status": "pass", + "httpStatus": 200, + "reachable": true, + "identityMatches": true, + "startedAt": "2026-05-23T09:40:07.825Z", + "finishedAt": "2026-05-23T09:40:11.666Z", + "expectedServiceId": "hwlab-cloud-api", + "expectedCommit": null, + "serviceId": "hwlab-cloud-api", + "environment": "dev", + "applicationStatus": "ok", + "ready": true, + "observedCommit": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "observedAt": "2026-05-23T09:40:09.312Z", + "serviceMatches": true, + "environmentMatches": true, + "commitMatches": null, + "blockerCodes": [] + } + ], + "summary": { + "checked": 2, + "reachable": 2, + "identityMatches": 2, + "commitMatches": null, + "ports": [ + 16666, + 16667 + ] + } + }, + "targetNamespace": "hwlab-dev", + "targetRef": "origin/main", + "releasedAt": null, + "releaseStatus": "running", + "staleLockBrokenAt": null, + "staleLockPrevious": null + }, + "staleBreak": null + }, + "steps": [ + { + "id": "desired-state-check-before-publish", + "phase": "publishing", + "status": "pass", + "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/deploy-desired-state-plan.mjs --check --pretty", + "code": 0, + "startedAt": "2026-05-23T09:40:11.742Z", + "finishedAt": "2026-05-23T09:40:11.784Z", + "stdoutJson": { + "kind": "hwlab-deploy-desired-state-plan", + "mode": "read-only-plan", + "status": "pass", + "source": { + "deploy": "deploy/deploy.json", + "artifactCatalog": "deploy/artifact-catalog.dev.json", + "workloads": "deploy/k8s/base/workloads.yaml", + "optionalReport": "reports/dev-gate/dev-artifacts.json" + }, + "safety": { + "readOnly": true, + "sourceOrDryRunSupportOnly": true, + "kubectlApply": false, + "registryPull": false, + "registryPush": false, + "imageBuild": false, + "serviceRestart": false, + "prod": false, + "devLiveClaim": false + }, + "checkSemantics": "--check exits non-zero for missing/invalid desired-state sources, internal commit/image mirror drift, invalid target tags, partial target drift, or any mismatch with an explicit --target-ref, --target-tag, or --promotion-commit. When the checked target ref is the current checked-out merge commit, the comparable current-main target is its accepted first parent because a commit cannot embed its own content hash. Without --check, a uniform older desired-state under --target-ref/--target-tag is a read-only promotion plan.", + "summary": { + "desiredCommitId": "6963ed2", + "desiredImageTag": "6963ed2", + "artifactState": "published", + "ciPublished": true, + "registryVerified": true, + "services": 13, + "workloadContainers": 13, + "presentMirrorCount": 14, + "diagnostics": 0, + "blockers": 0, + "targetConvergence": "not_requested" + }, + "target": null, + "promotionBoundary": { + "writes": [], + "authoritativeDesiredState": [ + "deploy/deploy.json", + "deploy/artifact-catalog.dev.json", + "deploy/k8s/base/workloads.yaml" + ], + "nonAuthoritativeEvidence": [ + "reports/dev-gate/dev-artifacts.json" + ], + "note": "This planner reviews source desired-state only. It does not prove image existence, registry reachability, a real DEV apply, or M3 DEV-LIVE hardware-loop evidence." + }, + "cloudApiDb": { + "contractVersion": "v1", + "environment": "dev", + "status": "pass", + "ready": true, + "secretRef": { + "env": "HWLAB_CLOUD_DB_URL", + "secretName": "hwlab-cloud-api-dev-db", + "secretKey": "database-url", + "deployPlaceholderPresent": true, + "workloadSecretRefPresent": true, + "present": true, + "redacted": true + }, + "sslMode": { + "env": "HWLAB_CLOUD_DB_SSL_MODE", + "value": "disable", + "workloadValue": "disable", + "expected": "disable", + "deployMatches": true, + "workloadMatches": true, + "secret": false + }, + "secretMaterialRead": false, + "valuesRedacted": true, + "liveDbEvidence": false, + "fixtureEvidence": false + }, + "codeAgentProvider": { + "contractVersion": "v1", + "environment": "dev", + "provider": "openai-responses", + "model": "gpt-5.5", + "status": "pass", + "ready": true, + "requiredEnv": [ + { + "name": "HWLAB_CODE_AGENT_PROVIDER", + "deployPresent": true, + "workloadPresent": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "HWLAB_CODE_AGENT_MODEL", + "deployPresent": true, + "workloadPresent": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "OPENAI_API_KEY", + "deployPresent": true, + "workloadPresent": true, + "redacted": true, + "source": "k8s-secret-ref" + }, + { + "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "deployPresent": true, + "workloadPresent": true, + "redacted": true, + "source": "runtime-env" + } + ], + "secretRef": { + "env": "OPENAI_API_KEY", + "secretName": "hwlab-code-agent-provider", + "secretKey": "openai-api-key", + "deployPlaceholderPresent": true, + "workloadSecretRefPresent": true, + "present": true, + "redacted": true + }, + "egress": { + "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "target": "dev-egress-proxy", + "deployPresent": true, + "workloadPresent": true, + "deployMatchesDevProxy": true, + "workloadMatchesDevProxy": true, + "directPublicOpenAi": false, + "valueRedacted": true + }, + "missingDeployEnv": [], + "missingWorkloadEnv": [], + "deployMismatches": [], + "workloadMismatches": [], + "missingSecretRefs": [], + "missingEgressContract": [], + "secretMaterialRead": false, + "valuesRedacted": true, + "providerConnected": false, + "fixtureEvidence": false + }, + "reportHints": { + "path": "reports/dev-gate/dev-artifacts.json", + "present": true, + "authoritative": false, + "note": "report snapshots are contextual evidence only; deploy desired-state remains authoritative in deploy/, not reports/", + "commitId": "6963ed2", + "matchesDesiredState": true, + "artifactPublish": { + "status": "published", + "sourceCommitId": "6963ed21342374016fe419fd251d1787b249b5e7", + "sourceMatchesDesiredState": true, + "publishedCount": 13, + "serviceCount": 13, + "registryVerified": null, + "registryCapabilitiesClassification": "degraded" + } + }, + "services": [ + { + "serviceId": "hwlab-cloud-api", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": { + "HWLAB_COMMIT_ID": { + "name": "HWLAB_COMMIT_ID", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + }, + "HWLAB_IMAGE": { + "name": "HWLAB_IMAGE", + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "status": "match" + }, + "HWLAB_IMAGE_TAG": { + "name": "HWLAB_IMAGE_TAG", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + } + }, + "missing": [ + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-cloud-api", + "namespace": "hwlab-dev", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": { + "HWLAB_COMMIT_ID": { + "name": "HWLAB_COMMIT_ID", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + }, + "HWLAB_IMAGE": { + "name": "HWLAB_IMAGE", + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "status": "match" + }, + "HWLAB_IMAGE_TAG": { + "name": "HWLAB_IMAGE_TAG", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + } + }, + "missing": [ + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-cloud-web", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": { + "HWLAB_COMMIT_ID": { + "name": "HWLAB_COMMIT_ID", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + }, + "HWLAB_IMAGE": { + "name": "HWLAB_IMAGE", + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "status": "match" + }, + "HWLAB_IMAGE_TAG": { + "name": "HWLAB_IMAGE_TAG", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + } + }, + "missing": [ + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:3c3a4ef374bf843ad1c170696c5a122fdbf35a872a17c086ed06ffd50c5a0e06", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": { + "HWLAB_COMMIT_ID": { + "name": "HWLAB_COMMIT_ID", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + }, + "HWLAB_IMAGE": { + "name": "HWLAB_IMAGE", + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:6963ed2", + "status": "match" + }, + "HWLAB_IMAGE_TAG": { + "name": "HWLAB_IMAGE_TAG", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + } + }, + "missing": [ + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-agent-mgr", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-agent-mgr", + "namespace": "hwlab-dev", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-agent-worker", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:8131839bd8f08fc654bf96ba7c713ba917e198ebab04cf051b9e384392eb95e9", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Job", + "name": "hwlab-agent-worker-template", + "namespace": "hwlab-dev", + "container": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-gateway", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:808d609ef4873b64faf5eeb13f8eb6bf280bcd9f799d90f00bab44c2c7ad3fd8", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-gateway", + "namespace": "hwlab-dev", + "container": "hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-gateway-simu", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "StatefulSet", + "name": "hwlab-gateway-simu", + "namespace": "hwlab-dev", + "container": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-box-simu", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "StatefulSet", + "name": "hwlab-box-simu", + "namespace": "hwlab-dev", + "container": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-patch-panel", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-patch-panel", + "namespace": "hwlab-dev", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-router", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-router", + "namespace": "hwlab-dev", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-tunnel-client", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-tunnel-client", + "namespace": "hwlab-dev", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-edge-proxy", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-edge-proxy", + "namespace": "hwlab-dev", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-cli", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:7e5ac811644c83237542c95f4a6302d607a070a4b4f9f247191ce529577ead99", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Job", + "name": "hwlab-cli-template", + "namespace": "hwlab-dev", + "container": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + }, + { + "serviceId": "hwlab-agent-skills", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": { + "HWLAB_SKILLS_COMMIT_ID": { + "name": "HWLAB_SKILLS_COMMIT_ID", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + } + }, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "6963ed2", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "imageTag": "6963ed2", + "digest": "sha256:6881f9d417b91705cca9d134f2df85da3a3ec2af393882f0f24ea113a20d6efd", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-agent-skills", + "namespace": "hwlab-dev", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "imageTag": "6963ed2", + "envMirrors": { + "present": { + "HWLAB_SKILLS_COMMIT_ID": { + "name": "HWLAB_SKILLS_COMMIT_ID", + "value": "6963ed2", + "expected": "6963ed2", + "status": "match" + } + }, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": null + } + ], + "diagnostics": [] + }, + "stdoutTail": null, + "stderrTail": "", + "reportPath": null + }, + { + "id": "artifact-publish", + "phase": "publishing", + "status": "pass", + "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-artifact-publish.mjs --publish", + "code": 0, + "startedAt": "2026-05-23T09:40:11.785Z", + "finishedAt": "2026-05-23T09:40:32.799Z", + "stdoutJson": { + "status": "published", + "mode": "publish", + "reportPath": "reports/dev-gate/dev-artifacts.json", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryPrefix": "127.0.0.1:5000/hwlab", + "registryCapabilities": { + "version": "v1", + "registryPrefix": "127.0.0.1:5000/hwlab", + "generatedAt": "2026-05-23T09:40:15.352Z", + "classification": "degraded", + "dimensions": { + "processHttpAccess": { + "id": "process-http-access", + "status": "degraded", + "requiredForPublish": false, + "requiredForDeploy": false, + "endpoint": "http://127.0.0.1:5000/v2/", + "probeKind": "runner-process-http-v2", + "summary": "Runner process cannot reach http://127.0.0.1:5000/v2/; this is process HTTP access only and does not prove Docker daemon push failure.", + "evidence": { + "probe": { + "ok": false, + "url": "http://127.0.0.1:5000/v2/", + "method": "GET", + "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" + }, + "publishFailure": false + } + }, + "dockerDaemonPushAccess": { + "id": "docker-daemon-push-access", + "status": "pass", + "requiredForPublish": true, + "requiredForDeploy": false, + "endpoint": "127.0.0.1:5000/hwlab", + "probeKind": "docker-ps-read-only", + "summary": "Docker daemon can see a local/internal registry target for publish preflight purposes; no push was attempted.", + "evidence": { + "dockerVersion": { + "command": "docker --version", + "ok": true, + "exitCode": 0, + "stdout": "Docker version 26.1.5+dfsg1, build a72d7cd", + "stderr": "", + "error": null + }, + "registryPrefix": "127.0.0.1:5000/hwlab", + "loopbackPort5000": true, + "registryContainerVisible": true, + "matchingContainers": [ + { + "id": "00091efce380", + "image": "registry:2.8.3", + "names": "unidesk-artifact-registry", + "ports": "127.0.0.1:5000->5000/tcp", + "state": "running", + "status": "Up 2 days" + } + ], + "pushAttempted": false, + "mutationAttempted": false + } + }, + "k3sPullAccess": { + "id": "k3s-pull-access", + "status": "pass", + "requiredForPublish": false, + "requiredForDeploy": true, + "endpoint": "127.0.0.1:5000/hwlab", + "probeKind": "kubectl-read-only", + "summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.", + "evidence": { + "kubectlAvailable": true, + "context": { + "command": "kubectl config current-context", + "ok": true, + "exitCode": 0, + "stdout": "in-cluster", + "stderr": "", + "error": null + }, + "canGetPods": { + "command": "kubectl auth can-i get pods -n hwlab-dev", + "ok": true, + "exitCode": 0, + "stdout": "yes", + "stderr": "", + "error": null + }, + "podCount": 21, + "pulledImages": [ + { + "pod": "hwlab-agent-mgr-57d8bc9f89-5kv4p", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80" + }, + { + "pod": "hwlab-agent-mgr-6c6f64bf5-zjbf7", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82" + }, + { + "pod": "hwlab-agent-skills-75b55bc498-gjjj2", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cd6003a7e8694a31a5cc116a7af38c8790ef3931edb7ae596455ee4aa8ec5dc1" + }, + { + "pod": "hwlab-agent-skills-8687f446fd-lqtgt", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7" + }, + { + "pod": "hwlab-box-simu-0", + "container": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" + }, + { + "pod": "hwlab-box-simu-1", + "container": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" + }, + { + "pod": "hwlab-cloud-api-668549d448-gnct8", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:08d9ec3943b6b2530af9a67cfba440460a0357fb6b0ed585cc4537c3ee36f3a9" + }, + { + "pod": "hwlab-cloud-api-858f6df96d-tcrbg", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f" + }, + { + "pod": "hwlab-cloud-web-576b7bb89d-dxk6w", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:58b891a", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:820804a6fe2da63d36951dcbbd8753077c923c252648b9e261eaea973908a379" + }, + { + "pod": "hwlab-cloud-web-fc896cddb-gwh58", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e" + }, + { + "pod": "hwlab-edge-proxy-5889fb8fb8-gblw8", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b" + }, + { + "pod": "hwlab-edge-proxy-5ff8d747d-rgdjm", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314" + }, + { + "pod": "hwlab-frpc-59f57d479c-wm5l2", + "container": "frpc", + "image": "127.0.0.1:5000/hwlab/frpc:v0.68.1", + "imageID": "127.0.0.1:5000/hwlab/frpc@sha256:ce400cda42a260964e40ab1ca68b868f72c569cdce4b243aef36ce40194d287b" + }, + { + "pod": "hwlab-gateway-simu-0", + "container": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" + }, + { + "pod": "hwlab-gateway-simu-1", + "container": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" + }, + { + "pod": "hwlab-patch-panel-5dd8fdf4f7-7cg4w", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce" + }, + { + "pod": "hwlab-patch-panel-79c59cd5b7-dl4sz", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a" + }, + { + "pod": "hwlab-router-59458f576d-l2j27", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40" + }, + { + "pod": "hwlab-router-7d47d6dfc4-gzcw9", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024" + }, + { + "pod": "hwlab-tunnel-client-64779fc4bd-pz8lz", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e" + }, + { + "pod": "hwlab-tunnel-client-65ff794986-5z2s6", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707" + } + ], + "pullFailures": [], + "pullAttempted": false, + "mutationAttempted": false + } + } + }, + "interpretation": { + "processHttpAccess": "Runner process HTTP access to /v2/ is diagnostic only and must not be treated as Docker daemon push access.", + "dockerDaemonPushAccess": "Docker daemon push access is the publish-path capability. This probe is read-only and does not push.", + "k3sPullAccess": "k3s pull access is the deploy-path capability. This probe is read-only and does not create pods or read secrets." + } + }, + "baseImagePreflight": { + "status": "ready", + "imageSource": "local-docker-node:20-*", + "requestedImage": null, + "localTag": "node:20-bookworm-slim", + "imageId": "sha256:9da6b4e352d0d5c94963eba1832408f5b7b08839cd8be9b6610c05de5118c704", + "repoDigests": [ + "node@sha256:2cf067cfed83d5ea958367df9f966191a942351a2df77d6f0193e162b5febfc0" + ], + "candidates": [ + { + "source": "local-docker-node:20-*", + "approval": { + "approved": true, + "reason": "local Node 20 builder base image" + }, + "localTag": "node:20-bookworm-slim", + "imageId": "9da6b4e352d0", + "size": "200MB", + "createdSince": "4 weeks ago" + } + ], + "rejectedCandidates": [ + { + "source": "local-docker-node", + "localTag": "node:22-bookworm-slim", + "imageId": "341b84210b33", + "reason": "local Node image is not Node 20 and is not approved as the HWLAB DEV builder base image" + } + ], + "publishUsable": true, + "blockers": [], + "nextSteps": [ + "Use the reported localTag as the DEV builder base image for artifact publish.", + "Keep publish DEV-only and record the produced HWLAB service image tags and digests separately." + ], + "recommendation": { + "source": "Preloaded D601 local Docker cache or D601-local registry tag.", + "envVar": "HWLAB_DEV_BASE_IMAGE", + "preferredImageTag": "node:20-bookworm-slim", + "preferredHwlabImageTag": "127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim", + "recommendedEnvValue": "node:20-bookworm-slim" + }, + "provision": { + "required": false, + "exactBlocker": null, + "expectedImageTag": "node:20-bookworm-slim", + "recommendedEnv": { + "name": "HWLAB_DEV_BASE_IMAGE", + "value": "node:20-bookworm-slim", + "assignment": "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim" + }, + "recommendedHwlabImageTag": "127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim", + "nextHumanCommand": null, + "commands": { + "d601OnlinePreload": [ + "docker pull node:20-bookworm-slim", + "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/preflight-dev-base-image.mjs" + ], + "d601HwlabTagProvision": [ + "docker pull node:20-bookworm-slim", + "docker tag node:20-bookworm-slim 127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim", + "HWLAB_DEV_BASE_IMAGE=127.0.0.1:5000/hwlab/hwlab-dev-base:node20-bookworm-slim node scripts/preflight-dev-base-image.mjs" + ], + "offlineSourceExport": [ + "docker pull node:20-bookworm-slim", + "docker save node:20-bookworm-slim -o hwlab-node20-bookworm-slim.tar" + ], + "offlineD601Import": [ + "docker load -i hwlab-node20-bookworm-slim.tar", + "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/preflight-dev-base-image.mjs" + ], + "artifactPublishDryRun": [ + "HWLAB_DEV_BASE_IMAGE=node:20-bookworm-slim node scripts/dev-artifact-publish.mjs --preflight --no-report" + ] + } + }, + "blockedReport": null, + "containerEngine": { + "command": "docker", + "available": true, + "version": "Docker version 26.1.5+dfsg1, build a72d7cd", + "errorCode": null, + "stderr": "" + } + }, + "publishPlan": { + "version": "v2", + "mode": "publish", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "imageTag": "63acb59", + "registryTarget": "127.0.0.1:5000/hwlab", + "registryCapabilities": { + "version": "v1", + "registryPrefix": "127.0.0.1:5000/hwlab", + "generatedAt": "2026-05-23T09:40:15.352Z", + "classification": "degraded", + "dimensions": { + "processHttpAccess": { + "id": "process-http-access", + "status": "degraded", + "requiredForPublish": false, + "requiredForDeploy": false, + "endpoint": "http://127.0.0.1:5000/v2/", + "probeKind": "runner-process-http-v2", + "summary": "Runner process cannot reach http://127.0.0.1:5000/v2/; this is process HTTP access only and does not prove Docker daemon push failure.", + "evidence": { + "probe": { + "ok": false, + "url": "http://127.0.0.1:5000/v2/", + "method": "GET", + "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" + }, + "publishFailure": false + } + }, + "dockerDaemonPushAccess": { + "id": "docker-daemon-push-access", + "status": "pass", + "requiredForPublish": true, + "requiredForDeploy": false, + "endpoint": "127.0.0.1:5000/hwlab", + "probeKind": "docker-ps-read-only", + "summary": "Docker daemon can see a local/internal registry target for publish preflight purposes; no push was attempted.", + "evidence": { + "dockerVersion": { + "command": "docker --version", + "ok": true, + "exitCode": 0, + "stdout": "Docker version 26.1.5+dfsg1, build a72d7cd", + "stderr": "", + "error": null + }, + "registryPrefix": "127.0.0.1:5000/hwlab", + "loopbackPort5000": true, + "registryContainerVisible": true, + "matchingContainers": [ + { + "id": "00091efce380", + "image": "registry:2.8.3", + "names": "unidesk-artifact-registry", + "ports": "127.0.0.1:5000->5000/tcp", + "state": "running", + "status": "Up 2 days" + } + ], + "pushAttempted": false, + "mutationAttempted": false + } + }, + "k3sPullAccess": { + "id": "k3s-pull-access", + "status": "pass", + "requiredForPublish": false, + "requiredForDeploy": true, + "endpoint": "127.0.0.1:5000/hwlab", + "probeKind": "kubectl-read-only", + "summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.", + "evidence": { + "kubectlAvailable": true, + "context": { + "command": "kubectl config current-context", + "ok": true, + "exitCode": 0, + "stdout": "in-cluster", + "stderr": "", + "error": null + }, + "canGetPods": { + "command": "kubectl auth can-i get pods -n hwlab-dev", + "ok": true, + "exitCode": 0, + "stdout": "yes", + "stderr": "", + "error": null + }, + "podCount": 21, + "pulledImages": [ + { + "pod": "hwlab-agent-mgr-57d8bc9f89-5kv4p", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80" + }, + { + "pod": "hwlab-agent-mgr-6c6f64bf5-zjbf7", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:42bd66841b857493d78e7be670957fa4238b487a2e546a3d42e78e56a685bc82" + }, + { + "pod": "hwlab-agent-skills-75b55bc498-gjjj2", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cd6003a7e8694a31a5cc116a7af38c8790ef3931edb7ae596455ee4aa8ec5dc1" + }, + { + "pod": "hwlab-agent-skills-8687f446fd-lqtgt", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7" + }, + { + "pod": "hwlab-box-simu-0", + "container": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" + }, + { + "pod": "hwlab-box-simu-1", + "container": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1ef041e13d81148dc3a02a28f9b70ae9848554c66c02ec358141bd2ac8cbf91e" + }, + { + "pod": "hwlab-cloud-api-668549d448-gnct8", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:08d9ec3943b6b2530af9a67cfba440460a0357fb6b0ed585cc4537c3ee36f3a9" + }, + { + "pod": "hwlab-cloud-api-858f6df96d-tcrbg", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:4bb54a3ac720cabdcf5b0e9f7a0ccb98ba28d6ff9c85d2f01c75b834211d113f" + }, + { + "pod": "hwlab-cloud-web-576b7bb89d-dxk6w", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:58b891a", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:820804a6fe2da63d36951dcbbd8753077c923c252648b9e261eaea973908a379" + }, + { + "pod": "hwlab-cloud-web-fc896cddb-gwh58", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e" + }, + { + "pod": "hwlab-edge-proxy-5889fb8fb8-gblw8", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:14722f8f7ed0ccdcc312ead4d9b93b68ca5187550fc61f29fdca26ed6399c32b" + }, + { + "pod": "hwlab-edge-proxy-5ff8d747d-rgdjm", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314" + }, + { + "pod": "hwlab-frpc-59f57d479c-wm5l2", + "container": "frpc", + "image": "127.0.0.1:5000/hwlab/frpc:v0.68.1", + "imageID": "127.0.0.1:5000/hwlab/frpc@sha256:ce400cda42a260964e40ab1ca68b868f72c569cdce4b243aef36ce40194d287b" + }, + { + "pod": "hwlab-gateway-simu-0", + "container": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" + }, + { + "pod": "hwlab-gateway-simu-1", + "container": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:13e1a66ba2dc45bdf04ac4664a4ab9f0589951509895e754ae46df02062c7b44" + }, + { + "pod": "hwlab-patch-panel-5dd8fdf4f7-7cg4w", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:4346f8753c690fa61c378ee8c8ed32e6c11d1e68f813272919914069044fb4ce" + }, + { + "pod": "hwlab-patch-panel-79c59cd5b7-dl4sz", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a" + }, + { + "pod": "hwlab-router-59458f576d-l2j27", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:a4b2befc25988abbeb575d5270e9b942bd6f072478f3e9130b3929588ea15d40" + }, + { + "pod": "hwlab-router-7d47d6dfc4-gzcw9", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024" + }, + { + "pod": "hwlab-tunnel-client-64779fc4bd-pz8lz", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e" + }, + { + "pod": "hwlab-tunnel-client-65ff794986-5z2s6", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:6963ed2", + "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:c7fa485bf3ba71f828b222664c1b80f4894eaa9a451f7034a44f68e9a1cbb707" + } + ], + "pullFailures": [], + "pullAttempted": false, + "mutationAttempted": false + } + } + }, + "interpretation": { + "processHttpAccess": "Runner process HTTP access to /v2/ is diagnostic only and must not be treated as Docker daemon push access.", + "dockerDaemonPushAccess": "Docker daemon push access is the publish-path capability. This probe is read-only and does not push.", + "k3sPullAccess": "k3s pull access is the deploy-path capability. This probe is read-only and does not create pods or read secrets." + } + }, + "digestPlaceholder": "not_published", + "services": [ + { + "serviceId": "hwlab-cloud-api", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-cloud-web", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-mgr", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-worker", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-worker@sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-gateway", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway@sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-gateway-simu", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-box-simu", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-patch-panel", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-router", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-router@sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-tunnel-client", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-edge-proxy", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-cli", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-cli@sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-skills", + "enabled": true, + "required": true, + "artifactScope": "required", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "registryTarget": "127.0.0.1:5000/hwlab/hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", + "repositoryDigest": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", + "digestStatus": "real", + "status": "published", + "notPublishedReason": null + } + ] + }, + "services": [ + { + "serviceId": "hwlab-cloud-api", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-cloud-web", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "distFreshness": { + "status": "pass", + "distPath": "web/hwlab-cloud-web/dist", + "buildCommand": "node web/hwlab-cloud-web/scripts/build.mjs", + "freshnessCommand": "node web/hwlab-cloud-web/scripts/build.mjs", + "files": [ + { + "kind": "runtime", + "path": "index.html", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/index.html", + "status": "match" + }, + { + "kind": "runtime", + "path": "styles.css", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/styles.css", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/styles.css", + "status": "match" + }, + { + "kind": "runtime", + "path": "app.mjs", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/app.mjs", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/app.mjs", + "status": "match" + }, + { + "kind": "runtime", + "path": "gate-summary.mjs", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/gate-summary.mjs", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/gate-summary.mjs", + "status": "match" + }, + { + "kind": "runtime", + "path": "runtime.mjs", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/runtime.mjs", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/runtime.mjs", + "status": "match" + }, + { + "kind": "runtime", + "path": "workbench-hardware-panel.mjs", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/workbench-hardware-panel.mjs", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/workbench-hardware-panel.mjs", + "status": "match" + }, + { + "kind": "runtime", + "path": "help.md", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/help.md", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/help.md", + "status": "match" + }, + { + "kind": "runtime", + "path": "third_party/marked/marked.esm.js", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/third_party/marked/marked.esm.js", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/third_party/marked/marked.esm.js", + "status": "match" + }, + { + "kind": "runtime", + "path": "third_party/marked/LICENSE", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/third_party/marked/LICENSE", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/third_party/marked/LICENSE", + "status": "match" + }, + { + "kind": "alias", + "path": "gate/index.html", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/gate/index.html", + "status": "match" + }, + { + "kind": "alias", + "path": "diagnostics/gate/index.html", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/diagnostics/gate/index.html", + "status": "match" + }, + { + "kind": "alias", + "path": "help/index.html", + "sourcePath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/index.html", + "distPath": "/tmp/hwlab-pr309/web/hwlab-cloud-web/dist/help/index.html", + "status": "match" + } + ], + "mismatches": [] + }, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-mgr", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-worker", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-gateway", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-gateway-simu", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-box-simu", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-patch-panel", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-router", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-tunnel-client", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-edge-proxy", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-cli", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-skills", + "status": "published", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", + "notPublishedReason": null + } + ], + "blockers": [] + }, + "stdoutTail": null, + "stderrTail": "\"event\":\"publish_start\",\"serviceId\":\"hwlab-tunnel-client\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-tunnel-client\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59\",\"digest\":\"sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-edge-proxy\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-edge-proxy\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59\",\"digest\":\"sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:63acb59\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:63acb59\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-cli\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:63acb59\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-cli\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:63acb59\",\"digest\":\"sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b\"}\n{\"event\":\"build_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59\"}\n{\"event\":\"build_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"built\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59\"}\n{\"event\":\"publish_start\",\"serviceId\":\"hwlab-agent-skills\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59\"}\n{\"event\":\"publish_done\",\"serviceId\":\"hwlab-agent-skills\",\"status\":\"published\",\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59\",\"digest\":\"sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7\"}", + "reportPath": "reports/dev-gate/dev-artifacts.json" + }, + { + "id": "artifact-catalog-refresh", + "phase": "publishing", + "status": "pass", + "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/refresh-artifact-catalog.mjs --target-ref 63acb5989baa9f12266ca3467eb896a454593efc --publish-report reports/dev-gate/dev-artifacts.json", + "code": 0, + "startedAt": "2026-05-23T09:40:32.800Z", + "finishedAt": "2026-05-23T09:40:32.853Z", + "stdoutJson": { + "status": "published", + "targetRef": "63acb5989baa9f12266ca3467eb896a454593efc", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "artifactCommitId": "63acb59", + "wrote": [ + "deploy/deploy.json", + "deploy/artifact-catalog.dev.json", + "deploy/k8s/base/workloads.yaml" + ], + "ciPublished": true, + "registryVerified": true, + "publishedCount": 13, + "requiredServiceCount": 13, + "disabledServiceCount": 0, + "notPublishedCount": 0, + "digestPolicy": "catalog digests copied only for required services from a published DEV artifact report; disabled services stay not_published", + "services": [ + { + "serviceId": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + }, + { + "serviceId": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", + "publishState": "published", + "artifactRequired": true, + "notPublishedReason": null + } + ] + }, + "stdoutTail": null, + "stderrTail": "", + "reportPath": null + }, + { + "id": "artifact-catalog-validate", + "phase": "publishing", + "status": "pass", + "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/validate-artifact-catalog.mjs", + "code": 0, + "startedAt": "2026-05-23T09:40:32.853Z", + "finishedAt": "2026-05-23T09:40:32.885Z", + "stdoutJson": null, + "stdoutTail": "validated 13 DEV artifact catalog services at 63acb59 (published)", + "stderrTail": "", + "reportPath": null + }, + { + "id": "desired-state-check-after-refresh", + "phase": "publishing", + "status": "pass", + "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/deploy-desired-state-plan.mjs --promotion-commit 63acb5989baa9f12266ca3467eb896a454593efc --check --pretty", + "code": 0, + "startedAt": "2026-05-23T09:40:32.886Z", + "finishedAt": "2026-05-23T09:40:32.936Z", + "stdoutJson": { + "kind": "hwlab-deploy-desired-state-plan", + "mode": "read-only-plan", + "status": "pass", + "source": { + "deploy": "deploy/deploy.json", + "artifactCatalog": "deploy/artifact-catalog.dev.json", + "workloads": "deploy/k8s/base/workloads.yaml", + "optionalReport": "reports/dev-gate/dev-artifacts.json" + }, + "safety": { + "readOnly": true, + "sourceOrDryRunSupportOnly": true, + "kubectlApply": false, + "registryPull": false, + "registryPush": false, + "imageBuild": false, + "serviceRestart": false, + "prod": false, + "devLiveClaim": false + }, + "checkSemantics": "--check exits non-zero for missing/invalid desired-state sources, internal commit/image mirror drift, invalid target tags, partial target drift, or any mismatch with an explicit --target-ref, --target-tag, or --promotion-commit. When the checked target ref is the current checked-out merge commit, the comparable current-main target is its accepted first parent because a commit cannot embed its own content hash. Without --check, a uniform older desired-state under --target-ref/--target-tag is a read-only promotion plan.", + "summary": { + "desiredCommitId": "63acb59", + "desiredImageTag": "63acb59", + "artifactState": "published", + "ciPublished": true, + "registryVerified": true, + "services": 13, + "workloadContainers": 13, + "presentMirrorCount": 14, + "diagnostics": 0, + "blockers": 0, + "targetConvergence": "already_promoted" + }, + "target": { + "targetRef": null, + "promotionCommit": "63acb5989baa9f12266ca3467eb896a454593efc", + "commitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "shortCommitId": "63acb59", + "tag": "63acb59", + "tagSource": "promotion-commit-short", + "acceptedCurrentMain": null, + "comparisonCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "comparisonTag": "63acb59", + "requireConvergence": true, + "convergenceRequirement": "promotion-commit", + "convergence": { + "state": "already_promoted", + "comparableFields": 81, + "matchingTargetFields": 81, + "pendingTargetFields": 0, + "matchingPaths": [ + "deploy/deploy.json.commitId", + "deploy/artifact-catalog.dev.json.commitId", + "deploy/deploy.json.services.hwlab-cloud-api.image", + "deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_COMMIT_ID", + "deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_IMAGE", + "deploy/deploy.json.services.hwlab-cloud-api.env.HWLAB_IMAGE_TAG", + "deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.image", + "deploy/artifact-catalog.dev.json.services.hwlab-cloud-api.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].image", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_COMMIT_ID", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_IMAGE", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-api.containers[0].env.HWLAB_IMAGE_TAG", + "deploy/deploy.json.services.hwlab-cloud-web.image", + "deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_COMMIT_ID", + "deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_IMAGE", + "deploy/deploy.json.services.hwlab-cloud-web.env.HWLAB_IMAGE_TAG", + "deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.image", + "deploy/artifact-catalog.dev.json.services.hwlab-cloud-web.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].image", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_COMMIT_ID", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_IMAGE", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-cloud-web.containers[0].env.HWLAB_IMAGE_TAG", + "deploy/deploy.json.services.hwlab-agent-mgr.image", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.image", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-mgr.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-mgr.containers[0].image", + "deploy/deploy.json.services.hwlab-agent-worker.image", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.image", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-worker.imageTag", + "deploy/k8s/base/workloads.yaml.Job.hwlab-agent-worker-template.containers[0].image", + "deploy/deploy.json.services.hwlab-gateway.image", + "deploy/artifact-catalog.dev.json.services.hwlab-gateway.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-gateway.image", + "deploy/artifact-catalog.dev.json.services.hwlab-gateway.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-gateway.containers[0].image", + "deploy/deploy.json.services.hwlab-gateway-simu.image", + "deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.image", + "deploy/artifact-catalog.dev.json.services.hwlab-gateway-simu.imageTag", + "deploy/k8s/base/workloads.yaml.StatefulSet.hwlab-gateway-simu.containers[0].image", + "deploy/deploy.json.services.hwlab-box-simu.image", + "deploy/artifact-catalog.dev.json.services.hwlab-box-simu.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-box-simu.image", + "deploy/artifact-catalog.dev.json.services.hwlab-box-simu.imageTag", + "deploy/k8s/base/workloads.yaml.StatefulSet.hwlab-box-simu.containers[0].image", + "deploy/deploy.json.services.hwlab-patch-panel.image", + "deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.image", + "deploy/artifact-catalog.dev.json.services.hwlab-patch-panel.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-patch-panel.containers[0].image", + "deploy/deploy.json.services.hwlab-router.image", + "deploy/artifact-catalog.dev.json.services.hwlab-router.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-router.image", + "deploy/artifact-catalog.dev.json.services.hwlab-router.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-router.containers[0].image", + "deploy/deploy.json.services.hwlab-tunnel-client.image", + "deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.image", + "deploy/artifact-catalog.dev.json.services.hwlab-tunnel-client.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-tunnel-client.containers[0].image", + "deploy/deploy.json.services.hwlab-edge-proxy.image", + "deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.image", + "deploy/artifact-catalog.dev.json.services.hwlab-edge-proxy.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-edge-proxy.containers[0].image", + "deploy/deploy.json.services.hwlab-cli.image", + "deploy/artifact-catalog.dev.json.services.hwlab-cli.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-cli.image", + "deploy/artifact-catalog.dev.json.services.hwlab-cli.imageTag", + "deploy/k8s/base/workloads.yaml.Job.hwlab-cli-template.containers[0].image", + "deploy/deploy.json.services.hwlab-agent-skills.image", + "deploy/deploy.json.services.hwlab-agent-skills.env.HWLAB_SKILLS_COMMIT_ID", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.commitId", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.image", + "deploy/artifact-catalog.dev.json.services.hwlab-agent-skills.imageTag", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-skills.containers[0].image", + "deploy/k8s/base/workloads.yaml.Deployment.hwlab-agent-skills.containers[0].env.HWLAB_SKILLS_COMMIT_ID" + ], + "pendingPaths": [] + }, + "commands": [ + "node scripts/deploy-desired-state-plan.mjs --promotion-commit 63acb5989baa9f12266ca3467eb896a454593efc --check --pretty" + ] + }, + "promotionBoundary": { + "writes": [], + "authoritativeDesiredState": [ + "deploy/deploy.json", + "deploy/artifact-catalog.dev.json", + "deploy/k8s/base/workloads.yaml" + ], + "nonAuthoritativeEvidence": [ + "reports/dev-gate/dev-artifacts.json" + ], + "note": "This planner reviews source desired-state only. It does not prove image existence, registry reachability, a real DEV apply, or M3 DEV-LIVE hardware-loop evidence." + }, + "cloudApiDb": { + "contractVersion": "v1", + "environment": "dev", + "status": "pass", + "ready": true, + "secretRef": { + "env": "HWLAB_CLOUD_DB_URL", + "secretName": "hwlab-cloud-api-dev-db", + "secretKey": "database-url", + "deployPlaceholderPresent": true, + "workloadSecretRefPresent": true, + "present": true, + "redacted": true + }, + "sslMode": { + "env": "HWLAB_CLOUD_DB_SSL_MODE", + "value": "disable", + "workloadValue": "disable", + "expected": "disable", + "deployMatches": true, + "workloadMatches": true, + "secret": false + }, + "secretMaterialRead": false, + "valuesRedacted": true, + "liveDbEvidence": false, + "fixtureEvidence": false + }, + "codeAgentProvider": { + "contractVersion": "v1", + "environment": "dev", + "provider": "openai-responses", + "model": "gpt-5.5", + "status": "pass", + "ready": true, + "requiredEnv": [ + { + "name": "HWLAB_CODE_AGENT_PROVIDER", + "deployPresent": true, + "workloadPresent": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "HWLAB_CODE_AGENT_MODEL", + "deployPresent": true, + "workloadPresent": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "OPENAI_API_KEY", + "deployPresent": true, + "workloadPresent": true, + "redacted": true, + "source": "k8s-secret-ref" + }, + { + "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "deployPresent": true, + "workloadPresent": true, + "redacted": true, + "source": "runtime-env" + } + ], + "secretRef": { + "env": "OPENAI_API_KEY", + "secretName": "hwlab-code-agent-provider", + "secretKey": "openai-api-key", + "deployPlaceholderPresent": true, + "workloadSecretRefPresent": true, + "present": true, + "redacted": true + }, + "egress": { + "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "target": "dev-egress-proxy", + "deployPresent": true, + "workloadPresent": true, + "deployMatchesDevProxy": true, + "workloadMatchesDevProxy": true, + "directPublicOpenAi": false, + "valueRedacted": true + }, + "missingDeployEnv": [], + "missingWorkloadEnv": [], + "deployMismatches": [], + "workloadMismatches": [], + "missingSecretRefs": [], + "missingEgressContract": [], + "secretMaterialRead": false, + "valuesRedacted": true, + "providerConnected": false, + "fixtureEvidence": false + }, + "reportHints": { + "path": "reports/dev-gate/dev-artifacts.json", + "present": true, + "authoritative": false, + "note": "report snapshots are contextual evidence only; deploy desired-state remains authoritative in deploy/, not reports/", + "commitId": "63acb59", + "matchesDesiredState": true, + "artifactPublish": { + "status": "published", + "sourceCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "sourceMatchesDesiredState": true, + "publishedCount": 13, + "serviceCount": 13, + "registryVerified": null, + "registryCapabilitiesClassification": "degraded" + } + }, + "services": [ + { + "serviceId": "hwlab-cloud-api", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": { + "HWLAB_COMMIT_ID": { + "name": "HWLAB_COMMIT_ID", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + }, + "HWLAB_IMAGE": { + "name": "HWLAB_IMAGE", + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "status": "match" + }, + "HWLAB_IMAGE_TAG": { + "name": "HWLAB_IMAGE_TAG", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + } + }, + "missing": [ + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-cloud-api", + "namespace": "hwlab-dev", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": { + "HWLAB_COMMIT_ID": { + "name": "HWLAB_COMMIT_ID", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + }, + "HWLAB_IMAGE": { + "name": "HWLAB_IMAGE", + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "status": "match" + }, + "HWLAB_IMAGE_TAG": { + "name": "HWLAB_IMAGE_TAG", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + } + }, + "missing": [ + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "workloadImages": [ + { + "workload": "hwlab-cloud-api", + "container": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-cloud-web", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": { + "HWLAB_COMMIT_ID": { + "name": "HWLAB_COMMIT_ID", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + }, + "HWLAB_IMAGE": { + "name": "HWLAB_IMAGE", + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "status": "match" + }, + "HWLAB_IMAGE_TAG": { + "name": "HWLAB_IMAGE_TAG", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + } + }, + "missing": [ + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": { + "HWLAB_COMMIT_ID": { + "name": "HWLAB_COMMIT_ID", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + }, + "HWLAB_IMAGE": { + "name": "HWLAB_IMAGE", + "value": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "status": "match" + }, + "HWLAB_IMAGE_TAG": { + "name": "HWLAB_IMAGE_TAG", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + } + }, + "missing": [ + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "workloadImages": [ + { + "workload": "hwlab-cloud-web", + "container": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-agent-mgr", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-agent-mgr", + "namespace": "hwlab-dev", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "workloadImages": [ + { + "workload": "hwlab-agent-mgr", + "container": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-agent-worker", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Job", + "name": "hwlab-agent-worker-template", + "namespace": "hwlab-dev", + "container": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "workloadImages": [ + { + "workload": "hwlab-agent-worker-template", + "container": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-gateway", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-gateway", + "namespace": "hwlab-dev", + "container": "hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "workloadImages": [ + { + "workload": "hwlab-gateway", + "container": "hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-gateway-simu", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "StatefulSet", + "name": "hwlab-gateway-simu", + "namespace": "hwlab-dev", + "container": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "workloadImages": [ + { + "workload": "hwlab-gateway-simu", + "container": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-box-simu", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "StatefulSet", + "name": "hwlab-box-simu", + "namespace": "hwlab-dev", + "container": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "workloadImages": [ + { + "workload": "hwlab-box-simu", + "container": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-patch-panel", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-patch-panel", + "namespace": "hwlab-dev", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "workloadImages": [ + { + "workload": "hwlab-patch-panel", + "container": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-router", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-router", + "namespace": "hwlab-dev", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "workloadImages": [ + { + "workload": "hwlab-router", + "container": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-tunnel-client", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-tunnel-client", + "namespace": "hwlab-dev", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "workloadImages": [ + { + "workload": "hwlab-tunnel-client", + "container": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-edge-proxy", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-edge-proxy", + "namespace": "hwlab-dev", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "workloadImages": [ + { + "workload": "hwlab-edge-proxy", + "container": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-cli", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Job", + "name": "hwlab-cli-template", + "namespace": "hwlab-dev", + "container": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": {}, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_SKILLS_COMMIT_ID", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "workloadImages": [ + { + "workload": "hwlab-cli-template", + "container": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" + } + ] + } + }, + { + "serviceId": "hwlab-agent-skills", + "deploy": { + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": { + "HWLAB_SKILLS_COMMIT_ID": { + "name": "HWLAB_SKILLS_COMMIT_ID", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + } + }, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + }, + "catalog": { + "commitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", + "publishState": "published", + "artifactRequired": true + }, + "workloads": [ + { + "kind": "Deployment", + "name": "hwlab-agent-skills", + "namespace": "hwlab-dev", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "imageTag": "63acb59", + "envMirrors": { + "present": { + "HWLAB_SKILLS_COMMIT_ID": { + "name": "HWLAB_SKILLS_COMMIT_ID", + "value": "63acb59", + "expected": "63acb59", + "status": "match" + } + }, + "missing": [ + "HWLAB_COMMIT_ID", + "HWLAB_IMAGE", + "HWLAB_IMAGE_TAG", + "HWLAB_IMAGE_DIGEST" + ], + "diagnostics": [] + } + } + ], + "promotion": { + "targetCommitId": "63acb5989baa9f12266ca3467eb896a454593efc", + "targetImageTag": "63acb59", + "deployImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "catalogImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "workloadImages": [ + { + "workload": "hwlab-agent-skills", + "container": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59" + } + ] + } + } + ], + "diagnostics": [] + }, + "stdoutTail": null, + "stderrTail": "", + "reportPath": null + }, + { + "id": "dev-deploy-apply", + "phase": "applying", + "status": "pass", + "command": "/opt/node-v20.19.2-linux-x64/bin/node scripts/dev-deploy-apply.mjs --apply --confirm-dev --confirmed-non-production --write-report", + "code": 0, + "startedAt": "2026-05-23T09:40:33.012Z", + "finishedAt": "2026-05-23T09:40:35.316Z", + "stdoutJson": { + "$schema": "https://hwlab.pikastech.local/schemas/dev-gate-report.schema.json", + "$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-deploy-report.json", + "reportVersion": "v1", + "issue": "pikasTech/HWLAB#33", + "supports": [ + "pikasTech/HWLAB#164", + "pikasTech/HWLAB#143", + "pikasTech/HWLAB#99", + "pikasTech/HWLAB#63", + "pikasTech/HWLAB#50", + "pikasTech/HWLAB#7", + "pikasTech/HWLAB#33", + "pikasTech/HWLAB#17", + "pikasTech/HWLAB#32", + "pikasTech/HWLAB#30" + ], + "taskId": "dev-deploy-apply", + "commitId": "63acb59", + "acceptanceLevel": "dev_deploy_apply", + "devOnly": true, + "prodDisabled": true, + "reportLifecycle": { + "version": "v1", + "state": "active", + "activeEndpoint": "http://74.48.78.17:16667", + "activeBrowserEndpoint": "http://74.48.78.17:16666", + "deprecatedEndpoint": null, + "summary": "Current DEV deploy apply report; active public API/health endpoint is 16667 and browser endpoint is 16666." + }, + "status": "pass", + "generatedAt": "2026-05-23T09:40:35.311Z", + "namespace": "hwlab-dev", + "endpoint": "http://74.48.78.17:16667", + "sourceContract": { + "status": "pass", + "documents": [ + "docs/dev-acceptance-matrix.md", + "docs/m0-contract-audit.md", + "docs/dev-deploy-apply.md", + "docs/artifact-catalog.md", + "deploy/README.md" + ], + "summary": "DEV deploy apply is pinned to hwlab-dev and the frozen HWLAB service IDs" + }, + "validationCommands": [ + "node --check scripts/validate-dev-gate-report.mjs", + "node scripts/validate-dev-gate-report.mjs", + "node --check scripts/dev-deploy-apply.mjs", + "node --check scripts/src/dev-deploy-apply.mjs", + "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked" + ], + "localSmoke": { + "status": "not_run", + "commands": [ + "node scripts/m1-contract-smoke.mjs" + ], + "evidence": [ + "This deploy apply task did not run local smoke because artifact/executor blockers stop promotion first." + ], + "summary": "Local smoke remains available but is not a substitute for DEV artifact publish evidence." + }, + "dryRun": { + "status": "pass", + "commands": [ + "node tools/hwlab-cli/bin/hwlab-cli.mjs test e2e --env dev --mvp --dry-run", + "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked" + ], + "evidence": [ + "artifact services checked: 13", + "expected artifact commit: 63acb59", + "namespace: hwlab-dev", + "workloads planned: 13", + "kubectl executor: /usr/local/bin/kubectl", + "kubectl kubeconfig source: env:KUBECONFIG", + "kubectl kubeconfig: /var/lib/unidesk/code-queue/kubeconfig", + "live health: pass", + "code agent provider desired-state: pass", + "code agent provider live env before apply: pass", + "template job replacements: 0", + "legacy simulator deployment cleanups: 0" + ], + "summary": "DEV dry-run preflight passed." + }, + "devPreconditions": { + "status": "pass", + "requirements": [ + "DEV artifact catalog must contain CI publish evidence and registry digests", + "kubectl must be available for D601 hwlab-dev and must not target PROD", + "hwlab-cloud-api /health/live must report serviceId, dev environment, and DB env readiness without exposing secret values", + "hwlab-cloud-api must declare and preserve OPENAI_API_KEY from hwlab-code-agent-provider/openai-api-key plus the DEV Code Agent egress proxy env without reading Secret values", + "pods, services, configmaps, and image commit tags must be observable in hwlab-dev" + ], + "summary": "DEV deploy preconditions are satisfied." + }, + "devDeployApply": { + "mode": "apply", + "conclusion": { + "status": "ready", + "reason": "All DEV-only preconditions passed; human approval is still required before apply.", + "blockerCount": 0 + }, + "applyBoundary": { + "currentMode": "apply-requested", + "defaultNoWrite": false, + "mutationAttempted": true, + "mutationAllowed": true, + "applyRequiresFlags": [ + "--apply", + "--confirm-dev", + "--confirmed-non-production" + ], + "kubeconfigSource": "env:KUBECONFIG", + "writeScope": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl apply -k deploy/k8s/dev, namespace hwlab-dev only; delete/recreate is allowed only for explicitly allowlisted suspended DEV template Jobs and stale legacy simulator Deployments", + "noWriteScope": "source/catalog/k8s validation, optional DEV health probe, KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl read, replacement planning, and server-side dry-run only", + "forbiddenActions": [ + "prod-deploy", + "secret-read", + "runtime-substitute", + "unidesk-restart", + "code-queue-restart", + "backend-core-restart", + "heavy-master-e2e", + "force-push" + ] + }, + "mutationAttempted": true, + "target": { + "environment": "dev", + "namespace": "hwlab-dev", + "endpoint": "http://74.48.78.17:16667", + "prodDisabled": true + }, + "artifactPlan": { + "expectedArtifactCommit": "63acb59", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "sourceCommitId": "63acb59", + "serviceCommitIds": [ + "63acb59" + ], + "matchesSourceCommit": true, + "published": true, + "registryVerified": true, + "imageCount": 13, + "requiredServiceCount": 13, + "disabledServiceCount": 0, + "unpublishedServices": [] + }, + "workloadPlan": [ + { + "kind": "Deployment", + "name": "hwlab-cloud-api", + "namespace": "hwlab-dev", + "replicas": 1, + "serviceIds": [ + "hwlab-cloud-api" + ], + "containers": [ + { + "name": "hwlab-cloud-api", + "serviceId": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59" + } + ] + }, + { + "kind": "Deployment", + "name": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "replicas": 1, + "serviceIds": [ + "hwlab-cloud-web" + ], + "containers": [ + { + "name": "hwlab-cloud-web", + "serviceId": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59" + } + ] + }, + { + "kind": "Deployment", + "name": "hwlab-agent-mgr", + "namespace": "hwlab-dev", + "replicas": 1, + "serviceIds": [ + "hwlab-agent-mgr" + ], + "containers": [ + { + "name": "hwlab-agent-mgr", + "serviceId": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59" + } + ] + }, + { + "kind": "Job", + "name": "hwlab-agent-worker-template", + "namespace": "hwlab-dev", + "replicas": 0, + "serviceIds": [ + "hwlab-agent-worker" + ], + "containers": [ + { + "name": "hwlab-agent-worker", + "serviceId": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" + } + ] + }, + { + "kind": "Deployment", + "name": "hwlab-gateway", + "namespace": "hwlab-dev", + "replicas": 0, + "serviceIds": [ + "hwlab-gateway" + ], + "containers": [ + { + "name": "hwlab-gateway", + "serviceId": "hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59" + } + ] + }, + { + "kind": "StatefulSet", + "name": "hwlab-gateway-simu", + "namespace": "hwlab-dev", + "replicas": 2, + "serviceIds": [ + "hwlab-gateway-simu" + ], + "containers": [ + { + "name": "hwlab-gateway-simu", + "serviceId": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59" + } + ] + }, + { + "kind": "StatefulSet", + "name": "hwlab-box-simu", + "namespace": "hwlab-dev", + "replicas": 2, + "serviceIds": [ + "hwlab-box-simu" + ], + "containers": [ + { + "name": "hwlab-box-simu", + "serviceId": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59" + } + ] + }, + { + "kind": "Deployment", + "name": "hwlab-patch-panel", + "namespace": "hwlab-dev", + "replicas": 1, + "serviceIds": [ + "hwlab-patch-panel" + ], + "containers": [ + { + "name": "hwlab-patch-panel", + "serviceId": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59" + } + ] + }, + { + "kind": "Deployment", + "name": "hwlab-router", + "namespace": "hwlab-dev", + "replicas": 1, + "serviceIds": [ + "hwlab-router" + ], + "containers": [ + { + "name": "hwlab-router", + "serviceId": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59" + } + ] + }, + { + "kind": "Deployment", + "name": "hwlab-tunnel-client", + "namespace": "hwlab-dev", + "replicas": 1, + "serviceIds": [ + "hwlab-tunnel-client" + ], + "containers": [ + { + "name": "hwlab-tunnel-client", + "serviceId": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59" + } + ] + }, + { + "kind": "Deployment", + "name": "hwlab-edge-proxy", + "namespace": "hwlab-dev", + "replicas": 1, + "serviceIds": [ + "hwlab-edge-proxy" + ], + "containers": [ + { + "name": "hwlab-edge-proxy", + "serviceId": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59" + } + ] + }, + { + "kind": "Job", + "name": "hwlab-cli-template", + "namespace": "hwlab-dev", + "replicas": 0, + "serviceIds": [ + "hwlab-cli" + ], + "containers": [ + { + "name": "hwlab-cli", + "serviceId": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" + } + ] + }, + { + "kind": "Deployment", + "name": "hwlab-agent-skills", + "namespace": "hwlab-dev", + "replicas": 1, + "serviceIds": [ + "hwlab-agent-skills" + ], + "containers": [ + { + "name": "hwlab-agent-skills", + "serviceId": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59" + } + ] + } + ], + "servicePlan": [ + { + "kind": "Service", + "name": "hwlab-cloud-api", + "namespace": "hwlab-dev", + "serviceId": "hwlab-cloud-api", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 6667, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-gateway-simu-1", + "namespace": "hwlab-dev", + "serviceId": "hwlab-gateway-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7101, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-gateway-simu-2", + "namespace": "hwlab-dev", + "serviceId": "hwlab-gateway-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7101, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "serviceId": "hwlab-cloud-web", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 8080, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-box-simu-1", + "namespace": "hwlab-dev", + "serviceId": "hwlab-box-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7201, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-box-simu-2", + "namespace": "hwlab-dev", + "serviceId": "hwlab-box-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7201, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-gateway", + "namespace": "hwlab-dev", + "serviceId": "hwlab-gateway", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7001, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-cli", + "namespace": "hwlab-dev", + "serviceId": "hwlab-cli", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7501, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-agent-skills", + "namespace": "hwlab-dev", + "serviceId": "hwlab-agent-skills", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7430, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-agent-mgr", + "namespace": "hwlab-dev", + "serviceId": "hwlab-agent-mgr", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7410, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-gateway-simu", + "namespace": "hwlab-dev", + "serviceId": "hwlab-gateway-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7101, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-box-simu", + "namespace": "hwlab-dev", + "serviceId": "hwlab-box-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7201, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-patch-panel", + "namespace": "hwlab-dev", + "serviceId": "hwlab-patch-panel", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7301, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-router", + "namespace": "hwlab-dev", + "serviceId": "hwlab-router", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7401, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-tunnel-client", + "namespace": "hwlab-dev", + "serviceId": "hwlab-tunnel-client", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7402, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-edge-proxy", + "namespace": "hwlab-dev", + "serviceId": "hwlab-edge-proxy", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 6667, + "targetPort": "http" + } + ] + } + ], + "templateJobReplacementPolicy": { + "status": "active", + "namespace": "hwlab-dev", + "scope": "DEV-only suspended template Jobs", + "allowedJobs": [ + { + "name": "hwlab-agent-worker-template", + "serviceId": "hwlab-agent-worker", + "reason": "suspended session worker template Job has immutable spec.template" + }, + { + "name": "hwlab-cli-template", + "serviceId": "hwlab-cli", + "reason": "suspended CLI template Job has immutable spec.template" + } + ] + }, + "templateJobReplacements": [ + { + "namespace": "hwlab-dev", + "jobName": "hwlab-agent-worker-template", + "allowed": true, + "desiredSuspended": true, + "liveExists": true, + "liveSuspended": true, + "oldImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "oldImages": [ + { + "name": "hwlab-agent-worker", + "serviceId": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" + } + ], + "newImages": [ + { + "name": "hwlab-agent-worker", + "serviceId": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" + } + ], + "replace": false, + "result": "not_needed", + "reason": "Live suspended template Job already matches the desired image." + }, + { + "namespace": "hwlab-dev", + "jobName": "hwlab-cli-template", + "allowed": true, + "desiredSuspended": true, + "liveExists": true, + "liveSuspended": true, + "oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "newImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "oldImages": [ + { + "name": "hwlab-cli", + "serviceId": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" + } + ], + "newImages": [ + { + "name": "hwlab-cli", + "serviceId": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" + } + ], + "replace": false, + "result": "not_needed", + "reason": "Live suspended template Job already matches the desired image." + } + ], + "legacySimulatorDeploymentCleanupPolicy": { + "status": "active", + "namespace": "hwlab-dev", + "scope": "DEV-only stale simulator Deployments replaced by indexed StatefulSets", + "allowedDeployments": [ + { + "name": "hwlab-gateway-simu", + "serviceId": "hwlab-gateway-simu", + "replacementKind": "StatefulSet", + "reason": "M3 DEV requires exactly two indexed gateway-simu identities/sessions" + }, + { + "name": "hwlab-box-simu", + "serviceId": "hwlab-box-simu", + "replacementKind": "StatefulSet", + "reason": "M3 DEV requires exactly two indexed box-simu resource identities" + } + ] + }, + "legacySimulatorDeploymentCleanups": [ + { + "namespace": "hwlab-dev", + "deploymentName": "hwlab-gateway-simu", + "serviceId": "hwlab-gateway-simu", + "allowed": true, + "desiredReplacementExists": true, + "desiredReplacementKind": "StatefulSet", + "liveExists": false, + "oldImage": null, + "newImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "oldImages": [], + "newImages": [ + { + "name": "hwlab-gateway-simu", + "serviceId": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59" + } + ], + "cleanup": false, + "result": "not_found", + "reason": "Live legacy Deployment is absent; no cleanup is needed." + }, + { + "namespace": "hwlab-dev", + "deploymentName": "hwlab-box-simu", + "serviceId": "hwlab-box-simu", + "allowed": true, + "desiredReplacementExists": true, + "desiredReplacementKind": "StatefulSet", + "liveExists": false, + "oldImage": null, + "newImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "oldImages": [], + "newImages": [ + { + "name": "hwlab-box-simu", + "serviceId": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59" + } + ], + "cleanup": false, + "result": "not_found", + "reason": "Live legacy Deployment is absent; no cleanup is needed." + } + ], + "cloudWebRollout": { + "serviceId": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "status": "observed", + "observationPhase": "after_apply", + "sourceCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "repositoryDigest": null, + "publishState": "published", + "rolloutRevision": "34", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageMatchesDesired": true, + "expectedRuntimeEnv": { + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" + }, + "liveRuntimeEnv": { + "status": "match", + "matchesDesired": true, + "fields": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "63acb59", + "actual": "63acb59", + "status": "match" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "status": "match" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "63acb59", + "actual": "63acb59", + "status": "match" + } + ], + "drift": [] + }, + "runtimeEnvMatchesDesired": true, + "runtimeEnvDrift": [], + "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "kubeconfigSource": "env:KUBECONFIG" + }, + "cloudWebRolloutBeforeApply": { + "serviceId": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "status": "observed", + "observationPhase": "before_apply", + "sourceCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "repositoryDigest": null, + "publishState": "published", + "rolloutRevision": "34", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageMatchesDesired": true, + "expectedRuntimeEnv": { + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" + }, + "liveRuntimeEnv": { + "status": "match", + "matchesDesired": true, + "fields": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "63acb59", + "actual": "63acb59", + "status": "match" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "status": "match" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "63acb59", + "actual": "63acb59", + "status": "match" + } + ], + "drift": [] + }, + "runtimeEnvMatchesDesired": true, + "runtimeEnvDrift": [], + "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "kubeconfigSource": "env:KUBECONFIG" + }, + "cloudWebRolloutAfterApply": { + "serviceId": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "status": "observed", + "observationPhase": "after_apply", + "sourceCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "repositoryDigest": null, + "publishState": "published", + "rolloutRevision": "34", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageMatchesDesired": true, + "expectedRuntimeEnv": { + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" + }, + "liveRuntimeEnv": { + "status": "match", + "matchesDesired": true, + "fields": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "63acb59", + "actual": "63acb59", + "status": "match" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "status": "match" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "63acb59", + "actual": "63acb59", + "status": "match" + } + ], + "drift": [] + }, + "runtimeEnvMatchesDesired": true, + "runtimeEnvDrift": [], + "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "kubeconfigSource": "env:KUBECONFIG" + }, + "codeAgentProvider": { + "desiredState": { + "contractVersion": "v1", + "environment": "dev", + "provider": "openai-responses", + "model": "gpt-5.5", + "status": "pass", + "ready": true, + "requiredEnv": [ + { + "name": "HWLAB_CODE_AGENT_PROVIDER", + "deployPresent": true, + "workloadPresent": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "HWLAB_CODE_AGENT_MODEL", + "deployPresent": true, + "workloadPresent": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "OPENAI_API_KEY", + "deployPresent": true, + "workloadPresent": true, + "redacted": true, + "source": "k8s-secret-ref" + }, + { + "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "deployPresent": true, + "workloadPresent": true, + "redacted": true, + "source": "runtime-env" + } + ], + "secretRef": { + "env": "OPENAI_API_KEY", + "secretName": "hwlab-code-agent-provider", + "secretKey": "openai-api-key", + "deployPlaceholderPresent": true, + "workloadSecretRefPresent": true, + "present": true, + "redacted": true + }, + "egress": { + "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "target": "dev-egress-proxy", + "deployPresent": true, + "workloadPresent": true, + "deployMatchesDevProxy": true, + "workloadMatchesDevProxy": true, + "directPublicOpenAi": false, + "valueRedacted": true + }, + "missingDeployEnv": [], + "missingWorkloadEnv": [], + "deployMismatches": [], + "workloadMismatches": [], + "missingSecretRefs": [], + "missingEgressContract": [], + "secretMaterialRead": false, + "valuesRedacted": true, + "providerConnected": false, + "fixtureEvidence": false + }, + "liveBeforeApply": { + "phase": "before_apply", + "namespace": "hwlab-dev", + "serviceId": "hwlab-cloud-api", + "status": "pass", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "expectedSecretRef": "hwlab-code-agent-provider/openai-api-key", + "expectedEgressTarget": "dev-egress-proxy", + "secretValuesRead": false, + "kubernetesSecretDataRead": false, + "valuesRedacted": true, + "contractVersion": "v1", + "environment": "dev", + "provider": "openai-responses", + "model": "gpt-5.5", + "ready": true, + "requiredEnv": [ + { + "name": "HWLAB_CODE_AGENT_PROVIDER", + "present": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "HWLAB_CODE_AGENT_MODEL", + "present": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "OPENAI_API_KEY", + "present": true, + "redacted": true, + "source": "k8s-secret-ref" + }, + { + "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "present": true, + "redacted": true, + "source": "runtime-env" + } + ], + "missingEnv": [], + "mismatchedEnv": [], + "secretRef": { + "env": "OPENAI_API_KEY", + "secretName": "hwlab-code-agent-provider", + "secretKey": "openai-api-key", + "present": true, + "redacted": true + }, + "egress": { + "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "target": "dev-egress-proxy", + "present": true, + "matchesDevProxy": true, + "directPublicOpenAi": false, + "valueRedacted": true + }, + "secretMaterialRead": false, + "providerConnected": false, + "deployment": "hwlab-cloud-api", + "container": "hwlab-cloud-api", + "validationScope": "deployment-env-and-secretKeyRef-metadata-only" + }, + "liveAfterApply": { + "phase": "after_apply", + "namespace": "hwlab-dev", + "serviceId": "hwlab-cloud-api", + "status": "pass", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "expectedSecretRef": "hwlab-code-agent-provider/openai-api-key", + "expectedEgressTarget": "dev-egress-proxy", + "secretValuesRead": false, + "kubernetesSecretDataRead": false, + "valuesRedacted": true, + "contractVersion": "v1", + "environment": "dev", + "provider": "openai-responses", + "model": "gpt-5.5", + "ready": true, + "requiredEnv": [ + { + "name": "HWLAB_CODE_AGENT_PROVIDER", + "present": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "HWLAB_CODE_AGENT_MODEL", + "present": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "OPENAI_API_KEY", + "present": true, + "redacted": true, + "source": "k8s-secret-ref" + }, + { + "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "present": true, + "redacted": true, + "source": "runtime-env" + } + ], + "missingEnv": [], + "mismatchedEnv": [], + "secretRef": { + "env": "OPENAI_API_KEY", + "secretName": "hwlab-code-agent-provider", + "secretKey": "openai-api-key", + "present": true, + "redacted": true + }, + "egress": { + "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "target": "dev-egress-proxy", + "present": true, + "matchesDevProxy": true, + "directPublicOpenAi": false, + "valueRedacted": true + }, + "secretMaterialRead": false, + "providerConnected": false, + "deployment": "hwlab-cloud-api", + "container": "hwlab-cloud-api", + "validationScope": "deployment-env-and-secretKeyRef-metadata-only" + }, + "validationGate": "no-secret provider env/secretKeyRef preservation", + "providerCallAttempted": false, + "secretValuesRead": false, + "kubernetesSecretDataRead": false, + "valuesRedacted": true + }, + "applyStep": { + "status": "pass", + "command": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl apply -k deploy/k8s/dev", + "stdout": "namespace/hwlab-dev unchanged\nconfigmap/hwlab-dev-health-contract unchanged\nservice/hwlab-agent-mgr unchanged\nservice/hwlab-agent-skills unchanged\nservice/hwlab-box-simu unchanged\nservice/hwlab-box-simu-1 unchanged\nservice/hwlab-box-simu-2 unchanged\nservice/hwlab-cli unchanged\nservice/hwlab-cloud-api unchanged\nservice/hwlab-cloud-web unchanged\nservice/hwlab-edge-proxy unchanged\nservice/hwlab-gateway unchanged\nservice/hwlab-gateway-simu unchanged\nservice/hwlab-gateway-simu-1 unchanged\nservice/hwlab-gateway-simu-2 unchanged\nservice/hwlab-patch-panel unchanged\nservice/hwlab-router unchanged\nservice/hwlab-tunnel-client unchanged\ndeployment.apps/hwlab-agent-mgr unchanged\ndeployment.apps/hwlab-agent-skills unchanged\ndeployment.apps/hwlab-cloud-api unchanged\ndeployment.apps/hwlab-cloud-web unchanged\ndeployment.apps/hwlab-edge-proxy unchanged\ndeployment.apps/hwlab-gateway unchanged\ndeployment.apps/hwlab-patch-panel unchanged\ndeployment.apps/hwlab-router unchanged\ndeployment.apps/hwlab-tunnel-client unchanged\nstatefulset.apps/hwlab-box-simu unchanged\nstatefulset.apps/hwlab-gateway-simu unchanged\njob.batch/hwlab-agent-worker-template unchanged\njob.batch/hwlab-cli-template unchanged", + "stderr": "# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.\n# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.", + "mutationAttempted": true, + "expectedImmutableTemplateJobDryRun": false, + "expectedImmutableTemplateJobs": [] + }, + "manualCommands": { + "status": "ready", + "beforeHumanApproval": [ + "node scripts/dev-deploy-apply.mjs --dry-run --write-report", + "node scripts/validate-dev-gate-report.mjs" + ], + "afterHumanApproval": [ + "node scripts/dev-cd-apply.mjs --apply --confirm-dev --confirmed-non-production --write-report" + ], + "summary": "Run the dry-run plan and validator immediately before requesting human approval; live apply still requires the explicit DEV confirmation flags." + }, + "rollbackHint": { + "namespace": "hwlab-dev", + "strategy": "DEV-only Kubernetes rollback using deployment revision history; do not touch PROD or UniDesk services.", + "captureBeforeApply": [ + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get pods,services,configmaps,deployments,jobs -o wide", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployments -o json" + ], + "deploymentRollbackCommands": [ + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-api", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-web", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-mgr", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-gateway", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-patch-panel", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-router", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-tunnel-client", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-edge-proxy", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-skills" + ], + "jobCleanupCommands": [ + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found" + ], + "postRollbackChecks": [ + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-api --timeout=120s", + "curl -fsS http://74.48.78.17:16667/health/live" + ] + }, + "remainingBlockers": [], + "artifactEvidence": [ + { + "serviceId": "hwlab-cloud-api", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", + "publishState": "published" + }, + { + "serviceId": "hwlab-cloud-web", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", + "publishState": "published" + }, + { + "serviceId": "hwlab-agent-mgr", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", + "publishState": "published" + }, + { + "serviceId": "hwlab-agent-worker", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", + "publishState": "published" + }, + { + "serviceId": "hwlab-gateway", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", + "publishState": "published" + }, + { + "serviceId": "hwlab-gateway-simu", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", + "publishState": "published" + }, + { + "serviceId": "hwlab-box-simu", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", + "publishState": "published" + }, + { + "serviceId": "hwlab-patch-panel", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", + "publishState": "published" + }, + { + "serviceId": "hwlab-router", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", + "publishState": "published" + }, + { + "serviceId": "hwlab-tunnel-client", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", + "publishState": "published" + }, + { + "serviceId": "hwlab-edge-proxy", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", + "publishState": "published" + }, + { + "serviceId": "hwlab-cli", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", + "publishState": "published" + }, + { + "serviceId": "hwlab-agent-skills", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", + "publishState": "published" + } + ], + "cloudApiDb": { + "status": "contract-ready", + "requiredEnv": [ + { + "name": "HWLAB_CLOUD_DB_URL", + "manifestPresent": true, + "k8sPresent": true, + "redacted": true, + "source": "k8s-secret-ref", + "secretRef": { + "secretName": "hwlab-cloud-api-dev-db", + "secretKey": "database-url", + "present": true, + "redacted": true + } + }, + { + "name": "HWLAB_CLOUD_DB_SSL_MODE", + "manifestPresent": true, + "k8sPresent": true, + "redacted": false, + "source": "runtime-env", + "secretRef": null + } + ], + "missingManifest": [], + "missingK8s": [], + "missingSecretRefs": [], + "mismatchedNonSecretEnv": [], + "missingDnsContract": [], + "dns": { + "ready": true, + "source": "optional-public-dns-alias", + "serviceName": "cloud-api-db", + "namespace": "hwlab-dev", + "port": 5432, + "portName": "postgres", + "requiredForReadiness": false, + "usedForProbe": false, + "servicePresent": false, + "secretMaterialRead": false, + "liveDbEvidence": false, + "missing": [], + "actual": {} + }, + "runtimeHealth": { + "status": "degraded", + "ready": false, + "configReady": true, + "connected": false, + "liveConnected": false, + "connectionChecked": false, + "connectionAttempted": false, + "connectionResult": "unknown", + "liveDbEvidence": false, + "requiredEnv": [ + { + "name": "HWLAB_CLOUD_DB_URL", + "present": true, + "redacted": true + }, + { + "name": "HWLAB_CLOUD_DB_SSL_MODE", + "present": true, + "redacted": false + } + ], + "missingEnv": [], + "secretRefs": [ + { + "env": "HWLAB_CLOUD_DB_URL", + "secretName": "hwlab-cloud-api-dev-db", + "secretKey": "database-url", + "present": true, + "envInjected": true, + "secretPresent": "not_observed", + "secretKeyPresent": "not_observed", + "redacted": true + } + ], + "endpointSource": "secret-url-host", + "optionalPublicDnsAlias": { + "source": "optional-public-dns-alias", + "serviceName": "cloud-api-db", + "namespace": "hwlab-dev", + "port": 5432, + "portName": "postgres", + "requiredForReadiness": false, + "usedForProbe": false, + "envPresent": false, + "readyGate": "not_readiness_authority" + }, + "connection": { + "attempted": false, + "result": "unknown", + "endpointRedacted": true, + "valueRedacted": true + }, + "redaction": { + "valuesRedacted": true, + "endpointRedacted": true, + "valueRedacted": true, + "secretMaterialRead": false, + "secretRefsOnly": true + }, + "readinessLayers": { + "dns": { + "status": "not_proven", + "result": "unknown" + }, + "tcp": { + "status": "not_proven", + "result": "unknown" + }, + "ssl": { + "status": "not_proven", + "result": "unknown" + }, + "auth": { + "status": "not_proven", + "result": "unknown" + }, + "schema": { + "status": "not_proven", + "result": "unknown" + }, + "migration": { + "status": "not_proven", + "result": "unknown" + }, + "durability": { + "status": "not_proven", + "result": "unknown" + } + }, + "blocker": null, + "fixtureEvidence": false + }, + "secretMaterialRead": false, + "valuesRedacted": true, + "liveDbEvidence": false, + "fixtureEvidence": false, + "note": "This check records DB env, Secret reference, and Secret URL host authority only. Optional cloud-api-db alias presence is diagnostic and is not live DB evidence." + }, + "k8sManifest": { + "resourceCounts": { + "workloads": 13, + "services": 16, + "configMaps": 1 + }, + "images": [ + { + "serviceId": "hwlab-cloud-api", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "kind": "Deployment", + "name": "hwlab-cloud-api" + }, + { + "serviceId": "hwlab-cloud-web", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "kind": "Deployment", + "name": "hwlab-cloud-web" + }, + { + "serviceId": "hwlab-agent-mgr", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "kind": "Deployment", + "name": "hwlab-agent-mgr" + }, + { + "serviceId": "hwlab-agent-worker", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "kind": "Job", + "name": "hwlab-agent-worker-template" + }, + { + "serviceId": "hwlab-gateway", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "kind": "Deployment", + "name": "hwlab-gateway" + }, + { + "serviceId": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "kind": "StatefulSet", + "name": "hwlab-gateway-simu" + }, + { + "serviceId": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "kind": "StatefulSet", + "name": "hwlab-box-simu" + }, + { + "serviceId": "hwlab-patch-panel", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "kind": "Deployment", + "name": "hwlab-patch-panel" + }, + { + "serviceId": "hwlab-router", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "kind": "Deployment", + "name": "hwlab-router" + }, + { + "serviceId": "hwlab-tunnel-client", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "kind": "Deployment", + "name": "hwlab-tunnel-client" + }, + { + "serviceId": "hwlab-edge-proxy", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "kind": "Deployment", + "name": "hwlab-edge-proxy" + }, + { + "serviceId": "hwlab-cli", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "kind": "Job", + "name": "hwlab-cli-template" + }, + { + "serviceId": "hwlab-agent-skills", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "kind": "Deployment", + "name": "hwlab-agent-skills" + } + ], + "runtimeIdentityEnv": [ + { + "serviceId": "hwlab-cloud-web", + "kind": "Deployment", + "name": "hwlab-cloud-web", + "container": "hwlab-cloud-web", + "expected": { + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" + }, + "status": "match", + "matchesDesired": true, + "fields": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "63acb59", + "actual": "63acb59", + "status": "match" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "status": "match" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "63acb59", + "actual": "63acb59", + "status": "match" + } + ], + "drift": [] + } + ] + }, + "clusterObservation": { + "status": "pass", + "executor": "/usr/local/bin/kubectl", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "kubeconfigSource": "env:KUBECONFIG", + "commandPrefix": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl get pods,services,configmaps,deployments,jobs -n hwlab-dev -o json", + "version": "clientVersion:\n buildDate: \"2026-05-12T09:54:35Z\"\n compiler: gc\n gitCommit: 756939600b9a7180fc2df6550a4585b638875e67\n gitTreeState: clean\n gitVersion: v1.36.1\n goVersion: go1.26.2\n major: \"1\"\n minor: \"36\"\n platform: linux/amd64\nkustomizeVersion: v5.8.1", + "resources": [ + { + "kind": "Pod", + "name": "hwlab-agent-mgr-57d8bc9f89-5kv4p", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-agent-skills-8687f446fd-lqtgt", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-box-simu-0", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-box-simu-1", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-cloud-api-668549d448-gnct8", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-cloud-web-fc896cddb-gwh58", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-edge-proxy-5ff8d747d-rgdjm", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-frpc-59f57d479c-wm5l2", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-gateway-simu-0", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-gateway-simu-1", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-patch-panel-79c59cd5b7-dl4sz", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-router-7d47d6dfc4-gzcw9", + "phase": "Running" + }, + { + "kind": "Pod", + "name": "hwlab-tunnel-client-64779fc4bd-pz8lz", + "phase": "Running" + }, + { + "kind": "Service", + "name": "hwlab-agent-mgr" + }, + { + "kind": "Service", + "name": "hwlab-agent-skills" + }, + { + "kind": "Service", + "name": "hwlab-box-simu" + }, + { + "kind": "Service", + "name": "hwlab-box-simu-1" + }, + { + "kind": "Service", + "name": "hwlab-box-simu-2" + }, + { + "kind": "Service", + "name": "hwlab-cli" + }, + { + "kind": "Service", + "name": "hwlab-cloud-api" + }, + { + "kind": "Service", + "name": "hwlab-cloud-web" + }, + { + "kind": "Service", + "name": "hwlab-edge-proxy" + }, + { + "kind": "Service", + "name": "hwlab-gateway" + }, + { + "kind": "Service", + "name": "hwlab-gateway-simu" + }, + { + "kind": "Service", + "name": "hwlab-gateway-simu-1" + }, + { + "kind": "Service", + "name": "hwlab-gateway-simu-2" + }, + { + "kind": "Service", + "name": "hwlab-patch-panel" + }, + { + "kind": "Service", + "name": "hwlab-router" + }, + { + "kind": "Service", + "name": "hwlab-tunnel-client" + }, + { + "kind": "ConfigMap", + "name": "hwlab-dev-health-contract" + }, + { + "kind": "ConfigMap", + "name": "hwlab-frpc-config" + }, + { + "kind": "ConfigMap", + "name": "kube-root-ca.crt" + }, + { + "kind": "Deployment", + "name": "hwlab-agent-mgr", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Deployment", + "name": "hwlab-agent-skills", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Deployment", + "name": "hwlab-cloud-api", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Deployment", + "name": "hwlab-cloud-web", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Deployment", + "name": "hwlab-edge-proxy", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Deployment", + "name": "hwlab-frpc", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Deployment", + "name": "hwlab-gateway" + }, + { + "kind": "Deployment", + "name": "hwlab-patch-panel", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Deployment", + "name": "hwlab-router", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Deployment", + "name": "hwlab-tunnel-client", + "readyReplicas": 1, + "replicas": 1 + }, + { + "kind": "Job", + "name": "hwlab-agent-worker-template" + }, + { + "kind": "Job", + "name": "hwlab-cli-template" + } + ] + }, + "liveProbe": { + "status": "pass", + "url": "http://74.48.78.17:16667/health/live", + "httpStatus": 200, + "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"ok\",\"ready\":true,\"readiness\":{\"contractVersion\":\"v3\",\"ready\":true,\"status\":\"ok\",\"blockerCodes\":[],\"blockers\":[],\"components\":{\"db\":\"ready\",\"codeAgent\":\"ready\",\"runtime\":\"ready\"},\"durability\":{\"status\":\"ready\",\"ready\":true,\"adapter\":\"postgres\",\"durable\":true,\"durableRequested\":true,\"durableCapable\":true,\"runtimeStatus\":\"ready\",\"runtimeReady\":true,\"liveRuntimeEvidence\":true,\"dbLiveEvidenceObserved\":true,\"dbLiveEvidenceIsDurabilityEvidenc" + } + }, + "blockers": [], + "notes": "DEV-only result. No PROD resources, secret values, force push, heavy e2e, browser e2e, or UniDesk runtime substitute were used." + }, + "stdoutTail": null, + "stderrTail": "", + "reportPath": "reports/dev-gate/dev-deploy-report.json" + } + ], + "liveBefore": { + "status": "pass", + "expectedCommit": null, + "endpoints": [ + { + "id": "cloud-web-16666", + "url": "http://74.48.78.17:16666/health/live", + "status": "pass", + "httpStatus": 200, + "reachable": true, + "identityMatches": true, + "startedAt": "2026-05-23T09:40:07.823Z", + "finishedAt": "2026-05-23T09:40:08.574Z", + "expectedServiceId": "hwlab-cloud-web", + "expectedCommit": null, + "serviceId": "hwlab-cloud-web", + "environment": "dev", + "applicationStatus": "ok", + "ready": null, + "observedCommit": "63acb59", + "image": null, + "imageTag": null, + "observedAt": null, + "serviceMatches": true, + "environmentMatches": true, + "commitMatches": null, + "blockerCodes": [] + }, + { + "id": "cloud-api-16667", + "url": "http://74.48.78.17:16667/health/live", + "status": "pass", + "httpStatus": 200, + "reachable": true, + "identityMatches": true, + "startedAt": "2026-05-23T09:40:07.825Z", + "finishedAt": "2026-05-23T09:40:11.666Z", + "expectedServiceId": "hwlab-cloud-api", + "expectedCommit": null, + "serviceId": "hwlab-cloud-api", + "environment": "dev", + "applicationStatus": "ok", + "ready": true, + "observedCommit": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "observedAt": "2026-05-23T09:40:09.312Z", + "serviceMatches": true, + "environmentMatches": true, + "commitMatches": null, + "blockerCodes": [] + } + ], + "summary": { + "checked": 2, + "reachable": 2, + "identityMatches": 2, + "commitMatches": null, + "ports": [ + 16666, + 16667 + ] + } + }, + "liveVerify": { + "status": "pass", + "expectedCommit": "63acb59", + "endpoints": [ + { + "id": "cloud-web-16666", + "url": "http://74.48.78.17:16666/health/live", + "status": "pass", + "httpStatus": 200, + "reachable": true, + "identityMatches": true, + "startedAt": "2026-05-23T09:40:35.398Z", + "finishedAt": "2026-05-23T09:40:36.584Z", + "expectedServiceId": "hwlab-cloud-web", + "expectedCommit": "63acb59", + "serviceId": "hwlab-cloud-web", + "environment": "dev", + "applicationStatus": "ok", + "ready": null, + "observedCommit": "63acb59", + "image": null, + "imageTag": null, + "observedAt": null, + "serviceMatches": true, + "environmentMatches": true, + "commitMatches": true, + "blockerCodes": [] + }, + { + "id": "cloud-api-16667", + "url": "http://74.48.78.17:16667/health/live", + "status": "pass", + "httpStatus": 200, + "reachable": true, + "identityMatches": true, + "startedAt": "2026-05-23T09:40:35.399Z", + "finishedAt": "2026-05-23T09:40:36.592Z", + "expectedServiceId": "hwlab-cloud-api", + "expectedCommit": "63acb59", + "serviceId": "hwlab-cloud-api", + "environment": "dev", + "applicationStatus": "ok", + "ready": true, + "observedCommit": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "imageTag": "63acb59", + "observedAt": "2026-05-23T09:40:36.263Z", + "serviceMatches": true, + "environmentMatches": true, + "commitMatches": true, + "blockerCodes": [] + } + ], + "summary": { + "checked": 2, + "reachable": 2, + "identityMatches": 2, + "commitMatches": 2, + "ports": [ + 16666, + 16667 + ] + } + }, + "reportPaths": { + "transaction": "reports/dev-gate/dev-cd-apply.json", + "artifacts": "reports/dev-gate/dev-artifacts.json", + "deployApply": "reports/dev-gate/dev-deploy-report.json" + }, + "safety": { + "prodTouched": false, + "secretValuesRead": false, + "secretValuesPrinted": false, + "manualDbWrite": false, + "oldPublicPortsUsed": false, + "mutationAttempted": true, + "singleLock": "Lease/hwlab-dev/hwlab-dev-cd-lock" + } + }, + "blockers": [], + "notes": "DEV-only CD transaction evidence. This does not claim M3 PASS or runtime durability." +} diff --git a/reports/dev-gate/dev-deploy-report.json b/reports/dev-gate/dev-deploy-report.json index e46e626c..b504d578 100644 --- a/reports/dev-gate/dev-deploy-report.json +++ b/reports/dev-gate/dev-deploy-report.json @@ -16,7 +16,7 @@ "pikasTech/HWLAB#30" ], "taskId": "dev-deploy-apply", - "commitId": "4d2a0ba", + "commitId": "63acb59", "acceptanceLevel": "dev_deploy_apply", "devOnly": true, "prodDisabled": true, @@ -29,7 +29,7 @@ "summary": "Current DEV deploy apply report; active public API/health endpoint is 16667 and browser endpoint is 16666." }, "status": "pass", - "generatedAt": "2026-05-23T08:34:34.256Z", + "generatedAt": "2026-05-23T09:40:35.311Z", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "sourceContract": { @@ -68,7 +68,7 @@ ], "evidence": [ "artifact services checked: 13", - "expected artifact commit: 4d2a0ba", + "expected artifact commit: 63acb59", "namespace: hwlab-dev", "workloads planned: 13", "kubectl executor: /usr/local/bin/kubectl", @@ -77,7 +77,7 @@ "live health: pass", "code agent provider desired-state: pass", "code agent provider live env before apply: pass", - "template job replacements: 2", + "template job replacements: 0", "legacy simulator deployment cleanups: 0" ], "summary": "DEV dry-run preflight passed." @@ -132,12 +132,12 @@ "prodDisabled": true }, "artifactPlan": { - "expectedArtifactCommit": "4d2a0ba", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "sourceCommitId": "4d2a0ba", + "expectedArtifactCommit": "63acb59", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "sourceCommitId": "63acb59", "serviceCommitIds": [ - "4d2a0ba" + "63acb59" ], "matchesSourceCommit": true, "published": true, @@ -160,7 +160,7 @@ { "name": "hwlab-cloud-api", "serviceId": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59" } ] }, @@ -176,7 +176,7 @@ { "name": "hwlab-cloud-web", "serviceId": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59" } ] }, @@ -192,7 +192,7 @@ { "name": "hwlab-agent-mgr", "serviceId": "hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59" } ] }, @@ -208,7 +208,7 @@ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" } ] }, @@ -224,7 +224,7 @@ { "name": "hwlab-gateway", "serviceId": "hwlab-gateway", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59" } ] }, @@ -240,7 +240,7 @@ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59" } ] }, @@ -256,7 +256,7 @@ { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59" } ] }, @@ -272,7 +272,7 @@ { "name": "hwlab-patch-panel", "serviceId": "hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59" } ] }, @@ -288,7 +288,7 @@ { "name": "hwlab-router", "serviceId": "hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59" } ] }, @@ -304,7 +304,7 @@ { "name": "hwlab-tunnel-client", "serviceId": "hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59" } ] }, @@ -320,7 +320,7 @@ { "name": "hwlab-edge-proxy", "serviceId": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59" } ] }, @@ -336,7 +336,7 @@ { "name": "hwlab-cli", "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" } ] }, @@ -352,7 +352,7 @@ { "name": "hwlab-agent-skills", "serviceId": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59" } ] } @@ -608,28 +608,25 @@ "desiredSuspended": true, "liveExists": true, "liveSuspended": true, - "oldImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:2343328", - "newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba", + "oldImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "oldImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:2343328" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" } ], "newImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59" } ], - "replace": true, - "result": "replaced", - "reason": "Live suspended template Job was deleted and recreated by kubectl apply.", - "deleteCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig 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": "" + "replace": false, + "result": "not_needed", + "reason": "Live suspended template Job already matches the desired image." }, { "namespace": "hwlab-dev", @@ -638,28 +635,25 @@ "desiredSuspended": true, "liveExists": true, "liveSuspended": true, - "oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:2343328", - "newImage": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba", + "oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "newImage": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "oldImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:2343328" + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" } ], "newImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59" } ], - "replace": true, - "result": "replaced", - "reason": "Live suspended template Job was deleted and recreated by kubectl apply.", - "deleteCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig 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": "" + "replace": false, + "result": "not_needed", + "reason": "Live suspended template Job already matches the desired image." } ], "legacySimulatorDeploymentCleanupPolicy": { @@ -691,13 +685,13 @@ "desiredReplacementKind": "StatefulSet", "liveExists": false, "oldImage": null, - "newImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", + "newImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "oldImages": [], "newImages": [ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59" } ], "cleanup": false, @@ -713,13 +707,13 @@ "desiredReplacementKind": "StatefulSet", "liveExists": false, "oldImage": null, - "newImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", + "newImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "oldImages": [], "newImages": [ { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba" + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59" } ], "cleanup": false, @@ -732,19 +726,19 @@ "namespace": "hwlab-dev", "status": "observed", "observationPhase": "after_apply", - "sourceCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "imageTag": "4d2a0ba", - "digest": "sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200", + "sourceCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "repositoryDigest": null, "publishState": "published", - "rolloutRevision": "30", - "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "rolloutRevision": "34", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageMatchesDesired": true, "expectedRuntimeEnv": { - "HWLAB_COMMIT_ID": "4d2a0ba", - "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "HWLAB_IMAGE_TAG": "4d2a0ba" + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" }, "liveRuntimeEnv": { "status": "match", @@ -752,20 +746,20 @@ "fields": [ { "name": "HWLAB_COMMIT_ID", - "expected": "4d2a0ba", - "actual": "4d2a0ba", + "expected": "63acb59", + "actual": "63acb59", "status": "match" }, { "name": "HWLAB_IMAGE", - "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", - "expected": "4d2a0ba", - "actual": "4d2a0ba", + "expected": "63acb59", + "actual": "63acb59", "status": "match" } ], @@ -783,85 +777,47 @@ "namespace": "hwlab-dev", "status": "observed", "observationPhase": "before_apply", - "sourceCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "imageTag": "4d2a0ba", - "digest": "sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200", + "sourceCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "repositoryDigest": null, "publishState": "published", - "rolloutRevision": "29", - "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:2343328", - "imageMatchesDesired": false, + "rolloutRevision": "34", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageMatchesDesired": true, "expectedRuntimeEnv": { - "HWLAB_COMMIT_ID": "4d2a0ba", - "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "HWLAB_IMAGE_TAG": "4d2a0ba" + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" }, "liveRuntimeEnv": { - "status": "drift", - "matchesDesired": false, + "status": "match", + "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", - "expected": "4d2a0ba", - "actual": "2343328", - "status": "drift" + "expected": "63acb59", + "actual": "63acb59", + "status": "match" }, { "name": "HWLAB_IMAGE", - "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:2343328", - "status": "drift" + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "status": "match" }, { "name": "HWLAB_IMAGE_TAG", - "expected": "4d2a0ba", - "actual": "2343328", - "status": "drift" + "expected": "63acb59", + "actual": "63acb59", + "status": "match" } ], - "drift": [ - { - "name": "HWLAB_COMMIT_ID", - "expected": "4d2a0ba", - "actual": "2343328", - "status": "drift" - }, - { - "name": "HWLAB_IMAGE", - "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:2343328", - "status": "drift" - }, - { - "name": "HWLAB_IMAGE_TAG", - "expected": "4d2a0ba", - "actual": "2343328", - "status": "drift" - } - ] + "drift": [] }, - "runtimeEnvMatchesDesired": false, - "runtimeEnvDrift": [ - { - "name": "HWLAB_COMMIT_ID", - "expected": "4d2a0ba", - "actual": "2343328", - "status": "drift" - }, - { - "name": "HWLAB_IMAGE", - "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:2343328", - "status": "drift" - }, - { - "name": "HWLAB_IMAGE_TAG", - "expected": "4d2a0ba", - "actual": "2343328", - "status": "drift" - } - ], + "runtimeEnvMatchesDesired": true, + "runtimeEnvDrift": [], "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", @@ -872,19 +828,19 @@ "namespace": "hwlab-dev", "status": "observed", "observationPhase": "after_apply", - "sourceCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "imageTag": "4d2a0ba", - "digest": "sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200", + "sourceCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "imageTag": "63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "repositoryDigest": null, "publishState": "published", - "rolloutRevision": "30", - "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "rolloutRevision": "34", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "imageMatchesDesired": true, "expectedRuntimeEnv": { - "HWLAB_COMMIT_ID": "4d2a0ba", - "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "HWLAB_IMAGE_TAG": "4d2a0ba" + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" }, "liveRuntimeEnv": { "status": "match", @@ -892,20 +848,20 @@ "fields": [ { "name": "HWLAB_COMMIT_ID", - "expected": "4d2a0ba", - "actual": "4d2a0ba", + "expected": "63acb59", + "actual": "63acb59", "status": "match" }, { "name": "HWLAB_IMAGE", - "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", - "expected": "4d2a0ba", - "actual": "4d2a0ba", + "expected": "63acb59", + "actual": "63acb59", "status": "match" } ], @@ -1127,7 +1083,7 @@ "applyStep": { "status": "pass", "command": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl apply -k deploy/k8s/dev", - "stdout": "namespace/hwlab-dev unchanged\nconfigmap/hwlab-dev-health-contract unchanged\nservice/hwlab-agent-mgr unchanged\nservice/hwlab-agent-skills unchanged\nservice/hwlab-box-simu unchanged\nservice/hwlab-box-simu-1 unchanged\nservice/hwlab-box-simu-2 unchanged\nservice/hwlab-cli unchanged\nservice/hwlab-cloud-api unchanged\nservice/hwlab-cloud-web unchanged\nservice/hwlab-edge-proxy unchanged\nservice/hwlab-gateway unchanged\nservice/hwlab-gateway-simu unchanged\nservice/hwlab-gateway-simu-1 unchanged\nservice/hwlab-gateway-simu-2 unchanged\nservice/hwlab-patch-panel unchanged\nservice/hwlab-router unchanged\nservice/hwlab-tunnel-client unchanged\ndeployment.apps/hwlab-agent-mgr 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", + "stdout": "namespace/hwlab-dev unchanged\nconfigmap/hwlab-dev-health-contract unchanged\nservice/hwlab-agent-mgr unchanged\nservice/hwlab-agent-skills unchanged\nservice/hwlab-box-simu unchanged\nservice/hwlab-box-simu-1 unchanged\nservice/hwlab-box-simu-2 unchanged\nservice/hwlab-cli unchanged\nservice/hwlab-cloud-api unchanged\nservice/hwlab-cloud-web unchanged\nservice/hwlab-edge-proxy unchanged\nservice/hwlab-gateway unchanged\nservice/hwlab-gateway-simu unchanged\nservice/hwlab-gateway-simu-1 unchanged\nservice/hwlab-gateway-simu-2 unchanged\nservice/hwlab-patch-panel unchanged\nservice/hwlab-router unchanged\nservice/hwlab-tunnel-client unchanged\ndeployment.apps/hwlab-agent-mgr unchanged\ndeployment.apps/hwlab-agent-skills unchanged\ndeployment.apps/hwlab-cloud-api unchanged\ndeployment.apps/hwlab-cloud-web unchanged\ndeployment.apps/hwlab-edge-proxy unchanged\ndeployment.apps/hwlab-gateway unchanged\ndeployment.apps/hwlab-patch-panel unchanged\ndeployment.apps/hwlab-router unchanged\ndeployment.apps/hwlab-tunnel-client unchanged\nstatefulset.apps/hwlab-box-simu unchanged\nstatefulset.apps/hwlab-gateway-simu unchanged\njob.batch/hwlab-agent-worker-template unchanged\njob.batch/hwlab-cli-template unchanged", "stderr": "# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.\n# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.", "mutationAttempted": true, "expectedImmutableTemplateJobDryRun": false, @@ -1175,106 +1131,106 @@ "artifactEvidence": [ { "serviceId": "hwlab-cloud-api", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:4d2a0ba", - "digest": "sha256:a295d92e3e11c4a7f04d80b90c5a0f4e59ffd6a83c3aa3ed8f86e14db1a88b14", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", + "digest": "sha256:79e9694d2d381ab96028e0705023b4e3c1cd3b7c71357a0ef5aefd66f53ee7f0", "publishState": "published" }, { "serviceId": "hwlab-cloud-web", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "digest": "sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "digest": "sha256:3c6b1efb10644c7f3d44054f364013cb348b1204a1a6ffd33969f213da59227e", "publishState": "published" }, { "serviceId": "hwlab-agent-mgr", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:4d2a0ba", - "digest": "sha256:7df780347df148f1303c498f35aba19d9c10f2f86899e9729afda978e7a27b2d", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", + "digest": "sha256:852b03d9d282e90454d5692dafa30cc34328ff8a097c509075a8bc6d5f1c6d80", "publishState": "published" }, { "serviceId": "hwlab-agent-worker", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba", - "digest": "sha256:21ff26ae035b97a181b3986f46d27305879502fb4aab30a94924ce9f8ab6bcd6", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", + "digest": "sha256:2f5b8eb8d1a52849d056f412c5dde4bb075456d4fbebdc9169917092011d10e7", "publishState": "published" }, { "serviceId": "hwlab-gateway", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:4d2a0ba", - "digest": "sha256:cdb8c86de03d9c1ab2c224b5d50d4048a8336942e507793f9fd450020f91b028", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", + "digest": "sha256:14dea76f86b481a895b0f24b5165ef9fd4c0f790dd558b5b625900b46761ec15", "publishState": "published" }, { "serviceId": "hwlab-gateway-simu", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", - "digest": "sha256:daae618cdc7fb176d7dc769956e3d5948d1abade09e35dd29daf9c86a37f8fd1", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", + "digest": "sha256:0964a94db3efef9a697a4dff1692888e8079c7aeb93abe25aabb6e8ba394c9c8", "publishState": "published" }, { "serviceId": "hwlab-box-simu", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", - "digest": "sha256:5ba916ed43a8e35e5052f16fd380a3e6004aea10b2e99b8375cc5ba6439702e7", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", + "digest": "sha256:1628a2ebc0ad1638c39fd71e8437ba91d042d9497262001473ecc36a5d7adc96", "publishState": "published" }, { "serviceId": "hwlab-patch-panel", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:4d2a0ba", - "digest": "sha256:7df24c38a83ccf743a155f8b913541a4d9224e0436c646206a9e5e4a9d43192f", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", + "digest": "sha256:461f3e99f52f55e335b51d6048829c40c299568d0fff02cc4f5934bc8d3c962a", "publishState": "published" }, { "serviceId": "hwlab-router", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-router:4d2a0ba", - "digest": "sha256:c918d15ebee2175e720ecb0c854701bed51a1e7753a996f9e69b99e8d530c77b", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", + "digest": "sha256:560ce04be9a54b82a31c77ab7a214719c998b8b320afc1cd47c1abaa97941024", "publishState": "published" }, { "serviceId": "hwlab-tunnel-client", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:4d2a0ba", - "digest": "sha256:ba8e496adf33ba7478c563291b84df0d30958f70576b23a8083972a5e5884e23", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", + "digest": "sha256:657c8efdb35c4dbd0c87d4bbe201321aa857ad89a486ec30a2b8fdd379a41a6e", "publishState": "published" }, { "serviceId": "hwlab-edge-proxy", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:4d2a0ba", - "digest": "sha256:e07c05b6b06aef750d02d9f82a34f3b43a1a9df3a668fe60d348abe5931a6650", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", + "digest": "sha256:beca30d9dfbac596cbf72ef49ef6162a708b1048dcfa1c9d741747ac1b858314", "publishState": "published" }, { "serviceId": "hwlab-cli", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba", - "digest": "sha256:3d5baeb3343b81f62f20c3ffd143e55a899a697ebb5f1ac294bf89ace550a367", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", + "digest": "sha256:53c5c1dc118c4f698407492b67a59aa1bb1374341907568dd17cf3a0e52ef97b", "publishState": "published" }, { "serviceId": "hwlab-agent-skills", - "deployCommitId": "4d2a0ba", - "catalogCommitId": "4d2a0ba", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:4d2a0ba", - "digest": "sha256:fd88f8f2d2d43d4420c5f70306f5810cb756bea9c0b206410cb7fa694cb67ce1", + "deployCommitId": "63acb59", + "catalogCommitId": "63acb59", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", + "digest": "sha256:cf36771fa898fd240b28b093e0070cc16ecc7ee83207ec30413b6abf855d99b7", "publishState": "published" } ], @@ -1431,79 +1387,79 @@ "images": [ { "serviceId": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:63acb59", "kind": "Deployment", "name": "hwlab-cloud-api" }, { "serviceId": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "kind": "Deployment", "name": "hwlab-cloud-web" }, { "serviceId": "hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:63acb59", "kind": "Deployment", "name": "hwlab-agent-mgr" }, { "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:63acb59", "kind": "Job", "name": "hwlab-agent-worker-template" }, { "serviceId": "hwlab-gateway", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:63acb59", "kind": "Deployment", "name": "hwlab-gateway" }, { "serviceId": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:63acb59", "kind": "StatefulSet", "name": "hwlab-gateway-simu" }, { "serviceId": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:63acb59", "kind": "StatefulSet", "name": "hwlab-box-simu" }, { "serviceId": "hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:63acb59", "kind": "Deployment", "name": "hwlab-patch-panel" }, { "serviceId": "hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-router:63acb59", "kind": "Deployment", "name": "hwlab-router" }, { "serviceId": "hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:63acb59", "kind": "Deployment", "name": "hwlab-tunnel-client" }, { "serviceId": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:63acb59", "kind": "Deployment", "name": "hwlab-edge-proxy" }, { "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:63acb59", "kind": "Job", "name": "hwlab-cli-template" }, { "serviceId": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:63acb59", "kind": "Deployment", "name": "hwlab-agent-skills" } @@ -1515,29 +1471,29 @@ "name": "hwlab-cloud-web", "container": "hwlab-cloud-web", "expected": { - "HWLAB_COMMIT_ID": "4d2a0ba", - "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "HWLAB_IMAGE_TAG": "4d2a0ba" + "HWLAB_COMMIT_ID": "63acb59", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "HWLAB_IMAGE_TAG": "63acb59" }, "status": "match", "matchesDesired": true, "fields": [ { "name": "HWLAB_COMMIT_ID", - "expected": "4d2a0ba", - "actual": "4d2a0ba", + "expected": "63acb59", + "actual": "63acb59", "status": "match" }, { "name": "HWLAB_IMAGE", - "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", - "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:63acb59", "status": "match" }, { "name": "HWLAB_IMAGE_TAG", - "expected": "4d2a0ba", - "actual": "4d2a0ba", + "expected": "63acb59", + "actual": "63acb59", "status": "match" } ], @@ -1556,12 +1512,12 @@ "resources": [ { "kind": "Pod", - "name": "hwlab-agent-mgr-6487c6d6c7-5xhdx", + "name": "hwlab-agent-mgr-57d8bc9f89-5kv4p", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-agent-skills-56488f6b58-h8jkx", + "name": "hwlab-agent-skills-8687f446fd-lqtgt", "phase": "Running" }, { @@ -1576,17 +1532,17 @@ }, { "kind": "Pod", - "name": "hwlab-cloud-api-794868f84d-q8mr7", + "name": "hwlab-cloud-api-668549d448-gnct8", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-cloud-web-5c746559b6-p9ktp", + "name": "hwlab-cloud-web-fc896cddb-gwh58", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-edge-proxy-5fbb997574-njgwz", + "name": "hwlab-edge-proxy-5ff8d747d-rgdjm", "phase": "Running" }, { @@ -1606,17 +1562,17 @@ }, { "kind": "Pod", - "name": "hwlab-patch-panel-5d75c58559-w7dq7", + "name": "hwlab-patch-panel-79c59cd5b7-dl4sz", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-router-5777cb4d7d-kn8tz", + "name": "hwlab-router-7d47d6dfc4-gzcw9", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-tunnel-client-65f85d7c8d-rpqrb", + "name": "hwlab-tunnel-client-64779fc4bd-pz8lz", "phase": "Running" }, { @@ -1767,7 +1723,7 @@ "status": "pass", "url": "http://74.48.78.17:16667/health/live", "httpStatus": 200, - "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"degraded\",\"ready\":false,\"readiness\":{\"contractVersion\":\"v3\",\"ready\":false,\"status\":\"degraded\",\"blockerCodes\":[\"runtime_durable_adapter_auth_blocked\"],\"blockers\":[{\"code\":\"runtime_durable_adapter_auth_blocked\",\"type\":\"runtime_blocker\",\"scope\":\"runtime-durable-adapter\",\"status\":\"open\",\"sourceIssue\":\"pikasTech/HWLAB#164\",\"summary\":\"Postgres runtime adapter reached the DB driver but authentication or authorization blocked the schema query\"" + "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"ok\",\"ready\":true,\"readiness\":{\"contractVersion\":\"v3\",\"ready\":true,\"status\":\"ok\",\"blockerCodes\":[],\"blockers\":[],\"components\":{\"db\":\"ready\",\"codeAgent\":\"ready\",\"runtime\":\"ready\"},\"durability\":{\"status\":\"ready\",\"ready\":true,\"adapter\":\"postgres\",\"durable\":true,\"durableRequested\":true,\"durableCapable\":true,\"runtimeStatus\":\"ready\",\"runtimeReady\":true,\"liveRuntimeEvidence\":true,\"dbLiveEvidenceObserved\":true,\"dbLiveEvidenceIsDurabilityEvidenc" } }, "blockers": [],