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.