Repository navigation
feat: align HomeVox product flow with Penpot parity - #21
Conversation
wtj-0527
left a comment
There was a problem hiding this comment.
Independent exact-head review — RETRY
- Repository / PR:
wtj-0527/HomeVoxPR #21 - Reviewed exact head:
c8329287b1390e82e28a972c63ad20edaa68e4f9(feat/issue-19-penpot-product-parity→main) - Review policy: evidence-only
COMMENT; workflow routing remainshomevox.review.v1.
Previous Required Fixes (RF1–RF4)
| Fix | Result | Evidence |
|---|---|---|
| RF1 six-step routing / isolated 3D confirmation | verified in product code; acceptance evidence incomplete | productFlow.ts, App.tsx, production test captures four routed states, but it no longer tests the real parse→save→restart/reload chain. |
RF2 stable wallId selection |
verified in code | wallShell.ts carries canonical IDs; 2D/3D scene handlers share selectedWallID; inspector exposes wall/opening ownership. |
| RF3 ordinary diagnostics isolation | verified | raw JSON, WASM/grid/triangle/fallback DOM diagnostics removed; normal accessibility assertion passes; actionable 3D invalid-geometry and unavailable-WebGL messages remain. |
| RF4 four-state parity matrix | incomplete | matrix exists and documents the four states, but its claimed screenshot evidence is not retained/reviewable after the harness removes the browser container. |
Acceptance matrix summary
| Area | Result |
|---|---|
| canonical data contract; stable wall/opening IDs; opening local coordinates; unknown/non-persistent disclosure | pass |
| 2D editing; common Undo/Redo history; 2D↔3D wall selection code path; real R3F + Rust/WASM opening geometry; vertical/sloped-wall-compatible geometry path | pass |
| six-step product routing; standalone 3D confirmation; ordinary diagnostics isolation; accessible focus/ARIA; narrow layout rules | pass |
manual Go project persistence/reload API; invalid geometry and unconfigured persistence fail-closed; PostgreSQL/S3 boundary; fixed 0.0.0.0:18088; AGPL-3.0 |
pass (code and independent tests) |
| production browser evidence for real upload → parse → canonical edit → 3D confirmation → linked workspace → save → restart/reload; four saved exact-head screenshots | required fixes below |
| artifact/credential hygiene and diff whitespace | pass |
Required Fixes
- Restore a production Playwright test for the real persisted user chain.
frontend/e2e/production.spec.tsremoved the prior controlled-image upload →/api/floorplans/parse→ canonical edit → manual save → service restart → project reload assertions and now exercises only?e2e=wall-fixture. The test runner still starts PostgreSQL, MinIO, fake Vision, and the restart control, but current tests do not use the persistence API or restart URL. Add exact-head production assertions for successful parse, stable wall/opening IDs and geometry after save/reload/restart, and retain the required failure coverage (including invalid/duplicate canonical ID fail-closed behavior). This is required by Issue #19 and the Dev Plan; an unused persistence harness cannot substitute for a browser acceptance test. - Make the four 1440×960 exact-head screenshots reviewable run artifacts and tie the parity matrix to them. The test calls
page.screenshot, butscripts/run-production-browser-e2e.shdeletes the browser container during cleanup and copies no Playwright output directory to$OUT; evenHOMEVOX_KEEP_E2E_ARTIFACTS=1retains only local test binaries, notissue-19-*.png. Preserve/copy the four named screenshots to a non-committed run-artifact directory, print the path plus exact head, and validate their distinctness/availability sodocs/issue-19-design-parity.mddoes not assert inaccessible evidence.
No other Required Fixes were found after completing the full matrix at this exact head.
Independent checks
/home/agent/.cargo/bin/cargo test --manifest-path wasm/Cargo.toml— PASS (12)npm --prefix frontend test— PASS (73)npm --prefix frontend run lint— PASSnpm --prefix frontend run build(including WASM build) — PASScd backend && go test ./...— PASSnpm --prefix frontend run test:e2e— PASS (3) with PostgreSQL/MinIO, production assets, and listener0.0.0.0:18088; reviewed exact head printed by runner:c8329287b1390e82e28a972c63ad20edaa68e4f9git diff --check origin/main...c8329287b1390e82e28a972c63ad20edaa68e4f9— PASS- changed-file artifact/credential scan — PASS
Decision: RETRY — the two requirements above are all findings for this complete exact-head review.
wtj-0527
left a comment
There was a problem hiding this comment.
Independent exact-head review — RETRY
- Repository / PR:
wtj-0527/HomeVoxPR #21 - Reviewed exact head:
7723a7b22cbb05efb059b78baa7f3a197d689380(feat/issue-19-penpot-product-parity→main) - Review policy: evidence-only
COMMENT; workflow routing remainshomevox.review.v1.
Previous Required Fixes (RF1–RF4)
| Fix | Result | Evidence |
|---|---|---|
| RF1 real six-step routing / isolated 3D confirmation | verified | productFlow.ts and App.tsx isolate import, parsing, 2D, confirmation, linked workspace, and save; production E2E follows parse → 2D → confirmation → linked workspace. |
| RF2 stable wall identity | verified in implementation; browser acceptance incomplete | 2D and R3F wall handlers use canonical wallId; opening ownership is surfaced. The new E2E still does not exercise a 3D wall click and matching linked 2D highlight. |
| RF3 ordinary diagnostics isolation | verified | Raw JSON / WASM / grid / triangle / fallback diagnostics are absent from the ordinary DOM/accessibility tree; the exact-head E2E checks that assertion. |
| RF4 four-state parity artifacts | verified | Runner preserves the four named 1440×960 screenshots outside Git, emits exact_head + artifact_path, and validates distinct hashes. Independent run produced four non-empty, distinct screenshots. |
Acceptance matrix summary
| Area | Result |
|---|---|
| canonical API contract; stable wall/opening IDs; wall-local opening coordinates; Go persistence; PostgreSQL/S3 lifecycle; save/reload/restart | pass |
| 2D endpoint/opening editing; shared Undo/Redo; vertical and diagonal local-coordinate geometry; real Rust/WASM opening mesh | pass in focused unit/Rust tests; required browser-chain gap below |
| six-step route; standalone 3D confirmation; 1440×960 parity matrix/screenshots; responsive CSS; ARIA/focus | pass |
| 2D↔3D bidirectional wall selection and linked editing; exact persisted lifecycle coverage | required fix below |
| invalid / duplicate canonical input fail-closed before usable 3D/linked work | required fix below |
| unknown/non-persistent preview disclosure; diagnostics isolation; persistence-unavailable error behavior | pass |
AGPL-3.0; fixed 0.0.0.0:18088; artifact/credential hygiene; whitespace |
pass |
Required Fixes
- Make invalid canonical geometry genuinely fail closed. In
frontend/src/App.tsx,geometryValidationErroronly adds an alert insidethreeDPanel; Step 4’s完成并打开 3Dbutton remains enabled and enters the linked 2D/3D workspace, where the fallback per-wall shell still renders. Thus?e2e=invalid-openingand?e2e=duplicate-wall-idcan still be treated as generated/linked 3D despite a canonical validation failure. Block 3D confirmation/workspace entry (and do not render an editable 3D result) until the canonical geometry is valid; retain the actionable return-to-2D path. Update the production test to assert that invalid and duplicate-ID fixtures cannot reach the linked workspace. - Complete the required production browser proof of linked 2D/3D behavior.
frontend/e2e/production.spec.tscurrently selectswall-1only before confirmation, then selects a 3D opening marker; it never selects a R3F wall, asserts the samewallIdin linked 2D, edits geometry in the linked workspace, or demonstrates the reverse 2D→3D wall highlight. It also saves without any canonical edit and reloads only wall IDs, not stable openings. Exercise both directions with an actualthree-wall-*wall selection, a linked 2D endpoint/opening edit and shared Undo/Redo as applicable, assert same canonical wall/opening IDs and geometry through save → restart → reload, and keep the existing real parse, production assets, persistence, and artifact assertions. This is explicitly required by Issue #19 and the Dev Plan’s production acceptance contract.
No other Required Fixes were found after completing the full matrix at this exact head.
Independent checks
test -x /home/agent/.cargo/bin/cargo— PASS/home/agent/.cargo/bin/cargo test --manifest-path wasm/Cargo.toml— PASS (12)npm --prefix frontend test— PASS (73)npm --prefix frontend run lint— PASSnpm --prefix frontend run build(absolute Cargo PATH plus WASM build) — PASScd backend && go test ./...— PASSHOMEVOX_E2E_ARTIFACT_DIR=/tmp/homevox-review-7723a7b-artifacts npm --prefix frontend run test:e2e— PASS (2), PostgreSQL/MinIO lifecycle, production assets, listener0.0.0.0:18088, exact head7723a7b22cbb05efb059b78baa7f3a197d689380; four 1440×960 distinct PNG artifacts verifiedgit diff --check origin/main...7723a7b22cbb05efb059b78baa7f3a197d689380— PASS- changed-file credential/artifact scan — PASS
Decision: RETRY — the two requirements above are all findings for this complete exact-head review.
wtj-0527
left a comment
There was a problem hiding this comment.
Independent exact-head review — RETRY
- Repository / PR:
wtj-0527/HomeVoxPR #21 - Reviewed exact head:
695e042b45e790a3a5286f697ceee797f14c8fd4(feat/issue-19-penpot-product-parity→main) - Review policy: evidence-only
COMMENT; workflow routing remainshomevox.review.v1.
Previous Required Fixes (RF1–RF4)
| Fix | Result | Evidence |
|---|---|---|
| RF1 invalid canonical geometry must not enter usable 3D/linked work | verified | App.tsx now derives canOpenLinkedWorkspace from canonical validation, hides the completion action, closes Step 5, and the exact-head production test exercises invalid-opening and duplicate-ID fixtures. |
| RF2 stable wall identity and bidirectional selection | verified for selection; production geometry proof remains incomplete | The exact-head browser chain clicks three-wall-wall-2 then the 2D wall-hit-wall-3, and asserts the matching wallId highlights. It performs an opening-width Undo/Redo edit, but does not perform and prove a linked 2D endpoint edit or its 3D geometry/readback effect. |
| RF3 ordinary diagnostics isolation | verified | The ordinary accessibility snapshot excludes WASM/grid/triangle/fallback/raw-JSON diagnostics; user-facing invalid-geometry and no-WebGL wording remain. |
| RF4 four 1440×960 parity artifacts | verified | Runner retains four non-Git PNGs, checks distinct hashes, emits exact head + artifact path. Independent run produced all four nonempty distinct PNGs. |
Acceptance matrix summary
| Area | Result |
|---|---|
| canonical contract; stable wall/opening IDs; local opening coordinates; unknown/non-persistent preview disclosure; duplicate/invalid admission gate | pass |
| six-step routing; isolated 3D confirmation; 2D↔3D stable wall selection; ordinary diagnostics isolation; desktop parity artifacts; responsive/focus rules | pass |
| 2D endpoint and opening editing; common Undo/Redo; vertical/diagonal local-coordinate geometry; Rust/WASM opening geometry | focused tests pass; production linked-endpoint geometry/readback proof required below |
| production 3D availability/fail-closed behavior | required below: a Rust/WASM failure currently falls through to an undisclosed, editable shell workspace |
manual Go persistence, PostgreSQL/S3 lifecycle, restart/reload, fixed 0.0.0.0:18088, AGPL-3.0 |
pass (code and independent checks) |
| real upload → parse → save → restart → reload; screenshot retention and artifact/credential hygiene | pass, except for the linked endpoint geometry proof stated below |
Required Fixes
- Fail closed when the Rust/WASM 3D geometry is unavailable, rather than silently presenting a wall-shell workspace as the generated 3D result. In
frontend/src/App.tsx, a failedrunMarchingCubesor rejected WASM geometry setswasmStatetofallback, butcanOpenLinkedWorkspacedepends only on canonical validation. Steps 4/5 therefore still renderthreeDPanelas “同源可编辑预览”, with a per-wall shell and no user-facing unavailable-3D state. This violates the Issue/Plan requirement for an honest, actionable unavailable-3D/fail-closed condition and risks representing a non-WASM, non-opening geometry result as completed 3D. Block Step 4 completion/Step 5 for this state (while retaining a return-to-2D path), and add production browser coverage using the existing?wasm=load-failurepath to prove neither an editable 3D result nor the linked workspace is available. - Restore production evidence that a linked 2D wall-geometry edit updates the real 3D/WASM model and persists through restart/reload.
frontend/e2e/production.spec.tscurrently proves 2D↔3D selection and an opening-width edit, but it never moves a 2D endpoint in the linked workspace, asserts the resulting Rust/WASM geometry changes and stays finite, performs shared Undo/Redo for that endpoint edit, or compares the edited canonical wall coordinates plus opening local coordinates/3D fingerprint after save → exact-PID restart → reload. Add those assertions via test-only instrumentation or production resource evidence—not ordinary-user diagnostics. Also cover the Plan’s remaining browser acceptance failure states (at minimum parse error→retry and persistence-unavailable) and narrow-screen keyboard/focus route so the stated production acceptance matrix is executable rather than CSS/code-only.
No other Required Fixes were found after completing the full matrix at this exact head.
Independent checks
test -x /home/agent/.cargo/bin/cargo— PASS/home/agent/.cargo/bin/cargo test --manifest-path wasm/Cargo.toml— PASS (12)npm --prefix frontend test— PASS (73)npm --prefix frontend run lint— PASSnpm --prefix frontend run build(absolute Cargo PATH + WASM build) — PASScd backend && go test ./...— PASSHOMEVOX_E2E_ARTIFACT_DIR=/tmp/homevox-review-695e042-artifacts npm --prefix frontend run test:e2e— PASS (2); production assets; PostgreSQL/MinIO lifecycle; listener0.0.0.0:18088; exact head695e042b45e790a3a5286f697ceee797f14c8fd4; four distinct 1440×960 artifacts retainedgit diff --check origin/main...695e042b45e790a3a5286f697ceee797f14c8fd4— PASS- changed-file credential/artifact scan — PASS
Decision: RETRY — the two Required Fixes above are all findings for this complete exact-head review.
wtj-0527
left a comment
There was a problem hiding this comment.
HomeVox 验收综合裁决 — RETRY
- Issue / PR: #19 / #21( → )
- 裁决 exact head:
- 身份一致性: 已核对当前 PR 为 OPEN、非 Draft、;QA 与代码审查均明确审查同一 Issue、PR 与 exact head。无身份不确定或外部阻塞。
双方证据综合
QA:不通过。 独立 production Docker/Playwright 复跑通过真实上传、parse、canonical admission、2D/3D 联动、WASM geometry、Undo/Redo、保存→exact-PID restart→reload、异常与窄屏键盘路径;质量门禁均通过,并保留 four-state exact-head 截图。唯一 QA 阻断是独立 3D 确认页的用户可见预览为空,既无可辨识的真实 3D,也无 loading/error/empty 的 fail-closed 状态。
代码审查:RETRY。 除已验证的 WASM fail-closed、canonical invalid/duplicate gate、stable ID、持久化链路与诊断隔离外,发现真实上传后的预览缺失、公开 production URL 的 E2E fixture/diagnostic bypass,以及 frozen selected-object violet 语义被无依据改为 amber。
这些 findings 分别落在冻结的 Import/AI、3D confirmation、canonical provenance / diagnostics boundary 与 selected-object parity 合同;没有重复项,也不是新增需求。
Required Fixes(全部)
-
确认页必须呈现可审阅的真实 3D,或明确 fail closed。
- 依据: AC-03、AC-05 与冻结 3D confirmation 画板。
- 影响: 当前“完成并打开 3D”前用户无法确认任何可见 3D 结果。
- 验收: 确认页使用同一 canonical 数据渲染可辨识的真实 R3F + Rust/WASM 几何;不可用时显示明确、可操作的 unavailable 状态与返回 2D 路径。production E2E 应证明 canvas/geometry 的可见结果或可靠的语义/像素证据,不能只断言按钮。
-
真实文件选择后保留原图预览与安全的文件事实,并让截图覆盖该状态。
- 依据: AC-01、AC-03、。
- 影响: 当前 state batch 直接跳到 Step 2,用户看不到刚选的图纸,无法核对事实源;现有 import 截图在选择文件之前截取,不能作为证据。
- 验收: Step 2(含 loading/error/retry)持续显示所选原图、文件名与安全文件事实,并提供重新选择操作;E2E 在 后先断言并截取该状态,再触发 parse。
-
移除普通 production URL 可触发的 E2E fixture、WASM failure switch 与诊断注入。
- 依据: AC-01、AC-02、AC-07、AC-09;TC-03、TC-05、TC-07。
- 影响: 能绕过真实上传、parse 与服务端 canonical admission,且可把 synthetic document 保存为真实项目;同时暴露 geometry/metrics 等工程数据,破坏 canonical provenance 和诊断边界。
- 验收: 正常 production build 不包含或不可达这些分支;fixture、failure control 与 evidence instrumentation 限制在 test-only harness/build/runtime。E2E 以 Playwright route 或测试专用 server 控制 API 响应,普通用户 URL 无法进入 synthetic success 或读取工程对象。
-
恢复同一 canonical selected object 的 violet 视觉语义。
- 依据: AC-03、、。
- 影响: 2D/3D selected wall 现为 amber,且 parity matrix 未给出能力或可访问性所必需的偏差依据;不符合冻结的跨视图 selected-object 对应。
- 验收: 2D selected wall/endpoint 与对应 3D selectable overlay 统一使用冻结 violet token;门窗类别色可保留,但不得替代 selected state。更新 parity matrix 与 exact-head screenshots 证明结果。
重新验收要求
在同一 PR 新 exact head 上:完整 production E2E、four-state screenshots/artifact manifest、QA 回读与 exact-head code review 均需重新执行并一致。当前不得进入 Delivery / merge。
路由结论:RETRY。
wtj-0527
left a comment
There was a problem hiding this comment.
HomeVox 验收综合裁决 — RETRY
- Issue / PR: #19 / #21(
feat/issue-19-penpot-product-parity→main) - 裁决 exact head:
50f7651d7bb642f52e07a83f2faff43b9ca49b6b - 身份一致性: 当前 PR 为 OPEN、非 Draft、
mergeStateStatus=CLEAN;QA 与代码审查均针对同一 Issue、PR 与 exact head。无身份不确定或外部阻塞。
双方证据综合
QA:不通过。 独立 production Docker/Playwright 复跑通过真实上传、parse、canonical admission、2D/3D 联动、WASM geometry、Undo/Redo、保存→exact-PID restart→reload、异常与窄屏键盘路径;质量门禁均通过,并保留 four-state exact-head 截图。唯一 QA 阻断是独立 3D 确认页的用户可见预览为空,既无可辨识的真实 3D,也无 loading/error/empty 的 fail-closed 状态。
代码审查:RETRY。 除已验证的 WASM fail-closed、canonical invalid/duplicate gate、stable ID、持久化链路与诊断隔离外,发现真实上传后的预览缺失、公开 production URL 的 E2E fixture/diagnostic bypass,以及 frozen selected-object violet 语义被无依据改为 amber。
这些 findings 分别落在冻结的 Import/AI、3D confirmation、canonical provenance / diagnostics boundary 与 selected-object parity 合同;没有重复项,也不是新增需求。
Required Fixes(全部)
-
确认页必须呈现可审阅的真实 3D,或明确 fail closed。
- 依据: AC-03、AC-05 与冻结 3D confirmation 画板。
- 影响: 当前“完成并打开 3D”前用户无法确认任何可见 3D 结果。
- 验收: 确认页使用同一 canonical 数据渲染可辨识的真实 R3F + Rust/WASM 几何;不可用时显示明确、可操作的 unavailable 状态与返回 2D 路径。production E2E 应证明 canvas/geometry 的可见结果或可靠的语义/像素证据,不能只断言按钮。
-
真实文件选择后保留原图预览与安全的文件事实,并让截图覆盖该状态。
- 依据: AC-01、AC-03、
PROTO-IMPORT-AI。 - 影响: 当前 state batch 直接跳到 Step 2,用户看不到刚选的图纸,无法核对事实源;现有 import 截图在选择文件之前截取,不能作为证据。
- 验收: Step 2(含 loading/error/retry)持续显示所选原图、文件名与安全文件事实,并提供重新选择操作;E2E 在
setInputFiles()后先断言并截取该状态,再触发 parse。
- 依据: AC-01、AC-03、
-
移除普通 production URL 可触发的 E2E fixture、WASM failure switch 与诊断注入。
- 依据: AC-01、AC-02、AC-07、AC-09;TC-03、TC-05、TC-07。
- 影响:
?e2e=...能绕过真实上传、parse 与服务端 canonical admission,且可把 synthetic document 保存为真实项目;同时暴露 geometry/metrics 等工程数据,破坏 canonical provenance 和诊断边界。 - 验收: 正常 production build 不包含或不可达这些分支;fixture、failure control 与 evidence instrumentation 限制在 test-only harness/build/runtime。E2E 以 Playwright route 或测试专用 server 控制 API 响应,普通用户 URL 无法进入 synthetic success 或读取工程对象。
-
恢复同一 canonical selected object 的 violet 视觉语义。
- 依据: AC-03、
PROTO-2D、PROTO-LINKED。 - 影响: 2D/3D selected wall 现为 amber,且 parity matrix 未给出能力或可访问性所必需的偏差依据;不符合冻结的跨视图 selected-object 对应。
- 验收: 2D selected wall/endpoint 与对应 3D selectable overlay 统一使用冻结 violet token;门窗类别色可保留,但不得替代 selected state。更新 parity matrix 与 exact-head screenshots 证明结果。
- 依据: AC-03、
重新验收要求
在同一 PR 新 exact head 上:完整 production E2E、four-state screenshots/artifact manifest、QA 回读与 exact-head code review 均需重新执行并一致。当前不得进入 Delivery / merge。
路由结论:RETRY。
wtj-0527
left a comment
There was a problem hiding this comment.
HomeVox 验收裁决:RETRY
- Issue:#19
feat: implement approved Penpot product shell and interaction parity - PR:#21
feat: align HomeVox product flow with Penpot parity - base:
main@baddb58606b825cf50a729f17ee9259d0473c6e7 - exact head:
76f627273c2148464457d190e6ed71ab5e214d72
已核对本地 HEAD、远端功能分支与 PR head 均为上述 SHA;PR 为 OPEN / MERGEABLE / CLEAN,且 PR body 含 Closes #19。两份独立报告引用同一冻结 handoff、Issue、PR 和 exact head,无身份或验收对象冲突。
双方共同支持的已通过证据
- 独立生产链路已覆盖真实上传、parse、2D/3D 联动、保存、exact-PID restart/reload,以及 invalid/duplicate ID、WASM failure、retry/persistence unavailable、窄屏键盘路径;资源已清理。
- 前端 unit tests 73 passed、lint、Go tests、Rust/WASM tests、production browser E2E、
git diff --check均有通过证据;普通 production bundle 未见 test-only 诊断泄漏。 - 2D/3D stable
wallId、共享 Undo/Redo、真实 R3F + Rust/WASM 数据链与普通用户诊断隔离已有实现和证据。
Required Fixes(一次性汇总)
RF-QA-01 — Step 4 不得将空白画布当作成功 3D
- 依据:AC-05、AC-03、TC-04;QA 在该 exact head 的 production 截图中复核 Step 4 为无可辨识的墙体、网格、opening 或其他 Three.js 几何,但页面仍展示“已生成”及“完成并打开 3D”。
- 影响:用户可见结果与内部成功状态不一致;不能用 WASM 已计算有限数据替代真实可见的 R3F 几何,因此阻断 AC-05 与 3D 代表画板 parity。
- 修复及验收:修复默认 camera/model framing、材质对比与可见对象的渲染;若不能可靠显示,则进入
threeDUnavailablePanel并禁用进入 Step 5,同时保留返回 2D 路径。新增生产浏览器的可见渲染断言,不能只断言 canvas、DOM 或window.__homevoxE2E。
RF-01 — 退化 wall 必须在进入 3D/联动前 fail-closed
- 依据:AC-04、AC-05、AC-06、AC-07、TC-04;代码审查确认无 opening 的 wall 可被端点拖动为零长度,现有
validateOpenings()未拒绝;shell/voxel 路径静默跳过该 wall,仍放行 Step 4/5,而后端保存才拒绝该 canonical document。 - 影响:2D canonical 文档和 3D 实际几何不再同源,且无效几何被“局部 3D 成功态”掩盖,违反 fail-closed 与保存/reload 一致性契约。
- 修复及验收:建立唯一 document-level canonical validator,至少校验 stable ID、有限坐标和 wall 长度严格大于 0;端点拖动预览/提交、Step 4/5 admission、
buildWallShellModel()与buildWallVoxelModel()必须共用。添加单元测试与 production E2E:将无 opening wall 拖为零长度后,确认 Step 4 不渲染成功 3D、Step 5 不可进入、保存不得显示成功,并提供返回 2D 校正路径。
两项均是冻结 AC/TC 内的实现缺陷,不引入新产品需求。当前存在可由本 PR 开发者修复的阻断问题,故不得进入 Delivery。修复须继续在同一分支/PR,产生新的 exact head 后重新完成完整 QA 与 exact-head Review。
wtj-0527
left a comment
There was a problem hiding this comment.
HomeVox 验收综合裁决:RETRY
- PR / Issue / exact head:PR #21(Issue #19,
homevox.handoff.v1),b43889809a8326c83e9c5a0da2b2f7c3186f7360。 - 一致性核验:本地
HEAD、origin/feat/issue-19-penpot-product-parity与 GitHub PR head 均为上述 SHA;PR 仍为 OPEN / CLEAN。未发现既有同 marker 的审计 review。 - 产品 QA 结论:QA 通过。独立 production E2E 覆盖真实上传、parse、canonical 2D、真实 R3F + Rust/WASM 3D、稳定
wallId联动、undo/redo、保存后不同 PID 重启重载、fail-closed 和普通用户诊断隔离;回归结果为前端 74 tests、lint/build、Go、Rust/WASM tests 均通过。QA 没有报告 Required Fix。 - 代码审查结论:RETRY。审查确认了上述产品链和 fail-closed 基础,但发现两项会使冻结 AC-03/05/06、TC-04 在实际完成态失真的 Required Fix。QA 的 canvas 亮像素、fingerprint 与 DOM 状态证据不能反证该渲染遮挡,也未覆盖步骤完成态语义,因此两份报告不构成身份或对象冲突,而是证据覆盖深度不同。
Required Fix 1:WASM 完成态不能由选中墙的无开洞 shell 覆盖真实门窗洞口
- 依据:
frontend/src/App.tsx:217-235在 WASM active 时仍为所有墙渲染完整boxGeometry;被选中墙的 material 是不透明(transparent=false、opacity=1)。该 shell 没有 opening,而 WASM mesh 位于同一空间,因此会写入 depth/color 并遮住真实 WASM 开洞。上游 production 测试进入 3D 前选择的正是包含 door 的wall-1,现有亮像素断言无法区分门洞 WASM mesh 和遮挡 shell。 - 影响:选择含门窗的墙后,用户可能看到实体完整墙,而非与 canonical opening 同源的真实开洞;这违反冻结的真实 WASM 3D、opening 同源与选中联动边界。
- 验收:WASM active 时以不遮挡 opening 的真实几何高亮、outline,或不写 depth/color 的专用 hit target 实现 stable
wallIdpicking;新增 production 浏览器可视断言,选择含 door/window 的墙后实际 Canvas 中该洞口仍可见。不能仅断言 JS geometry、DOM selected 状态或总亮像素。
Required Fix 2:六步流程补齐可辨别、可访问且可测试的“已完成”状态
- 依据:
frontend/src/productFlow.ts:1-20和当前侧栏只建模data-active、data-locked及 document gating;frontend/src/App.tsx的步骤按钮未输出data-completed/完成语义,frontend/src/App.css:19-49也只定义 active/locked。解析后 Step 1、2 与“已具备 document 因而可进入”的后续步骤不可区分。 - 影响:用户无法满足冻结 AC-03 要求地同时辨别当前、已完成与不可进入步骤;仅由数据存在推导可进入不等于完成 transition。
- 验收:按真实完成 transition 维护最小 completed state;新导入重置,项目重载按已加载 canonical 状态明确初始化;侧栏提供可见完成样式及可读 accessibility 语义(如
data-completed、完成图标/aria 文案);补 unit/component 与 production browser 覆盖正常主链、失败/retry、reload 后的 current/completed/locked 三态。
这两项均可由当前开发分支修复,且直接源自冻结需求和已验收技术边界;不是外部阻塞,也没有新增范围。修复后须在新的 exact head 上重新运行前端 unit/lint/build、production Playwright(含 Fix 1 像素级开洞可见断言)、四个代表截图/parity matrix,并再次独立 exact-head 审查。
wtj-0527
left a comment
There was a problem hiding this comment.
HomeVox 验收综合裁决:RETRY
- Issue / PR / exact head:Issue #19、PR #21,
a91f597b9eaafb0de366c05517cad02eee249378(feat/issue-19-penpot-product-parity→main)。 - 对象一致性:已回读当前 GitHub PR;PR 为
OPEN、mergeStateStatus=CLEAN,其 head 与两份报告声明的 exact head 一致。本地分支也跟踪同一远端分支。不存在身份不确定、审查对象冲突或外部环境阻塞。
证据综合
产品 / 真实链路 QA:HOLD。 其 production Docker/Playwright 证据支持真实上传、parse、2D 编辑、R3F + Rust/WASM 3D、2D/3D 选择、Undo/Redo、保存→精确 PID 重启→reload,以及 invalid/duplicate canonical、WASM failure、retry、persistence failure、窄屏键盘路径;前端 unit 76、lint、Go、Rust/WASM、production E2E、git diff --check 均通过。
但 QA 直接复核代表截图,确认 issue-19-linked-workspace.png 实际来自第 6 步“保存项目”页,不能证明联动工作台;导入/AI 截图使用 2×3 px 白色 fixture,原图预览不可辨认。因此 AC-01、AC-03、AC-10、AC-12 的代表性视觉证据不能成立。
exact-head 代码审查:RETRY。 审查认可 canonical fail-closed、WASM opening 保留、持久化主链与诊断隔离,但发现导航 completion 只作视觉状态且未作为进入 gate,允许在满足 document/WASM 条件时绕过确认步骤;另有旧 Three renderer 可能在有效 3D 后返回 2D、再编辑为 invalid canonical 时仍被 2D Inspector 用于导出,绕过当前几何的 fail-closed。审查还确认 App Shell、流程、编辑器、3D lifecycle 和保存 UI 仍聚集在单一约 1,260 行 App.tsx,未满足冻结交接包要求的可测试边界拆分。
两方的结论没有冲突:QA 提供运行时与视觉证据缺口,代码审查补充流程/输出边界与可维护性缺口;均属于当前开发分支可修复的冻结需求,不是新增范围。
Required Fixes(一次性汇总)
-
修正四状态代表性截图与 parity matrix 证据。
- 依据 / 影响:AC-03、AC-10、AC-12;当前名为联动工作台的截图在点击“继续”后才截取,实际为保存页,无法证明同屏 2D/3D、对象选择与 Inspector。
- 验收:在 Step 5 完成跨视图选择、几何编辑与 Undo/Redo 后、进入 Step 6 前截取固定 1440×960
issue-19-linked-workspace.png;确认它可见等权 2D/3D、同一对象的选择态和 Inspector。同步更新 matrix 的证据说明,并重新生成、保留并复核四张 exact-head 截图。
-
以可辨认、非用户真实数据的受控户型图 fixture 证明原图预览。
- 依据 / 影响:AC-01、AC-03、AC-10;现有 2×3 px、80-byte 白 PNG 仅显示元数据,无法让用户核对“识别前请核对这张原图”,也不能作为真实预览证据。
- 验收:替换为含墙线、门窗等可辨识元素的受控 fixture,保留真实文件选择/API 链路;E2E 在 parse 前断言预览可见并截图,确认截图中原图可辨认且不含用户数据。
-
将六步可进入性收敛为以真实完成 transition 驱动的单一 guard。
- 依据 / 影响:AC-02 与冻结主链;当前
canOpenStep()/unlocked主要依据 document、canonical/WASM,而completedSteps未参与 gate,用户可进入步骤 2 空页面,或绕过 2D、3D confirmation、联动直接保存,造成“可进入”与“已完成”语义矛盾。 - 验收:新项目至少要求:Step 2 已选源文件;Step 4 有 Step 3 的明确确认;Step 5 有 Step 4 完成且实时 WASM/WebGL 几何可用;Step 6 有 Step 5 完成。已保存项目按冻结恢复定义初始化,不得用跳转补写 completion。为越级点击、正常 transition 和 reload 恢复补 unit/component 与 production E2E 覆盖。
- 依据 / 影响:AC-02 与冻结主链;当前
-
3D PNG export 必须绑定当前有效的 WASM geometry 与当前挂载 renderer。
- 依据 / 影响:AC-05、TC-04;
canExport3D仅依赖缓存 renderer/WebGL,Canvas 卸载未清理 renderer。有效 3D 后回到 2D、编辑成退化/invalid canonical 时,Step 4/5 虽阻断,Inspector 仍可能导出旧场景。 - 验收:export gate 至少依赖
wasmState === 'active'、当前wasmGeometry、当前 canonical generation 与挂载 Canvas;卸载时清理 renderer。production E2E 覆盖“有效 3D → 2D 编辑为 invalid → export disabled、无下载”,证明无法导出旧 fingerprint。
- 依据 / 影响:AC-05、TC-04;
-
按冻结交接包拆出可测试的产品边界,避免关键门禁继续集中于
App.tsx。- 依据 / 影响:Issue #19 明确要求 App Shell、步骤页面、2D editor、Inspector、3D confirmation、synchronized workspace 与 diagnostics 拆分为可测试边界;当前流程 gate、WASM lifecycle、持久化、编辑器、各页面和 E2E telemetry 均仍在
App.tsx,直接增加步骤/3D 状态组合遗漏风险。 - 验收:在保持 canonical 数据流和行为不变前提下,至少提取
ProductShell/navigation guard、导入+识别、TwoDWorkspace、ThreeDConfirmation、LinkedWorkspace、保存面板及 3D renderer lifecycle hook;将 guard/completion transition 置于纯函数或状态机,并为其补直接单测。
- 依据 / 影响:Issue #19 明确要求 App Shell、步骤页面、2D editor、Inspector、3D confirmation、synchronized workspace 与 diagnostics 拆分为可测试边界;当前流程 gate、WASM lifecycle、持久化、编辑器、各页面和 E2E telemetry 均仍在
重新验收
修复仅在当前 PR 分支提交新 exact head。随后需重新运行前端 unit/lint/build、Go、Rust/WASM、production Playwright,生成并回读四张代表截图;QA 与 exact-head 代码审查均须对新 SHA 重新裁决。当前不得进入 Delivery 或 merge。
路由结论:RETRY。
2c0f67d to
6099001
Compare
Co-Authored-By: Claude <noreply@anthropic.com>
|
现场真实户型验收发现阻断项:2D 墙线与 3D 墙面未逐墙对应;同时产品口径已更新为有效编辑提交后自动实时保存。当前 exact HEAD 的 ACCEPT 已撤销,PR 回到 REWORK_REQUIRED,禁止 merge/Release。详细证据、根因假设和验收合同见 Issue #19 最新现场验收记录。 |
Scope carve-out and merge authorization王总已确认:现场初验发现的两项后续工作不再阻断 PR #21 当前冻结范围,已独立记录于 #22:
PR #21 保持 exact HEAD 王总已在 Room 明确授权合并 PR #21。本次仅 merge,不 Release、不构建、不安装、不部署。 |
Summary
Verification
Closes #19