ab11565640
Merge PR #71 after commander review. Rebaselines DEV live evidence to 16666/16667, removes stale edge/frp blocker classification, keeps DB live and M3 patch-panel runtime as real blockers. Complies with HWLAB #78 / DC-DCSN-P0-2026-003 by preserving DEV-LIVE evidence boundaries and not treating Gate/UI as MVP success.
200 lines
13 KiB
JSON
200 lines
13 KiB
JSON
{
|
|
"$schema": "https://hwlab.pikastech.local/schemas/dev-m3-hardware-loop-report.schema.json",
|
|
"$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-m3-hardware-loop.json",
|
|
"reportVersion": "v1",
|
|
"issue": "pikasTech/HWLAB#38",
|
|
"taskId": "dev-m3-hardware-loop",
|
|
"commitId": "86d769525caf",
|
|
"acceptanceLevel": "dev_m3_hardware_loop",
|
|
"devOnly": true,
|
|
"prodDisabled": true,
|
|
"sourceContract": {
|
|
"status": "pass",
|
|
"documents": [
|
|
"docs/dev-acceptance-matrix.md",
|
|
"docs/m3-hardware-loop.md",
|
|
"fixtures/mvp/m3-hardware-loop/topology.json"
|
|
],
|
|
"summary": "Source contracts define DEV-only M3 simulator wiring and prohibit fixture output as live evidence."
|
|
},
|
|
"validationCommands": [
|
|
"node --check scripts/dev-m3-hardware-loop-smoke.mjs",
|
|
"node --check scripts/validate-dev-m3-cardinality.mjs",
|
|
"node scripts/validate-dev-m3-cardinality.mjs",
|
|
"node scripts/dev-m3-hardware-loop-smoke.mjs --live --confirm-dev --confirmed-non-production",
|
|
"node --check scripts/validate-dev-gate-report.mjs",
|
|
"node scripts/validate-dev-gate-report.mjs"
|
|
],
|
|
"runtimeTarget": {
|
|
"endpoint": "http://74.48.78.17:16667",
|
|
"namespace": "hwlab-dev",
|
|
"environment": "dev",
|
|
"requiredBoxSimulators": 2,
|
|
"requiredGatewaySimulators": 2,
|
|
"realHardwareAllowed": false,
|
|
"prodAllowed": false
|
|
},
|
|
"safetyGates": {
|
|
"liveFlagRequired": true,
|
|
"confirmDevRequired": true,
|
|
"confirmedNonProductionRequired": true,
|
|
"prodForbidden": true,
|
|
"realHardwareForbidden": true,
|
|
"secretReadForbidden": true,
|
|
"forcePushForbidden": true,
|
|
"unideskRuntimeSubstitutionForbidden": true
|
|
},
|
|
"liveChecks": [
|
|
{
|
|
"id": "static-contract-parse",
|
|
"status": "pass",
|
|
"summary": "DEV M3 smoke contract files were readable before live probing.",
|
|
"evidence": [
|
|
"docs/dev-acceptance-matrix.md",
|
|
"docs/m3-hardware-loop.md"
|
|
]
|
|
},
|
|
{
|
|
"id": "endpoint-freeze",
|
|
"status": "pass",
|
|
"summary": "DEV endpoint is frozen at http://74.48.78.17:16667.",
|
|
"evidence": [
|
|
"http://74.48.78.17:16667"
|
|
]
|
|
},
|
|
{
|
|
"id": "dev-ingress-health",
|
|
"status": "pass",
|
|
"summary": "DEV ingress returned HWLAB identity at /health/live.",
|
|
"evidence": [
|
|
"{\"url\":\"http://74.48.78.17:16667/health/live\",\"method\":\"GET\",\"startedAt\":\"2026-05-22T04:30:50.824Z\",\"observedAt\":\"2026-05-22T04:30:51.649Z\",\"reached\":true,\"ok\":true,\"status\":200,\"statusText\":\"OK\",\"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:30:51.463Z\",\"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}}}}",
|
|
"{\"url\":\"http://74.48.78.17:16667/health\",\"method\":\"GET\",\"startedAt\":\"2026-05-22T04:30:51.650Z\",\"observedAt\":\"2026-05-22T04:30:52.025Z\",\"reached\":true,\"ok\":true,\"status\":200,\"statusText\":\"OK\",\"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:30:51.840Z\",\"details\":{\"upstream\":\"http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667\",\"mode\":\"dev-edge-proxy\"}}}",
|
|
"{\"url\":\"http://74.48.78.17:16667/live\",\"method\":\"GET\",\"startedAt\":\"2026-05-22T04:30:52.025Z\",\"observedAt\":\"2026-05-22T04:30:52.401Z\",\"reached\":true,\"ok\":true,\"status\":200,\"statusText\":\"OK\",\"json\":{\"serviceId\":\"hwlab-cloud-api\",\"status\":\"live\"}}",
|
|
"{\"url\":\"http://74.48.78.17:16667/v1\",\"method\":\"GET\",\"startedAt\":\"2026-05-22T04:30:52.401Z\",\"observedAt\":\"2026-05-22T04:30:53.001Z\",\"reached\":true,\"ok\":true,\"status\":200,\"statusText\":\"OK\",\"json\":{\"serviceId\":\"hwlab-cloud-api\",\"adapter\":\"rest\",\"status\":\"degraded\",\"rpcBridge\":\"POST /v1/rpc/{method}\",\"methods\":[\"system.health\",\"cloud.adapter.describe\",\"gateway.session.register\",\"box.resource.register\",\"box.capability.report\",\"hardware.operation.request\",\"hardware.invoke.shell\",\"audit.event.write\",\"audit.event.query\",\"evidence.record.write\",\"evidence.record.query\"],\"auditFields\":[\"requestId\",\"actor\",\"source\",\"operation\",\"target\",\"result\",\"timestamp\"],\"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}}}}"
|
|
]
|
|
},
|
|
{
|
|
"id": "two-box-simu-online",
|
|
"status": "not_run",
|
|
"summary": "A live DEV M3 runtime contract check failed before all checks passed.",
|
|
"evidence": [
|
|
"No live DEV evidence collected for this check."
|
|
]
|
|
},
|
|
{
|
|
"id": "two-gateway-simu-online",
|
|
"status": "not_run",
|
|
"summary": "A live DEV M3 runtime contract check failed before all checks passed.",
|
|
"evidence": [
|
|
"No live DEV evidence collected for this check."
|
|
]
|
|
},
|
|
{
|
|
"id": "patch-panel-healthy",
|
|
"status": "not_run",
|
|
"summary": "A live DEV M3 runtime contract check failed before all checks passed.",
|
|
"evidence": [
|
|
"No live DEV evidence collected for this check."
|
|
]
|
|
},
|
|
{
|
|
"id": "wiring-do1-di1-applied",
|
|
"status": "not_run",
|
|
"summary": "A live DEV M3 runtime contract check failed before all checks passed.",
|
|
"evidence": [
|
|
"No live DEV evidence collected for this check."
|
|
]
|
|
},
|
|
{
|
|
"id": "direct-call-do-write-di-read",
|
|
"status": "not_run",
|
|
"summary": "A live DEV M3 runtime contract check failed before all checks passed.",
|
|
"evidence": [
|
|
"No live DEV evidence collected for this check."
|
|
]
|
|
},
|
|
{
|
|
"id": "audit-evidence-traceable",
|
|
"status": "not_run",
|
|
"summary": "A live DEV M3 runtime contract check failed before all checks passed.",
|
|
"evidence": [
|
|
"No live DEV evidence collected for this check."
|
|
]
|
|
}
|
|
],
|
|
"readOnlySupplementalEvidence": [
|
|
{
|
|
"id": "deploy-skeleton-m3-cardinality",
|
|
"status": "manifest-ready",
|
|
"blockerClass": null,
|
|
"source": "deploy/k8s/base/workloads.yaml",
|
|
"summary": "Checked-in DEV deploy skeleton declares M3 cardinality: two box simulators, two gateway simulators, and one patch panel.",
|
|
"evidence": {
|
|
"required": {
|
|
"hwlab-box-simu": 2,
|
|
"hwlab-gateway-simu": 2,
|
|
"hwlab-patch-panel": 1,
|
|
"wiring": "box-simu-1 DO1 -> box-simu-2 DI1"
|
|
},
|
|
"observed": {
|
|
"hwlab-box-simu": {
|
|
"replicas": 2,
|
|
"env": {
|
|
"HWLAB_BOX_ID": "boxsimu_1,boxsimu_2"
|
|
}
|
|
},
|
|
"hwlab-gateway-simu": {
|
|
"replicas": 2,
|
|
"env": {
|
|
"HWLAB_BOX_RESOURCES": "res_boxsimu_1,res_boxsimu_2"
|
|
}
|
|
},
|
|
"hwlab-patch-panel": {
|
|
"replicas": 1,
|
|
"env": {}
|
|
}
|
|
}
|
|
},
|
|
"validationCommand": "node scripts/validate-dev-m3-cardinality.mjs",
|
|
"requiredFollowUp": "Static DEV manifest cardinality is source-ready; live DEV M3 evidence still depends on edge/runtime reachability and direct DEV simulator targets."
|
|
}
|
|
],
|
|
"localRuntimeObservations": [
|
|
{
|
|
"id": "docker-hwlab-containers",
|
|
"status": "not_observed",
|
|
"command": "docker ps --format {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}",
|
|
"summary": "No running docker container name/image/port line contained hwlab-."
|
|
},
|
|
{
|
|
"id": "kubectl-hwlab-dev",
|
|
"status": "observed",
|
|
"command": "kubectl get deploy,po,svc -n hwlab-dev -o wide",
|
|
"summary": "NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.apps/hwlab-agent-mgr 1/1 1 1 4h38m hwlab-agent-mgr 127.0.0.1:5000/hwlab/hwlab-agent-mgr:cb35ada app.kubernetes.io/name=hwlab-agent-mgr,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/profile=dev deployment.apps/hwlab-agent-skills 1/1 1 1 66m hwlab-agent-skills 127.0.0.1:5000/hwlab/hwlab-agent-skills:cb35ada app.kubernetes.io/name=hwlab-agent-skills,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/profile=dev deployment.apps/hwlab-box-simu 2/2 2 2 4h38m hwlab-box-simu 127.0.0.1:5000/hwlab/hwlab-box-simu:cb35ada app.kubernetes.io/name=hwlab-box-simu,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/profile=dev deployment.apps/hwlab-cloud-api 1/1 1 1 4h38m hwlab-cloud-api 127.0.0.1:5000/hwlab/hwlab-cloud-api:cb35ada app.kubernetes.io/name=hwlab-cloud-api,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/profile=dev deployment.apps/hwlab-cloud-web 1/1 1 1 4h38m hwlab-cloud-web 127.0.0.1:5000/hwlab/hwlab-cloud-web:cb35ada app.kubernetes.io/name=hwlab-cloud-web,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/profile=dev deployment.apps/hwlab-edge-proxy 1/1 1 1 4h38m hwlab-edge-proxy 127.0.0.1:5000/hwlab/hwlab-edge-proxy:cb35ada app.kubernetes.io/name=hwlab-edge-proxy,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/profile=dev deployment.apps/hwlab-frpc 1/1 1 1 4h33m frpc 127.0.0.1:5000/hwlab/frpc:v0.68.1 app.kubernetes.io/name=hwlab-frpc deployment.apps/hwlab-gateway 0/0 0 0 4h38m hwlab-gateway 127.0.0.1:5000/hwlab/hwlab-gateway:cb35ada app.kubernetes.io/name=hwlab-gateway,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/profile=dev deployment.apps/hwlab-gateway-simu 2/2 2 2 4h38m hwlab-gateway-simu 127.0.0.1:5000/hwlab/hwlab-gateway-simu:cb35ada app.kubernetes.io/name=hwlab-gateway-simu,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/profile=dev deployment.apps/hwlab-patch-panel 1/1 1 1 4h38m hwlab-patch-panel 127.0.0.1:5000/hwlab/hwlab-patch-panel:cb35ada app.kubernetes.io/name=hwlab-patch-panel,app.kubernetes.io/part-of=hwlab,hwlab.pikastech.local/environment=dev,hwlab.pikastech.local/prof"
|
|
}
|
|
],
|
|
"liveOperation": {
|
|
"status": "not_run",
|
|
"operationId": "not_observed",
|
|
"traceId": "not_observed",
|
|
"auditId": "not_observed",
|
|
"evidenceId": "not_observed",
|
|
"summary": "No live DEV operation has run yet."
|
|
},
|
|
"blockers": [
|
|
{
|
|
"type": "runtime_blocker",
|
|
"scope": "m3-hardware-loop-runtime",
|
|
"status": "open",
|
|
"classification": "hardware loop",
|
|
"summary": "patch-panel active DO1 -> DI1 connection missing"
|
|
}
|
|
],
|
|
"summary": {
|
|
"status": "blocked",
|
|
"classification": "hardware loop",
|
|
"observedAt": "2026-05-22T04:30:50.820Z",
|
|
"result": "Live DEV M3 runtime was reachable but did not satisfy the M3 hardware-loop contract."
|
|
}
|
|
}
|