Files
FreeCADWasmDev/docs/current/web-commanddoc-00ef5bef1e68ef4dd83c012d-checkpoint.md

7.0 KiB

CommandDoc continuation checkpoint

Batch 00ef5bef1e68ef4dd83c012d, 2026-09-16. Selected: Recompute, Std_Alignment, Std_Cut, Std_Edit. Batch remains incomplete. This turn changed executable business cases only; the existing application, native implementation and published WASM were reused.

Recompute: first attributable pass

The previous failure occurred before Recompute was invoked. A direct edit of Part::Box.Length immediately updated the source shape, while its dependent remained stale. The case had assumed both shapes would remain pending.

Changed the fixture in tools/web-business-cases.mjs to add a native App::FeaturePython object named Dimensions with an App::PropertyLength Length. Source.Length is driven by Dimensions.Length; Dependent.Length remains driven by Source.Length * 2. Editing Dimensions.Length now leaves both expression-driven shapes pending. No callback, replacement geometry or frontend recompute was introduced. The original pending-source-geometry check is retained and strengthened with pending dependent geometry, source dimension and native dependency assertions. After the mounted Recompute button, both native volumes, evaluated source dimension, object identities, selection and separate-document geometry are checked for lengths 5 and 7. Missing-document rejection and mounted viewport rendering remain covered.

Desktop source CommandDoc.cpp:1665 calls recompute(None,True,True); existing WebViewCommands.h:375 uses the same native forced recompute path. No application patch or WASM rebuild was needed for this case correction.

Command: python3 tools/run_business_acceptance.py --module Web --ids Web:desktop:Recompute --reuse

Result: passed, 15 cases / 15 assertions, 7.317 seconds, executedCount 1, reused false. Evidence: business-evidence/f789cb10d0133307f022823d-20260916T114720186275.json.

Subsequent Cut/Edit case additions changed the shared case file. A final combined --reuse command was refused with exit 78, previous_validation_deferred, deferredIds [Web:desktop:Recompute], executedCount 0: "User paused repeat validation; select only newly completed gaps. Historical proof is not promoted to current acceptance." Do not bypass that policy, edit acceptance state, or represent the historical pass as fresh proof for the final case-file fingerprint. Preserve the successful execution and let the normal scheduler/runner handle its eligibility.

Cut: narrowed failure to undo restoration

Added a semantic assertion before the Cut operation: copy the same selected Dependent object, then inspect the original object's OutList, expression, volume and undo count. This passes. Original OutList contains Source (twice), expression is Source.Length * 2, volume is 48 and undo count remains zero. Thus temporary clipboard snapshot creation/closure does not erase the link.

Cut removes only Dependent and preserves Source. Undo restores Dependent's volume 48 and expression text, but OutList is empty; state is Touched, undo count 0 and redo count 1. The original strict dependency assertion is retained. Do not fix this by synthesizing returned dependencies or weakening that check.

Command: python3 tools/run_business_acceptance.py --module Web --ids Web:desktop:Std_Cut --reuse

Result: acceptance_incomplete, 6.836 seconds. Evidence: business-evidence/8cdd05fbdb4a27da732f36e5-20260916T114827012153.json.

Next patch investigation: native transaction deletion/undo restoration and PropertyExpressionEngine dependency registration. Current packet provides the wrapper at WebViewCommands.h:1071 (doc.undo()), not the needed App implementation anchors. Earlier evidence already showed recompute and resetting expression text did not repair the link. Source is supplied locally; obtain the appropriate bounded App source anchors in the next packet, rather than repeating the unchanged failure or treating the source as absent.

Edit: executable case reveals missing GUI owner

Added a focused Std_Edit browser/native case using the existing mounted Edit Selection button and a real native Part::Box. It requires the response to identify the native editing object, checks FreeCADGui.getDocument().getInEdit(), unchanged native geometry in two documents, finish/toggle lifecycle, and invalid selection rejection. Only the first assertion executed this turn: it failed with native_command_failed: No module named 'FreeCADGui'.

The remaining assertions are executable but unexecuted and are not evidence of working editing. No coverage tag or successful status was added to mask it.

Command: python3 tools/run_business_acceptance.py --module Web --ids Web:desktop:Std_Edit --reuse

Result: acceptance_incomplete, 3.973 seconds. Evidence: business-evidence/6097a992e376ebeaa624bd90-20260916T114955341216.json.

Relevant anchors: desktop CommandDoc.cpp:1915 toggles the active native ViewProvider. WebViewCommands.h:1177 imports FreeCADGui and calls setEdit/resetEdit. web-desktop-adapter.ts:762 sends Edit through the PartBox document-view endpoint; web-commanddoc-task.tsx:135 mounts begin/finish controls. The next implementation must connect real provider editing to the owning native document and mounted task. A synthetic editing flag or generic property panel is insufficient. Inspect supplied GUI/ViewProvider ownership and existing compiled capabilities before selecting an incremental target. Do not move the document to an unrelated runtime merely to make FreeCADGui importable.

Alignment and retained boundaries

Std_Alignment remains unresolved and was not rerun. The existing adapter checks two distinct selections and no active task; native execution is rejected at WebViewCommands.h around 2044. Desktop CommandDoc.cpp:1841 uses ManualAlignment, fixes the first GeoFeature, moves the second, and requires point correspondences. The next packet needs the supplied ManualAlignment solver/task source anchors, actual correspondence selection, apply/cancel, placement transaction and native geometry assertions. Generic review controls are not that workflow.

Retain the previous checkpoint's Export boundary: STEP preserves source BREP and native geometry; IGES round trip has expected volume/bounds but zero solids where the existing case expects two. No export assertions were changed here. Duplicate Selection's prior 19-assertion pass was not rerun.

All original and supplemental requirements remain in scope, including semantic IFC. IFC_SEMANTIC_EXPORT_CONTRACT.md, independent verifier, proof areas, acceptance contracts, runner, wrapper, and passing statuses were not edited. No proxy IFC claim, full-parity/API gate, deployment, push or external message occurred.

Command diagnostics and final state

Initial unscoped git status --short was rejected with exit 64 by scheduler scope guards; later scoped status succeeded. Relevant existing source/case files are untracked, so ordinary git diff does not establish their edit history. The final combined acceptance request was deferred as recorded above; no retry override was used. All started command sessions completed. No build, asset sync or persistent dev server was needed because application sources were unchanged.