7.0 KiB
Part simultaneous expression edit checkpoint — 2026-09-18 04:36 UTC
Batch 4aa3ea5e85f9c4b3e4412ba2, selected records Part:desktop:Part_Primitives
and Part:desktop:Part_ProjectionOnSurface. Both remain incomplete. Preserve all
original/supplemental requirements and historical evidence. This supersedes the
next-action instructions in the expression-units checkpoint only.
Reconciled existing work
The prior checkpoint was older than the source and evidence on disk. Before this
turn, new-object expression preflight already copied the current native document
into a temporary native document, assigned requested numeric properties, validated
bindings/units/evaluated dimensions, then closed the copy before opening the real
transaction. Invalid new creation therefore preserved redo in the implemented
cases. Existing evidence business-evidence/13fb362e5bcf598a7f1f90a6-20260918T042615225114.json
contains 20 successful assertion groups, including four failed-creation cases,
executable redo, corrected creation and requested-property-context creation.
Do not reimplement or repeat these unchanged cases as new delivery.
New defect, implementation and cases
Changed only the existing native owner
freecad-source/src/WebAssembly/FreeCADCoreProbe/DocumentProbe.cpp and semantic
case helper tools/part-primitive-expression-business-cases.mjs.
The new mounted browser case submitted existing Box Width=9 with
Length=Width - 8 mm. The old existing-object preflight evaluated against Width=4
and incorrectly rejected the valid edit. Unchanged runner recorded this failure
in business-evidence/13fb362e5bcf598a7f1f90a6-20260918T043203469102.json
(8.614 seconds). Preserve this failure record.
The existing temporary native document preflight now also validates edits using the copied existing object and simultaneously requested properties. A shared C++ expression binding helper clears all replaced bindings first, then installs the final formulas; both preflight and the actual mutation use it. This prevents transient cycles while reversing dependency direction. Parsing, dependencies, evaluation and geometry remain native FreeCAD/OCCT; no JavaScript evaluation. The actual document transaction opens only after this preflight succeeds.
Three new semantic groups exercise the already mounted primitive controls:
- Width=9, Length=
Width - 8 mmproduces Length=1 and volume=45, with native valid topology and atomic undo/redo. - Simultaneous Length=
Width + 1 mm, Width=Length + 1 mmis rejected with full snapshot preservation, and the original redo branch still executes. - Reverse the dependency from Length=2, Width=
Length + 1 mmto Width=4, Length=Width + 1 mm; native volume changes from 30 to 100, the Width binding is removed, and undo/redo preserves both graphs without a transient cycle.
No adapter, shared dispatcher, mounted component or acceptance machinery was changed. These cases prove the existing workbench task against its real native document owner; they do not prove integrated primary-project UI completion.
Actual verification
- Focused locked build passed:
python3 tools/build_web_module_artifacts.py --target FreeCADWebDocumentProbe --jobs 8 --timeout 240. node web/tools/sync-assets.mjscompleted in 5.523 seconds: copied 3 matching artifacts, skipped 101, reported 14 missing assets outside the copied target.- Build/public JS hashes match:
bf5195b87a5dd1be34ea0c8dc46649b7fb4e3a71bec30e3dcf9d7464b5d14813. - Build/public WASM hashes match:
98934c5b7ec8bc75942383fcf52398004516710457910a5915d2531d27de2018. - JS syntax check and scoped
git diff --checkpassed. Both implementation/case files are untracked in this pre-existing workspace; git diff alone does not establish their substantive correctness. - Runner:
python3 tools/run_business_acceptance.py --module Part --ids Part:desktop:Part_Primitives --reuse. Evidence:business-evidence/13fb362e5bcf598a7f1f90a6-20260918T043557151909.json. 23/23 semantic assertion groups succeeded, including the 3 new groups and affected existing unit/error/source-edit/OPFS FCStd persistence cases. Load 2.900 seconds; expression cases 26.989 seconds; browser cleanup completed. Total runner 30.680 seconds. Exit 1, acceptance_incomplete, passed records 0, executed 1, reused 0. Full command is deliberately still not_implemented. - No unchanged projection suite, whole API/parity gate, additional screenshots or unrelated tests were run. All started build/sync/test sessions have exited; the existing server remains in use, no new server was started.
Next concrete repair and preserved boundaries
- Continue expression atomicity at DocumentProbe.cpp around 1530–1618. The current copied-document preflight runs only when primitiveExpressions is nonempty and evaluates candidate expressions, not every dependent feature's geometry. Add direct native cases for a numeric-only edit of an already-bound object and for source edits making dependent geometry invalid, with an actual redo branch. Confirm the failure before extending preflight. Preserve objects, bindings, history, document isolation and active-document identity; do not claim these untested paths are fixed. Also cover cross-document references and copied-document name/label semantics; temporary-document cloning cost on large user documents remains unmeasured.
- Preserve dimension AND Placement.Base expression support, all primitive types, native bypass/error/isolation checks, live task lifecycle, location-normal parity and integrated current-document primary UI. Placement expressions are still missing; the previous checkpoint cites desktop DlgPrimitives.cpp:2439. Reuse existing dimension controls in part-primitives-task.tsx:175 and expression request validation/snapshots in part-document-facade.ts and DocumentProbe.cpp.
- Projection: task activation/live preview transaction, Accept commit, Reject rollback, viewport subelement selection gates and integrated primary UI remain. Reuse linked-object geometry/dependency/history/persistence cases and retain runLegacyProjectionCases. Projection was not changed or rerun here.
- Retain runCircleThreePointCases, runCylinderSkewCases, runLegacyPrimitiveTaskCases, runAdditionalPrimitiveCases, runWedgePrimitiveCases, runHelixSpiralCases, runPrimitivePlacementCases, runPrimitiveContainerCases, runCircleVertexPickingCases, all earlier deferred assertions and their historical evidence. A subset run does not replace any of them. Other batch SectionCut requirements in the expression-units checkpoint remain preserved, outside these two selected IDs.
No acceptance contract, verifier, proof-area requirement, covers tag, acceptance machinery or passing ledger was edited. IFC semantic export contract remains unchanged; proxy geometry is not sufficient and no IFC completion is claimed. No deployment, pushes, external messages, extra agents or full-parity/API gates. Source reads used the bounded reader; initial scoped-search/status denials were not bypassed. Source-window budget was not exhausted this turn.