Files
FreeCADWasmDev/docs/current/part-slice-lifecycle-handoff-20260912.md
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

70 lines
3.7 KiB
Markdown

# Slice Lifecycle and Cooldown Repair
No automated tests, browser checks or acceptance ran. This is implementation and
build handoff; user validation remains deferred. Existing OCCT-backed slicing,
FreeCAD document classes, compiled dependencies and OPFS output were reused.
## Business Changes
- Added native-document read/update/reopen actions to PartSliceDocument.h.
- Updates Mode, Tolerance, Base, Tools and Label in a native transaction, rejects
dependency cycles and returns current native geometry, links and an FCStd snapshot.
- Uses desktop CompoundFilter creation to synchronize a simple exploded slice
when its piece count changes. Removal with external dependencies, custom filter
indexing or invalid recompute aborts instead of silently corrupting the graph.
- Reopens actual FCStd bytes with App.openDocument and the supplied proxy classes,
rejects open-document name collisions and cleans disposable input files. Native
failures are not converted to exposed status. Restored slices are recomputed.
- React supports reading an open document, editing properties, opening local FCStd
and choosing stored FCStd from OPFS/Part. Each result can be saved/downloaded again.
- Workbench-owned nativeDocuments retains PartBox object snapshots across module
changes. Shared navigation shows actual native names/labels, ownership and links,
updates selection and opens the Part task for that document. No handles are sent
into another module's runtime as though they belonged there.
This is not a complete all-module global tree: project-shell's separate document
store and other native owners are not unified. Editing is scoped to Slice properties,
not every FreeCAD property type. Cross-worker transfer and arbitrary custom filter
editing remain explicit work. Runtime reopen/update correctness is not yet verified.
## Cooldown Root Cause
Repeated attempts without changed outcomes trigger record/module cooldown; the
planner does search its other lanes before waiting. At this turn's start, cooldown
had expired and BIM was executing, so the scheduler had not stopped. Later BIM,
Web and Test cooled again after unsuccessful cycles.
A real defect kept recoveryLevel/cooldownRounds at their historic maximum even
after substantive progress. A later short failure streak therefore immediately
returned to the longest delay. scheduler_progress.py now resets those escalation
levels only on substantive progress, not mere evidence refresh or provider failure.
Existing failure history and current retry deadlines were not cleared.
The scheduler was gracefully reloaded while waiting with no child process. Its
existing watchdog restarted it as PID 2572390 (restart count 170). It was still
waiting for previously cooled records afterward. This is not proof of restored
throughput or elimination of external model latency.
## Timings
First native lifecycle build pipeline: 49.004 seconds, including 38.322 seconds
build. A subsequent filter-count synchronization change required a second native
build. Final receipt: part-slice-lifecycle-implementation-pipeline.json.
| Final Native Step | Seconds |
| --- | ---: |
| Module registry | 0.102 |
| Capability registry | 8.089 |
| Preflight | 0.044 |
| Build | 32.772 |
| Artifact sync | 2.264 |
| Completion metadata, not acceptance | 0.954 |
| Final pipeline | 44.225 |
| Frontend build | 5.642 |
| Public sync within frontend build | 3.655 |
Native dependencies were reused; no whole OCCT rebuild. After the final header-only
change the two changed PartBox runtime artifacts were synchronized to dist/kernel;
unchanged frontend bundles were not rebuilt. Timings are step wall times, not an
end-to-end throughput claim. Source decisions were updated in place for continuation.