{ "$schema": "https://hwlab.pikastech.local/schemas/dev-gate-report.schema.json", "$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-cloud-workbench-dom-only.json", "reportVersion": "v1", "status": "blocked", "issue": "pikasTech/HWLAB#7", "taskId": "dev-cloud-workbench-live", "commitId": "6911138398e4", "acceptanceLevel": "dev_cloud_workbench_live", "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 deployed browser user journey report for the 16666 Cloud Workbench; it does not substitute for M3/M4/M5 hardware acceptance." }, "task": "DC-DCSN-P0-2026-003", "refs": [ "pikasTech/HWLAB#7", "pikasTech/HWLAB#108", "pikasTech/HWLAB#99", "pikasTech/HWLAB#78", "pikasTech/HWLAB#117", "pikasTech/HWLAB#118", "pikasTech/HWLAB#119", "pikasTech/HWLAB#120", "pikasTech/HWLAB#131", "pikasTech/HWLAB#143", "pikasTech/HWLAB#164", "pikasTech/HWLAB#224" ], "mode": "dom-only", "url": "http://74.48.78.17:16666/", "generatedAt": "2026-05-23T06:47:32.343Z", "evidenceLevel": "BLOCKED", "devLive": false, "sourceIdentity": { "status": "observed", "source": "git-head", "commitId": "6911138398e41485048193a6bf298a4b2e070b64", "shortCommitId": "6911138398e4", "ref": "test/d601-dom-only-feedback-validation", "worktreeState": "clean", "dirty": false, "reportCommitId": "6911138398e4", "summary": "Source identity was derived from the current worktree or source environment and is separate from the live runtime identity." }, "runtimeIdentity": { "status": "observed", "source": "health-live", "endpoint": "http://74.48.78.17:16667/health/live", "serviceId": "hwlab-cloud-api", "environment": "dev", "healthStatus": "degraded", "ready": false, "commitId": "ffffced", "commitSource": "runtime-env", "imageTag": "ffffced", "observedAt": "2026-05-23T06:47:14.607Z", "runtime": { "durable": false, "ready": false, "status": "blocked", "blocker": "runtime_durable_adapter_auth_blocked", "connection": { "queryAttempted": true, "queryResult": "auth_blocked" } }, "readiness": { "ready": false, "status": "degraded", "durability": { "ready": false, "status": "blocked", "blocker": "runtime_durable_adapter_auth_blocked", "blockedLayer": "auth", "queryResult": "auth_blocked" } }, "blockerCodes": [ "runtime_durable_adapter_auth_blocked" ], "summary": "Live runtime identity was observed through the existing read-only health endpoint and is not inferred from source git HEAD." }, "expectedRuntimeIdentity": { "status": "observed", "serviceId": "hwlab-cloud-api", "source": "deploy/artifact-catalog.dev.json+deploy/deploy.json", "commitId": "ffffced", "imageTag": "ffffced", "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:ffffced", "summary": "Expected DEV runtime identity was derived from current source deploy desired state, not from live health." }, "deploymentIdentity": { "status": "pass", "expectedCommit": "ffffced", "expectedReportCommitId": "6911138398e4", "expectedImageTag": "ffffced", "expectedSource": "deploy/artifact-catalog.dev.json+deploy/deploy.json", "observedRuntimeCommit": "ffffced", "observedImageTag": "ffffced", "evidence": [ "expected=ffffced", "expectedImageTag=ffffced", "runtimeCommit=ffffced", "imageTag=ffffced" ], "summary": "Live API runtime identity matches the current source desired runtime identity." }, "webAssetIdentity": { "status": "pass", "assets": [ { "path": "index.html", "status": "match", "httpStatus": 200, "contentType": "text/html; charset=utf-8", "sourceHash": "47caa4cca88306c2", "liveHash": "47caa4cca88306c2", "sourceLength": 15062, "liveLength": 15062 }, { "path": "styles.css", "status": "match", "httpStatus": 200, "contentType": "text/css; charset=utf-8", "sourceHash": "f0649d37f7597e2a", "liveHash": "f0649d37f7597e2a", "sourceLength": 22493, "liveLength": 22493 }, { "path": "app.mjs", "status": "match", "httpStatus": 200, "contentType": "text/javascript; charset=utf-8", "sourceHash": "3deecca70ab81e80", "liveHash": "3deecca70ab81e80", "sourceLength": 78631, "liveLength": 78631 } ], "mismatches": [], "summary": "Live 16666 primary web assets match the current clean source files." }, "sourceContract": { "status": "pass", "documents": [ "docs/cloud-web-workbench.md", "docs/reference/cloud-workbench.md", "docs/reference/code-agent-chat-readiness.md" ], "summary": "The deployed browser journey is anchored to the Cloud Workbench and Code Agent readiness contracts." }, "validationCommands": [ "node --check scripts/dev-cloud-workbench-smoke.mjs", "node --check scripts/src/dev-cloud-workbench-smoke-lib.mjs", "node scripts/dev-cloud-workbench-smoke.mjs --source", "node scripts/dev-cloud-workbench-smoke.mjs --mobile", "node scripts/dev-cloud-workbench-smoke.mjs --local-agent-fixture", "node scripts/dev-cloud-workbench-smoke.mjs --local-agent-timeout-fixture", "node scripts/dev-cloud-workbench-smoke.mjs --dom-only --url http://74.48.78.17:16666/ --report reports/dev-gate/dev-cloud-workbench-dom-only.json", "node scripts/dev-cloud-workbench-smoke.mjs --live --confirm-dev-live --url http://74.48.78.17:16666/ --report reports/dev-gate/dev-cloud-workbench-live.json", "node scripts/validate-dev-gate-report.mjs reports/dev-gate/dev-cloud-workbench-dom-only.json", "node scripts/validate-dev-gate-report.mjs" ], "localSmoke": { "status": "not_run", "commands": [ "node scripts/dev-cloud-workbench-smoke.mjs --source", "node scripts/dev-cloud-workbench-smoke.mjs --mobile", "node scripts/dev-cloud-workbench-smoke.mjs --local-agent-fixture", "node scripts/dev-cloud-workbench-smoke.mjs --local-agent-timeout-fixture" ], "evidence": [ "Source mode verifies the source contract and same-origin Code Agent wiring only.", "Mobile browser mode verifies the 390x844 outer-scroll lock and help route at SOURCE level.", "Local fixture browser mode verifies both Code Agent prompts past the old 4500ms window at SOURCE level.", "Local timeout fixture verifies bounded timeout UI classification without live acceptance." ], "summary": "Source, mobile, and local fixture workbench smokes are SOURCE-level evidence and do not prove the deployed browser journey." }, "dryRun": { "status": "not_applicable", "commands": [ "node scripts/dev-cloud-workbench-smoke.mjs --source" ], "evidence": [ "No dry-run substitute is accepted for the deployed browser journey." ], "summary": "The journey evidence is collected from the real DEV browser endpoint, not a dry-run fixture." }, "devPreconditions": { "status": "blocked", "requirements": [ "GET http://74.48.78.17:16666/ serves the Cloud Workbench HTML.", "Browser DOM exposes the default workbench and core controls.", "DOM-only mode may inspect read-only deployed DOM wiring after identity preflight blocks, but must not send Code Agent chat.", "A controlled same-origin POST /v1/agent/chat returns completed UI-visible evidence or reports a blocker.", "No hardware write API, service restart, PROD access, or secret read is performed." ], "commands": [ "node scripts/dev-cloud-workbench-smoke.mjs --dom-only --url http://74.48.78.17:16666/ --report reports/dev-gate/dev-cloud-workbench-dom-only.json", "node scripts/dev-cloud-workbench-smoke.mjs --live --confirm-dev-live --url http://74.48.78.17:16666/ --report reports/dev-gate/dev-cloud-workbench-live.json" ], "summary": "Deployed browser DOM was inspected read-only; Code Agent chat was not posted." }, "endpoints": { "frontend": "http://74.48.78.17:16666", "api": "http://74.48.78.17:16667", "edge": "http://74.48.78.17:16667" }, "checks": [ { "id": "live-api-runtime-readiness", "status": "degraded", "summary": "Live API is reachable but degraded/read-only; runtime durability is not ready, so this cannot be full DEV-LIVE acceptance.", "evidence": [ "api.status=degraded", "ready=false", "runtime.durable=false", "runtime.ready=false", "durability.ready=false", "blocker=runtime_durable_adapter_auth_blocked" ], "observations": { "status": "degraded", "healthStatus": "degraded", "ready": false, "runtimeDurable": false, "runtimeReady": false, "durabilityReady": false, "durableBlocked": false, "blockerCodes": [ "runtime_durable_adapter_auth_blocked" ], "evidence": [ "api.status=degraded", "ready=false", "runtime.durable=false", "runtime.ready=false", "durability.ready=false", "blocker=runtime_durable_adapter_auth_blocked" ], "summary": "Live API is reachable but degraded/read-only; runtime durability is not ready, so this cannot be full DEV-LIVE acceptance." } }, { "id": "live-runtime-current-main", "status": "pass", "summary": "Live API runtime identity matches the current source desired runtime identity.", "evidence": [ "expected=ffffced", "expectedImageTag=ffffced", "runtimeCommit=ffffced", "imageTag=ffffced" ], "observations": { "status": "pass", "expectedCommit": "ffffced", "expectedReportCommitId": "6911138398e4", "expectedImageTag": "ffffced", "expectedSource": "deploy/artifact-catalog.dev.json+deploy/deploy.json", "observedRuntimeCommit": "ffffced", "observedImageTag": "ffffced", "evidence": [ "expected=ffffced", "expectedImageTag=ffffced", "runtimeCommit=ffffced", "imageTag=ffffced" ], "summary": "Live API runtime identity matches the current source desired runtime identity." } }, { "id": "live-http-html", "status": "pass", "summary": "Live URL serves the Cloud Workbench HTML.", "evidence": [ "http://74.48.78.17:16666/", "HTTP 200", "text/html; charset=utf-8" ] }, { "id": "live-web-assets-current-main", "status": "pass", "summary": "Live 16666 primary web assets match the current clean source files.", "evidence": [ "index.html: match", "styles.css: match", "app.mjs: match" ], "observations": { "status": "pass", "assets": [ { "path": "index.html", "status": "match", "httpStatus": 200, "contentType": "text/html; charset=utf-8", "sourceHash": "47caa4cca88306c2", "liveHash": "47caa4cca88306c2", "sourceLength": 15062, "liveLength": 15062 }, { "path": "styles.css", "status": "match", "httpStatus": 200, "contentType": "text/css; charset=utf-8", "sourceHash": "f0649d37f7597e2a", "liveHash": "f0649d37f7597e2a", "sourceLength": 22493, "liveLength": 22493 }, { "path": "app.mjs", "status": "match", "httpStatus": 200, "contentType": "text/javascript; charset=utf-8", "sourceHash": "3deecca70ab81e80", "liveHash": "3deecca70ab81e80", "sourceLength": 78631, "liveLength": 78631 } ], "mismatches": [], "summary": "Live 16666 primary web assets match the current clean source files." } }, { "id": "live-browser-dom", "status": "blocked", "summary": "Browser DOM did not satisfy the workbench contract.", "evidence": [ "title=HWLAB 云工作台", "bodyOverflow=hidden", "htmlOverflow=hidden", "firstViewportForbidden=验收", "gateRouteAvailable=true", "m3WiringRows=1", "codeAgentPostAttempts=0" ], "observations": { "title": "HWLAB 云工作台", "bodyOverflow": "hidden", "htmlOverflow": "hidden", "workspaceHidden": false, "gateHidden": true, "helpHidden": true, "diagnosticsHidden": null, "outerScrollLocked": true, "rootAfterScrollAttempt": { "windowScrollY": 0, "htmlScrollTop": 0, "bodyScrollTop": 0 }, "firstViewportForbiddenPresent": [ "验收" ], "firstViewportTextSample": "工作台 内部复核 使用说明 资源树 HWLAB Cloud 云工作台 只读工作区 编写任务 查看接线 查看状态 硬件资源 8 prj_m3_hardware_loop 当前项目 gws_gwsimu_1 hwlab-gateway-simu / 已连接 gws_gwsimu_2 hwlab-gateway-simu / 已连接 res_boxsimu_1 simulator_endpoint / 可用 res_boxsimu_2 simulator_endpoint / 可用 pps_m3_hardware_loop hwlab-patch-panel / 待处理 agt_m5-0001 hwlab-agent-mgr / Agent 会话 wkr_m5-0001 hwlab-agent-worker / 完成 常用能力 3 来源 任务草稿 在底部输入区记录要交给 Agent 的任务,不会", "labelsPresent": true, "navLabelsPresent": true, "defaultBackstageHidden": true, "gateRouteAvailable": true, "wiringHeaders": [ "源设备", "源端口", "接线盘", "目标设备", "目标端口", "状态", "证据来源", "trace/evidence" ], "m3WiringRows": [ [ "res_boxsimu_1", "DO1", "hwlab-patch-panel", "res_boxsimu_2", "DI1", "待可信记录", "来源拓扑", "等待可信记录" ] ], "coreControlsVisible": { "commandInput": true, "commandSend": true, "agentChatStatus": true, "conversationList": true, "hardwareList": true, "wiringTab": true, "recordsTab": true }, "codeAgentPostGuard": { "installed": true, "blockedPath": "/v1/agent/chat", "attemptedCount": 0, "attempts": [] } } }, { "id": "live-gate-route", "status": "pass", "summary": "Direct /gate route opens the internal diagnostics view without becoming the default workbench.", "evidence": [ "pathname=/gate", "gateHidden=false", "diagnosticsTermsPresent=true", "codeAgentPostAttempts=0" ], "observations": { "pathname": "/gate", "hash": "", "title": "HWLAB 云工作台", "workspaceHidden": true, "gateHidden": false, "helpHidden": true, "diagnosticsTermsPresent": true, "codeAgentPostGuard": { "installed": true, "blockedPath": "/v1/agent/chat", "attemptedCount": 0, "attempts": [] } } }, { "id": "live-help-markdown-route", "status": "pass", "summary": "Desktop browser help route remains non-default, markdown-rendered, and scrollable.", "evidence": [ "hash=#help", "heading=云工作台内部使用说明", "rootStillLocked=true", "helpPanelScrolls=true", "codeAgentPostAttempts=0" ], "observations": { "hash": "#help", "pathname": "/", "helpState": "ready", "workspaceHidden": true, "gateHidden": true, "helpHidden": false, "heading": "云工作台内部使用说明", "renderedLists": 26, "codeCount": 42, "hasRawMarkdownHeading": false, "termsPresent": true, "helpPanelScrolls": true, "rootStillLocked": true, "helpScroll": { "before": 0, "after": 871, "clientHeight": 495, "scrollHeight": 1366, "overflowY": "auto" }, "routeIsHashHelp": true, "routeIsSlashHashHelp": false, "routeIsDirectHelp": false, "nonDefaultMarkdownHelp": true, "codeAgentPostGuard": { "installed": true, "blockedPath": "/v1/agent/chat", "attemptedCount": 0, "attempts": [] } } }, { "id": "live-code-agent-browser-journey", "status": "not_applicable", "summary": "DOM-only mode never posts the browser Code Agent journey; /v1/agent/chat is not sent.", "evidence": [ "POST /v1/agent/chat not_applicable", "POST /v1/agent/chat not sent", "DOM-only read-only mode" ], "observations": { "request": { "method": "POST", "status": "not_applicable", "urlPath": "/v1/agent/chat" }, "response": { "status": "not_applicable", "provider": "not_observed", "model": "not_observed", "backend": "not_observed", "traceId": "not_observed", "hasReply": false, "error": null }, "classification": { "status": "not_applicable", "reason": "dom_only_no_code_agent_post", "codeAgentBrowserJourneySkipped": true }, "networkEvents": [] } } ], "blockers": [ { "type": "observability_blocker", "scope": "live-browser-dom", "status": "open", "summary": "Browser DOM did not satisfy the workbench contract." } ], "safety": { "prodTouched": false, "servicesRestarted": false, "heavyE2E": false, "hardwareWriteApis": false, "sourceIsDevLive": false, "liveMode": "dom-only-readonly-no-code-agent-post", "codeAgentBrowserJourneySkipped": true, "codeAgentPostSent": false, "retainedApiFields": [ "runtime.commitId", "runtime.imageTag", "web asset hash/status", "DOM route/control/wiring observations" ], "statement": "DOM-only live smoke preserves runtime and web-asset identity preflight semantics, continues with read-only browser DOM/help inspection even when identity is blocked, and never posts /v1/agent/chat, reads Secret values, mutates live DEV, or claims M3/M4/M5 acceptance." }, "artifacts": { "reportPath": "/workspace/hwlab-d601-dom-only-feedback-validation/reports/dev-gate/dev-cloud-workbench-dom-only.json" } }