Files
FreeCADWasmDev/docs/current/cross-workbench-checkpoint-20260918T021045.md

6.1 KiB
Raw Blame History

Cross-workbench continuation checkpoint

Request batch: 87d3691ca57ddbf994740d84. Selected requirement: product:cross-workbench-document-editing. Status: incomplete; no business behavior was completed in this turn.

Change and actual verification

Updated tools/web-cross-workbench-business-cases.mjs failure handling to retain the primary page URL, active document tab, toolbar contents, native error responses and a hashed full-page screenshot. Capture failure is reported separately without masking the original failed assertion. No success status, proof-area requirement, covers tag, verifier or acceptance contract was changed.

Ran once:

python3 tools/run_business_acceptance.py --module Web --ids product:cross-workbench-document-editing

Runner returned acceptance_incomplete, exit 1, passed 0, executedCount 1, totalSeconds 2.551. Evidence: docs/current/business-evidence/49541ff602063d0030bc9fd7-20260918T021045798054.json. The runner recorded batch ID 49541ff602063d0030bc9fd7; preserve that attribution as generated rather than replacing it with the request packet ID.

First actual browser failure remains primary-workbench-selector: expected one combobox named Workbench, found zero. Browser/native evidence directory: docs/current/web-cross-workbench-business/2026-09-18T02-10-43-967Z/. Screenshot was opened and visually inspected: primary page has the Part toolbar, two document tabs, empty tree, properties and task panels, and no workbench selector. Active tab is project-document-1, revision 0, clean. Native request and response arrays are empty. This is a UI integration failure before native initialization, not evidence of a native timeout or missing geometry backend. Preview startup completed at 162 ms; browser startup at 885 ms; cleanup took 100 ms; case elapsed time was 1284 ms. No frontend or WASM changes/builds occurred.

Retained implementation facts and exact next anchors

  • web/src/project-shell.tsx:41 owns App, a shared WebModuleRouter, ProjectSessionStore, active document ID, native document set, selected object map and the existing ImportRenderBridge.
  • web/src/project-shell.tsx:148 projects native snapshot objects into project session state and already preserves semantic fields for Body/Tip, sketch constraints and feature profiles. Read approximately lines 125–185 next to obtain the exact projection/dispatch function signatures.
  • web/src/project-shell.tsx:518 still renders a fixed aria-label="Part workbench toolbar", <strong>Part</strong> and Part tasks. Read approximately lines 505–555 next to obtain a safe selector/mount patch.
  • web/src/partdesign-workspace.tsx imports and mounts the existing PartDesignWorkspace from ./partdesign-workspace-component.js.
  • web/src/partdesign-workspace-component.tsx:11 exports PartDesignWorkspace({ router: sharedRouter }: { router?: WebModuleRouter } = {}). Lines 14 and 104 reuse the supplied router and only dispose an independently created router. Existing component still has internal document state: const current = documents[active] at line 61. Sharing a router alone is not sufficient to share the primary current document.
  • The component's request function at lines 172–174 calls router.request("PartDesign", PARTDESIGN_DOCUMENT_COMMAND, { schema: PARTDESIGN_DOCUMENT_SCHEMA, module: "PartDesign", document, action, includeMesh: true, ...details }, document).
  • Its editSketch at lines 192–195 already uses executePartDesignDesktop with Sketcher_EditSketch and selection { documentId: active, object: selected }. Reuse these actual controls and native owner; do not copy fixture dispatches.
  • web/src/partdesign-document-facade.ts:1 supplies the native action/payload contract including createBody, setSketch, setFeature, snapshot, save, open, undo and redo. No native pointers may cross independent WASM instances.

Next repair: make the existing component's active document, selection and snapshot publication controllable by the primary project session, then mount its relevant Sketcher/PartDesign tasks behind the primary Workbench selector. Keep the same native owner alive when switching Sketcher and PartDesign. Determine the existing Part-to-PartDesign ownership/handoff path before allowing an existing Part document to switch; preserve unrelated documents and native history rather than opening a fixture document. Synchronize returned native snapshots through the primary shell's existing projection and renderer.

The source reader rejected partdesign-workspace-component.tsx as outside the packet dependencies, although the permitted scoped symbol search found the above anchors. Include this exact existing component in the next packet's source dependencies. Later reads of the necessary primary shell anchors were rejected with Supplemental source budget reached (16 windows / 48000 bytes), including the requested 60-line supplemental window. Do not bypass this limit or describe the component/source as absent. Resume from these anchors without rereading delivery plans, runner internals or already retained excerpts.

Remaining acceptance boundaries

All five proof areas remain unproven: active_document_identity, live_sketch_feature_recompute, cross_workbench_history, fcstd_opfs_roundtrip, rejection_isolation. The existing case additionally ends with an intentional incomplete-capability failure after its first constrained Sketch/Pad scenario; replace it only after implementing real remaining semantic cases. Need native independent evidence plus browser actions for dimension edits/recompute, undo/redo, accept/cancel, save actual FCStd to OPFS, reload/reopen/edit, foreign selection/document rejection and unrelated-document preservation. The existing first geometry scenario asserts constrained 12×8 Sketch, Pad length 5 and volume 480, profile link, Body Tip, DOF zero and nonempty mesh; none was reached in this run.

Do not rerun this unchanged missing-selector failure again. Batch the actual integration changes, build the affected frontend once, and then use the same focused acceptance runner. Preserve original/supplemental requirements and IFC semantic export contract; no full-parity/API gate, deployment or push.