{ "$schema": "https://hwlab.pikastech.local/schemas/dev-gate-preflight-report.schema.json", "$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-preflight-report.json", "reportVersion": "v1", "reportKind": "dev-gate-preflight", "issue": "pikasTech/HWLAB#34", "supports": [ "pikasTech/HWLAB#7", "pikasTech/HWLAB#12", "pikasTech/HWLAB#14", "pikasTech/HWLAB#22", "pikasTech/HWLAB#23", "pikasTech/HWLAB#29", "pikasTech/HWLAB#30", "pikasTech/HWLAB#31", "pikasTech/HWLAB#33", "pikasTech/HWLAB#35", "pikasTech/HWLAB#39", "pikasTech/HWLAB#43", "pikasTech/HWLAB#48", "pikasTech/HWLAB#49", "pikasTech/HWLAB#57", "pikasTech/HWLAB#66" ], "target": { "ref": "origin/main", "commitId": "f64182b54fe6153a1ec0343cabf63b690df74f4e", "shortCommitId": "f64182b" }, "generatedAt": "2026-05-22T16:59:48.691Z", "mode": "read-only", "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 read-only DEV preflight report; source, local, and dry-run checks are not DEV-LIVE acceptance." }, "forbiddenActions": [ "prod-deploy", "secret-material-read", "unidesk-runtime-substitute", "heavy-e2e", "browser-e2e", "force-push", "runtime-restart" ], "validationCommands": [ "node --check scripts/dev-gate-preflight.mjs", "node --check scripts/src/dev-gate-preflight.mjs", "node --check scripts/src/registry-capabilities.mjs", "node --check scripts/refresh-artifact-catalog.mjs", "node scripts/dev-gate-preflight.mjs", "node --check scripts/validate-dev-gate-report.mjs", "node scripts/validate-dev-gate-report.mjs" ], "artifactIdentity": { "source": { "ref": "origin/main", "commitId": "f64182b54fe6153a1ec0343cabf63b690df74f4e", "shortCommitId": "f64182b" }, "artifactSource": { "source": "artifact-publish-report", "ref": "7e29522b65c8a316b7c3fde12bebcb5f6baf8c33", "commitId": "7e29522b65c8a316b7c3fde12bebcb5f6baf8c33", "shortCommitId": "7e29522" }, "targetCoverage": { "sourceKind": "artifact-publish-report", "sourceRef": "7e29522b65c8a316b7c3fde12bebcb5f6baf8c33", "sourceCommitId": "7e29522b65c8a316b7c3fde12bebcb5f6baf8c33", "sourceShortCommitId": "7e29522", "targetRef": "origin/main", "targetCommitId": "f64182b54fe6153a1ec0343cabf63b690df74f4e", "targetShortCommitId": "f64182b", "mode": "artifact-input-drift", "covered": false, "artifactBuildInputChanged": true, "changedPathCount": 114, "changedArtifactInputPaths": [ "cmd/hwlab-box-simu/main.mjs", "cmd/hwlab-gateway-simu/main.mjs", "cmd/hwlab-patch-panel/main.mjs", "internal/cloud/code-agent-chat.mjs", "internal/cloud/db-contract.mjs", "internal/cloud/json-rpc.test.mjs", "internal/cloud/server.mjs", "internal/cloud/server.test.mjs", "internal/dev-report-lifecycle.mjs", "internal/mvp-gate/summary.mjs", "internal/patchpanel/fixture.mjs", "internal/patchpanel/model.test.mjs", "internal/protocol/index.mjs", "package.json", "scripts/dev-artifact-publish.mjs", "tools/hwlab-cli/lib/cli.mjs", "web/hwlab-cloud-web/app.mjs", "web/hwlab-cloud-web/gate-summary.mjs", "web/hwlab-cloud-web/help.md", "web/hwlab-cloud-web/index.html", "web/hwlab-cloud-web/package.json", "web/hwlab-cloud-web/runtime.mjs", "web/hwlab-cloud-web/scripts/build.mjs", "web/hwlab-cloud-web/scripts/check.mjs", "web/hwlab-cloud-web/scripts/dist-contract.mjs", "web/hwlab-cloud-web/scripts/m3-readonly-contract.mjs", "web/hwlab-cloud-web/scripts/workbench-hardware-panel-contract.mjs", "web/hwlab-cloud-web/styles.css", "web/hwlab-cloud-web/third_party/marked/LICENSE", "web/hwlab-cloud-web/third_party/marked/marked.esm.js", "web/hwlab-cloud-web/workbench-hardware-panel.mjs" ], "changedNonArtifactPathCount": 83, "reason": "target changes since the artifact source touch artifact build inputs" }, "deployManifest": { "path": "deploy/deploy.json", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false }, "artifactCatalog": { "path": "deploy/artifact-catalog.dev.json", "commitId": "c7de474", "artifactState": "contract-skeleton", "ciPublished": false, "registryVerified": false, "provenance": "not_available_until_publish", "digestCounts": { "sha256": 0, "notPublished": 13, "invalid": 0 }, "requiredServiceCount": 13, "disabledServiceCount": 0, "matchesSource": false, "matchesTarget": false }, "services": [ { "serviceId": "hwlab-cloud-api", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-cloud-web", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-agent-mgr", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-agent-worker", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-gateway", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-gateway:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-gateway-simu", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-box-simu", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-patch-panel", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-router", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-router:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-tunnel-client", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-edge-proxy", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-cli", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-cli:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-agent-skills", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" } ], "serviceCommitIds": [ "c7de474" ], "matchesSource": false, "publishVerified": false, "refreshCommands": { "blocked": "node scripts/refresh-artifact-catalog.mjs --target-ref origin/main --blocked", "published": "node scripts/refresh-artifact-catalog.mjs --target-ref origin/main --publish-report reports/dev-gate/dev-artifacts.json" } }, "registryCapabilities": { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", "generatedAt": "2026-05-22T16:59:47.814Z", "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 39 hours" } ], "pushAttempted": false, "mutationAttempted": false } }, "k3sPullAccess": { "id": "k3s-pull-access", "status": "pass", "requiredForPublish": false, "requiredForDeploy": true, "endpoint": "127.0.0.1:5000/hwlab", "probeKind": "kubectl-read-only", "summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.", "evidence": { "kubectlAvailable": true, "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": 13, "pulledImages": [ { "pod": "hwlab-agent-mgr-75544c7747-5dzt9", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:c16c733306a28ae9385087653b79f5bb2f28724d917a89bb296646f6a02c5318" }, { "pod": "hwlab-agent-skills-849d9976f4-2nsmw", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:246fb7bb48597a7179aab62cb091e8213e47b71b6871ba94e6028032992e916c" }, { "pod": "hwlab-box-simu-55688cbcc7-pftxc", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:ae5fcc06a276918561c2d752f2221156bd2bd4db7fb93967ae76af97bfdc51bf" }, { "pod": "hwlab-box-simu-55688cbcc7-sq5fx", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:ae5fcc06a276918561c2d752f2221156bd2bd4db7fb93967ae76af97bfdc51bf" }, { "pod": "hwlab-cloud-api-74c969765d-kzvdd", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:86fe92c0dd5d5883851b38805e6f5acc49d2876552599c18f85480cf0d3bf981" }, { "pod": "hwlab-cloud-web-7d48b84f4b-n6hw6", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:c7de474", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:91cfacc1fc011a96bb47ff00d2ab09ee3c93003b7ec482308ec5ac35004e5627" }, { "pod": "hwlab-edge-proxy-567f978cdd-8fwc8", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:384832fc579063b9b0a940973690734bb402607720fd36f4662e4ee6fa5a57d2" }, { "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-699fd486b-j9pk7", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:00599721b910b5667b6be43c416cab4c410c6cc29b7f56ecdfb6eff71123d01c" }, { "pod": "hwlab-gateway-simu-699fd486b-phcgp", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:00599721b910b5667b6be43c416cab4c410c6cc29b7f56ecdfb6eff71123d01c" }, { "pod": "hwlab-patch-panel-757f9f44d5-7np8r", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:5b3aa6505492c2ed398d21cbd35a8754672114acd0fa97faa3351d4b6a6dfd5a" }, { "pod": "hwlab-router-5d9cbdf89b-p7r94", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:217b1fdb0f704c4183e9d8503644177f0c8bae674da0433985c19ef909f0e342" }, { "pod": "hwlab-tunnel-client-65c7858c8-wjqsh", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:9bcdd8a58132d7bc4dbfc71297f802fc0ab407a1b5c1bb1ea58e0791147a243b" } ], "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." } }, "conclusion": "blocked", "checks": [ { "id": "source-contract-static", "category": "contract", "status": "pass", "summary": "Local deploy manifest and artifact catalog are internally consistent.", "evidence": [] }, { "id": "target-commit-pinning", "category": "contract", "status": "blocked", "summary": "Source origin/main f64182b is not covered by artifact source 7e29522: target changes since the artifact source touch artifact build inputs.", "evidence": [ { "source": { "ref": "origin/main", "commitId": "f64182b54fe6153a1ec0343cabf63b690df74f4e", "shortCommitId": "f64182b" }, "artifactSource": { "source": "artifact-publish-report", "ref": "7e29522b65c8a316b7c3fde12bebcb5f6baf8c33", "commitId": "7e29522b65c8a316b7c3fde12bebcb5f6baf8c33", "shortCommitId": "7e29522" }, "targetCoverage": { "sourceKind": "artifact-publish-report", "sourceRef": "7e29522b65c8a316b7c3fde12bebcb5f6baf8c33", "sourceCommitId": "7e29522b65c8a316b7c3fde12bebcb5f6baf8c33", "sourceShortCommitId": "7e29522", "targetRef": "origin/main", "targetCommitId": "f64182b54fe6153a1ec0343cabf63b690df74f4e", "targetShortCommitId": "f64182b", "mode": "artifact-input-drift", "covered": false, "artifactBuildInputChanged": true, "changedPathCount": 114, "changedArtifactInputPaths": [ "cmd/hwlab-box-simu/main.mjs", "cmd/hwlab-gateway-simu/main.mjs", "cmd/hwlab-patch-panel/main.mjs", "internal/cloud/code-agent-chat.mjs", "internal/cloud/db-contract.mjs", "internal/cloud/json-rpc.test.mjs", "internal/cloud/server.mjs", "internal/cloud/server.test.mjs", "internal/dev-report-lifecycle.mjs", "internal/mvp-gate/summary.mjs", "internal/patchpanel/fixture.mjs", "internal/patchpanel/model.test.mjs", "internal/protocol/index.mjs", "package.json", "scripts/dev-artifact-publish.mjs", "tools/hwlab-cli/lib/cli.mjs", "web/hwlab-cloud-web/app.mjs", "web/hwlab-cloud-web/gate-summary.mjs", "web/hwlab-cloud-web/help.md", "web/hwlab-cloud-web/index.html", "web/hwlab-cloud-web/package.json", "web/hwlab-cloud-web/runtime.mjs", "web/hwlab-cloud-web/scripts/build.mjs", "web/hwlab-cloud-web/scripts/check.mjs", "web/hwlab-cloud-web/scripts/dist-contract.mjs", "web/hwlab-cloud-web/scripts/m3-readonly-contract.mjs", "web/hwlab-cloud-web/scripts/workbench-hardware-panel-contract.mjs", "web/hwlab-cloud-web/styles.css", "web/hwlab-cloud-web/third_party/marked/LICENSE", "web/hwlab-cloud-web/third_party/marked/marked.esm.js", "web/hwlab-cloud-web/workbench-hardware-panel.mjs" ], "changedNonArtifactPathCount": 83, "reason": "target changes since the artifact source touch artifact build inputs" }, "deployManifest": { "path": "deploy/deploy.json", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false }, "artifactCatalog": { "path": "deploy/artifact-catalog.dev.json", "commitId": "c7de474", "artifactState": "contract-skeleton", "ciPublished": false, "registryVerified": false, "provenance": "not_available_until_publish", "digestCounts": { "sha256": 0, "notPublished": 13, "invalid": 0 }, "requiredServiceCount": 13, "disabledServiceCount": 0, "matchesSource": false, "matchesTarget": false }, "services": [ { "serviceId": "hwlab-cloud-api", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-cloud-web", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-agent-mgr", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-agent-worker", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-gateway", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-gateway:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-gateway-simu", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-box-simu", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-patch-panel", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-router", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-router:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-tunnel-client", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-edge-proxy", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-cli", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-cli:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" }, { "serviceId": "hwlab-agent-skills", "commitId": "c7de474", "matchesSource": false, "matchesTarget": false, "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:c7de474", "imageTag": "c7de474", "digest": "not_published", "publishState": "skeleton-only", "artifactRequired": true, "notPublishedReason": "publish_not_run" } ], "serviceCommitIds": [ "c7de474" ], "matchesSource": false, "publishVerified": false, "refreshCommands": { "blocked": "node scripts/refresh-artifact-catalog.mjs --target-ref origin/main --blocked", "published": "node scripts/refresh-artifact-catalog.mjs --target-ref origin/main --publish-report reports/dev-gate/dev-artifacts.json" } } ] }, { "id": "artifact-catalog-publish-state", "category": "registry", "status": "blocked", "summary": "Artifact catalog publish state is contract-skeleton; ciPublished=false, registryVerified=false, digests sha256=0, not_published=13, invalid=0.", "evidence": [ { "path": "deploy/artifact-catalog.dev.json", "commitId": "c7de474", "artifactState": "contract-skeleton", "ciPublished": false, "registryVerified": false, "provenance": "not_available_until_publish", "digestCounts": { "sha256": 0, "notPublished": 13, "invalid": 0 }, "requiredServiceCount": 13, "disabledServiceCount": 0, "matchesSource": false, "matchesTarget": false } ] }, { "id": "k8s-manifest-static", "category": "k3s", "status": "pass", "summary": "DEV k3s manifest files parse and stay scoped to hwlab-dev.", "evidence": [] }, { "id": "registry-capability-process-http-access", "category": "registry", "status": "degraded", "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": [ { "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 } } ] }, { "id": "registry-capability-docker-daemon-push-access", "category": "registry", "status": "pass", "summary": "Docker daemon can see a local/internal registry target for publish preflight purposes; no push was attempted.", "evidence": [ { "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 39 hours" } ], "pushAttempted": false, "mutationAttempted": false } } ] }, { "id": "registry-capability-k3s-pull-access", "category": "registry", "status": "pass", "summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.", "evidence": [ { "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": 13, "pulledImages": [ { "pod": "hwlab-agent-mgr-75544c7747-5dzt9", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:c16c733306a28ae9385087653b79f5bb2f28724d917a89bb296646f6a02c5318" }, { "pod": "hwlab-agent-skills-849d9976f4-2nsmw", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:246fb7bb48597a7179aab62cb091e8213e47b71b6871ba94e6028032992e916c" }, { "pod": "hwlab-box-simu-55688cbcc7-pftxc", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:ae5fcc06a276918561c2d752f2221156bd2bd4db7fb93967ae76af97bfdc51bf" }, { "pod": "hwlab-box-simu-55688cbcc7-sq5fx", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:ae5fcc06a276918561c2d752f2221156bd2bd4db7fb93967ae76af97bfdc51bf" }, { "pod": "hwlab-cloud-api-74c969765d-kzvdd", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:86fe92c0dd5d5883851b38805e6f5acc49d2876552599c18f85480cf0d3bf981" }, { "pod": "hwlab-cloud-web-7d48b84f4b-n6hw6", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:c7de474", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:91cfacc1fc011a96bb47ff00d2ab09ee3c93003b7ec482308ec5ac35004e5627" }, { "pod": "hwlab-edge-proxy-567f978cdd-8fwc8", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:384832fc579063b9b0a940973690734bb402607720fd36f4662e4ee6fa5a57d2" }, { "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-699fd486b-j9pk7", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:00599721b910b5667b6be43c416cab4c410c6cc29b7f56ecdfb6eff71123d01c" }, { "pod": "hwlab-gateway-simu-699fd486b-phcgp", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:00599721b910b5667b6be43c416cab4c410c6cc29b7f56ecdfb6eff71123d01c" }, { "pod": "hwlab-patch-panel-757f9f44d5-7np8r", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:5b3aa6505492c2ed398d21cbd35a8754672114acd0fa97faa3351d4b6a6dfd5a" }, { "pod": "hwlab-router-5d9cbdf89b-p7r94", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:217b1fdb0f704c4183e9d8503644177f0c8bae674da0433985c19ef909f0e342" }, { "pod": "hwlab-tunnel-client-65c7858c8-wjqsh", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:9bcdd8a58132d7bc4dbfc71297f802fc0ab407a1b5c1bb1ea58e0791147a243b" } ], "pullFailures": [], "pullAttempted": false, "mutationAttempted": false } } ] }, { "id": "registry-capability-classification", "category": "registry", "status": "degraded", "summary": "Registry capability classification is degraded: process HTTP, Docker daemon push path, and k3s pull path are reported separately.", "evidence": [ { "version": "v1", "registryPrefix": "127.0.0.1:5000/hwlab", "generatedAt": "2026-05-22T16:59:47.814Z", "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 39 hours" } ], "pushAttempted": false, "mutationAttempted": false } }, "k3sPullAccess": { "id": "k3s-pull-access", "status": "pass", "requiredForPublish": false, "requiredForDeploy": true, "endpoint": "127.0.0.1:5000/hwlab", "probeKind": "kubectl-read-only", "summary": "Read-only kubectl observed hwlab-dev pods with pulled registry images.", "evidence": { "kubectlAvailable": true, "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": 13, "pulledImages": [ { "pod": "hwlab-agent-mgr-75544c7747-5dzt9", "container": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:c16c733306a28ae9385087653b79f5bb2f28724d917a89bb296646f6a02c5318" }, { "pod": "hwlab-agent-skills-849d9976f4-2nsmw", "container": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:246fb7bb48597a7179aab62cb091e8213e47b71b6871ba94e6028032992e916c" }, { "pod": "hwlab-box-simu-55688cbcc7-pftxc", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:ae5fcc06a276918561c2d752f2221156bd2bd4db7fb93967ae76af97bfdc51bf" }, { "pod": "hwlab-box-simu-55688cbcc7-sq5fx", "container": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:ae5fcc06a276918561c2d752f2221156bd2bd4db7fb93967ae76af97bfdc51bf" }, { "pod": "hwlab-cloud-api-74c969765d-kzvdd", "container": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:86fe92c0dd5d5883851b38805e6f5acc49d2876552599c18f85480cf0d3bf981" }, { "pod": "hwlab-cloud-web-7d48b84f4b-n6hw6", "container": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:c7de474", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:91cfacc1fc011a96bb47ff00d2ab09ee3c93003b7ec482308ec5ac35004e5627" }, { "pod": "hwlab-edge-proxy-567f978cdd-8fwc8", "container": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:384832fc579063b9b0a940973690734bb402607720fd36f4662e4ee6fa5a57d2" }, { "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-699fd486b-j9pk7", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:00599721b910b5667b6be43c416cab4c410c6cc29b7f56ecdfb6eff71123d01c" }, { "pod": "hwlab-gateway-simu-699fd486b-phcgp", "container": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:00599721b910b5667b6be43c416cab4c410c6cc29b7f56ecdfb6eff71123d01c" }, { "pod": "hwlab-patch-panel-757f9f44d5-7np8r", "container": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:5b3aa6505492c2ed398d21cbd35a8754672114acd0fa97faa3351d4b6a6dfd5a" }, { "pod": "hwlab-router-5d9cbdf89b-p7r94", "container": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:217b1fdb0f704c4183e9d8503644177f0c8bae674da0433985c19ef909f0e342" }, { "pod": "hwlab-tunnel-client-65c7858c8-wjqsh", "container": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:9bcdd8a58132d7bc4dbfc71297f802fc0ab407a1b5c1bb1ea58e0791147a243b" } ], "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." } } ] }, { "id": "cloud-api-db-env-contract", "category": "db", "status": "pass", "summary": "cloud-api DEV DB manifest declares the required env names, redacted Secret reference, and stable k3s DB DNS Service.", "evidence": [ { "staticContract": { "contractVersion": "v1", "environment": "dev", "ready": true, "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 } ], "dns": { "ready": true, "host": "cloud-api-db.hwlab-dev.svc.cluster.local", "serviceName": "cloud-api-db", "namespace": "hwlab-dev", "port": 5432, "portName": "postgres", "selectorless": true, "secretMaterialRead": false, "liveDbEvidence": false, "missing": [], "actual": { "deployServiceName": "cloud-api-db", "deployServiceNamespace": "hwlab-dev", "deployHost": "cloud-api-db.hwlab-dev.svc.cluster.local", "deployPort": "5432", "workloadServiceName": "cloud-api-db", "workloadServiceNamespace": "hwlab-dev", "workloadHost": "cloud-api-db.hwlab-dev.svc.cluster.local", "workloadPort": "5432", "serviceName": "cloud-api-db", "serviceNamespace": "hwlab-dev", "serviceType": "ClusterIP", "serviceSelector": null, "portName": "postgres", "port": 5432, "targetPort": "postgres" } }, "missingDeployEnv": [], "missingK8sEnv": [], "missingSecretRefs": [], "missingDnsContract": [], "secretMaterialRead": false, "valuesRedacted": true, "liveDbEvidence": false, "fixtureEvidence": false }, "healthContract": { "status": "blocked", "ready": false, "configReady": false, "connected": false, "liveConnected": false, "connectionChecked": false, "connectionAttempted": false, "connectionResult": "not_attempted_missing_env", "liveDbEvidence": false, "requiredEnv": [ { "name": "HWLAB_CLOUD_DB_URL", "present": false, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CLOUD_DB_SSL_MODE", "present": false, "redacted": false, "source": "runtime-env" } ], "missingEnv": [ "HWLAB_CLOUD_DB_URL", "HWLAB_CLOUD_DB_SSL_MODE" ], "secretRefs": [ { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "present": false, "envInjected": false, "secretPresent": "not_observed_by_runtime", "secretKeyPresent": "not_observed_by_runtime", "redacted": true } ], "connection": { "attempted": false, "networkAttempted": false, "result": "not_attempted_missing_env", "classification": "missing_runtime_env", "probeType": "tcp-connect", "endpointRedacted": true, "valueRedacted": true, "timeoutMs": null, "durationMs": 0, "errorCode": null }, "redaction": { "valuesRedacted": true, "endpointRedacted": true, "valueRedacted": true, "secretMaterialRead": false, "secretRefsOnly": true }, "blocker": "DB runtime config is missing HWLAB_CLOUD_DB_URL, HWLAB_CLOUD_DB_SSL_MODE", "fixtureEvidence": false }, "fixtureEvidence": false, "liveDbEvidence": false } ] }, { "id": "cloud-api-db-health-gate", "category": "db", "status": "blocked", "summary": "cloud-api DB health gate is missing HWLAB_CLOUD_DB_URL, HWLAB_CLOUD_DB_SSL_MODE.", "evidence": [ { "staticContract": { "contractVersion": "v1", "environment": "dev", "ready": true, "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 } ], "dns": { "ready": true, "host": "cloud-api-db.hwlab-dev.svc.cluster.local", "serviceName": "cloud-api-db", "namespace": "hwlab-dev", "port": 5432, "portName": "postgres", "selectorless": true, "secretMaterialRead": false, "liveDbEvidence": false, "missing": [], "actual": { "deployServiceName": "cloud-api-db", "deployServiceNamespace": "hwlab-dev", "deployHost": "cloud-api-db.hwlab-dev.svc.cluster.local", "deployPort": "5432", "workloadServiceName": "cloud-api-db", "workloadServiceNamespace": "hwlab-dev", "workloadHost": "cloud-api-db.hwlab-dev.svc.cluster.local", "workloadPort": "5432", "serviceName": "cloud-api-db", "serviceNamespace": "hwlab-dev", "serviceType": "ClusterIP", "serviceSelector": null, "portName": "postgres", "port": 5432, "targetPort": "postgres" } }, "missingDeployEnv": [], "missingK8sEnv": [], "missingSecretRefs": [], "missingDnsContract": [], "secretMaterialRead": false, "valuesRedacted": true, "liveDbEvidence": false, "fixtureEvidence": false }, "healthContract": { "status": "blocked", "ready": false, "configReady": false, "connected": false, "liveConnected": false, "connectionChecked": false, "connectionAttempted": false, "connectionResult": "not_attempted_missing_env", "liveDbEvidence": false, "requiredEnv": [ { "name": "HWLAB_CLOUD_DB_URL", "present": false, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CLOUD_DB_SSL_MODE", "present": false, "redacted": false, "source": "runtime-env" } ], "missingEnv": [ "HWLAB_CLOUD_DB_URL", "HWLAB_CLOUD_DB_SSL_MODE" ], "secretRefs": [ { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "present": false, "envInjected": false, "secretPresent": "not_observed_by_runtime", "secretKeyPresent": "not_observed_by_runtime", "redacted": true } ], "connection": { "attempted": false, "networkAttempted": false, "result": "not_attempted_missing_env", "classification": "missing_runtime_env", "probeType": "tcp-connect", "endpointRedacted": true, "valueRedacted": true, "timeoutMs": null, "durationMs": 0, "errorCode": null }, "redaction": { "valuesRedacted": true, "endpointRedacted": true, "valueRedacted": true, "secretMaterialRead": false, "secretRefsOnly": true }, "blocker": "DB runtime config is missing HWLAB_CLOUD_DB_URL, HWLAB_CLOUD_DB_SSL_MODE", "fixtureEvidence": false }, "fixtureEvidence": false, "liveDbEvidence": false } ] }, { "id": "dev-artifact-publish-report", "category": "registry", "status": "blocked", "summary": "DEV artifact publish report status is published with 13/13 required services published for source 7e29522b65c8a316b7c3fde12bebcb5f6baf8c33; source states resolved: 13 source-present, 0 intentionally-disabled.", "evidence": [] }, { "id": "dev-edge-health-report", "category": "edge", "status": "blocked", "summary": "Committed DEV edge health report is blocked with classification app_health_blocker.", "evidence": [ { "report": "reports/dev-gate/dev-edge-health.json", "status": "blocked", "classification": "app_health_blocker", "publicTcp": [ { "host": "74.48.78.17", "port": 16667, "status": "connected", "durationMs": 206 }, { "host": "74.48.78.17", "port": 7000, "status": "connected", "durationMs": 218 }, { "host": "74.48.78.17", "port": 7402, "status": "connected", "durationMs": 207 } ], "kubernetesObservable": true } ] }, { "id": "frp-master-edge-static", "category": "edge", "status": "pass", "summary": "FRP and master-edge contracts describe D601-to-master DEV on public ports 16666/16667.", "evidence": [] }, { "id": "runtime-substitution-boundary", "category": "safety", "status": "pass", "summary": "Deploy images do not point at UniDesk/provider-gateway/microservice-proxy substitutes.", "evidence": [] }, { "id": "d601-k3s-read-access", "category": "k3s", "status": "pass", "summary": "Read-only kubectl probes reached hwlab-dev.", "evidence": [ { "ok": true, "command": "kubectl version --client=true", "exitCode": 0, "stdout": "Client Version: v1.36.1\nKustomize Version: v5.8.1", "stderr": "" }, { "ok": true, "command": "kubectl config current-context", "exitCode": 0, "stdout": "in-cluster", "stderr": "" }, { "ok": true, "command": "kubectl auth can-i get pods -n hwlab-dev", "exitCode": 0, "stdout": "yes", "stderr": "" }, { "ok": true, "command": "kubectl get namespace hwlab-dev -o json", "exitCode": 0, "stdout": "{\n \"apiVersion\": \"v1\",\n \"kind\": \"Namespace\",\n \"metadata\": {\n \"annotations\": {\n \"kubectl.kubernetes.io/last-applied-configuration\": \"{\\\"apiVersion\\\":\\\"v1\\\",\\\"kind\\\":\\\"Namespace\\\",\\\"metadata\\\":{\\\"annotations\\\":{},\\\"labels\\\":{\\\"app.kubernetes.io/part-of\\\":\\\"hwlab\\\",\\\"hwlab.pikastech.local/environment\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/profile\\\":\\\"dev\\\"},\\\"name\\\":\\\"hwlab-dev\\\"}}\\n\"\n },\n \"creationTimestamp\": \"2026-05-21T23:52:11Z\",\n \"labels\": {\n \"app.kubernetes.io/part-of\": \"hwlab\",\n \"hwlab.pikastech.local/environment\": \"dev\",\n \"hwlab.pikastech.local/profile\": \"dev\",\n \"kubernetes.io/metadata.name\": \"hwlab-dev\"\n },\n \"name\": \"hwlab-dev\",\n \"resourceVersion\": \"1081061\",\n \"uid\": \"97fbde04-c052-46f3-91ee-b15616f7690b\"\n },\n \"spec\": {\n \"finalizers\": [\n \"kubernetes\"\n ]\n },\n \"status\": {\n \"phase\": \"Active\"\n }\n}", "stderr": "" }, { "ok": true, "command": "kubectl -n hwlab-dev get deploy,svc,job,cm -o name", "exitCode": 0, "stdout": "deployment.apps/hwlab-agent-mgr\ndeployment.apps/hwlab-agent-skills\ndeployment.apps/hwlab-box-simu\ndeployment.apps/hwlab-cloud-api\ndeployment.apps/hwlab-cloud-web\ndeployment.apps/hwlab-edge-proxy\ndeployment.apps/hwlab-frpc\ndeployment.apps/hwlab-gateway\ndeployment.apps/hwlab-gateway-simu\ndeployment.apps/hwlab-patch-panel\ndeployment.apps/hwlab-router\ndeployment.apps/hwlab-tunnel-client\nservice/hwlab-agent-mgr\nservice/hwlab-agent-skills\nservice/hwlab-box-simu\nservice/hwlab-cli\nservice/hwlab-cloud-api\nservice/hwlab-cloud-web\nservice/hwlab-edge-proxy\nservice/hwlab-gateway\nservice/hwlab-gateway-simu\nservice/hwlab-patch-panel\nservice/hwlab-router\nservice/hwlab-tunnel-client\njob.batch/hwlab-agent-worker-template\njob.batch/hwlab-cli-template\nconfigmap/hwlab-dev-health-contract\nconfigmap/hwlab-frpc-config\nconfigmap/kube-root-ca.crt", "stderr": "" } ] }, { "id": "public-dev-edge-health", "category": "edge", "status": "pass", "summary": "Public DEV health endpoint responded successfully.", "evidence": [ { "ok": true, "url": "http://74.48.78.17:16667/health/live", "method": "GET", "status": 200, "statusText": "OK", "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"degraded\",\"service\":{\"id\":\"hwlab-cloud-api\",\"role\":\"cloud-api\",\"healthPath\":\"/health\",\"livePath\":\"/health/live\"},\"commit\":{\"id\":\"c7de474\",\"source\":\"runtime-env\"},\"image\":{\"reference\":\"127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474\",\"tag\":\"c7de474\",\"digest\":\"unknown\"},\"endpoint\":\"http://74.48.78.17:16667\",\"observedAt\":\"2026-05-22T16:59:48.488Z\",\"db\":{\"contractVersion\":\"v1\",\"environment\":\"dev\",\"connected\":false,\"liveConnected\":false,\"liveD" } ] }, { "id": "catalog-image-manifest-read", "category": "artifact-catalog", "status": "degraded", "summary": "One or more required catalog images could not be verified through manifest HEAD probes; this is runner-process catalog evidence, not Docker daemon push access.", "evidence": [ { "serviceId": "hwlab-cloud-api", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cloud-api/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-cloud-web", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cloud-web/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-agent-mgr", "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-mgr/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-agent-worker", "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-worker/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-gateway", "image": "127.0.0.1:5000/hwlab/hwlab-gateway:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-gateway/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-gateway-simu", "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-gateway-simu/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-box-simu", "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-box-simu/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-patch-panel", "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-patch-panel/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-router", "image": "127.0.0.1:5000/hwlab/hwlab-router:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-router/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-tunnel-client/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-edge-proxy/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-cli", "image": "127.0.0.1:5000/hwlab/hwlab-cli:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cli/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" }, { "serviceId": "hwlab-agent-skills", "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:c7de474", "ok": false, "url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-skills/manifests/c7de474", "method": "HEAD", "error": "fetch failed ECONNREFUSED 127.0.0.1 5000" } ] } ], "blockers": [ { "status": "open", "type": "contract_blocker", "scope": "artifact-source-commit", "summary": "source commit origin/main f64182b is not covered by artifact source 7e29522; target changes since the artifact source touch artifact build inputs.", "nextTask": "Refresh without fake digests using `node scripts/refresh-artifact-catalog.mjs --target-ref origin/main --blocked`, or after a successful publish run `node scripts/refresh-artifact-catalog.mjs --target-ref origin/main --publish-report reports/dev-gate/dev-artifacts.json`." }, { "status": "open", "type": "runtime_blocker", "scope": "artifact-catalog", "summary": "deploy/artifact-catalog.dev.json does not prove published artifacts for origin/main f64182b; ciPublished=false, registryVerified=false, not_published=13.", "nextTask": "Run the DEV artifact publish workflow, then record only real sha256 digests with `node scripts/refresh-artifact-catalog.mjs --target-ref origin/main --publish-report reports/dev-gate/dev-artifacts.json`; if publish is still blocked, keep not_published via `node scripts/refresh-artifact-catalog.mjs --target-ref origin/main --blocked`." }, { "status": "open", "type": "runtime_blocker", "scope": "cloud-api-db-health-gate", "summary": "cloud-api DB runtime env is not ready; missing HWLAB_CLOUD_DB_URL, HWLAB_CLOUD_DB_SSL_MODE.", "nextTask": "Configure DEV hwlab-cloud-api with Secret hwlab-cloud-api-dev-db/database-url and HWLAB_CLOUD_DB_SSL_MODE=require, then rerun health/preflight without printing the secret value." }, { "status": "open", "type": "runtime_blocker", "scope": "dev-artifact-publish", "summary": "reports/dev-gate/dev-artifacts.json does not prove all required HWLAB service artifacts for origin/main f64182b; current status is published with 13/13 required services published and source states resolved: 13 source-present, 0 intentionally-disabled.", "nextTask": "Complete DEV artifact publishing for every enabled required HWLAB service at the artifact source commit, or prove the target commit has no artifact build input changes; keep disabled services marked not_published with reasons." }, { "status": "open", "type": "network_blocker", "scope": "cloud-api-db", "summary": "DB endpoint DNS resolution failed from the cloud-api runtime", "nextTask": "Deploy cloud-api DB runtime readiness probe and/or repair DEV DB connectivity, then rerun the read-only health smoke without reading or printing the DB secret value." } ], "notes": "No PROD action, secret read, UniDesk runtime substitution, heavy e2e, browser e2e, runtime restart, or force push was performed." }