{ "$schema": "https://hwlab.pikastech.local/schemas/dev-gate-report.schema.json", "$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-edge-health.json", "reportVersion": "v1", "issue": "pikasTech/HWLAB#36", "taskId": "dev-edge-health", "commitId": "cb35ada68606", "acceptanceLevel": "dev_edge_health", "devOnly": true, "prodDisabled": true, "status": "blocked", "generatedAt": "2026-05-22T04:22:14.774Z", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "sourceContract": { "status": "pass", "documents": [ "docs/dev-acceptance-matrix.md", "docs/m0-contract-audit.md", "docs/dev-edge-health.md", "deploy/frp/README.md", "deploy/master-edge/README.md" ], "summary": "DEV edge health is pinned to the frozen HWLAB endpoint, frp reverse link, master edge proxy, and hwlab-dev services." }, "validationCommands": [ "node --check scripts/validate-dev-gate-report.mjs", "node scripts/validate-dev-gate-report.mjs", "node --check scripts/dev-edge-health-smoke.mjs", "node --check scripts/src/dev-edge-health-smoke-lib.mjs", "node scripts/dev-edge-health-smoke.mjs --live --write-report" ], "localSmoke": { "status": "pass", "commands": [ "node scripts/m1-contract-smoke.mjs" ], "evidence": [ "npm run check includes internal/cloud/server.test.mjs and validates /health plus /health/live." ], "summary": "Local cloud-api health checks pass and include service, commit, and image evidence fields." }, "dryRun": { "status": "not_run", "commands": [ "node tools/hwlab-cli/bin/hwlab-cli.mjs test e2e --env dev --mvp --dry-run" ], "evidence": [ "This edge-health task used the dedicated read-only smoke instead of the MVP e2e dry-run." ], "summary": "MVP dry-run remains the generic gate command; edge health uses a narrower route smoke." }, "devPreconditions": { "status": "blocked", "requirements": [ "http://74.48.78.17:16667/health returns HWLAB DEV JSON with service, commit, and image evidence", "frps control on 74.48.78.17:7000 accepts the D601 frp client", "hwlab-dev hwlab-edge-proxy, hwlab-tunnel-client, hwlab-router, and hwlab-cloud-api are observable", "No PROD endpoint, secret read, restart, or UniDesk runtime substitute is used" ], "summary": "cloud-api DB env is injected, but runtime health has not attempted a live DB connection" }, "blockers": [ { "type": "runtime_blocker", "scope": "cloud-api-db", "status": "open", "summary": "cloud-api DB env is injected, but runtime health has not attempted a live DB connection" } ], "edgeHealth": { "generatedAt": "2026-05-22T04:22:14.774Z", "mode": "live-read-only", "endpoint": "http://74.48.78.17:16667", "safety": { "environment": "dev", "prodTouched": false, "secretsRead": false, "restarts": false, "unideskRuntimeSubstitute": false }, "contracts": { "devEndpoint": "http://74.48.78.17:16667", "frp": { "frpcTargetsEdgeProxy": true, "frpcTargetsCloudWeb": true, "frpsTcpRemotePort16667": true, "frpsTcpRemotePort16666": true, "frpsUsesVhostEdgePort": false, "configRisk": "none" }, "masterEdge": { "endpoint": "http://74.48.78.17:16667", "reverseLinkMode": "frp", "reverseLinkClient": "hwlab-tunnel-client", "publicPort": 16667 }, "deploy": { "environment": "dev", "namespace": "hwlab-dev", "serviceCount": 13, "edgeProxy": { "serviceId": "hwlab-edge-proxy", "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:73b379f", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_EDGE_LISTEN": "0.0.0.0:6667", "HWLAB_EDGE_UPSTREAM": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667" } }, "tunnelClient": { "serviceId": "hwlab-tunnel-client", "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:73b379f", "namespace": "hwlab-dev", "healthPath": "/health/live", "profile": "dev", "replicas": 1, "env": { "HWLAB_TUNNEL_MODE": "frp-client", "HWLAB_FRP_SERVER_ADDR": "74.48.78.17", "HWLAB_FRP_PUBLIC_PORT": "16667", "HWLAB_FRP_WEB_PUBLIC_PORT": "16666" } }, "cloudApiDb": { "status": "degraded", "ready": false, "configReady": true, "connected": false, "liveConnected": false, "connectionChecked": false, "connectionAttempted": false, "connectionResult": "manifest_only_not_attempted", "requiredEnv": [ { "name": "HWLAB_CLOUD_DB_URL", "present": true, "redacted": true, "source": "k8s-secret-ref" }, { "name": "HWLAB_CLOUD_DB_SSL_MODE", "present": true, "redacted": false, "source": "runtime-env" } ], "missingEnv": [], "secretRefs": [ { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "present": true, "envInjected": false, "secretPresent": "not_observed_by_manifest", "secretKeyPresent": "declared", "redacted": true } ], "connection": { "attempted": false, "networkAttempted": false, "result": "manifest_only_not_attempted", "classification": "manifest_only", "probeType": "tcp-connect", "endpointRedacted": true, "valueRedacted": true, "timeoutMs": null, "durationMs": 0, "errorCode": null }, "blocker": "Manifest declares DB env/Secret references but does not prove runtime env injection or live DB connection", "liveDbEvidence": false, "fixtureEvidence": false, "manifestConfigReady": true, "envInjected": false, "secretMaterialRead": false, "valuesRedacted": true, "note": "Manifest-only DB env placeholder; this is not runtime env injection or live DB evidence." } } }, "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 } ], "publicHttp": [ { "url": "http://74.48.78.17:16667/health", "ok": true, "status": 200, "statusText": "OK", "headers": { "connection": "keep-alive", "content-length": "661", "content-type": "application/json; charset=utf-8", "date": "Fri, 22 May 2026 04:22:14 GMT", "keep-alive": "timeout=5" }, "json": { "serviceId": "hwlab-edge-proxy", "environment": "dev", "status": "ok", "service": { "id": "hwlab-edge-proxy", "role": "public-dev-ingress", "healthPath": "/health", "livePath": "/health/live" }, "commit": { "id": "cb35ada6860653b27269b0a57991184118cbf4b1", "source": "runtime-env" }, "image": { "reference": "ghcr.io/pikastech/hwlab-edge-proxy:cb35ada", "tag": "cb35ada", "digest": "unknown" }, "endpoint": "http://74.48.78.17:16667", "observedAt": "2026-05-22T04:22:14.011Z", "details": { "upstream": "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667", "mode": "dev-edge-proxy" } }, "bodyPreview": "{\n \"serviceId\": \"hwlab-edge-proxy\",\n \"environment\": \"dev\",\n \"status\": \"ok\",\n \"service\": {\n \"id\": \"hwlab-edge-proxy\",\n \"role\": \"public-dev-ingress\",\n \"healthPath\": \"/health\",\n \"livePath\": \"/health/live\"\n },\n \"commit\": {\n \"id\": \"cb35ada6860653b27269b0a57991184118cbf4b1\",\n \"source\": \"runtime-env\"\n },\n \"image\": {\n \"reference\": \"ghcr.io/pikastech/hwlab-edge-proxy:cb35ada\",\n \"tag\": \"cb35ada\",\n \"digest\": \"unknown\"\n },\n \"endpoint\": \"http://74.48.78.17:16667\",\n \"obse", "durationMs": 821 }, { "url": "http://74.48.78.17:16667/health/live", "ok": true, "status": 200, "statusText": "OK", "headers": { "cache-control": "no-store", "connection": "keep-alive", "content-type": "application/json; charset=utf-8", "date": "Fri, 22 May 2026 04:22:14 GMT", "keep-alive": "timeout=5", "transfer-encoding": "chunked" }, "json": { "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:22:14.013Z", "db": { "contractVersion": "v1", "environment": "dev", "connected": false, "connectionChecked": false, "configReady": true, "ready": false, "status": "degraded", "mode": "configured_without_live_connection", "fields": [ { "name": "HWLAB_CLOUD_DB_URL", "present": true, "redacted": true, "source": "k8s-secret-ref", "required": true }, { "name": "HWLAB_CLOUD_DB_SSL_MODE", "present": true, "redacted": false, "source": "runtime-env", "required": true } ], "missingEnv": [], "secretRefs": [ { "env": "HWLAB_CLOUD_DB_URL", "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "present": true, "redacted": true } ], "safety": { "devOnly": true, "prodAllowed": false, "secretsRead": false, "valuesRedacted": true, "liveDbEvidence": false }, "evidence": "env_presence_only_no_live_db" }, "runtime": { "adapter": "memory", "durable": false, "status": "degraded", "reason": "live DB persistence is not connected; L1 runtime writes are process-local only", "counts": { "gatewaySessions": 0, "boxResources": 0, "boxCapabilities": 0, "hardwareOperations": 0, "auditEvents": 0, "evidenceRecords": 0 } } }, "bodyPreview": "{\"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:22:14.013Z\",\"db\":{\"contractVersion\":\"v1\",\"environment\":\"dev\",\"connected\":false,\"connectionChecked\":false,\"c", "durationMs": 793 } ], "kubernetes": { "observable": true, "namespace": "hwlab-dev", "context": { "exitCode": 0, "value": "in-cluster", "stderr": "" }, "services": [ { "name": "hwlab-cloud-api", "type": "ClusterIP", "clusterIP": "10.43.88.144", "ports": [ { "name": "http", "port": 6667, "targetPort": "http" } ], "selector": { "app.kubernetes.io/name": "hwlab-cloud-api", "app.kubernetes.io/part-of": "hwlab", "hwlab.pikastech.local/environment": "dev", "hwlab.pikastech.local/profile": "dev" } }, { "name": "hwlab-edge-proxy", "type": "ClusterIP", "clusterIP": "10.43.104.107", "ports": [ { "name": "http", "port": 6667, "targetPort": "http" } ], "selector": { "app.kubernetes.io/name": "hwlab-edge-proxy", "app.kubernetes.io/part-of": "hwlab", "hwlab.pikastech.local/environment": "dev", "hwlab.pikastech.local/profile": "dev" } }, { "name": "hwlab-tunnel-client", "type": "ClusterIP", "clusterIP": "10.43.129.225", "ports": [ { "name": "http", "port": 7402, "targetPort": "http" } ], "selector": { "app.kubernetes.io/name": "hwlab-tunnel-client", "app.kubernetes.io/part-of": "hwlab", "hwlab.pikastech.local/environment": "dev", "hwlab.pikastech.local/profile": "dev" } }, { "name": "hwlab-router", "type": "ClusterIP", "clusterIP": "10.43.6.240", "ports": [ { "name": "http", "port": 7401, "targetPort": "http" } ], "selector": { "app.kubernetes.io/name": "hwlab-router", "app.kubernetes.io/part-of": "hwlab", "hwlab.pikastech.local/environment": "dev", "hwlab.pikastech.local/profile": "dev" } } ], "endpoints": [ { "name": "hwlab-cloud-api", "readyAddresses": [ "10.42.0.201" ], "notReadyAddresses": [], "ports": [ { "name": "http", "port": 6667 } ] }, { "name": "hwlab-edge-proxy", "readyAddresses": [ "10.42.0.203" ], "notReadyAddresses": [], "ports": [ { "name": "http", "port": 6667 } ] }, { "name": "hwlab-tunnel-client", "readyAddresses": [ "10.42.0.207" ], "notReadyAddresses": [], "ports": [ { "name": "http", "port": 7402 } ] }, { "name": "hwlab-router", "readyAddresses": [ "10.42.0.206" ], "notReadyAddresses": [], "ports": [ { "name": "http", "port": 7401 } ] } ], "pods": [ { "name": "hwlab-agent-mgr-75544c7747-5dzt9", "phase": "Running", "serviceId": "hwlab-agent-mgr", "containers": [ { "name": "hwlab-agent-mgr", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-mgr@sha256:c16c733306a28ae9385087653b79f5bb2f28724d917a89bb296646f6a02c5318" } ] }, { "name": "hwlab-agent-skills-849d9976f4-2nsmw", "phase": "Running", "serviceId": "hwlab-agent-skills", "containers": [ { "name": "hwlab-agent-skills", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-agent-skills@sha256:246fb7bb48597a7179aab62cb091e8213e47b71b6871ba94e6028032992e916c" } ] }, { "name": "hwlab-box-simu-55688cbcc7-pftxc", "phase": "Running", "serviceId": "hwlab-box-simu", "containers": [ { "name": "hwlab-box-simu", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:ae5fcc06a276918561c2d752f2221156bd2bd4db7fb93967ae76af97bfdc51bf" } ] }, { "name": "hwlab-box-simu-55688cbcc7-sq5fx", "phase": "Running", "serviceId": "hwlab-box-simu", "containers": [ { "name": "hwlab-box-simu", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-box-simu@sha256:ae5fcc06a276918561c2d752f2221156bd2bd4db7fb93967ae76af97bfdc51bf" } ] }, { "name": "hwlab-cloud-api-f48dcdfb-9n6zh", "phase": "Running", "serviceId": "hwlab-cloud-api", "containers": [ { "name": "hwlab-cloud-api", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-api@sha256:3946efdd7360409cea6a897cb03a6f3172f14819d3132df3aab821621909513f" } ] }, { "name": "hwlab-cloud-web-cd9655b98-gxtmc", "phase": "Running", "serviceId": "hwlab-cloud-web", "containers": [ { "name": "hwlab-cloud-web", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-cloud-web@sha256:868e2a11c56cc1a27c77de3fa71a7b092f21ae98a4052104e9071bd93960abfa" } ] }, { "name": "hwlab-edge-proxy-567f978cdd-8fwc8", "phase": "Running", "serviceId": "hwlab-edge-proxy", "containers": [ { "name": "hwlab-edge-proxy", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-edge-proxy@sha256:384832fc579063b9b0a940973690734bb402607720fd36f4662e4ee6fa5a57d2" } ] }, { "name": "hwlab-gateway-simu-699fd486b-j9pk7", "phase": "Running", "serviceId": "hwlab-gateway-simu", "containers": [ { "name": "hwlab-gateway-simu", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:00599721b910b5667b6be43c416cab4c410c6cc29b7f56ecdfb6eff71123d01c" } ] }, { "name": "hwlab-gateway-simu-699fd486b-phcgp", "phase": "Running", "serviceId": "hwlab-gateway-simu", "containers": [ { "name": "hwlab-gateway-simu", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-gateway-simu@sha256:00599721b910b5667b6be43c416cab4c410c6cc29b7f56ecdfb6eff71123d01c" } ] }, { "name": "hwlab-patch-panel-757f9f44d5-7np8r", "phase": "Running", "serviceId": "hwlab-patch-panel", "containers": [ { "name": "hwlab-patch-panel", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-patch-panel@sha256:5b3aa6505492c2ed398d21cbd35a8754672114acd0fa97faa3351d4b6a6dfd5a" } ] }, { "name": "hwlab-router-5d9cbdf89b-p7r94", "phase": "Running", "serviceId": "hwlab-router", "containers": [ { "name": "hwlab-router", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-router:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-router@sha256:217b1fdb0f704c4183e9d8503644177f0c8bae674da0433985c19ef909f0e342" } ] }, { "name": "hwlab-tunnel-client-65c7858c8-wjqsh", "phase": "Running", "serviceId": "hwlab-tunnel-client", "containers": [ { "name": "hwlab-tunnel-client", "ready": true, "restartCount": 0, "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:cb35ada", "imageID": "127.0.0.1:5000/hwlab/hwlab-tunnel-client@sha256:9bcdd8a58132d7bc4dbfc71297f802fc0ab407a1b5c1bb1ea58e0791147a243b" } ] } ], "dbSecret": { "observable": true, "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "secretPresent": true, "secretKeyPresent": true, "secretValueRead": false, "redacted": true, "command": "kubectl describe secret (key-presence-only)", "error": null }, "notes": [] }, "clusterDns": [ { "serviceId": "hwlab-cloud-api", "host": "hwlab-cloud-api.hwlab-dev.svc.cluster.local", "port": 6667, "resolved": true, "output": "10.43.88.144 hwlab-cloud-api.hwlab-dev.svc.cluster.local" }, { "serviceId": "hwlab-router", "host": "hwlab-router.hwlab-dev.svc.cluster.local", "port": 7401, "resolved": true, "output": "10.43.6.240 hwlab-router.hwlab-dev.svc.cluster.local" }, { "serviceId": "hwlab-tunnel-client", "host": "hwlab-tunnel-client.hwlab-dev.svc.cluster.local", "port": 7402, "resolved": true, "output": "10.43.129.225 hwlab-tunnel-client.hwlab-dev.svc.cluster.local" }, { "serviceId": "hwlab-edge-proxy", "host": "hwlab-edge-proxy.hwlab-dev.svc.cluster.local", "port": 6667, "resolved": true, "output": "10.43.104.107 hwlab-edge-proxy.hwlab-dev.svc.cluster.local" } ], "runtimeDbReadiness": { "status": "blocked", "configReady": true, "envInjected": true, "secret": { "observable": true, "secretName": "hwlab-cloud-api-dev-db", "secretKey": "database-url", "secretPresent": true, "secretKeyPresent": true, "secretValueRead": false, "redacted": true, "command": "kubectl describe secret (key-presence-only)", "error": null, "secretRefPresent": true, "envInjected": true }, "connectionAttempted": false, "connectionResult": "not_attempted", "liveConnected": false, "valuesRedacted": true, "secretMaterialRead": false, "liveDbEvidence": false, "blocker": "cloud-api DB env is injected, but runtime health has not attempted a live DB connection", "evidence": [ { "configReady": true, "missingEnv": [], "connectionAttempted": false, "connectionResult": "not_attempted", "liveConnected": false, "endpointRedacted": true, "valueRedacted": true } ] }, "status": "blocker", "classification": "app_health_blocker", "blocker": "cloud-api DB env is injected, but runtime health has not attempted a live DB connection", "diagnosis": { "likelyLayer": "cloud-api-db", "confidence": "high", "likelyCause": "cloud-api DB env is injected, but runtime health has not attempted a live DB connection", "evidence": [ { "configReady": true, "missingEnv": [], "connectionAttempted": false, "connectionResult": "not_attempted", "liveConnected": false, "endpointRedacted": true, "valueRedacted": true } ], "notProven": [ "live DB endpoint reachability", "authenticated SQL query readiness" ], "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." } } }