{ "$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 --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, "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-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." } ], "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." } }