Files
pikasTech-HWLAB/reports/dev-gate/dev-preflight-report.json
T
2026-05-22 07:26:40 +00:00

1574 lines
65 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#35",
"pikasTech/HWLAB#39",
"pikasTech/HWLAB#43",
"pikasTech/HWLAB#48",
"pikasTech/HWLAB#49",
"pikasTech/HWLAB#57",
"pikasTech/HWLAB#66"
],
"target": {
"ref": "origin/main",
"commitId": "8e89409dda5d0b028de7f7b7b0e006a60bdd6d44",
"shortCommitId": "8e89409"
},
"generatedAt": "2026-05-22T07:12:46.951Z",
"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": "8e89409dda5d0b028de7f7b7b0e006a60bdd6d44",
"shortCommitId": "8e89409"
},
"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": "8e89409dda5d0b028de7f7b7b0e006a60bdd6d44",
"targetShortCommitId": "8e89409",
"mode": "artifact-input-drift",
"covered": false,
"artifactBuildInputChanged": true,
"changedPathCount": 48,
"changedArtifactInputPaths": [
"internal/dev-report-lifecycle.mjs",
"internal/mvp-gate/summary.mjs",
"internal/protocol/index.mjs",
"package.json",
"scripts/dev-artifact-publish.mjs",
"web/hwlab-cloud-web/gate-summary.mjs"
],
"changedNonArtifactPathCount": 42,
"reason": "target changes since the artifact source touch artifact build inputs"
},
"deployManifest": {
"path": "deploy/deploy.json",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false
},
"artifactCatalog": {
"path": "deploy/artifact-catalog.dev.json",
"commitId": "7e29522",
"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": true,
"matchesTarget": false
},
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:7e29522",
"imageTag": "7e29522",
"digest": "sha256:090b6f919be3b3c7594ca4073b193351689fc525f478b64d54d393725cb01ecf",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:7e29522",
"imageTag": "7e29522",
"digest": "sha256:bc6e836b2bb796b30562ed3ae93d8534146a3b74a310906481c8641646d1b8f0",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-mgr",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:7e29522",
"imageTag": "7e29522",
"digest": "sha256:4d9b8944bc52012bb0a4a3a345f8939381d2804032e544d0c98f49fac0e46bfd",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-worker",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522",
"imageTag": "7e29522",
"digest": "sha256:2582176e2c35a2bfbce4edfd922749397d45f6f1f8c04d0394c501f7d87323ee",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:7e29522",
"imageTag": "7e29522",
"digest": "sha256:290341fd6e6f036aa953943072ad58e0d0cfcc0e13950e6090f941b3310755a6",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway-simu",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:7e29522",
"imageTag": "7e29522",
"digest": "sha256:02627f880c7ddf2102e2255a43097d1f604cfb7a22215736e328287e27fc5f03",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-box-simu",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:7e29522",
"imageTag": "7e29522",
"digest": "sha256:e02c270c71f83a2f4624722bb84616bea8374ef43439f27bdce310e4baa8dcca",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-patch-panel",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:7e29522",
"imageTag": "7e29522",
"digest": "sha256:f730323f83c62797f382932582a05df921045c86383dad7951f3d639b32456a9",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-router",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-router:7e29522",
"imageTag": "7e29522",
"digest": "sha256:7c40c573078a9c325402bd47b2eb78a46c0c80564a228cf7c9fcf0cfba5bc6d2",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-tunnel-client",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:7e29522",
"imageTag": "7e29522",
"digest": "sha256:b141dc88557b8f6391aa082fdb37c6f0db5bc3a76c97bb39ba00354a9208abd8",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:7e29522",
"imageTag": "7e29522",
"digest": "sha256:792505139793c3f3da7769f9dc9d1cb3203ff92797305b62e8f12207c69a9831",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-cli",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cli:7e29522",
"imageTag": "7e29522",
"digest": "sha256:43d1c175091bfb462eddd7dd22a780d6485d86bdb052c36b78201606f48fadc1",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:7e29522",
"imageTag": "7e29522",
"digest": "sha256:c75510038dc33196dc254472e78101d545c0d777a7b33b531f02b39faf2588b5",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
}
],
"serviceCommitIds": [
"7e29522"
],
"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-22T07:12:45.056Z",
"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 30 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 8e89409 is not covered by artifact source 7e29522: target changes since the artifact source touch artifact build inputs.",
"evidence": [
{
"source": {
"ref": "origin/main",
"commitId": "8e89409dda5d0b028de7f7b7b0e006a60bdd6d44",
"shortCommitId": "8e89409"
},
"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": "8e89409dda5d0b028de7f7b7b0e006a60bdd6d44",
"targetShortCommitId": "8e89409",
"mode": "artifact-input-drift",
"covered": false,
"artifactBuildInputChanged": true,
"changedPathCount": 48,
"changedArtifactInputPaths": [
"internal/dev-report-lifecycle.mjs",
"internal/mvp-gate/summary.mjs",
"internal/protocol/index.mjs",
"package.json",
"scripts/dev-artifact-publish.mjs",
"web/hwlab-cloud-web/gate-summary.mjs"
],
"changedNonArtifactPathCount": 42,
"reason": "target changes since the artifact source touch artifact build inputs"
},
"deployManifest": {
"path": "deploy/deploy.json",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false
},
"artifactCatalog": {
"path": "deploy/artifact-catalog.dev.json",
"commitId": "7e29522",
"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": true,
"matchesTarget": false
},
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:7e29522",
"imageTag": "7e29522",
"digest": "sha256:090b6f919be3b3c7594ca4073b193351689fc525f478b64d54d393725cb01ecf",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:7e29522",
"imageTag": "7e29522",
"digest": "sha256:bc6e836b2bb796b30562ed3ae93d8534146a3b74a310906481c8641646d1b8f0",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-mgr",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:7e29522",
"imageTag": "7e29522",
"digest": "sha256:4d9b8944bc52012bb0a4a3a345f8939381d2804032e544d0c98f49fac0e46bfd",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-worker",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522",
"imageTag": "7e29522",
"digest": "sha256:2582176e2c35a2bfbce4edfd922749397d45f6f1f8c04d0394c501f7d87323ee",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:7e29522",
"imageTag": "7e29522",
"digest": "sha256:290341fd6e6f036aa953943072ad58e0d0cfcc0e13950e6090f941b3310755a6",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway-simu",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:7e29522",
"imageTag": "7e29522",
"digest": "sha256:02627f880c7ddf2102e2255a43097d1f604cfb7a22215736e328287e27fc5f03",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-box-simu",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:7e29522",
"imageTag": "7e29522",
"digest": "sha256:e02c270c71f83a2f4624722bb84616bea8374ef43439f27bdce310e4baa8dcca",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-patch-panel",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:7e29522",
"imageTag": "7e29522",
"digest": "sha256:f730323f83c62797f382932582a05df921045c86383dad7951f3d639b32456a9",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-router",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-router:7e29522",
"imageTag": "7e29522",
"digest": "sha256:7c40c573078a9c325402bd47b2eb78a46c0c80564a228cf7c9fcf0cfba5bc6d2",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-tunnel-client",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:7e29522",
"imageTag": "7e29522",
"digest": "sha256:b141dc88557b8f6391aa082fdb37c6f0db5bc3a76c97bb39ba00354a9208abd8",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:7e29522",
"imageTag": "7e29522",
"digest": "sha256:792505139793c3f3da7769f9dc9d1cb3203ff92797305b62e8f12207c69a9831",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-cli",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-cli:7e29522",
"imageTag": "7e29522",
"digest": "sha256:43d1c175091bfb462eddd7dd22a780d6485d86bdb052c36b78201606f48fadc1",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "7e29522",
"matchesSource": true,
"matchesTarget": false,
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:7e29522",
"imageTag": "7e29522",
"digest": "sha256:c75510038dc33196dc254472e78101d545c0d777a7b33b531f02b39faf2588b5",
"publishState": "published",
"artifactRequired": true,
"notPublishedReason": null
}
],
"serviceCommitIds": [
"7e29522"
],
"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": "7e29522",
"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": true,
"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 30 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-22T07:12:45.056Z",
"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 30 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 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": 228
},
{
"host": "74.48.78.17",
"port": 7000,
"status": "connected",
"durationMs": 212
},
{
"host": "74.48.78.17",
"port": 7402,
"status": "connected",
"durationMs": 216
}
],
"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-22T07:12:46.583Z\",\"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cloud-api/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cloud-web/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-mgr/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-worker/manifests/7e29522",
"method": "HEAD",
"error": "fetch failed ECONNREFUSED 127.0.0.1 5000"
},
{
"serviceId": "hwlab-gateway",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-gateway/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-gateway-simu/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-box-simu/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-patch-panel/manifests/7e29522",
"method": "HEAD",
"error": "fetch failed ECONNREFUSED 127.0.0.1 5000"
},
{
"serviceId": "hwlab-router",
"image": "127.0.0.1:5000/hwlab/hwlab-router:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-router/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-tunnel-client/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-edge-proxy/manifests/7e29522",
"method": "HEAD",
"error": "fetch failed ECONNREFUSED 127.0.0.1 5000"
},
{
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-cli/manifests/7e29522",
"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:7e29522",
"ok": false,
"url": "http://127.0.0.1:5000/v2/hwlab/hwlab-agent-skills/manifests/7e29522",
"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 8e89409 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": "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 8e89409; 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": "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."
}