Files
FreeCADWasmDev/docs/current/part-expression-simultaneous-20260918-checkpoint.md

7.0 KiB
Raw Blame History

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 mm produces Length=1 and volume=45, with native valid topology and atomic undo/redo.
  • Simultaneous Length=Width + 1 mm, Width=Length + 1 mm is rejected with full snapshot preservation, and the original redo branch still executes.
  • Reverse the dependency from Length=2, Width=Length + 1 mm to 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.mjs completed 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 --check passed. 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.