Files
FreeCADWasmDev/docs/current/PART_SELECTED_BATCH_PROGRESS.md

6.2 KiB

Part selected batch checkpoint

Updated: 2026-09-17, batch a31535b769d261461291da35.

Selected requirements remain Part:desktop:Part_Primitives, Part:desktop:Part_ProjectionOnSurface, Part:desktop:Part_Scale, and Part:desktop:Part_SectionCut. This checkpoint is descriptive only. It does not change requirement statuses, contracts, proof areas, or acceptance policy.

Work completed this continuation

  • Reused the existing Scale desktop adapter, mounted PartScaleTask, document facade, native Part::Scale implementation, and supplied OCCT WASM.
  • Added runScaleCases to tools/part-business-cases.mjs and wired the selected Scale ID into the existing case dispatcher. Unsupported-case fallback excludes Scale because it now has its own executable case function.
  • The first runner execution reached native load completion and failed at createScale with document_operation_failed: unsupported document action. Evidence: docs/current/business-evidence/788696be57f6b5b6ddfeb05e-20260917T003458126640.json.
  • Confirmed the build-tree document probe was newer than the public runtime. cmake --build freecad-source/build-web/configure --target FreeCADWebDocumentProbe -j2 completed successfully. Copied only FreeCADWebDocumentProbe.js, .wasm, and .worker.js from that tree's bin to web/public/kernel.
  • Ran python3 tools/run_business_acceptance.py --module Part --ids Part:desktop:Part_Scale --reuse. It passed one selected capability in 14.764 seconds. Evidence: docs/current/business-evidence/788696be57f6b5b6ddfeb05e-20260917T003549560323.json. Native and browser cleanup completed. Browser artifacts and the case result are under docs/current/part-scale-business/2026-09-17T00-35-35-060Z/. The mobile geometry screenshot was also visually inspected.

Proven scope and current verification boundary

The passing version exercised uniform scaling (24 to 192 volume), axis scaling (24 to 576), parameter storage and source links, source visibility, document isolation, one-step undo/redo, rejected selections/zero factors/cyclic edits, cancellation, source recomputation before and after FCStd reopening, and unique names on repeated Apply. Browser cases exercised mounted Scale controls through the real dispatcher/Worker, editing, undo/redo, OPFS save and reopen after reload, and interactive nonblank geometry at 1440x900 and 390x844.

After that pass, the case was strengthened with native exact bounds, two-source scaling in one transaction, and input fingerprints for PartScaleDocument.h, FeatureScale.cpp, and DlgScale.cpp. A focused runner attempt returned exit 78, previous_validation_deferred, executedCount: 0 for Scale. These added checks have NOT executed. The older evidence must not be represented as a passing run of the current case file. No policy files or acceptance machinery were changed to bypass the deferral. Do not replay the unchanged deferred attempt.

The existing local browser server responded at http://127.0.0.1:5180/workbench.html. No new server or lingering test session was started. No full-parity/API gate, deployment, push, or external message occurred.

Remaining selected work

  • Primitives: adapter and mounted task currently expose Cylinder, Cone, Sphere, and Torus only. No selected Part_Primitives case was added or claimed passed. DlgPrimitives.cpp has desktop create implementations for Plane (284), Box (376), Cylinder (489), Cone (610), Sphere (724), Ellipsoid (854), Torus (990), Prism (1111), Wedge (1292), Helix (1450), Spiral (1563), Circle (1662), Ellipse (1769), Polygon (1861), Line (1961), and Vertex (2086). Preserve the location, placement and create/edit workflow; four primitive shortcuts are insufficient. Current integration anchors: executePartPrimitivesDesktop in web/src/part-desktop-adapter.ts, web/src/part-primitives-task.tsx, and the PartPrimitivesTask mount in web/src/workbench-shell.tsx.
  • ProjectionOnSurface: Command.cpp:2450 opens the newer TaskProjectOnSurface, not the older TaskProjectionOnSurface implementation in the same file. DlgProjectionOnSurface.cpp:1242 initializes a persistent Part::ProjectOnSurface feature; 1319 commits and recomputes, while reject aborts its transaction. Selection modes distinguish support face, source face, edge and wire; controls include direction, projection display mode, Height and Offset. Continue from that newer task and native feature source. No adapter, mounted task, or executable selected case was implemented in this turn.
  • SectionCut: Command.cpp:2490 opens a persistent singleton SectionCut dock. It is distinct from Part_Section and Part_CrossSections. The actual business source is freecad-source/src/Mod/Part/Gui/SectionCutting.cpp: visible source collection and cuts around 1141, links around 1019, createAllObjects at 1335, BooleanFragments at 2555, and Compound at 2588. Preserve axis-plane cutting, linked document objects, visibility and persistent dock behavior. No selected SectionCut case or integration was added in this turn.
  • Scale: retain all original requirements beyond the proven scope. The desktop source (DlgScale.cpp:201) creates one linked feature per selected object in one transaction and copies ShapeAppearance, LineColor and PointColor before hiding sources. The newer bounds/multi-selection assertions are pending the runner's deferral boundary; visual-property propagation and other source types must not be inferred from the existing box assertions.

Continuation constraints

Continue implementing one of the three uncompleted commands while preserving the deferred Scale assertions and previous evidence. Reuse the document probe and module-specific adapter; do not modify the shared dispatcher without an actual shared-contract defect. Follow the current packet's bounded source reader and command budgets. PartScaleDocument.h exists, but its read was rejected by the current reader's source scope; that is not an absent-source diagnosis. Do not bypass the reader with an unrestricted dump.

Keep docs/current/IFC_SEMANTIC_EXPORT_CONTRACT.md and every original and supplemental requirement intact. No IFC behavior or proof was changed or rerun. Only the acceptance runner may record acceptance; no coverage tags or passing statuses were manually added.