Skip to content

feat: align HomeVox product flow with Penpot parity - #21

Merged
wtj-0527 merged 39 commits into
mainfrom
feat/issue-19-penpot-product-parity
Aug 11, 2026
Merged

wtj-0527 merged 39 commits into
mainfrom
feat/issue-19-penpot-product-parity

Conversation

@wtj-0527

Copy link
Copy Markdown
Owner

Summary

  • rebuild the HomeVox shell around the six-step frozen Penpot workflow
  • retain real browser parse, canonical 2D/3D editing, shared selection, manual persistence, and explicit unknown disclosures
  • add exact-head production screenshots and a design parity matrix

Verification

  • npm --prefix frontend test
  • npm --prefix frontend run lint
  • npm --prefix frontend run build
  • npm --prefix frontend run test:e2e
  • go test ./...
  • cargo test
  • same-network PostgreSQL + MinIO lifecycle/restart/fail-closed harness

Closes #19

@wtj-0527 wtj-0527 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent exact-head review — RETRY

  • Repository / PR: wtj-0527/HomeVox PR #21
  • Reviewed exact head: c8329287b1390e82e28a972c63ad20edaa68e4f9 (feat/issue-19-penpot-product-parity → main)
  • Review policy: evidence-only COMMENT; workflow routing remains homevox.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

  1. Restore a production Playwright test for the real persisted user chain. frontend/e2e/production.spec.ts removed 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.
  2. Make the four 1440×960 exact-head screenshots reviewable run artifacts and tie the parity matrix to them. The test calls page.screenshot, but scripts/run-production-browser-e2e.sh deletes the browser container during cleanup and copies no Playwright output directory to $OUT; even HOMEVOX_KEEP_E2E_ARTIFACTS=1 retains only local test binaries, not issue-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 so docs/issue-19-design-parity.md does 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 — PASS
  • npm --prefix frontend run build (including WASM build) — PASS
  • cd backend && go test ./... — PASS
  • npm --prefix frontend run test:e2e — PASS (3) with PostgreSQL/MinIO, production assets, and listener 0.0.0.0:18088; reviewed exact head printed by runner: c8329287b1390e82e28a972c63ad20edaa68e4f9
  • git 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 wtj-0527 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent exact-head review — RETRY

  • Repository / PR: wtj-0527/HomeVox PR #21
  • Reviewed exact head: 7723a7b22cbb05efb059b78baa7f3a197d689380 (feat/issue-19-penpot-product-parity → main)
  • Review policy: evidence-only COMMENT; workflow routing remains homevox.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

  1. Make invalid canonical geometry genuinely fail closed. In frontend/src/App.tsx, geometryValidationError only adds an alert inside threeDPanel; Step 4’s 完成并打开 3D button remains enabled and enters the linked 2D/3D workspace, where the fallback per-wall shell still renders. Thus ?e2e=invalid-opening and ?e2e=duplicate-wall-id can 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.
  2. Complete the required production browser proof of linked 2D/3D behavior. frontend/e2e/production.spec.ts currently selects wall-1 only before confirmation, then selects a 3D opening marker; it never selects a R3F wall, asserts the same wallId in 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 actual three-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 — PASS
  • npm --prefix frontend run build (absolute Cargo PATH plus WASM build) — PASS
  • cd backend && go test ./... — PASS
  • HOMEVOX_E2E_ARTIFACT_DIR=/tmp/homevox-review-7723a7b-artifacts npm --prefix frontend run test:e2e — PASS (2), PostgreSQL/MinIO lifecycle, production assets, listener 0.0.0.0:18088, exact head 7723a7b22cbb05efb059b78baa7f3a197d689380; four 1440×960 distinct PNG artifacts verified
  • git 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 wtj-0527 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent exact-head review — RETRY

  • Repository / PR: wtj-0527/HomeVox PR #21
  • Reviewed exact head: 695e042b45e790a3a5286f697ceee797f14c8fd4 (feat/issue-19-penpot-product-parity → main)
  • Review policy: evidence-only COMMENT; workflow routing remains homevox.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

  1. 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 failed runMarchingCubes or rejected WASM geometry sets wasmState to fallback, but canOpenLinkedWorkspace depends only on canonical validation. Steps 4/5 therefore still render threeDPanel as “同源可编辑预览”, 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-failure path to prove neither an editable 3D result nor the linked workspace is available.
  2. 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.ts currently 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 — PASS
  • npm --prefix frontend run build (absolute Cargo PATH + WASM build) — PASS
  • cd backend && go test ./... — PASS
  • HOMEVOX_E2E_ARTIFACT_DIR=/tmp/homevox-review-695e042-artifacts npm --prefix frontend run test:e2e — PASS (2); production assets; PostgreSQL/MinIO lifecycle; listener 0.0.0.0:18088; exact head 695e042b45e790a3a5286f697ceee797f14c8fd4; four distinct 1440×960 artifacts retained
  • git 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 wtj-0527 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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(全部)

  1. 确认页必须呈现可审阅的真实 3D,或明确 fail closed。

    • 依据: AC-03、AC-05 与冻结 3D confirmation 画板。
    • 影响: 当前“完成并打开 3D”前用户无法确认任何可见 3D 结果。
    • 验收: 确认页使用同一 canonical 数据渲染可辨识的真实 R3F + Rust/WASM 几何;不可用时显示明确、可操作的 unavailable 状态与返回 2D 路径。production E2E 应证明 canvas/geometry 的可见结果或可靠的语义/像素证据,不能只断言按钮。
  2. 真实文件选择后保留原图预览与安全的文件事实,并让截图覆盖该状态。

    • 依据: AC-01、AC-03、。
    • 影响: 当前 state batch 直接跳到 Step 2,用户看不到刚选的图纸,无法核对事实源;现有 import 截图在选择文件之前截取,不能作为证据。
    • 验收: Step 2(含 loading/error/retry)持续显示所选原图、文件名与安全文件事实,并提供重新选择操作;E2E 在 后先断言并截取该状态,再触发 parse。
  3. 移除普通 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 或读取工程对象。
  4. 恢复同一 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 wtj-0527 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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(全部)

  1. 确认页必须呈现可审阅的真实 3D,或明确 fail closed。

    • 依据: AC-03、AC-05 与冻结 3D confirmation 画板。
    • 影响: 当前“完成并打开 3D”前用户无法确认任何可见 3D 结果。
    • 验收: 确认页使用同一 canonical 数据渲染可辨识的真实 R3F + Rust/WASM 几何;不可用时显示明确、可操作的 unavailable 状态与返回 2D 路径。production E2E 应证明 canvas/geometry 的可见结果或可靠的语义/像素证据,不能只断言按钮。
  2. 真实文件选择后保留原图预览与安全的文件事实,并让截图覆盖该状态。

    • 依据: AC-01、AC-03、PROTO-IMPORT-AI。
    • 影响: 当前 state batch 直接跳到 Step 2,用户看不到刚选的图纸,无法核对事实源;现有 import 截图在选择文件之前截取,不能作为证据。
    • 验收: Step 2(含 loading/error/retry)持续显示所选原图、文件名与安全文件事实,并提供重新选择操作;E2E 在 setInputFiles() 后先断言并截取该状态,再触发 parse。
  3. 移除普通 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 或读取工程对象。
  4. 恢复同一 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 证明结果。

