273 lines
19 KiB
JSON
273 lines
19 KiB
JSON
{
|
|
"schema": "freecad-web-execution-policy/v1",
|
|
"mode": "comprehensive-resumable-smoke",
|
|
"validationOwner": "comprehensive-resumable-smoke",
|
|
"automaticValidation": true,
|
|
"automaticMaintenance": false,
|
|
"continuousDevelopment": true,
|
|
"completionFocus": "comprehensive-smoke",
|
|
"prioritizeCoverageGaps": false,
|
|
"deferPreviouslyPassedValidation": true,
|
|
"minimumOriginalRequirements": 1507,
|
|
"requiredSupplementalIds": [
|
|
"business-format:BIM:semantic-export:.ifc",
|
|
"product:desktop-workspace-parity",
|
|
"product:cross-workbench-document-editing",
|
|
"product:desktop-task-interaction-parity"
|
|
],
|
|
"priorityBusinessIds": [
|
|
"business-format:BIM:semantic-export:.ifc"
|
|
],
|
|
"reason": "Latest user correction: the migration itself is already completed; only check for and repair concrete omissions/defects. Do not restart complete migration, rebuild panels wholesale, or infer missing functionality from stale evidence or lack of coverage.",
|
|
"preserveHistoricalEvidence": true,
|
|
"workflowDelivery": {
|
|
"enabled": false,
|
|
"plan": "docs/current/DESKTOP_WEB_DELIVERY_PLAN_20260918.md",
|
|
"priorityIds": [
|
|
"product:desktop-workspace-parity",
|
|
"product:cross-workbench-document-editing",
|
|
"product:desktop-task-interaction-parity"
|
|
],
|
|
"moduleOrder": [
|
|
"Web",
|
|
"Sketcher",
|
|
"PartDesign",
|
|
"Part",
|
|
"Import",
|
|
"Draft",
|
|
"Mesh",
|
|
"MeshPart",
|
|
"TechDraw",
|
|
"Assembly",
|
|
"BIM",
|
|
"Fem",
|
|
"CAM",
|
|
"Spreadsheet",
|
|
"Surface",
|
|
"Measure",
|
|
"Material",
|
|
"Points",
|
|
"Robot",
|
|
"ReverseEngineering",
|
|
"OpenSCAD",
|
|
"Cloud",
|
|
"Inspection",
|
|
"JtReader",
|
|
"Start",
|
|
"Help",
|
|
"Plot",
|
|
"Show",
|
|
"Sandbox",
|
|
"TemplatePyMod",
|
|
"Test",
|
|
"Tux"
|
|
],
|
|
"historyWindow": 8,
|
|
"maxModuleTurns": 3,
|
|
"maxUnfinishedAttempts": 2,
|
|
"breadthEvery": 4
|
|
},
|
|
"maintenancePolicy": {
|
|
"intervalSeconds": 1800,
|
|
"mode": "between-business-turns",
|
|
"authorization": "2026-09-18: automatically inspect and resolve placeholder implementations, blockers and idle loops using supplied local business sources and completed work.",
|
|
"inspectionScope": [
|
|
"actual workflow outputs and native document behavior",
|
|
"placeholder or fixture-only implementation",
|
|
"repeated identical failures",
|
|
"lack of substantive progress",
|
|
"unnecessary rebuilds, reloads and repeated verification"
|
|
],
|
|
"repairPolicy": "Repair only evidenced problems in the owning implementation; use focused validation and return to the delivery plan. A healthy inspection ends promptly without gratuitous changes.",
|
|
"preserveExistingWork": true,
|
|
"interruptActiveBusinessTurn": false,
|
|
"startAdditionalScheduler": false
|
|
},
|
|
"antiDriftRule": "docs/WEB_BUSINESS_MIGRATION_RULES.md#2026-09-18-防跑偏铁律用户明确要求",
|
|
"reusePolicy": {
|
|
"carrySelectedEvidenceIntoContext": true,
|
|
"reuseValidEvidenceBeforeDeferredExecutionGuard": true,
|
|
"doNotRepeatPartialSuccessForTimestamps": true,
|
|
"maintenanceSkipCompletedWithoutNewFault": true,
|
|
"audit": "docs/current/repetition-audit-20260918/README.md"
|
|
},
|
|
"validationArrangement": "2026-09-18: user confirms migration complete and authorizes comprehensive resumable smoke plus repair of the original ten unsuccessful groups. Reuse recorded evidence; validate changed inputs and concrete repairs only.",
|
|
"openImplementationGaps": {
|
|
"product:desktop-task-interaction-parity": {
|
|
"status": "historical-assumption-not-scheduling",
|
|
"priority": 0,
|
|
"source": "web/src/partdesign-workspace-component.tsx",
|
|
"observedAt": "2026-09-18T05:57:15.197557+00:00",
|
|
"reason": "Cycle 9482 explicitly reported complete native task accept/cancel lifecycle unfinished; only duplicate-submit guard and viewport fit were changed. Outer pipeline incorrectly refreshed all three product implementation receipts.",
|
|
"nextAction": "Reuse embedded workspace and current native owner; implement real task begin/apply/accept/cancel lifecycle and primary selection/task synchronization. Keep completed controls and geometry. Do not replace it with draft reset only, another fixture, repeated validation or unrelated argument hardening.",
|
|
"closure": "Only after concrete implementation covers the remaining workflow, record implementation changes and set this entry status to implemented; verification stays deferred.",
|
|
"supersededBy": "User clarified delivered migration baseline; retain notes, do not use broad inferred integration goals as automatic work."
|
|
},
|
|
"product:cross-workbench-document-editing": {
|
|
"status": "historical-assumption-not-scheduling",
|
|
"priority": 1,
|
|
"source": "web/src/project-shell.tsx",
|
|
"observedAt": "2026-09-18T05:57:15.197572+00:00",
|
|
"reason": "Populated Part-owned documents still reject Sketcher/PartDesign handoff. Existing new-document Sketch/Pad editing, OPFS persistence and UI selector are completed increments to reuse.",
|
|
"nextAction": "Resolve existing-document native ownership and history across workbenches using existing owners; preserve source objects and identity. Do not replay missing-selector or already connected new-document scenarios.",
|
|
"closure": "Record actual ownership/entrypoint implementation and remaining limits before marking implemented; compile and sync only, no acceptance now.",
|
|
"supersededBy": "User clarified delivered migration baseline; retain notes, do not use broad inferred integration goals as automatic work."
|
|
}
|
|
},
|
|
"workScope": "gap-repair-only",
|
|
"migrationBaseline": "Desktop FreeCAD functionality and panels have already been ported to Web; reuse the delivered work. Current task is gap repair only.",
|
|
"confirmedGapRepairs": [
|
|
{
|
|
"id": "primary-document-id-collision",
|
|
"module": "Web",
|
|
"source": "web/src/project-shell.tsx",
|
|
"problem": "Counter-generated new/open document identifiers can collide with navigation/restored sessions; failed design opens leave provisional ownership.",
|
|
"status": "implemented_pending_validation",
|
|
"result": "Shared collision-avoiding allocator and failed-open ownership cleanup implemented; TypeScript and Vite compilation succeeded. No runtime validation.",
|
|
"record": "docs/current/DOCUMENT_ID_GAP_REPAIR_20260918.md"
|
|
},
|
|
{
|
|
"key": "cancel-design-draft-fields",
|
|
"id": "product:desktop-task-interaction-parity",
|
|
"module": "Web",
|
|
"source": "web/src/partdesign-workspace-component.tsx",
|
|
"line": 294,
|
|
"status": "implemented_pending_validation",
|
|
"command": "Repair existing Cancel draft parameter restoration",
|
|
"problem": "Embedded Cancel draft restores only sketch parameters/position and feature length. Existing controls also expose profile type, feature type, reverse, angle/axis, helix pitch/height, hole diameter/depth, loft and pipe parameters; cancelling leaves those edits active while reporting draft cancelled. This is incomplete reset in an existing control, not a request for a new native preview system.",
|
|
"nextAction": "Outer pipeline performs incremental build/sync; functional validation remains deferred until all functionality is implemented. Native task lifecycle redesign is outside this repair.",
|
|
"files": [
|
|
"web/src/partdesign-workspace-component.tsx",
|
|
"web/src/partdesign-document-facade.ts",
|
|
"web/src/project-shell.tsx"
|
|
],
|
|
"executionRules": "Follow DESKTOP_WEB_DELIVERY_PLAN_20260918.md as gap repair only. Reuse completed work. No tests, acceptance, browser checks or validation cases. Necessary compiler/link/assets only. After this exact repair, update ONLY its confirmedGapRepairs entry by key to implemented_pending_validation with changed sources and compile/sync outcome. If a new actual defect is found, add a narrow source-backed entry; never restore the old inventory/coverage backlog.",
|
|
"changedSources": [
|
|
"web/src/partdesign-workspace-component.tsx"
|
|
],
|
|
"implementation": "Reused native selection-to-form synchronization through restoreCommittedFields. Cancel draft restores creation defaults then committed selected-object fields for sketch profile/parameters/position, feature type/profile, length/reverse, angle/axis, helix, hole, loft and pipe; clears error state. Standalone synchronization and native commands are preserved.",
|
|
"compileSyncOutcome": "Not run; outer pipeline owns incremental build/sync/route receipts. Tests, acceptance and browser validation deferred until all functionality is implemented."
|
|
},
|
|
{
|
|
"key": "retain-design-mesh-on-metadata-snapshot",
|
|
"id": "product:cross-workbench-document-editing",
|
|
"module": "Web",
|
|
"source": "web/src/project-shell.tsx",
|
|
"line": 180,
|
|
"status": "implemented_pending_validation",
|
|
"command": "Repair existing save snapshot losing task geometry metadata",
|
|
"problem": "saveFcstd requests includeMesh:false then applyNativeDocument replaces designSnapshots[id] with that response. Embedded PartDesignWorkspace uses current.objects mesh/faceCount/edgeCount for selectable elements; saving should not discard already available unchanged mesh metadata. Confirm actual response fields first. Standalone save uses includeMesh:true as a reuse reference. Do not transfer ownership or rebuild workspaces.",
|
|
"nextAction": "After all functionality is implemented, validate save retains embedded PartDesign selection data and full geometry responses replace caches; no additional implementation in this batch.",
|
|
"executionRules": "Follow DESKTOP_WEB_DELIVERY_PLAN_20260918.md as gap repair only. Reuse completed work. No tests, acceptance, browser checks or validation cases. Necessary compiler/link/assets only. After this exact repair, update ONLY its confirmedGapRepairs entry by key to implemented_pending_validation with changed sources and compile/sync outcome. If a new actual defect is found, add a narrow source-backed entry; never restore the old inventory/coverage backlog.",
|
|
"changedSources": [
|
|
"web/src/project-shell.tsx"
|
|
],
|
|
"implementation": "saveFcstd explicitly marks its includeMesh:false response as metadata-only. The existing snapshot projector retains missing mesh/faceCount/edgeCount only for the same native document and matching object name/type; incoming fields remain authoritative, removed objects are dropped, and full responses replace the cache.",
|
|
"compileSyncOutcome": "Not run in this turn; incremental build/sync/route receipts are owned by the outer pipeline. Tests, browser validation and business acceptance remain deferred."
|
|
},
|
|
{
|
|
"key": "shaft-native-constraints-and-analysis",
|
|
"id": "PartDesign:desktop:PartDesign_WizardShaft",
|
|
"module": "PartDesign",
|
|
"source": "freecad-source/src/Mod/PartDesign/WizardShaft/WebDocument.py",
|
|
"problem": "Round 9483 uses real Fem constraints without native registration; analysisComputed remains false and desktop NumPy analysis is not connected to Web results.",
|
|
"status": "implemented_pending_validation",
|
|
"record": "docs/current/PARTDESIGN_SHAFT_9483_REPAIR_20260918.md",
|
|
"implementation": "Registered the desktop shaft constraints in the existing PartDesign owner; reused shaft equilibrium and beam functions with Eigen solve; exposed reactions and diagrams in existing task UI; corrected force/material/pulley units. Historical round is not marked passed.",
|
|
"compileSyncOutcome": "Native incremental build, Python syntax compilation, TypeScript compilation, asset sync and Vite production build passed. Asset sync copied 3 changed artifacts and skipped 101 unchanged files. No tests, acceptance or browser validation.",
|
|
"executionRules": "Follow DESKTOP_WEB_DELIVERY_PLAN_20260918.md as gap repair only. Reuse completed work. No tests, acceptance, browser checks or validation cases. Necessary compiler/link/assets only. After this exact repair, update ONLY its confirmedGapRepairs entry by key to implemented_pending_validation with changed sources and compile/sync outcome. If a new actual defect is found, add a narrow source-backed entry; never restore the old inventory/coverage backlog.",
|
|
"schedulerRepair": "Open confirmed gaps bypass the pre-turn build-ready shortcut; implementation must precede post-turn compilation. Existing single service restarted to load the fix."
|
|
},
|
|
{
|
|
"key": "shaft-existing-segment-count",
|
|
"id": "PartDesign:desktop:PartDesign_WizardShaft",
|
|
"module": "PartDesign",
|
|
"source": "freecad-source/src/Mod/PartDesign/WizardShaft/WebDocument.py",
|
|
"problem": "Existing shaft edits explicitly reject len(previous) != len(segments); existing task disables adding/removing segments after shaft creation. This is a concrete functional gap, not missing test evidence.",
|
|
"status": "implemented_pending_validation",
|
|
"priority": 1,
|
|
"nextAction": "Implementation and outer compilation/synchronization complete; runtime validation remains deferred. Reuse these changes.",
|
|
"changedSources": [
|
|
"freecad-source/src/Mod/PartDesign/WizardShaft/WebDocument.py",
|
|
"freecad-source/src/Mod/PartDesign/WizardShaft/ShaftFeature.py",
|
|
"web/src/partdesign-shaft-task.tsx"
|
|
],
|
|
"implementationOutcome": "Existing shaft segment insertion/removal uses the desktop sketch builder in the existing geometry transaction, retaining sketch and revolution objects. Native constraint handles are restored from document objects, remapped to retained segments and persisted after writes; removed constraints are deleted in the same transaction. Existing task controls now allow insertion before any segment, append and removal while keeping at least one segment and inheriting the uniform bore. Dimension edits, native analysis, cancel, undo/redo and FCStd flows reuse existing owners.",
|
|
"compileSyncOutcome": "Outer pipeline for cycle 9536 succeeded (34.048 seconds): native build 28.302s and asset sync 3.261s, exit code 0. Source: continuation-runs/cycle-009536.log scheduler.post-turn-pipeline. No business/browser validation.",
|
|
"sourceAnchors": [
|
|
"freecad-source/src/Mod/PartDesign/WizardShaft/WebDocument.py",
|
|
"freecad-source/src/Mod/PartDesign/WizardShaft/ShaftFeature.py",
|
|
"web/src/partdesign-shaft-task.tsx",
|
|
"docs/current/PARTDESIGN_SHAFT_9483_REPAIR_20260918.md"
|
|
],
|
|
"executionRules": "Follow DESKTOP_WEB_DELIVERY_PLAN_20260918.md as gap repair only. Reuse completed work. No tests, acceptance, browser checks or validation cases. Necessary compiler/link/assets only. After this exact repair, update ONLY its confirmedGapRepairs entry by key to implemented_pending_validation with changed sources and compile/sync outcome. If a new actual defect is found, add a narrow source-backed entry; never restore the old inventory/coverage backlog."
|
|
},
|
|
{
|
|
"key": "confirmed-gap-empty-queue-rounds",
|
|
"id": "scheduler:confirmed-gap-empty-queue",
|
|
"module": "Shared",
|
|
"source": "tools/run_freecad_web_scheduler.py",
|
|
"problem": "With zero open confirmed gaps, each idle interval increments cycle and repeats continuation/planner/deferred-flush subprocesses. Heartbeat reporting also reloads the whole business evidence ledger without new completed passes.",
|
|
"implementation": "Empty confirmed work idles before inventory/planner/cycle allocation, retains heartbeat and small policy checks, and flushes only due pending builds. Report reads evidence only for newly completed first-pass IDs. Existing execution page explicitly shows no implementation task.",
|
|
"status": "implemented_pending_validation",
|
|
"record": "docs/current/GAP_REPAIR_IDLE_AND_SHAFT_CALLBACK_20260918.md",
|
|
"compileSyncOutcome": "Python source syntax, TypeScript and PartDesign incremental build passed; asset sync succeeded (3 changed artifacts copied, 101 unchanged files reused); Vite production build passed. No tests, acceptance or browser validation."
|
|
},
|
|
{
|
|
"key": "shaft-callback-preserve-force-direction",
|
|
"id": "PartDesign:desktop:PartDesign_WizardShaftCallBack",
|
|
"module": "PartDesign",
|
|
"source": "freecad-source/src/Mod/PartDesign/WizardShaft/WebDocument.py",
|
|
"problem": "Editing only Force in the callback sends a partial property object; the native handler replaces properties and defaults Reversed to false, silently reversing an existing reversed force.",
|
|
"implementation": "Same-type callback edits merge with existing properties; changing constraint type starts with its own defaults. Existing task sends retained Force properties alongside the edited magnitude.",
|
|
"status": "implemented_pending_validation",
|
|
"record": "docs/current/GAP_REPAIR_IDLE_AND_SHAFT_CALLBACK_20260918.md",
|
|
"compileSyncOutcome": "Python source syntax, TypeScript and PartDesign incremental build passed; asset sync succeeded (3 changed artifacts copied, 101 unchanged files reused); Vite production build passed. No tests, acceptance or browser validation."
|
|
}
|
|
],
|
|
"gapRepairRules": [
|
|
"Use existing components, documents, native owners and artifacts by default.",
|
|
"Queue only a specific user-observed or source-confirmed defect with source location and limited repair goal.",
|
|
"No case coverage or stale fingerprint alone creates a repair task.",
|
|
"If no concrete unresolved defect is known, remain idle rather than generate placeholder work.",
|
|
"Do not change historical implementation or acceptance evidence to claim new completion."
|
|
],
|
|
"unattendedGapRepair": {
|
|
"enabled": true,
|
|
"reuseExistingScheduler": true,
|
|
"taskLimit": "one concrete defect per turn",
|
|
"validation": false,
|
|
"sourceDiscovery": "Specific source-backed defects adjacent to existing work only; no broad migration restart",
|
|
"completion": "skip implemented entries; wait when no concrete gap remains"
|
|
},
|
|
"smokeRun": {
|
|
"directory": "docs/current/comprehensive-smoke-20260918",
|
|
"automaticRetryUnchanged": false,
|
|
"resume": true,
|
|
"owner": "tools/run_web_module_smoke_once.py",
|
|
"scope": "32 module loads, 32 panels, all 250 declared business IDs plus 3 product integration IDs; fingerprinted resume",
|
|
"status": "completed",
|
|
"report": "docs/current/comprehensive-smoke-20260918/RESUME_20260919.md",
|
|
"checks": 68,
|
|
"passed": 68,
|
|
"notPassed": 0,
|
|
"repeatUnchangedFailures": false,
|
|
"fixes": "Help/Plot/Show pthread glue and Help stdlib resources; Shaft native namespace and non-mutating direction calculations. Targeted native/browser smoke passed.",
|
|
"remainingGroups": [],
|
|
"completedAt": "2026-09-18T21:19:18.395799+00:00",
|
|
"closureBasis": "All 68 smoke groups pass using unchanged valid evidence or changed-input execution; all 250 declared business IDs plus 3 integration IDs are selected. 68/68 groups reused in final resume check. Not full 1511-requirement parity certification.",
|
|
"repairCompletion": "docs/current/comprehensive-smoke-20260918/repair-completion.json",
|
|
"resumeReport": "docs/current/comprehensive-smoke-20260918/RESUME_20260919.md"
|
|
},
|
|
"changeWatch": {
|
|
"enabled": true,
|
|
"intervalSeconds": 600,
|
|
"owner": "existing freecad-web-acceptance.service scheduler",
|
|
"scope": "changed smoke inputs and new runtime issue observations only",
|
|
"baseline": "docs/current/comprehensive-smoke-20260918/completion-20260919.json",
|
|
"sameInputFailureRetry": false,
|
|
"sourceOnlyChanges": "wait for matching built/published artifacts",
|
|
"authorization": "2026-09-19 user explicitly requests starting changed-input/new-fault work; completed migration is the baseline."
|
|
}
|
|
}
|