Files
pikasTech-HWLAB/reports/dev-gate/dev-preflight-report.json
T
Lyon 7e29522b65 fix: split registry capability probes
Refs #66. Merged by commander after reviewing Code Queue task codex_1779422778882_1. Separates process HTTP, Docker daemon push, and k3s pull registry capabilities so runner loopback HTTP degradation does not block artifact publish when Docker/k3s paths are proven.
2026-05-22 12:46:59 +08:00

1476 lines
61 KiB
JSON

{
"$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#39",
"pikasTech/HWLAB#49",
"pikasTech/HWLAB#66",
"pikasTech/HWLAB#33",
"pikasTech/HWLAB#35",
"pikasTech/HWLAB#48"
],
"target": {
"ref": "origin/main",
"commitId": "a1c3cb58da0067a12424277d47d9d50d0cbf7a9d",
"shortCommitId": "a1c3cb5"
},
"generatedAt": "2026-05-22T04:31:08.449Z",
"mode": "read-only",
"devOnly": true,
"prodDisabled": true,
"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": "a1c3cb58da0067a12424277d47d9d50d0cbf7a9d",
"shortCommitId": "a1c3cb5"
},
"deployManifest": {
"path": "deploy/deploy.json",
"commitId": "73b379f",
"matchesSource": false
},
"artifactCatalog": {
"path": "deploy/artifact-catalog.dev.json",
"commitId": "73b379f",
"artifactState": "published",
"ciPublished": true,
"registryVerified": true,
"provenance": "reports/dev-gate/dev-artifacts.json",
"digestCounts": {
"sha256": 13,
"notPublished": 0,
"invalid": 0
},
"requiredServiceCount": 13,
"disabledServiceCount": 0,
"matchesSource": false
},
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:73b379f",
"imageTag": "73b379f",
"digest": "sha256:561e50494bf13bf61f83d28b371bc39b860b21333ef9991711853a095bd535bf",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:73b379f",
"imageTag": "73b379f",
"digest": "sha256:c7939658af9f1109e5384619163dd0d11e1a1de14e7d15d4cbde7c4400b495c2",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-mgr",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:73b379f",
"imageTag": "73b379f",
"digest": "sha256:ae6ca76cd09a7d21e46e0076e12dea1843417a0d59d57b3115915c831e88ebef",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-worker",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:73b379f",
"imageTag": "73b379f",
"digest": "sha256:4d5f8d8d404fc2826256fb690fdea5570285a34d1bdffbaf1e0c7ca39603ffd8",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:73b379f",
"imageTag": "73b379f",
"digest": "sha256:ff9f3f3dc6332c3d8e4e9825657c296c9664d84a8d40c3ffeab3c1e91a484008",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway-simu",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:73b379f",
"imageTag": "73b379f",
"digest": "sha256:f5ccff29da331e424a482f92394d071e1be90c0244e7137e07ac33d9a7cc4082",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-box-simu",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:73b379f",
"imageTag": "73b379f",
"digest": "sha256:2a12c1c462b2c01a9fa15efa75a6e1f17ecc8432dfa88bca53f0d8d4b6355daf",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-patch-panel",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:73b379f",
"imageTag": "73b379f",
"digest": "sha256:5bc9a1c7ce65026cd7bf6d20a311226b35c796a4d52a914266244bf3c1a17286",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-router",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-router:73b379f",
"imageTag": "73b379f",
"digest": "sha256:356f37a7d78cc2f86230c2037f43215ad66979fbe4a949cb9241b5957692d9d8",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-tunnel-client",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:73b379f",
"imageTag": "73b379f",
"digest": "sha256:8ca553408a633d7f287ca9440f822fb1458dd9a028eb4db178b466b0b5505c49",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:73b379f",
"imageTag": "73b379f",
"digest": "sha256:480dea831051d45b6d63a489db9c0fa314f88bae35dbf72be4186bf1de356f38",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-cli",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cli:73b379f",
"imageTag": "73b379f",
"digest": "sha256:125154cf59727ec230618c65b07a6235c18c1411f9ad51525ae411040169c9b5",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:73b379f",
"imageTag": "73b379f",
"digest": "sha256:5bdf9a4d17f8f4c7f3ecead99dcbd4de0ac346a2c28fef020b8853cf494df573",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
}
],
"serviceCommitIds": [
"73b379f"
],
"matchesSource": false,
"publishVerified": true,
"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-22T04:31:07.663Z",
"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 27 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-f48dcdfb-9n6zh",
"container": "hwlab-cloud-api",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:cb35ada",
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:3946efdd7360409cea6a897cb03a6f3172f14819d3132df3aab821621909513f"
},
{
"pod": "hwlab-cloud-web-cd9655b98-gxtmc",
"container": "hwlab-cloud-web",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:cb35ada",
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:868e2a11c56cc1a27c77de3fa71a7b092f21ae98a4052104e9071bd93960abfa"
},
{
"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 a1c3cb5 is not covered by deploy commit 73b379f, catalog commit 73b379f, service commits 73b379f.",
"evidence": [
{
"source": {
"ref": "origin/main",
"commitId": "a1c3cb58da0067a12424277d47d9d50d0cbf7a9d",
"shortCommitId": "a1c3cb5"
},
"deployManifest": {
"path": "deploy/deploy.json",
"commitId": "73b379f",
"matchesSource": false
},
"artifactCatalog": {
"path": "deploy/artifact-catalog.dev.json",
"commitId": "73b379f",
"artifactState": "published",
"ciPublished": true,
"registryVerified": true,
"provenance": "reports/dev-gate/dev-artifacts.json",
"digestCounts": {
"sha256": 13,
"notPublished": 0,
"invalid": 0
},
"requiredServiceCount": 13,
"disabledServiceCount": 0,
"matchesSource": false
},
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:73b379f",
"imageTag": "73b379f",
"digest": "sha256:561e50494bf13bf61f83d28b371bc39b860b21333ef9991711853a095bd535bf",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:73b379f",
"imageTag": "73b379f",
"digest": "sha256:c7939658af9f1109e5384619163dd0d11e1a1de14e7d15d4cbde7c4400b495c2",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-mgr",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:73b379f",
"imageTag": "73b379f",
"digest": "sha256:ae6ca76cd09a7d21e46e0076e12dea1843417a0d59d57b3115915c831e88ebef",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-worker",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:73b379f",
"imageTag": "73b379f",
"digest": "sha256:4d5f8d8d404fc2826256fb690fdea5570285a34d1bdffbaf1e0c7ca39603ffd8",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:73b379f",
"imageTag": "73b379f",
"digest": "sha256:ff9f3f3dc6332c3d8e4e9825657c296c9664d84a8d40c3ffeab3c1e91a484008",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway-simu",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:73b379f",
"imageTag": "73b379f",
"digest": "sha256:f5ccff29da331e424a482f92394d071e1be90c0244e7137e07ac33d9a7cc4082",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-box-simu",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:73b379f",
"imageTag": "73b379f",
"digest": "sha256:2a12c1c462b2c01a9fa15efa75a6e1f17ecc8432dfa88bca53f0d8d4b6355daf",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-patch-panel",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:73b379f",
"imageTag": "73b379f",
"digest": "sha256:5bc9a1c7ce65026cd7bf6d20a311226b35c796a4d52a914266244bf3c1a17286",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-router",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-router:73b379f",
"imageTag": "73b379f",
"digest": "sha256:356f37a7d78cc2f86230c2037f43215ad66979fbe4a949cb9241b5957692d9d8",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-tunnel-client",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:73b379f",
"imageTag": "73b379f",
"digest": "sha256:8ca553408a633d7f287ca9440f822fb1458dd9a028eb4db178b466b0b5505c49",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:73b379f",
"imageTag": "73b379f",
"digest": "sha256:480dea831051d45b6d63a489db9c0fa314f88bae35dbf72be4186bf1de356f38",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-cli",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cli:73b379f",
"imageTag": "73b379f",
"digest": "sha256:125154cf59727ec230618c65b07a6235c18c1411f9ad51525ae411040169c9b5",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "73b379f",
"matchesSource": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:73b379f",
"imageTag": "73b379f",
"digest": "sha256:5bdf9a4d17f8f4c7f3ecead99dcbd4de0ac346a2c28fef020b8853cf494df573",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
}
],
"serviceCommitIds": [
"73b379f"
],
"matchesSource": false,
"publishVerified": true,
"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": "pass",
"summary": "Artifact catalog records CI publish, registry verification, and immutable service digests.",
"evidence": [
{
"path": "deploy/artifact-catalog.dev.json",
"commitId": "73b379f",
"artifactState": "published",
"ciPublished": true,
"registryVerified": true,
"provenance": "reports/dev-gate/dev-artifacts.json",
"digestCounts": {
"sha256": 13,
"notPublished": 0,
"invalid": 0
},
"requiredServiceCount": 13,
"disabledServiceCount": 0,
"matchesSource": 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 27 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-f48dcdfb-9n6zh",
"container": "hwlab-cloud-api",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:cb35ada",
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:3946efdd7360409cea6a897cb03a6f3172f14819d3132df3aab821621909513f"
},
{
"pod": "hwlab-cloud-web-cd9655b98-gxtmc",
"container": "hwlab-cloud-web",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:cb35ada",
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:868e2a11c56cc1a27c77de3fa71a7b092f21ae98a4052104e9071bd93960abfa"
},
{
"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-22T04:31:07.663Z",
"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 27 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-f48dcdfb-9n6zh",
"container": "hwlab-cloud-api",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:cb35ada",
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:3946efdd7360409cea6a897cb03a6f3172f14819d3132df3aab821621909513f"
},
{
"pod": "hwlab-cloud-web-cd9655b98-gxtmc",
"container": "hwlab-cloud-web",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:cb35ada",
"imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:868e2a11c56cc1a27c77de3fa71a7b092f21ae98a4052104e9071bd93960abfa"
},
{
"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 and redacted Secret reference.",
"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
}
],
"missingDeployEnv": [],
"missingK8sEnv": [],
"missingSecretRefs": [],
"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",
"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
},
"blocker": "DB runtime config is missing HWLAB_CLOUD_DB_URL, HWLAB_CLOUD_DB_SSL_MODE",
"liveDbEvidence": false,
"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
}
],
"missingDeployEnv": [],
"missingK8sEnv": [],
"missingSecretRefs": [],
"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",
"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
},
"blocker": "DB runtime config is missing HWLAB_CLOUD_DB_URL, HWLAB_CLOUD_DB_SSL_MODE",
"liveDbEvidence": false,
"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 73b379f4441d47a99dfd978a80fd43727410af51; 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": 212
},
{
"host": "74.48.78.17",
"port": 7000,
"status": "connected",
"durationMs": 1205
},
{
"host": "74.48.78.17",
"port": 7402,
"status": "connected",
"durationMs": 232
}
],
"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\":\"cb35ada\",\"source\":\"runtime-env\"},\"image\":{\"reference\":\"127.0.0.1:5000/hwlab/hwlab-cloud-api:cb35ada\",\"tag\":\"cb35ada\",\"digest\":\"unknown\"},\"endpoint\":\"http://74.48.78.17:16667\",\"observedAt\":\"2026-05-22T04:31:08.245Z\",\"db\":{\"contractVersion\":\"v1\",\"environment\":\"dev\",\"connected\":false,\"connectionChecked\":false,\"c"
}
]
},
{
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cloud-api/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cloud-web/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-mgr/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-worker/manifests/73b379f",
"method": "HEAD",
"error": "fetch failed ECONNREFUSED 127.0.0.1 5000"
},
{
"serviceId": "hwlab-gateway",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-gateway/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-gateway-simu/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-box-simu/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-patch-panel/manifests/73b379f",
"method": "HEAD",
"error": "fetch failed ECONNREFUSED 127.0.0.1 5000"
},
{
"serviceId": "hwlab-router",
"image": "127.0.0.1:5000/hwlab/hwlab-router:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-router/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-tunnel-client/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-edge-proxy/manifests/73b379f",
"method": "HEAD",
"error": "fetch failed ECONNREFUSED 127.0.0.1 5000"
},
{
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cli/manifests/73b379f",
"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:73b379f",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-skills/manifests/73b379f",
"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 a1c3cb5 does not match deploy/catalog artifact identity: deploy=73b379f, catalog=73b379f, services=73b379f.",
"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": "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 a1c3cb5; 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 current origin/main commit and record immutable registry digests; keep disabled services marked not_published with reasons."
},
{
"status": "open",
"type": "network_blocker",
"scope": "cloud-api-db",
"summary": "cloud-api DB env is injected, but runtime health has not attempted a live DB connection",
"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."
}