重新验收要求

在同一 PR 新 exact head 上:完整 production E2E、four-state screenshots/artifact manifest、QA 回读与 exact-head code review 均需重新执行并一致。当前不得进入 Delivery / merge。

路由结论:RETRY。

@wtj-0527 wtj-0527 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 wtj-0527 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 wallId picking;新增 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 wtj-0527 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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(一次性汇总)

  1. 修正四状态代表性截图与 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 截图。
  2. 以可辨认、非用户真实数据的受控户型图 fixture 证明原图预览。

    • 依据 / 影响:AC-01、AC-03、AC-10;现有 2×3 px、80-byte 白 PNG 仅显示元数据,无法让用户核对“识别前请核对这张原图”,也不能作为真实预览证据。
    • 验收:替换为含墙线、门窗等可辨识元素的受控 fixture,保留真实文件选择/API 链路;E2E 在 parse 前断言预览可见并截图,确认截图中原图可辨认且不含用户数据。
  3. 将六步可进入性收敛为以真实完成 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 覆盖。
  4. 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。
  5. 按冻结交接包拆出可测试的产品边界,避免关键门禁继续集中于 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 置于纯函数或状态机,并为其补直接单测。

重新验收

修复仅在当前 PR 分支提交新 exact head。随后需重新运行前端 unit/lint/build、Go、Rust/WASM、production Playwright,生成并回读四张代表截图;QA 与 exact-head 代码审查均须对新 SHA 重新裁决。当前不得进入 Delivery 或 merge。

路由结论:RETRY。

@wtj-0527
wtj-0527 force-pushed the feat/issue-19-penpot-product-parity branch from 2c0f67d to 6099001 Compare August 9, 2026 06:47
@wtj-0527

Copy link
Copy Markdown
Owner Author

现场真实户型验收发现阻断项:2D 墙线与 3D 墙面未逐墙对应;同时产品口径已更新为有效编辑提交后自动实时保存。当前 exact HEAD 的 ACCEPT 已撤销,PR 回到 REWORK_REQUIRED,禁止 merge/Release。详细证据、根因假设和验收合同见 Issue #19 最新现场验收记录。

@wtj-0527

Copy link
Copy Markdown
Owner Author

Scope carve-out and merge authorization

王总已确认:现场初验发现的两项后续工作不再阻断 PR #21 当前冻结范围,已独立记录于 #22:

  1. 2D 墙线与 3D 墙面逐 wallId 对应;
  2. 有效编辑提交后的自动实时保存。

PR #21 保持 exact HEAD 2ac26f88579cbfd6226fd75306b2429128cf79a8 / Tree a49bc7999b8af4f04812301e49daafc05769f5bd,当前全部 5 项 Check Runs 为 SUCCESS,状态 CLEAN / MERGEABLE。技术负责人对 #21 的既有范围恢复 ACCEPT;该 ACCEPT 明确不包含 #22 的两项后续能力。

王总已在 Room 明确授权合并 PR #21。本次仅 merge,不 Release、不构建、不安装、不部署。

@wtj-0527
wtj-0527 merged commit f63f1c3 into main Aug 11, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: implement approved Penpot product shell and interaction parity

1 participant