729 lines
41 KiB
JSON
729 lines
41 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": "c7de4745f491",
|
|
"acceptanceLevel": "dev_m3_hardware_loop",
|
|
"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 M3 DEV hardware trusted-loop report; DEV-LIVE requires res_boxsimu_1:DO1 -> hwlab-patch-panel -> res_boxsimu_2:DI1 with operation, audit, and evidence ids."
|
|
},
|
|
"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 --dry-run",
|
|
"node scripts/dev-m3-hardware-loop-smoke.mjs --live --confirm-dev --expect-non-prod",
|
|
"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",
|
|
"frontendEndpoint": "http://74.48.78.17:16666",
|
|
"namespace": "hwlab-dev",
|
|
"environment": "dev",
|
|
"requiredBoxSimulators": 2,
|
|
"requiredGatewaySimulators": 2,
|
|
"requiredPatchPanels": 1,
|
|
"requiredRoute": "res_boxsimu_1:DO1 -> hwlab-patch-panel -> res_boxsimu_2:DI1",
|
|
"realHardwareAllowed": false,
|
|
"prodAllowed": false
|
|
},
|
|
"safetyGates": {
|
|
"liveFlagRequired": true,
|
|
"confirmDevRequired": true,
|
|
"expectNonProdRequired": true,
|
|
"confirmedNonProductionRequired": true,
|
|
"dryRunPlanSupported": true,
|
|
"dryRunCallsLiveEndpoints": false,
|
|
"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": "dry-run-live-write-plan",
|
|
"status": "not_run",
|
|
"summary": "Plan-only mode enumerated live write prerequisites and endpoints without calling DEV endpoints or mutating DEV state.",
|
|
"evidence": [
|
|
"endpointCount=17",
|
|
"mutatingEndpointCount=2",
|
|
"dryRunCallsLiveEndpoints=false"
|
|
]
|
|
},
|
|
{
|
|
"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-22T13:44:36.427Z\",\"observedAt\":\"2026-05-22T13:44:37.010Z\",\"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\":\"c7de474\",\"source\":\"runtime-env\"},\"image\":{\"reference\":\"127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474\",\"tag\":\"c7de474\",\"digest\":\"unknown\"},\"endpoint\":\"http://74.48.78.17:16667\",\"observedAt\":\"2026-05-22T13:44:36.806Z\",\"db\":{\"contractVersion\":\"v1\",\"environment\":\"dev\",\"connected\":false,\"liveConnected\":false,\"liveDbEvidence\":false,\"connectionChecked\":true,\"connectionAttempted\":true,\"connectionResult\":\"dns_error\",\"configReady\":true,\"ready\":false,\"status\":\"degraded\",\"mode\":\"live_connection_blocked\",\"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,\"envInjected\":true,\"secretPresent\":\"not_observed_by_runtime\",\"secretKeyPresent\":\"not_observed_by_runtime\",\"redacted\":true}],\"connection\":{\"attempted\":true,\"networkAttempted\":true,\"probeType\":\"tcp-connect\",\"endpointRedacted\":true,\"valueRedacted\":true,\"timeoutMs\":1200,\"durationMs\":1,\"missingEnv\":[],\"result\":\"dns_error\",\"classification\":\"dns_resolution_failed\",\"errorCode\":\"ENOTFOUND\"},\"redaction\":{\"valuesRedacted\":true,\"endpointRedacted\":true,\"valueRedacted\":true,\"secretMaterialRead\":false,\"secretRefsOnly\":true},\"safety\":{\"devOnly\":true,\"prodAllowed\":false,\"secretsRead\":false,\"secretMaterialRead\":false,\"valuesRedacted\":true,\"endpointRedacted\":true,\"liveDbEvidence\":false,\"liveDbConnectedEvidence\":false},\"blocker\":\"DB endpoint DNS resolution failed from the cloud-api runtime\",\"evidence\":\"live_db_tcp_connection_blocked\"},\"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-22T13:44:37.011Z\",\"observedAt\":\"2026-05-22T13:44:37.943Z\",\"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-22T13:44:37.190Z\",\"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-22T13:44:37.943Z\",\"observedAt\":\"2026-05-22T13:44:38.325Z\",\"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-22T13:44:38.325Z\",\"observedAt\":\"2026-05-22T13:44:38.710Z\",\"reached\":true,\"ok\":true,\"status\":200,\"statusText\":\"OK\",\"json\":{\"serviceId\":\"hwlab-cloud-api\",\"adapter\":\"rest\",\"status\":\"degraded\",\"rpcBridge\":\"POST /v1/rpc/{method}\",\"codeAgent\":{\"endpoint\":\"POST /v1/agent/chat\",\"status\":\"available\",\"schema\":[\"conversationId\",\"sessionId\",\"messageId\",\"status\",\"createdAt\",\"updatedAt\",\"traceId\",\"provider\",\"model\",\"backend\",\"error.message\"]},\"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,\"liveConnected\":false,\"liveDbEvidence\":false,\"connectionChecked\":true,\"connectionAttempted\":true,\"connectionResult\":\"dns_error\",\"configReady\":true,\"ready\":false,\"status\":\"degraded\",\"mode\":\"live_connection_blocked\",\"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,\"envInjected\":true,\"secretPresent\":\"not_observed_by_runtime\",\"secretKeyPresent\":\"not_observed_by_runtime\",\"redacted\":true}],\"connection\":{\"attempted\":true,\"networkAttempted\":true,\"probeType\":\"tcp-connect\",\"endpointRedacted\":true,\"valueRedacted\":true,\"timeoutMs\":1200,\"durationMs\":2,\"missingEnv\":[],\"result\":\"dns_error\",\"classification\":\"dns_resolution_failed\",\"errorCode\":\"ENOTFOUND\"},\"redaction\":{\"valuesRedacted\":true,\"endpointRedacted\":true,\"valueRedacted\":true,\"secretMaterialRead\":false,\"secretRefsOnly\":true},\"safety\":{\"devOnly\":true,\"prodAllowed\":false,\"secretsRead\":false,\"secretMaterialRead\":false,\"valuesRedacted\":true,\"endpointRedacted\":true,\"liveDbEvidence\":false,\"liveDbConnectedEvidence\":false},\"blocker\":\"DB endpoint DNS resolution failed from the cloud-api runtime\",\"evidence\":\"live_db_tcp_connection_blocked\"},\"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:16666/health/live\",\"method\":\"GET\",\"startedAt\":\"2026-05-22T13:44:38.710Z\",\"observedAt\":\"2026-05-22T13:44:39.934Z\",\"reached\":true,\"ok\":true,\"status\":200,\"statusText\":\"OK\",\"json\":{\"serviceId\":\"hwlab-cloud-web\",\"environment\":\"dev\",\"status\":\"ok\",\"artifactKind\":\"cloud-web\",\"revision\":\"c7de474\"}}",
|
|
"{\"url\":\"http://74.48.78.17:16666/health\",\"method\":\"GET\",\"startedAt\":\"2026-05-22T13:44:39.934Z\",\"observedAt\":\"2026-05-22T13:44:40.314Z\",\"reached\":true,\"ok\":true,\"status\":200,\"statusText\":\"OK\",\"json\":{\"serviceId\":\"hwlab-cloud-web\",\"environment\":\"dev\",\"status\":\"ok\",\"artifactKind\":\"cloud-web\",\"revision\":\"c7de474\"}}",
|
|
"{\"url\":\"http://74.48.78.17:16667/json-rpc\",\"method\":\"POST\",\"startedAt\":\"2026-05-22T13:44:40.314Z\",\"observedAt\":\"2026-05-22T13:44:40.709Z\",\"reached\":true,\"ok\":true,\"status\":200,\"statusText\":\"OK\",\"json\":{\"jsonrpc\":\"2.0\",\"id\":\"req_dev_m3_a6ad2ece-8c10-4938-bdbb-717ae63948bb\",\"result\":{\"status\":\"degraded\",\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"db\":{\"contractVersion\":\"v1\",\"environment\":\"dev\",\"connected\":false,\"liveConnected\":false,\"liveDbEvidence\":false,\"connectionChecked\":true,\"connectionAttempted\":true,\"connectionResult\":\"dns_error\",\"configReady\":true,\"ready\":false,\"status\":\"degraded\",\"mode\":\"live_connection_blocked\",\"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,\"envInjected\":true,\"secretPresent\":\"not_observed_by_runtime\",\"secretKeyPresent\":\"not_observed_by_runtime\",\"redacted\":true}],\"connection\":{\"attempted\":true,\"networkAttempted\":true,\"probeType\":\"tcp-connect\",\"endpointRedacted\":true,\"valueRedacted\":true,\"timeoutMs\":1200,\"durationMs\":1,\"missingEnv\":[],\"result\":\"dns_error\",\"classification\":\"dns_resolution_failed\",\"errorCode\":\"ENOTFOUND\"},\"redaction\":{\"valuesRedacted\":true,\"endpointRedacted\":true,\"valueRedacted\":true,\"secretMaterialRead\":false,\"secretRefsOnly\":true},\"safety\":{\"devOnly\":true,\"prodAllowed\":false,\"secretsRead\":false,\"secretMaterialRead\":false,\"valuesRedacted\":true,\"endpointRedacted\":true,\"liveDbEvidence\":false,\"liveDbConnectedEvidence\":false},\"blocker\":\"DB endpoint DNS resolution failed from the cloud-api runtime\",\"evidence\":\"live_db_tcp_connection_blocked\"},\"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}}},\"meta\":{\"traceId\":\"trc_dev_m3_2393bb6a-6df3-4ad1-8794-b45530869d22\",\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"actorId\":\"system_code_queue_d601\"}}}"
|
|
]
|
|
},
|
|
{
|
|
"id": "two-box-simu-online",
|
|
"status": "blocked",
|
|
"blockerClass": "runtime_blocker",
|
|
"summary": "Read-only direct target probes did not prove two distinct live DEV box-simu resources res_boxsimu_1 and res_boxsimu_2.",
|
|
"evidence": [
|
|
"{\"source\":\"kubernetes-endpointslices\",\"counts\":{\"boxSimu\":2,\"gatewaySimu\":2,\"patchPanel\":1,\"distinctBoxResources\":1,\"distinctGatewayIdentities\":1},\"selected\":{\"boxSimu1\":{\"id\":\"box-simu-1-candidate-1\",\"serviceId\":\"hwlab-box-simu\",\"baseUrl\":\"http://10.42.0.200:7201\",\"targetRef\":\"hwlab-box-simu-55688cbcc7-pftxc\",\"ok\":true,\"statusCode\":200,\"healthCode\":200,\"boxId\":\"boxsimu_1\",\"resourceId\":\"res_boxsimu_1\",\"gatewayId\":null,\"gatewaySessionId\":\"gws_mvp_simu\",\"patchPanelState\":null},\"boxSimu2\":null,\"gateways\":[{\"id\":\"gateway-simu-1-candidate-1\",\"serviceId\":\"hwlab-gateway-simu\",\"baseUrl\":\"http://10.42.0.204:7101\",\"targetRef\":\"hwlab-gateway-simu-699fd486b-phcgp\",\"ok\":true,\"statusCode\":200,\"healthCode\":200,\"boxId\":null,\"resourceId\":null,\"gatewayId\":\"gateway-a\",\"gatewaySessionId\":\"gws_gateway-a\",\"patchPanelState\":null}],\"patchPanel\":{\"id\":\"patch-panel-candidate-1\",\"serviceId\":\"hwlab-patch-panel\",\"baseUrl\":\"http://10.42.0.205:7301\",\"targetRef\":\"hwlab-patch-panel-757f9f44d5-7np8r\",\"ok\":true,\"statusCode\":200,\"healthCode\":200,\"boxId\":null,\"resourceId\":null,\"gatewayId\":null,\"gatewaySessionId\":\"gws_gwsimu_east\",\"patchPanelState\":\"active\"}}}"
|
|
]
|
|
},
|
|
{
|
|
"id": "two-gateway-simu-online",
|
|
"status": "blocked",
|
|
"blockerClass": "runtime_blocker",
|
|
"summary": "Read-only direct target probes did not prove two distinct live DEV gateway-simu identities.",
|
|
"evidence": [
|
|
"{\"source\":\"kubernetes-endpointslices\",\"counts\":{\"boxSimu\":2,\"gatewaySimu\":2,\"patchPanel\":1,\"distinctBoxResources\":1,\"distinctGatewayIdentities\":1},\"selected\":{\"boxSimu1\":{\"id\":\"box-simu-1-candidate-1\",\"serviceId\":\"hwlab-box-simu\",\"baseUrl\":\"http://10.42.0.200:7201\",\"targetRef\":\"hwlab-box-simu-55688cbcc7-pftxc\",\"ok\":true,\"statusCode\":200,\"healthCode\":200,\"boxId\":\"boxsimu_1\",\"resourceId\":\"res_boxsimu_1\",\"gatewayId\":null,\"gatewaySessionId\":\"gws_mvp_simu\",\"patchPanelState\":null},\"boxSimu2\":null,\"gateways\":[{\"id\":\"gateway-simu-1-candidate-1\",\"serviceId\":\"hwlab-gateway-simu\",\"baseUrl\":\"http://10.42.0.204:7101\",\"targetRef\":\"hwlab-gateway-simu-699fd486b-phcgp\",\"ok\":true,\"statusCode\":200,\"healthCode\":200,\"boxId\":null,\"resourceId\":null,\"gatewayId\":\"gateway-a\",\"gatewaySessionId\":\"gws_gateway-a\",\"patchPanelState\":null}],\"patchPanel\":{\"id\":\"patch-panel-candidate-1\",\"serviceId\":\"hwlab-patch-panel\",\"baseUrl\":\"http://10.42.0.205:7301\",\"targetRef\":\"hwlab-patch-panel-757f9f44d5-7np8r\",\"ok\":true,\"statusCode\":200,\"healthCode\":200,\"boxId\":null,\"resourceId\":null,\"gatewayId\":null,\"gatewaySessionId\":\"gws_gwsimu_east\",\"patchPanelState\":\"active\"}}}"
|
|
]
|
|
},
|
|
{
|
|
"id": "patch-panel-healthy",
|
|
"status": "pass",
|
|
"summary": "DEV patch-panel direct target returned live status.",
|
|
"evidence": [
|
|
"{\"id\":\"patch-panel-candidate-1\",\"serviceId\":\"hwlab-patch-panel\",\"baseUrl\":\"http://10.42.0.205:7301\",\"targetRef\":\"hwlab-patch-panel-757f9f44d5-7np8r\",\"ok\":true,\"statusCode\":200,\"healthCode\":200,\"boxId\":null,\"resourceId\":null,\"gatewayId\":null,\"gatewaySessionId\":\"gws_gwsimu_east\",\"patchPanelState\":\"active\"}"
|
|
]
|
|
},
|
|
{
|
|
"id": "wiring-do1-di1-applied",
|
|
"status": "blocked",
|
|
"blockerClass": "runtime_blocker",
|
|
"summary": "DEV patch-panel wiring is active but does not contain the required res_boxsimu_1:DO1 -> res_boxsimu_2:DI1 route.",
|
|
"evidence": [
|
|
"{\"url\":\"http://10.42.0.205:7301/wiring\",\"ok\":true,\"requiredConnection\":{\"fromResourceId\":\"res_boxsimu_1\",\"fromPort\":\"DO1\",\"toResourceId\":\"res_boxsimu_2\",\"toPort\":\"DI1\"},\"activeObserved\":[\"res_boxsim_alpha:uart0->res_boxsim_beta:uart0\",\"res_boxsim_alpha:gpio0->res_boxsim_beta:gpio0\"],\"configuredObserved\":[\"res_boxsim_alpha:uart0->res_boxsim_beta:uart0\",\"res_boxsim_alpha:gpio0->res_boxsim_beta:gpio0\"],\"hasRequiredActiveConnection\":false,\"hasRequiredConfiguredConnection\":false,\"configSource\":\"internal:mvp-topology\",\"syncableConnectionCount\":0}"
|
|
]
|
|
},
|
|
{
|
|
"id": "direct-call-do-write-di-read",
|
|
"status": "not_run",
|
|
"summary": "Not attempted because read-only DEV M3 preconditions were blocked; no box-simu loopback or SOURCE/DRY-RUN substitute was used.",
|
|
"evidence": [
|
|
"No live DEV write was sent."
|
|
]
|
|
},
|
|
{
|
|
"id": "audit-evidence-traceable",
|
|
"status": "not_run",
|
|
"summary": "Not attempted because the patch-panel-bound live operation was not safe to trigger.",
|
|
"evidence": [
|
|
"operationId=not_observed",
|
|
"traceId=not_observed",
|
|
"auditId=not_observed",
|
|
"evidenceId=not_observed"
|
|
]
|
|
}
|
|
],
|
|
"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 13h 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 10h 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 13h 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 13h hwlab-cloud-api 127.0.0.1:5000/hwlab/hwlab-cloud-api:c7de474 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 13h hwlab-cloud-web 127.0.0.1:5000/hwlab/hwlab-cloud-web:c7de474 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 13h 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 13h 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 13h 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 13h 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 13h 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/profile=dev deployment.app"
|
|
},
|
|
{
|
|
"id": "runner-k3s-kubeconfig-readonly",
|
|
"status": "observed",
|
|
"command": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get pods -o name",
|
|
"summary": "Runner /etc/rancher/k3s/k3s.yaml is not readable through fs access, but read-only kubectl observation succeeds; file readability, kubectl reachability, and service discovery are recorded separately. runnerKubeconfigReadable=false; exitCode=0; stderr=empty."
|
|
}
|
|
],
|
|
"d601Observability": {
|
|
"runnerKubeconfigReadable": false,
|
|
"runnerKubeconfigProbeOk": true,
|
|
"runnerKubeconfigProbeExitCode": 0,
|
|
"runnerKubeconfigProbeStderr": "empty",
|
|
"d601PublicEndpointsReachable": true,
|
|
"d601K3sUnavailable": false,
|
|
"classification": "read_only_kubectl_available_kubeconfig_file_unreadable",
|
|
"sourceIssue": "pikasTech/HWLAB#46",
|
|
"command": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get pods -o name",
|
|
"stdoutSummary": "13 pod name(s) observed",
|
|
"summary": "Runner /etc/rancher/k3s/k3s.yaml is not readable through fs access, but read-only kubectl observation succeeds; file readability, kubectl reachability, and service discovery are recorded separately.",
|
|
"inferenceRule": "runnerKubeconfigReadable=false must not imply d601K3sUnavailable=true; public 16666/16667 endpoint reachability is tracked separately.",
|
|
"secretValuesRead": false,
|
|
"secretResourcesRead": false
|
|
},
|
|
"liveOperation": {
|
|
"status": "not_run",
|
|
"operationId": "not_observed",
|
|
"traceId": "not_observed",
|
|
"auditId": "not_observed",
|
|
"evidenceId": "not_observed",
|
|
"summary": "No live DEV operation was attempted because read-only direct target checks did not prove the required patch-panel-owned M3 route."
|
|
},
|
|
"blockers": [
|
|
{
|
|
"type": "runtime_blocker",
|
|
"scope": "m3-box-simu-identity",
|
|
"status": "open",
|
|
"classification": "direct_target_identity_gap",
|
|
"sourceIssue": "pikasTech/HWLAB#64",
|
|
"summary": "DEV exposes two box-simu endpoints, but live identities are not the required distinct resources res_boxsimu_1 and res_boxsimu_2; observed resources=res_boxsimu_1."
|
|
},
|
|
{
|
|
"type": "runtime_blocker",
|
|
"scope": "m3-gateway-simu-identity",
|
|
"status": "open",
|
|
"classification": "direct_target_identity_gap",
|
|
"sourceIssue": "pikasTech/HWLAB#64",
|
|
"summary": "DEV exposes two gateway-simu endpoints, but live gateway identities are not distinct; observed identities=gateway-a:gws_gateway-a."
|
|
},
|
|
{
|
|
"type": "runtime_blocker",
|
|
"scope": "m3-patch-panel-wiring",
|
|
"status": "open",
|
|
"classification": "direct_target_m3_wiring_missing",
|
|
"sourceIssue": "pikasTech/HWLAB#64",
|
|
"summary": "DEV patch-panel is callable, but live wiring does not contain res_boxsimu_1:DO1 -> res_boxsimu_2:DI1; active=res_boxsim_alpha:uart0->res_boxsim_beta:uart0, res_boxsim_alpha:gpio0->res_boxsim_beta:gpio0; configured=res_boxsim_alpha:uart0->res_boxsim_beta:uart0, res_boxsim_alpha:gpio0->res_boxsim_beta:gpio0."
|
|
},
|
|
{
|
|
"type": "safety_blocker",
|
|
"scope": "m3-live-write-authorization",
|
|
"status": "open",
|
|
"classification": "dry_run_plan_only",
|
|
"summary": "Plan-only mode is intentionally non-mutating; run the bounded live smoke only after explicit DEV/non-PROD approval and after read-only preconditions identify the exact HWLAB targets."
|
|
}
|
|
],
|
|
"summary": {
|
|
"status": "blocked",
|
|
"classification": "direct_target_identity_gap",
|
|
"observedAt": "2026-05-22T13:44:36.422Z",
|
|
"result": "DEV ingress and direct targets were reachable, but M3 DEV-LIVE was not triggered because required identities or patch-panel wiring were missing."
|
|
},
|
|
"directTargetDiscovery": {
|
|
"environmentMissing": [
|
|
"HWLAB_DEV_BOX_SIMU_1_URL",
|
|
"HWLAB_DEV_BOX_SIMU_2_URL",
|
|
"HWLAB_DEV_GATEWAY_SIMU_1_URL",
|
|
"HWLAB_DEV_GATEWAY_SIMU_2_URL",
|
|
"HWLAB_DEV_PATCH_PANEL_URL"
|
|
],
|
|
"kubernetes": {
|
|
"status": "observed",
|
|
"source": "kubernetes-endpointslices",
|
|
"command": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get endpointslices.discovery.k8s.io -o json",
|
|
"exitCode": 0,
|
|
"services": {
|
|
"hwlab-box-simu": {
|
|
"endpointSlice": "hwlab-box-simu-qssf6",
|
|
"port": 7201,
|
|
"count": 2,
|
|
"endpoints": [
|
|
{
|
|
"url": "http://10.42.0.200:7201",
|
|
"address": "10.42.0.200",
|
|
"port": 7201,
|
|
"targetRef": "hwlab-box-simu-55688cbcc7-pftxc"
|
|
},
|
|
{
|
|
"url": "http://10.42.0.208:7201",
|
|
"address": "10.42.0.208",
|
|
"port": 7201,
|
|
"targetRef": "hwlab-box-simu-55688cbcc7-sq5fx"
|
|
}
|
|
]
|
|
},
|
|
"hwlab-gateway-simu": {
|
|
"endpointSlice": "hwlab-gateway-simu-dmm4m",
|
|
"port": 7101,
|
|
"count": 2,
|
|
"endpoints": [
|
|
{
|
|
"url": "http://10.42.0.204:7101",
|
|
"address": "10.42.0.204",
|
|
"port": 7101,
|
|
"targetRef": "hwlab-gateway-simu-699fd486b-phcgp"
|
|
},
|
|
{
|
|
"url": "http://10.42.0.209:7101",
|
|
"address": "10.42.0.209",
|
|
"port": 7101,
|
|
"targetRef": "hwlab-gateway-simu-699fd486b-j9pk7"
|
|
}
|
|
]
|
|
},
|
|
"hwlab-patch-panel": {
|
|
"endpointSlice": "hwlab-patch-panel-nl2px",
|
|
"port": 7301,
|
|
"count": 1,
|
|
"endpoints": [
|
|
{
|
|
"url": "http://10.42.0.205:7301",
|
|
"address": "10.42.0.205",
|
|
"port": 7301,
|
|
"targetRef": "hwlab-patch-panel-757f9f44d5-7np8r"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"summary": "Observed endpoint slices for hwlab-box-simu, hwlab-gateway-simu, hwlab-patch-panel."
|
|
},
|
|
"source": "kubernetes-endpointslices",
|
|
"counts": {
|
|
"boxSimu": 2,
|
|
"gatewaySimu": 2,
|
|
"patchPanel": 1,
|
|
"distinctBoxResources": 1,
|
|
"distinctGatewayIdentities": 1
|
|
},
|
|
"selected": {
|
|
"boxSimu1": {
|
|
"id": "box-simu-1-candidate-1",
|
|
"serviceId": "hwlab-box-simu",
|
|
"baseUrl": "http://10.42.0.200:7201",
|
|
"targetRef": "hwlab-box-simu-55688cbcc7-pftxc",
|
|
"ok": true,
|
|
"statusCode": 200,
|
|
"healthCode": 200,
|
|
"boxId": "boxsimu_1",
|
|
"resourceId": "res_boxsimu_1",
|
|
"gatewayId": null,
|
|
"gatewaySessionId": "gws_mvp_simu",
|
|
"patchPanelState": null
|
|
},
|
|
"boxSimu2": null,
|
|
"gateways": [
|
|
{
|
|
"id": "gateway-simu-1-candidate-1",
|
|
"serviceId": "hwlab-gateway-simu",
|
|
"baseUrl": "http://10.42.0.204:7101",
|
|
"targetRef": "hwlab-gateway-simu-699fd486b-phcgp",
|
|
"ok": true,
|
|
"statusCode": 200,
|
|
"healthCode": 200,
|
|
"boxId": null,
|
|
"resourceId": null,
|
|
"gatewayId": "gateway-a",
|
|
"gatewaySessionId": "gws_gateway-a",
|
|
"patchPanelState": null
|
|
}
|
|
],
|
|
"patchPanel": {
|
|
"id": "patch-panel-candidate-1",
|
|
"serviceId": "hwlab-patch-panel",
|
|
"baseUrl": "http://10.42.0.205:7301",
|
|
"targetRef": "hwlab-patch-panel-757f9f44d5-7np8r",
|
|
"ok": true,
|
|
"statusCode": 200,
|
|
"healthCode": 200,
|
|
"boxId": null,
|
|
"resourceId": null,
|
|
"gatewayId": null,
|
|
"gatewaySessionId": "gws_gwsimu_east",
|
|
"patchPanelState": "active"
|
|
}
|
|
},
|
|
"candidates": [
|
|
{
|
|
"id": "box-simu-1-candidate-1",
|
|
"serviceId": "hwlab-box-simu",
|
|
"baseUrl": "http://10.42.0.200:7201",
|
|
"targetRef": "hwlab-box-simu-55688cbcc7-pftxc",
|
|
"ok": true,
|
|
"statusCode": 200,
|
|
"healthCode": 200,
|
|
"boxId": "boxsimu_1",
|
|
"resourceId": "res_boxsimu_1",
|
|
"gatewayId": null,
|
|
"gatewaySessionId": "gws_mvp_simu",
|
|
"patchPanelState": null
|
|
},
|
|
{
|
|
"id": "box-simu-1-candidate-2",
|
|
"serviceId": "hwlab-box-simu",
|
|
"baseUrl": "http://10.42.0.208:7201",
|
|
"targetRef": "hwlab-box-simu-55688cbcc7-sq5fx",
|
|
"ok": true,
|
|
"statusCode": 200,
|
|
"healthCode": 200,
|
|
"boxId": "boxsimu_1",
|
|
"resourceId": "res_boxsimu_1",
|
|
"gatewayId": null,
|
|
"gatewaySessionId": "gws_mvp_simu",
|
|
"patchPanelState": null
|
|
},
|
|
{
|
|
"id": "gateway-simu-1-candidate-1",
|
|
"serviceId": "hwlab-gateway-simu",
|
|
"baseUrl": "http://10.42.0.204:7101",
|
|
"targetRef": "hwlab-gateway-simu-699fd486b-phcgp",
|
|
"ok": true,
|
|
"statusCode": 200,
|
|
"healthCode": 200,
|
|
"boxId": null,
|
|
"resourceId": null,
|
|
"gatewayId": "gateway-a",
|
|
"gatewaySessionId": "gws_gateway-a",
|
|
"patchPanelState": null
|
|
},
|
|
{
|
|
"id": "gateway-simu-1-candidate-2",
|
|
"serviceId": "hwlab-gateway-simu",
|
|
"baseUrl": "http://10.42.0.209:7101",
|
|
"targetRef": "hwlab-gateway-simu-699fd486b-j9pk7",
|
|
"ok": true,
|
|
"statusCode": 200,
|
|
"healthCode": 200,
|
|
"boxId": null,
|
|
"resourceId": null,
|
|
"gatewayId": "gateway-a",
|
|
"gatewaySessionId": "gws_gateway-a",
|
|
"patchPanelState": null
|
|
},
|
|
{
|
|
"id": "patch-panel-candidate-1",
|
|
"serviceId": "hwlab-patch-panel",
|
|
"baseUrl": "http://10.42.0.205:7301",
|
|
"targetRef": "hwlab-patch-panel-757f9f44d5-7np8r",
|
|
"ok": true,
|
|
"statusCode": 200,
|
|
"healthCode": 200,
|
|
"boxId": null,
|
|
"resourceId": null,
|
|
"gatewayId": null,
|
|
"gatewaySessionId": "gws_gwsimu_east",
|
|
"patchPanelState": "active"
|
|
}
|
|
],
|
|
"patchPanelWiring": {
|
|
"url": "http://10.42.0.205:7301/wiring",
|
|
"ok": true,
|
|
"requiredConnection": {
|
|
"fromResourceId": "res_boxsimu_1",
|
|
"fromPort": "DO1",
|
|
"toResourceId": "res_boxsimu_2",
|
|
"toPort": "DI1"
|
|
},
|
|
"activeObserved": [
|
|
"res_boxsim_alpha:uart0->res_boxsim_beta:uart0",
|
|
"res_boxsim_alpha:gpio0->res_boxsim_beta:gpio0"
|
|
],
|
|
"configuredObserved": [
|
|
"res_boxsim_alpha:uart0->res_boxsim_beta:uart0",
|
|
"res_boxsim_alpha:gpio0->res_boxsim_beta:gpio0"
|
|
],
|
|
"hasRequiredActiveConnection": false,
|
|
"hasRequiredConfiguredConnection": false,
|
|
"configSource": "internal:mvp-topology",
|
|
"syncableConnectionCount": 0
|
|
},
|
|
"summary": "Direct DEV M3 targets were probed read-only, but required identities or patch-panel M3 wiring were not satisfied."
|
|
},
|
|
"dryRunPlan": {
|
|
"mode": "plan-only",
|
|
"evidenceLevel": "DRY-RUN",
|
|
"route": "res_boxsimu_1:DO1 -> hwlab-patch-panel -> res_boxsimu_2:DI1",
|
|
"dryRunCallsLiveEndpoints": false,
|
|
"liveWriteWillRun": false,
|
|
"liveWriteRequiresHumanApproval": true,
|
|
"liveCommand": "node scripts/dev-m3-hardware-loop-smoke.mjs --live --confirm-dev --expect-non-prod",
|
|
"legacyLiveCommand": "node scripts/dev-m3-hardware-loop-smoke.mjs --live --confirm-dev --confirmed-non-production",
|
|
"liveWritePreconditions": [
|
|
"operator has authorized a bounded DEV M3 live smoke window",
|
|
"command includes --live, --confirm-dev, and --expect-non-prod",
|
|
"PROD, real hardware, secret reads, service restarts, and force pushes remain forbidden",
|
|
"DEV ingress identifies HWLAB DEV on the frozen 16666/16667 boundary",
|
|
"two distinct hwlab-box-simu targets report res_boxsimu_1 and res_boxsimu_2",
|
|
"two distinct hwlab-gateway-simu targets report distinct DEV gateway sessions",
|
|
"one hwlab-patch-panel reports active wiring for res_boxsimu_1:DO1 -> res_boxsimu_2:DI1",
|
|
"cross-device propagation is owned by hwlab-patch-panel; box loopback, SOURCE, LOCAL, fixture, and DRY-RUN output cannot be marked DEV-LIVE"
|
|
],
|
|
"endpointPlan": [
|
|
{
|
|
"phase": "dev-ingress-precondition",
|
|
"targetId": "dev-api-edge",
|
|
"serviceId": "hwlab-cloud-api",
|
|
"method": "GET",
|
|
"path": "/health/live",
|
|
"url": "http://74.48.78.17:16667/health/live",
|
|
"urlSource": "frozen-dev-endpoint",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "dev-ingress-precondition",
|
|
"targetId": "dev-api-edge-json-rpc",
|
|
"serviceId": "hwlab-cloud-api",
|
|
"method": "POST",
|
|
"path": "/json-rpc",
|
|
"url": "http://74.48.78.17:16667/json-rpc",
|
|
"urlSource": "frozen-dev-endpoint",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false,
|
|
"requestShape": "system.health"
|
|
},
|
|
{
|
|
"phase": "dev-ingress-precondition",
|
|
"targetId": "dev-frontend",
|
|
"serviceId": "hwlab-cloud-web",
|
|
"method": "GET",
|
|
"path": "/health/live",
|
|
"url": "http://74.48.78.17:16666/health/live",
|
|
"urlSource": "frozen-dev-frontend-endpoint",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "box-simu-1",
|
|
"serviceId": "hwlab-box-simu",
|
|
"method": "GET",
|
|
"path": "/health/live",
|
|
"url": "$HWLAB_DEV_BOX_SIMU_1_URL/health/live",
|
|
"urlSource": "required-env:HWLAB_DEV_BOX_SIMU_1_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "box-simu-1",
|
|
"serviceId": "hwlab-box-simu",
|
|
"method": "GET",
|
|
"path": "/status",
|
|
"url": "$HWLAB_DEV_BOX_SIMU_1_URL/status",
|
|
"urlSource": "required-env:HWLAB_DEV_BOX_SIMU_1_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "box-simu-2",
|
|
"serviceId": "hwlab-box-simu",
|
|
"method": "GET",
|
|
"path": "/health/live",
|
|
"url": "$HWLAB_DEV_BOX_SIMU_2_URL/health/live",
|
|
"urlSource": "required-env:HWLAB_DEV_BOX_SIMU_2_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "box-simu-2",
|
|
"serviceId": "hwlab-box-simu",
|
|
"method": "GET",
|
|
"path": "/status",
|
|
"url": "$HWLAB_DEV_BOX_SIMU_2_URL/status",
|
|
"urlSource": "required-env:HWLAB_DEV_BOX_SIMU_2_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "gateway-simu-1",
|
|
"serviceId": "hwlab-gateway-simu",
|
|
"method": "GET",
|
|
"path": "/health/live",
|
|
"url": "$HWLAB_DEV_GATEWAY_SIMU_1_URL/health/live",
|
|
"urlSource": "required-env:HWLAB_DEV_GATEWAY_SIMU_1_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "gateway-simu-1",
|
|
"serviceId": "hwlab-gateway-simu",
|
|
"method": "GET",
|
|
"path": "/status",
|
|
"url": "$HWLAB_DEV_GATEWAY_SIMU_1_URL/status",
|
|
"urlSource": "required-env:HWLAB_DEV_GATEWAY_SIMU_1_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "gateway-simu-2",
|
|
"serviceId": "hwlab-gateway-simu",
|
|
"method": "GET",
|
|
"path": "/health/live",
|
|
"url": "$HWLAB_DEV_GATEWAY_SIMU_2_URL/health/live",
|
|
"urlSource": "required-env:HWLAB_DEV_GATEWAY_SIMU_2_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "gateway-simu-2",
|
|
"serviceId": "hwlab-gateway-simu",
|
|
"method": "GET",
|
|
"path": "/status",
|
|
"url": "$HWLAB_DEV_GATEWAY_SIMU_2_URL/status",
|
|
"urlSource": "required-env:HWLAB_DEV_GATEWAY_SIMU_2_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "patch-panel",
|
|
"serviceId": "hwlab-patch-panel",
|
|
"method": "GET",
|
|
"path": "/health/live",
|
|
"url": "$HWLAB_DEV_PATCH_PANEL_URL/health/live",
|
|
"urlSource": "required-env:HWLAB_DEV_PATCH_PANEL_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "direct-target-precondition",
|
|
"targetId": "patch-panel",
|
|
"serviceId": "hwlab-patch-panel",
|
|
"method": "GET",
|
|
"path": "/status",
|
|
"url": "$HWLAB_DEV_PATCH_PANEL_URL/status",
|
|
"urlSource": "required-env:HWLAB_DEV_PATCH_PANEL_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "patch-panel-route-precondition",
|
|
"targetId": "patch-panel",
|
|
"serviceId": "hwlab-patch-panel",
|
|
"method": "GET",
|
|
"path": "/wiring",
|
|
"url": "$HWLAB_DEV_PATCH_PANEL_URL/wiring",
|
|
"urlSource": "required-env:HWLAB_DEV_PATCH_PANEL_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "live-write-source-do1",
|
|
"targetId": "box-simu-1",
|
|
"serviceId": "hwlab-box-simu",
|
|
"method": "POST",
|
|
"path": "/ports/write",
|
|
"url": "$HWLAB_DEV_BOX_SIMU_1_URL/ports/write",
|
|
"urlSource": "required-env:HWLAB_DEV_BOX_SIMU_1_URL",
|
|
"mutatesDevState": true,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "live-write-patch-panel-route",
|
|
"targetId": "patch-panel",
|
|
"serviceId": "hwlab-patch-panel",
|
|
"method": "POST",
|
|
"path": "/signals/route",
|
|
"url": "$HWLAB_DEV_PATCH_PANEL_URL/signals/route",
|
|
"urlSource": "required-env:HWLAB_DEV_PATCH_PANEL_URL",
|
|
"mutatesDevState": true,
|
|
"calledInDryRun": false
|
|
},
|
|
{
|
|
"phase": "live-read-target-di1",
|
|
"targetId": "box-simu-2",
|
|
"serviceId": "hwlab-box-simu",
|
|
"method": "GET",
|
|
"path": "/status",
|
|
"url": "$HWLAB_DEV_BOX_SIMU_2_URL/status",
|
|
"urlSource": "required-env:HWLAB_DEV_BOX_SIMU_2_URL",
|
|
"mutatesDevState": false,
|
|
"calledInDryRun": false
|
|
}
|
|
],
|
|
"evidenceFields": [
|
|
"operationId",
|
|
"traceId",
|
|
"auditId",
|
|
"evidenceId",
|
|
"sourceResourceId=res_boxsimu_1",
|
|
"sourcePort=DO1",
|
|
"routeOwner=hwlab-patch-panel",
|
|
"routeResponse.propagatedBy=hwlab-patch-panel",
|
|
"targetResourceId=res_boxsimu_2",
|
|
"targetPort=DI1",
|
|
"targetState.ports.DI1.propagatedBy=hwlab-patch-panel"
|
|
],
|
|
"refusalPolicy": [
|
|
"no arguments defaults to refusal",
|
|
"--dry-run/--plan cannot be combined with --live/--allow-live",
|
|
"live mode refuses without --confirm-dev and --expect-non-prod",
|
|
"a dry-run, source, local, fixture, or read-only blocker report leaves liveOperation.status as not_run or blocked, never pass"
|
|
]
|
|
}
|
|
}
|