d7e84f359b
Implements #317 session-gated read-only runner phase with structured long-lived Codex stdio blockers.
552 lines
19 KiB
JSON
552 lines
19 KiB
JSON
{
|
|
"$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": "blocked",
|
|
"summary": "Direct /gate route was observed in an older DOM-only report, but the checked-in observations do not include the current single-table gate contract fields; kept BLOCKED instead of inferring DEV-LIVE gate readiness.",
|
|
"evidence": [
|
|
"pathname=/gate",
|
|
"gateHidden=false",
|
|
"diagnosticsTermsPresent=true",
|
|
"codeAgentPostAttempts=0",
|
|
"single-table gate observations missing",
|
|
"kept blocked to avoid false green"
|
|
],
|
|
"observations": {
|
|
"pathname": "/gate",
|
|
"hash": "",
|
|
"title": "HWLAB 云工作台",
|
|
"workspaceHidden": true,
|
|
"gateHidden": false,
|
|
"helpHidden": true,
|
|
"diagnosticsTermsPresent": true,
|
|
"codeAgentPostGuard": {
|
|
"installed": true,
|
|
"blockedPath": "/v1/agent/chat",
|
|
"attemptedCount": 0,
|
|
"attempts": []
|
|
}
|
|
},
|
|
"blocker": "observability_blocker"
|
|
},
|
|
{
|
|
"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."
|
|
},
|
|
{
|
|
"type": "observability_blocker",
|
|
"scope": "live-gate-route",
|
|
"status": "open",
|
|
"summary": "Checked-in DOM-only /gate observations are missing current single-table contract fields; rerun DOM-only smoke after DEV rollout for fresh evidence."
|
|
}
|
|
],
|
|
"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"
|
|
}
|
|
}
|