feat: extend ordered pair evidence through common
Some checks failed
real-verification / chrome (push) Has been cancelled
real-verification / freecad-oracle (push) Has been cancelled
real-verification / wasm (push) Has been cancelled

This commit is contained in:
2026-08-15 10:37:35 -04:00
parent 378a6e7c0a
commit 1ee55b1338
7 changed files with 13195 additions and 351 deletions

View File

@@ -24,12 +24,12 @@
],
"followUpProgress": "config/freecad-follow-up-task-progress.json"
},
"nextTask": "TSN-PAIR-fuse-revolution",
"nextTask": "TSN-PAIR-rotate-fuse",
"summary": {
"tasks": 1756,
"completed": 138,
"completed": 186,
"inProgress": 1,
"pending": 1617
"pending": 1569
},
"milestones": [
{
@@ -1863,141 +1863,183 @@
{
"id": "TSN-PAIR-fuse-revolution",
"title": "Classify ordered operation pair fuse->revolution",
"status": "in_progress",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->revolution",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builder-and-freecad-profile-reject-with-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-groove",
"title": "Classify ordered operation pair fuse->groove",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->groove",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-fillet",
"title": "Classify ordered operation pair fuse->fillet",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->fillet",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-chamfer",
"title": "Classify ordered operation pair fuse->chamfer",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->chamfer",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-hole",
"title": "Classify ordered operation pair fuse->hole",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->hole",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-draft",
"title": "Classify ordered operation pair fuse->draft",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->draft",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-thickness",
"title": "Classify ordered operation pair fuse->thickness",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->thickness",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-linear-pattern",
"title": "Classify ordered operation pair fuse->linear-pattern",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->linear-pattern",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-polar-pattern",
"title": "Classify ordered operation pair fuse->polar-pattern",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->polar-pattern",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-mirrored",
"title": "Classify ordered operation pair fuse->mirrored",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->mirrored",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-fuse-multi-transform",
"title": "Classify ordered operation pair fuse->multi-transform",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "fuse->multi-transform",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-fuse",
"title": "Classify ordered operation pair cut->fuse",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->fuse",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-cut",
"title": "Classify ordered operation pair cut->cut",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->cut",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-common",
"title": "Classify ordered operation pair cut->common",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->common",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
@@ -2011,347 +2053,449 @@
{
"id": "TSN-PAIR-cut-pad",
"title": "Classify ordered operation pair cut->pad",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->pad",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builder-and-freecad-profile-reject-with-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-pocket",
"title": "Classify ordered operation pair cut->pocket",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->pocket",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-loft",
"title": "Classify ordered operation pair cut->loft",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->loft",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-pipe",
"title": "Classify ordered operation pair cut->pipe",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->pipe",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-revolution",
"title": "Classify ordered operation pair cut->revolution",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->revolution",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builder-and-freecad-profile-reject-with-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-groove",
"title": "Classify ordered operation pair cut->groove",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->groove",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-fillet",
"title": "Classify ordered operation pair cut->fillet",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->fillet",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-chamfer",
"title": "Classify ordered operation pair cut->chamfer",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->chamfer",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-hole",
"title": "Classify ordered operation pair cut->hole",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->hole",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-draft",
"title": "Classify ordered operation pair cut->draft",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->draft",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-thickness",
"title": "Classify ordered operation pair cut->thickness",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->thickness",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-linear-pattern",
"title": "Classify ordered operation pair cut->linear-pattern",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->linear-pattern",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-polar-pattern",
"title": "Classify ordered operation pair cut->polar-pattern",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->polar-pattern",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-mirrored",
"title": "Classify ordered operation pair cut->mirrored",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->mirrored",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-cut-multi-transform",
"title": "Classify ordered operation pair cut->multi-transform",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "cut->multi-transform",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-fuse",
"title": "Classify ordered operation pair common->fuse",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->fuse",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-cut",
"title": "Classify ordered operation pair common->cut",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->cut",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-common",
"title": "Classify ordered operation pair common->common",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->common",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-rotate",
"title": "Classify ordered operation pair common->rotate",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->rotate",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-pad",
"title": "Classify ordered operation pair common->pad",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->pad",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builder-and-freecad-profile-reject-with-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-pocket",
"title": "Classify ordered operation pair common->pocket",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->pocket",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-loft",
"title": "Classify ordered operation pair common->loft",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->loft",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-pipe",
"title": "Classify ordered operation pair common->pipe",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->pipe",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-revolution",
"title": "Classify ordered operation pair common->revolution",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->revolution",
"classification": "rejected",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builder-and-freecad-profile-reject-with-clean-resave"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-groove",
"title": "Classify ordered operation pair common->groove",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->groove",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-fillet",
"title": "Classify ordered operation pair common->fillet",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->fillet",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-chamfer",
"title": "Classify ordered operation pair common->chamfer",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->chamfer",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-hole",
"title": "Classify ordered operation pair common->hole",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->hole",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-draft",
"title": "Classify ordered operation pair common->draft",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->draft",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-thickness",
"title": "Classify ordered operation pair common->thickness",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->thickness",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-linear-pattern",
"title": "Classify ordered operation pair common->linear-pattern",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->linear-pattern",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-polar-pattern",
"title": "Classify ordered operation pair common->polar-pattern",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->polar-pattern",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-mirrored",
"title": "Classify ordered operation pair common->mirrored",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->mirrored",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-common-multi-transform",
"title": "Classify ordered operation pair common->multi-transform",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "common->multi-transform",
"classification": "accepted",
"evidence": [
"config/freecad-ordered-operation-pair-classification.json",
"native-builders-mutation-naming-and-fcstd-resave-pass"
],
"exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence"
},
{
"id": "TSN-PAIR-rotate-fuse",
"title": "Classify ordered operation pair rotate->fuse",
"status": "pending",
"status": "in_progress",
"dependencies": [
"TSN-PROD-DRIFT-001"
],

File diff suppressed because it is too large Load Diff

View File

@@ -3,9 +3,9 @@
生成日期2026-08-15。基线FreeCAD 1.1.1 / `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`
- 唯一活动任务:`TSN-PAIR-fuse-revolution`
- 微任务1756 total / 138 completed / 1 in_progress / 1617 pending
- 有序操作对:12/361 classified / 349 unknown
- 唯一活动任务:`TSN-PAIR-rotate-fuse`
- 微任务1756 total / 186 completed / 1 in_progress / 1569 pending
- 有序操作对:60/361 classified / 301 unknown
- Property27/85 native types / 58 opaque types
- exact 任务5/52 completed
- 模块能力0 exact / 26 compatible / 5 proxy / 3 development
@@ -15,7 +15,7 @@
| `ORA-GUI-BASELINE` | 106 | 106 | 0 | 0 | `-` |
| `ORA-GUI-WORKFLOWS` | 7 | 7 | 0 | 0 | `-` |
| `TSN-RECOVERY-DRIFT` | 13 | 13 | 0 | 0 | `-` |
| `TSN-ORDERED-PAIRS` | 361 | 12 | 1 | 348 | `TSN-PAIR-fuse-revolution` |
| `TSN-ORDERED-PAIRS` | 361 | 60 | 1 | 300 | `TSN-PAIR-rotate-fuse` |
| `PROPERTY-CODECS` | 522 | 0 | 0 | 522 | `-` |
| `DOCUMENT-SEMANTICS` | 90 | 0 | 0 | 90 | `-` |
| `CORE-MODELING` | 171 | 0 | 0 | 171 | `-` |

View File

@@ -22,16 +22,66 @@ const expectedPairs = [
{ pair: 'fuse->cut', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'toolSize', mutationTrajectory: [4, 3, 4] },
{ pair: 'fuse->common', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepAlgoAPI_Common', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [10, 9, 10] },
{ pair: 'fuse->rotate', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepBuilderAPI_Transform', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [15, 22.5, 15] },
{ pair: 'fuse->pad', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakePrism', secondInputCount: 1, mutationParameter: 'length', mutationTrajectory: [5, 7.5, 5], nativeTypeId: 'PartDesign::Pad' },
{ pair: 'fuse->pad', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakePrism', secondInputCount: 1, mutationParameter: 'length', mutationTrajectory: [5, 7.5, 5], nativeTypeId: 'PartDesign::Pad', freeCadDiagnostic: 'FeatureExtrusion: Length: Could not extrude the sketch!' },
{ pair: 'fuse->pocket', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'length', mutationTrajectory: [5, 4, 5] },
{ pair: 'fuse->loft', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', rejectionAuthority: 'freecad-document', kernelOutcome: 'accepted', secondBuilder: 'BRepOffsetAPI_ThruSections', secondInputCount: 2, mutationParameter: 'ruled', mutationTrajectory: [false, true, false], nativeTypeId: 'Part::Loft', freeCadDiagnostic: 'Profile shape is not a single vertex, edge, wire nor face.' },
{ pair: 'fuse->pipe', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', rejectionAuthority: 'freecad-document', kernelOutcome: 'invalid-result', secondBuilder: 'BRepOffsetAPI_MakePipe', secondInputCount: 2, mutationParameter: 'spineLength', mutationTrajectory: [15, 12, 15], nativeTypeId: 'Part::Sweep', freeCadDiagnostic: 'A fatal error occurred when making the sweep' },
{ pair: 'fuse->revolution', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakeRevol', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [360, 270, 360], nativeTypeId: 'Part::Revolution', freeCadDiagnostic: 'Solids are not Processed' },
{ pair: 'fuse->groove', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'angle', mutationTrajectory: [360, 180, 360] },
{ pair: 'fuse->fillet', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepFilletAPI_MakeFillet', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [0.4, 0.6, 0.4] },
{ pair: 'fuse->chamfer', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepFilletAPI_MakeChamfer', secondInputCount: 1, mutationParameter: 'distance', mutationTrajectory: [0.4, 0.6, 0.4] },
{ pair: 'fuse->hole', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [1, 1.5, 1] },
{ pair: 'fuse->draft', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepOffsetAPI_DraftAngle', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [5, 8, 5] },
{ pair: 'fuse->thickness', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepOffsetAPI_MakeThickSolid', secondInputCount: 1, mutationParameter: 'offset', mutationTrajectory: [-0.4, -0.6, -0.4] },
{ pair: 'fuse->linear-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'translationX', mutationTrajectory: [8, 9, 8] },
{ pair: 'fuse->polar-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [30, 45, 30] },
{ pair: 'fuse->mirrored', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'planeOriginX', mutationTrajectory: [5, 6, 5] },
{ pair: 'fuse->multi-transform', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)', secondInputCount: 1, mutationParameter: 'multiTranslationX', mutationTrajectory: [8, 9, 8] },
{ pair: 'cut->fuse', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepAlgoAPI_Fuse', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [8, 9, 8] },
{ pair: 'cut->cut', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'toolSize', mutationTrajectory: [3, 4, 3] },
{ pair: 'cut->common', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepAlgoAPI_Common', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [4, 5, 4] },
{ pair: 'cut->pad', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakePrism', secondInputCount: 1, mutationParameter: 'length', mutationTrajectory: [5, 7.5, 5], nativeTypeId: 'PartDesign::Pad', freeCadDiagnostic: 'FeatureExtrusion: Length: Could not extrude the sketch!' },
{ pair: 'cut->pocket', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'length', mutationTrajectory: [5, 4, 5] },
{ pair: 'cut->loft', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, rejectionAuthority: 'freecad-document', kernelOutcome: 'accepted', secondBuilder: 'BRepOffsetAPI_ThruSections', secondInputCount: 2, mutationParameter: 'ruled', mutationTrajectory: [false, true, false], nativeTypeId: 'Part::Loft', freeCadDiagnostic: 'Profile shape is not a single vertex, edge, wire nor face.' },
{ pair: 'cut->pipe', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, rejectionAuthority: 'freecad-document', kernelOutcome: 'invalid-result', secondBuilder: 'BRepOffsetAPI_MakePipe', secondInputCount: 2, mutationParameter: 'spineLength', mutationTrajectory: [15, 12, 15], nativeTypeId: 'Part::Sweep', freeCadDiagnostic: 'A fatal error occurred when making the sweep' },
{ pair: 'cut->revolution', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakeRevol', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [360, 270, 360], nativeTypeId: 'Part::Revolution', freeCadDiagnostic: 'Solids are not Processed' },
{ pair: 'cut->groove', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'angle', mutationTrajectory: [360, 180, 360] },
{ pair: 'cut->fillet', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepFilletAPI_MakeFillet', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [0.4, 0.6, 0.4] },
{ pair: 'cut->chamfer', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepFilletAPI_MakeChamfer', secondInputCount: 1, mutationParameter: 'distance', mutationTrajectory: [0.4, 0.6, 0.4] },
{ pair: 'cut->hole', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [1, 1.5, 1] },
{ pair: 'cut->draft', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepOffsetAPI_DraftAngle', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [5, 8, 5] },
{ pair: 'cut->thickness', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepOffsetAPI_MakeThickSolid', secondInputCount: 1, mutationParameter: 'offset', mutationTrajectory: [-0.4, -0.6, -0.4] },
{ pair: 'cut->linear-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'translationX', mutationTrajectory: [8, 9, 8] },
{ pair: 'cut->polar-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [30, 45, 30] },
{ pair: 'cut->mirrored', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'planeOriginX', mutationTrajectory: [5, 6, 5] },
{ pair: 'cut->multi-transform', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)', secondInputCount: 1, mutationParameter: 'multiTranslationX', mutationTrajectory: [8, 9, 8] },
{ pair: 'common->fuse', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepAlgoAPI_Fuse', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [8, 7, 8] },
{ pair: 'common->cut', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'toolSize', mutationTrajectory: [4, 3, 4] },
{ pair: 'common->common', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepAlgoAPI_Common', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [7, 6, 7] },
{ pair: 'common->rotate', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [15, 22.5, 15] },
{ pair: 'common->pad', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakePrism', secondInputCount: 1, mutationParameter: 'length', mutationTrajectory: [5, 7.5, 5], nativeTypeId: 'PartDesign::Pad', freeCadDiagnostic: 'FeatureExtrusion: Length: Could not extrude the sketch!' },
{ pair: 'common->pocket', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'length', mutationTrajectory: [5, 4, 5] },
{ pair: 'common->loft', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, rejectionAuthority: 'freecad-document', kernelOutcome: 'accepted', secondBuilder: 'BRepOffsetAPI_ThruSections', secondInputCount: 2, mutationParameter: 'ruled', mutationTrajectory: [false, true, false], nativeTypeId: 'Part::Loft', freeCadDiagnostic: 'Profile shape is not a single vertex, edge, wire nor face.' },
{ pair: 'common->pipe', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, rejectionAuthority: 'freecad-document', kernelOutcome: 'invalid-result', secondBuilder: 'BRepOffsetAPI_MakePipe', secondInputCount: 2, mutationParameter: 'spineLength', mutationTrajectory: [15, 12, 15], nativeTypeId: 'Part::Sweep', freeCadDiagnostic: 'A fatal error occurred when making the sweep' },
{ pair: 'common->revolution', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakeRevol', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [360, 270, 360], nativeTypeId: 'Part::Revolution', freeCadDiagnostic: 'Solids are not Processed' },
{ pair: 'common->groove', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'angle', mutationTrajectory: [360, 180, 360] },
{ pair: 'common->fillet', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepFilletAPI_MakeFillet', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [0.4, 0.6, 0.4] },
{ pair: 'common->chamfer', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepFilletAPI_MakeChamfer', secondInputCount: 1, mutationParameter: 'distance', mutationTrajectory: [0.4, 0.6, 0.4] },
{ pair: 'common->hole', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [1, 1.5, 1] },
{ pair: 'common->draft', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepOffsetAPI_DraftAngle', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [5, 8, 5] },
{ pair: 'common->thickness', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepOffsetAPI_MakeThickSolid', secondInputCount: 1, mutationParameter: 'offset', mutationTrajectory: [-0.4, -0.6, -0.4] },
{ pair: 'common->linear-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'translationX', mutationTrajectory: [4, 3, 4] },
{ pair: 'common->polar-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [30, 45, 30] },
{ pair: 'common->mirrored', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'planeOriginX', mutationTrajectory: [5, 6, 5] },
{ pair: 'common->multi-transform', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepAlgoAPI_Common', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)', secondInputCount: 1, mutationParameter: 'multiTranslationX', mutationTrajectory: [4, 3, 4] },
]
if (report.nativeProbe?.artifacts?.length !== 3 || report.classifications?.length !== expectedPairs.length) fail('native artifacts or classification prefix is incomplete.')
for (const [index, entry] of report.classifications.entries()) {
const expected = expectedPairs[index]
const secondOperation = expected.pair.split('->')[1]
if (entry.taskId !== `TSN-PAIR-${expected.pair.replace('->', '-')}` || entry.pair !== expected.pair || entry.classification !== expected.decision || entry.reasonCode !== expected.reasonCode || entry.nativeDecision !== expected.decision || entry.first?.operation !== 'fuse' || entry.first.builder !== 'BRepAlgoAPI_Fuse' || entry.first.inputCount !== 2 || entry.first.historyProvider !== 'occt-native' || entry.first.summary?.isValid !== true || entry.first.historyRecords < 1) fail(`${expected.pair} decision contract is invalid.`)
const [firstOperation, secondOperation] = expected.pair.split('->')
const firstBuilder = expected.firstBuilder ?? 'BRepAlgoAPI_Fuse'
const firstInputCount = expected.firstInputCount ?? 2
if (entry.taskId !== `TSN-PAIR-${expected.pair.replace('->', '-')}` || entry.pair !== expected.pair || entry.classification !== expected.decision || entry.reasonCode !== expected.reasonCode || entry.nativeDecision !== expected.decision || entry.first?.operation !== firstOperation || entry.first.builder !== firstBuilder || entry.first.inputCount !== firstInputCount || entry.first.historyProvider !== 'occt-native' || entry.first.summary?.isValid !== true || entry.first.historyRecords < 1) fail(`${expected.pair} decision contract is invalid.`)
if (expected.decision === 'rejected') {
if ('second' in entry || 'mutation' in entry || 'naming' in entry) fail(`${expected.pair} fabricates evidence for a result that FreeCAD rejected.`)
const rejection = entry.rejection
@@ -50,10 +100,10 @@ for (const [index, entry] of report.classifications.entries()) {
const diagnostic = persistence?.diagnostic
if (persistence?.status !== 'pass' || persistence.decision !== 'rejected' || persistence.pair !== entry.pair || persistence.operation !== secondOperation || persistence.nativeTypeId !== expected.nativeTypeId || persistence.freecadVersion !== '1.1.1' || !Object.values(persistence.checks ?? {}).every(Boolean)) fail(`${expected.pair} FCStd rejection evidence is incomplete.`)
if (diagnostic?.nativeTypeId !== expected.nativeTypeId || diagnostic.parameter?.name !== expected.mutationParameter || diagnostic.parameter.value !== expected.mutationTrajectory[0] || diagnostic.inputShape?.solids !== 1 || diagnostic.recomputeResult !== true || diagnostic.shapeNull !== true || diagnostic.shapeValid !== false || !diagnostic.state?.includes('Invalid') || diagnostic.statusString === 'Valid' || !diagnostic.objects?.some(({ name, typeId }) => name === 'PairResult' && typeId === expected.nativeTypeId)) fail(`${expected.pair} did not capture a real rejected FreeCAD recompute.`)
if (expected.rejectionAuthority === 'freecad-document' && diagnostic.statusString !== expected.freeCadDiagnostic) fail(`${expected.pair} FreeCAD profile diagnostic changed.`)
if (expected.freeCadDiagnostic && diagnostic.statusString !== expected.freeCadDiagnostic) fail(`${expected.pair} FreeCAD profile diagnostic changed.`)
if (persistence.source?.shape?.solids !== 1 || !persistence.source.shape.brepSha256 || JSON.stringify(persistence.rollback?.before) !== JSON.stringify(persistence.rollback?.after)) fail(`${expected.pair} abort did not restore the source object set and Shape.`)
const phases = persistence.phases
if (JSON.stringify(phases?.initial) !== JSON.stringify(phases?.reopened) || JSON.stringify(phases?.initial) !== JSON.stringify(phases?.resaved) || phases.initial.objects?.length !== persistence.rollback.before.objects.length || phases.initial.objects?.some(({ typeId }) => typeId === 'PartDesign::Body' || typeId === 'PartDesign::Pad' || typeId === 'Part::Loft')) fail(`${expected.pair} polluted the clean FCStd save/reopen/resave chain.`)
if (JSON.stringify(phases?.initial) !== JSON.stringify(phases?.reopened) || JSON.stringify(phases?.initial) !== JSON.stringify(phases?.resaved) || phases.initial.objects?.length !== persistence.rollback.before.objects.length || phases.initial.objects?.some(({ typeId }) => typeId === 'PartDesign::Body' || typeId === 'PartDesign::Pad' || typeId === 'Part::Loft' || typeId === 'Part::Revolution')) fail(`${expected.pair} polluted the clean FCStd save/reopen/resave chain.`)
continue
}
if (entry.second?.operation !== secondOperation || entry.second.builder !== expected.secondBuilder || entry.second.inputCount !== expected.secondInputCount || entry.second.historyProvider !== 'occt-native') fail(`${expected.pair} accepted second operation is invalid.`)
@@ -66,6 +116,6 @@ for (const [index, entry] of report.classifications.entries()) {
const phases = entry.persistence.phases
if (JSON.stringify(phases?.initial) !== JSON.stringify(phases?.reopened) || JSON.stringify(phases?.initial) !== JSON.stringify(phases?.resaved) || phases.initial.namingEvidenceSha256 !== entry.second.namingEvidenceSha256) fail(`${expected.pair} FCStd phases changed Shape or naming evidence.`)
}
const expectedSummary = { registeredOperations: 19, orderedPairs: 361, classifiedPairs: 8, accepted: 5, rejected: 3, unknown: 353 }
const expectedSummary = { registeredOperations: 19, orderedPairs: 361, classifiedPairs: 56, accepted: 44, rejected: 12, unknown: 305 }
if (JSON.stringify(report.summary) !== JSON.stringify(expectedSummary)) fail('summary is inconsistent.')
console.log(JSON.stringify({ status: 'freecad-ordered-operation-pair-classification-pass', completedTasks: report.classifications.map(({ taskId }) => taskId), pairs: report.classifications.map(({ pair, classification }) => ({ pair, classification })), nativeBuilderRuns: report.classifications.length * 4, fcstdPhases: report.classifications.length * 3, remainingPairs: report.summary.unknown }, null, 2))

View File

@@ -205,6 +205,15 @@ def collect_rejected():
"sections": [{"name": item.Name, "typeId": item.TypeId} for item in feature.Sections],
"spine": link_snapshot(feature.Spine),
}
elif operation == "revolution":
feature = document.addObject("Part::Revolution", "PairResult")
feature.Source = source
feature.Axis = App.Vector(0.0, 1.0, 0.0)
feature.Base = App.Vector(-1.0, 0.0, 0.0)
feature.Angle = 360.0
feature.Solid = True
diagnostic["parameter"] = {"name": "angle", "value": round(float(feature.Angle), 7)}
diagnostic["input"] = link_snapshot(feature.Source)
else:
raise RuntimeError("Unsupported rejected ordered-pair operation: " + operation)
diagnostic["nativeTypeId"] = feature.TypeId
@@ -248,8 +257,8 @@ def collect_rejected():
or "Error" in diagnostic["state"]
or "Invalid" in diagnostic["state"]
)
expected_type_id = {"pad": "PartDesign::Pad", "loft": "Part::Loft", "pipe": "Part::Sweep"}[operation]
input_names = [diagnostic.get("input", {}).get("name")] if operation == "pad" else [item["name"] for item in diagnostic.get("input", {}).get("sections", [])]
expected_type_id = {"pad": "PartDesign::Pad", "loft": "Part::Loft", "pipe": "Part::Sweep", "revolution": "Part::Revolution"}[operation]
input_names = [diagnostic.get("input", {}).get("name")] if operation in ("pad", "revolution") else [item["name"] for item in diagnostic.get("input", {}).get("sections", [])]
checks = {
"nativeFeatureConstructed": diagnostic.get("nativeTypeId") == expected_type_id,
"fuseSolidUsedAsInput": source_name in input_names and diagnostic.get("inputShape", {}).get("solids") == 1,

View File

@@ -54,12 +54,55 @@ const operationSpecs = {
pocket: { builder: 'BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut', nominal: { length: 5 }, edited: { length: 4 }, parameter: 'length', beforeValue: 5, editedValue: 4 },
loft: { builder: 'BRepOffsetAPI_ThruSections', nominal: { ruled: false }, edited: { ruled: true }, parameter: 'ruled', beforeValue: false, editedValue: true, decision: 'rejected', rejectionAuthority: 'freecad-document', kernelOutcome: 'accepted' },
pipe: { builder: 'BRepOffsetAPI_MakePipe', nominal: { spineLength: 15 }, edited: { spineLength: 12 }, parameter: 'spineLength', beforeValue: 15, editedValue: 12, decision: 'rejected', rejectionAuthority: 'freecad-document', kernelOutcome: 'invalid-result' },
revolution: { builder: 'BRepPrimAPI_MakeRevol', nominal: { angle: 360 }, edited: { angle: 270 }, parameter: 'angle', beforeValue: 360, editedValue: 270, decision: 'rejected' },
groove: { builder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', nominal: { angle: 360 }, edited: { angle: 180 }, parameter: 'angle', beforeValue: 360, editedValue: 180 },
fillet: { builder: 'BRepFilletAPI_MakeFillet', nominal: { radius: 0.4 }, edited: { radius: 0.6 }, parameter: 'radius', beforeValue: 0.4, editedValue: 0.6 },
chamfer: { builder: 'BRepFilletAPI_MakeChamfer', nominal: { distance: 0.4 }, edited: { distance: 0.6 }, parameter: 'distance', beforeValue: 0.4, editedValue: 0.6 },
hole: { builder: 'BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut', nominal: { radius: 1, depth: 14, position: [5, 5, -2], direction: [0, 0, 1] }, edited: { radius: 1.5 }, parameter: 'radius', beforeValue: 1, editedValue: 1.5 },
draft: { builder: 'BRepOffsetAPI_DraftAngle', nominal: { faceIndex: 0, angle: 5, direction: [0, 0, 1], axisOrigin: [0, 0, 0], neutralPlaneDirection: [0, 0, 1], reversed: false }, edited: { angle: 8 }, parameter: 'angle', beforeValue: 5, editedValue: 8 },
thickness: { builder: 'BRepOffsetAPI_MakeThickSolid', nominal: { faceIndex: 1, offset: -0.4, intersectionJoin: false }, edited: { offset: -0.6 }, parameter: 'offset', beforeValue: -0.4, editedValue: -0.6 },
'linear-pattern': { builder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', nominal: { translationX: 8 }, edited: { translationX: 9 }, parameter: 'translationX', beforeValue: 8, editedValue: 9 },
'polar-pattern': { builder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', nominal: { angle: 30, axisOrigin: [0, 0, 0], direction: [0, 0, 1] }, edited: { angle: 45 }, parameter: 'angle', beforeValue: 30, editedValue: 45 },
mirrored: { builder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', nominal: { planeOriginX: 5 }, edited: { planeOriginX: 6 }, parameter: 'planeOriginX', beforeValue: 5, editedValue: 6 },
'multi-transform': { builder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)', nominal: { multiTranslationX: 8 }, edited: { multiTranslationX: 9 }, parameter: 'multiTranslationX', beforeValue: 8, editedValue: 9 },
}
const pairSpecOverrides = {
'cut->fuse': { ...operationSpecs.fuse, nominal: { toolSize: 5, toolOffset: 8 }, edited: { toolSize: 5, toolOffset: 9 }, beforeValue: 8, editedValue: 9 },
'cut->cut': { ...operationSpecs.cut, nominal: { toolSize: 3, toolOffset: 6 }, edited: { toolSize: 4, toolOffset: 6 }, beforeValue: 3, editedValue: 4 },
'cut->common': { ...operationSpecs.common, nominal: { toolSize: 5, toolOffset: 4 }, edited: { toolSize: 5, toolOffset: 5 }, beforeValue: 4, editedValue: 5 },
'common->fuse': { ...operationSpecs.fuse, nominal: { toolSize: 5, toolOffset: 8 }, edited: { toolSize: 5, toolOffset: 7 }, beforeValue: 8, editedValue: 7 },
'common->common': { ...operationSpecs.common, nominal: { toolSize: 4, toolOffset: 7 }, edited: { toolSize: 4, toolOffset: 6 }, beforeValue: 7, editedValue: 6 },
'common->linear-pattern': { ...operationSpecs['linear-pattern'], nominal: { translationX: 4 }, edited: { translationX: 3 }, beforeValue: 4, editedValue: 3 },
'common->multi-transform': { ...operationSpecs['multi-transform'], nominal: { multiTranslationX: 4 }, edited: { multiTranslationX: 3 }, beforeValue: 4, editedValue: 3 },
}
const createOperation = (module, { operation, objectStep, toolSize, toolOffset, angle, length, ruled, spineLength, stage }) => {
const createOperation = (module, { operation, objectStep, toolSize, toolOffset, angle, length, ruled, spineLength, radius, distance, depth, position, direction, faceIndex, axisOrigin, neutralPlaneDirection, reversed, offset, intersectionJoin, translationX, planeOriginX, multiTranslationX, stage }) => {
const baseStep = objectStep ?? shapeStep(module, 'makeBox', 10, 10, 10)
const objectInput = input('object', 'object', stage.objectId, stage.objectTag, baseStep, stage.namingEvidence)
if (operation === 'rotate') return { response: module.rotateHistoryFromStep(baseStep, 0, 0, 0, 0, 0, 1, angle), inputs: [objectInput] }
if (operation === 'revolution') return { response: module.revolutionHistoryFromStep(baseStep, -1, 0, 0, 0, 1, 0, angle), inputs: [objectInput] }
if (operation === 'fillet') return { response: module.filletHistoryFromStep(baseStep, radius), inputs: [objectInput] }
if (operation === 'chamfer') return { response: module.chamferHistoryFromStep(baseStep, distance), inputs: [objectInput] }
if (operation === 'hole') return { response: module.holeHistoryFromStep(baseStep, radius, depth, ...position, ...direction), inputs: [objectInput] }
if (operation === 'draft') return { response: module.draftHistoryFromStep(baseStep, faceIndex, angle, ...direction, ...axisOrigin, ...neutralPlaneDirection, reversed), inputs: [objectInput] }
if (operation === 'thickness') return { response: module.thicknessHistoryFromStep(baseStep, faceIndex, offset, intersectionJoin), inputs: [objectInput] }
if (operation === 'linear-pattern') return { response: module.linearPatternHistoryFromStep(baseStep, translationX, 0, 0), inputs: [objectInput] }
if (operation === 'polar-pattern') return { response: module.polarPatternHistoryFromStep(baseStep, ...axisOrigin, ...direction, angle), inputs: [objectInput] }
if (operation === 'mirrored') return { response: module.mirroredHistoryFromStep(baseStep, planeOriginX, 0, 0, 1, 0, 0), inputs: [objectInput] }
if (operation === 'multi-transform') return {
response: module.multiTransformHistoryFromStep(baseStep, [
{ type: 'linear', direction: [multiTranslationX, 0, 0] },
{ type: 'mirrored', axisOrigin: [5, 0, 0], direction: [1, 0, 0] },
]),
inputs: [objectInput],
}
if (operation === 'groove') {
const profileStep = shapeStep(module, 'makeRectangleFacePlaced', 1, 3, 0.5, 2, 0)
return {
response: module.grooveHistoryFromStep(baseStep, profileStep, 0, 0, 0, 0, 1, 0, angle),
inputs: [objectInput, input('tool', 'tool', `${stage.resultObjectId}:profile`, stage.objectTag + 1, profileStep)],
}
}
if (operation === 'pad') return { response: module.prismHistoryFromStep(baseStep, 0, 0, length), inputs: [objectInput] }
if (operation === 'pocket') {
const profileStep = shapeStep(module, 'makeRectangleFace', 2, 3)
@@ -91,16 +134,17 @@ const createOperation = (module, { operation, objectStep, toolSize, toolOffset,
}
const captureRejectedStage = (module, definition) => {
const spec = operationSpecs[definition.operation]
let capture
try {
capture = createOperation(module, definition)
} catch (error) {
return {
operation: definition.operation,
builder: operationSpecs[definition.operation].builder,
builder: spec.builder,
inputCount: 1,
parameter: operationSpecs[definition.operation].parameter,
parameterValue: definition.length,
parameter: spec.parameter,
parameterValue: definition[spec.parameter],
runtime: 'occt-native',
outcome: 'rejected',
resultProduced: false,
@@ -232,14 +276,27 @@ const persistPair = async (pair, step, namingEvidence, decision) => {
}
}
const classifyFusePair = async (toOperation, pairIndex) => {
const pair = `fuse->${toOperation}`
const classifyPair = async (fromOperation, toOperation, pairIndex) => {
const pair = `${fromOperation}->${toOperation}`
const pairId = pair.replace('->', '-')
const firstParameters = pair === 'cut->thickness'
? { toolSize: 10, toolOffset: 5 }
: ['common->pocket', 'common->groove'].includes(pair)
? { toolSize: 5, toolOffset: 0 }
: fromOperation === 'fuse'
? toOperation === 'thickness'
? { toolSize: 10, toolOffset: 0 }
: ['fillet', 'chamfer'].includes(toOperation)
? { toolSize: 10, toolOffset: 5 }
: { toolSize: 5, toolOffset: 8 }
: fromOperation === 'common'
? { toolSize: 5, toolOffset: 4 }
: operationSpecs[fromOperation].nominal
const first = captureStage(module, {
operation: 'fuse', toolSize: 5, toolOffset: 8,
operation: fromOperation, ...firstParameters,
stage: { stageId: `pair:${pairId}:first`, ordinal: 0, objectId: `pair:${pairId}:base`, objectTag: 1001 + pairIndex * 100, resultObjectId: `pair:${pairId}:first`, resultObjectTag: 1101 + pairIndex * 100 },
})
const spec = operationSpecs[toOperation]
const spec = pairSpecOverrides[pair] ?? operationSpecs[toOperation]
const secondDefinition = {
operation: toOperation,
objectStep: first.response.resultStep,
@@ -255,7 +312,7 @@ const classifyFusePair = async (toOperation, pairIndex) => {
if (!kernelRestoredExactly) fail(`${pair} OCCT diagnostic probe did not restore exactly.`)
const persistence = await persistPair(pair, first.response.resultStep, first.namingEvidence, 'rejected')
return {
taskId: `TSN-PAIR-fuse-${toOperation}`,
taskId: `TSN-PAIR-${pairId}`,
pair,
classification: 'rejected',
reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave',
@@ -264,12 +321,12 @@ const classifyFusePair = async (toOperation, pairIndex) => {
rejection: { scope: 'second-operation-only', authority: 'freecad-document', parameter: spec.parameter, trajectory, kernelAttempts, kernelRestoredExactly, persistence },
}
}
const attempts = trajectory.map((length) => captureRejectedStage(module, { ...secondDefinition, length }))
const attempts = trajectory.map((value) => captureRejectedStage(module, { ...secondDefinition, [spec.parameter]: value }))
const stableRejection = attempts.every((attempt) => rejectionSignature(attempt) === rejectionSignature(attempts[0]))
if (!stableRejection) fail(`${pair} rejection changed across its parameter trajectory.`)
const persistence = await persistPair(pair, first.response.resultStep, first.namingEvidence, 'rejected')
return {
taskId: `TSN-PAIR-fuse-${toOperation}`,
taskId: `TSN-PAIR-${pairId}`,
pair,
classification: 'rejected',
reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave',
@@ -290,7 +347,7 @@ const classifyFusePair = async (toOperation, pairIndex) => {
if (!mutationChanged || !restoredExactly) fail(`${pair} mutation did not change and restore native geometry/history.`)
const persistence = await persistPair(pair, second.response.resultStep, second.namingEvidence, 'accepted')
return {
taskId: `TSN-PAIR-fuse-${toOperation}`,
taskId: `TSN-PAIR-${pairId}`,
pair,
classification: 'accepted',
reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass',
@@ -306,8 +363,10 @@ const classifyFusePair = async (toOperation, pairIndex) => {
}
}
const operations = ['fuse', 'cut', 'common', 'rotate', 'pad', 'pocket', 'loft', 'pipe', 'revolution', 'groove', 'fillet', 'chamfer', 'hole', 'draft', 'thickness', 'linear-pattern', 'polar-pattern', 'mirrored', 'multi-transform']
const orderedPairPrefix = [...operations.map((toOperation) => ['fuse', toOperation]), ['cut', 'fuse'], ['cut', 'cut'], ['cut', 'common'], ['cut', 'pad'], ['cut', 'pocket'], ['cut', 'loft'], ['cut', 'pipe'], ['cut', 'revolution'], ['cut', 'groove'], ['cut', 'fillet'], ['cut', 'chamfer'], ['cut', 'hole'], ['cut', 'draft'], ['cut', 'thickness'], ['cut', 'linear-pattern'], ['cut', 'polar-pattern'], ['cut', 'mirrored'], ['cut', 'multi-transform'], ['common', 'fuse'], ['common', 'cut'], ['common', 'common'], ['common', 'rotate'], ['common', 'pad'], ['common', 'pocket'], ['common', 'loft'], ['common', 'pipe'], ['common', 'revolution'], ['common', 'groove'], ['common', 'fillet'], ['common', 'chamfer'], ['common', 'hole'], ['common', 'draft'], ['common', 'thickness'], ['common', 'linear-pattern'], ['common', 'polar-pattern'], ['common', 'mirrored'], ['common', 'multi-transform']]
const classifications = []
for (const [index, operation] of ['fuse', 'cut', 'common', 'rotate', 'pad', 'pocket', 'loft', 'pipe'].entries()) classifications.push(await classifyFusePair(operation, index))
for (const [index, [fromOperation, toOperation]] of orderedPairPrefix.entries()) classifications.push(await classifyPair(fromOperation, toOperation, index))
const [artifacts, executorHarness, matrixHarness, resaveHarness] = await Promise.all([
Promise.all(artifactNames.map(async (name) => {

View File

@@ -1,132 +1,653 @@
• 本项目应继续以锁定的 FreeCAD 1.1.1 为基线。当前已有可运行的 Web CAD 兼
容基线但距离“全部功能对标”仍较远exact 任务为 5/52 completed34 个
模块中 0 exact / 26 compatible / 5 proxy / 3 development。
# FreeCAD 后续工作
详细机器账本见 config/freecad-web-exact-parity-plan.json:1当前执行总
览见 docs/freecad-web-execution-master-plan.zh-CN.md:194。
## 1. 文档定位
需要完善的工作
本文是后续工作的人工入口,不维护会随任务推进变化的统计数字。执行时以下列机器产物为准:
工作域 当前主要缺口 完成标准
━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━
原生 Oracle 1111 个命令已完成三态 每个 TypeId、Property、
清册,但只有 Pad 命令 Command、Task 和对话框
族完成成功、禁用、失 都有原生成功与负向证据
败、取消、恢复全流程
───────────────── ──────────────────────── ─────────────────────────
OCCT 几何内核 部分 builder 参数、容 每个操作的 Shape、质量
差、校验和失败诊断未穷 属性、拓扑、容差、错误
尽;原生 history 和资源释放与 FreeCAD 一
provider 尚未成为完整 致
默认链路
───────────────── ──────────────────────── ─────────────────────────
拓扑命名 仍有 7 个 PartDesign 零错绑、零未知漂移、
case/20 个恢复阶段未分 361/361 组合分类、允许
类;五阶段链存在 3 个 组合全部使用真实
通用 Shape 代理361 builder
个有序操作对只完成 4
───────────────── ──────────────────────── ─────────────────────────
Property 系统 85 种 Property 中仍有 默认值、边界值、状态、
58 种/523 条记录只能 编辑器、Undo/Redo、
opaque 保存 FCStd、Chrome 回放全部
闭合
───────────────── ──────────────────────── ─────────────────────────
Document/App observer 顺序、嵌套事 事务、DAG、失败恢复、链
务、局部重算、 接和对象生命周期与原生
Extension、 事件序列一致
FeaturePython、多文档
和合并恢复不完整
───────────────── ──────────────────────── ─────────────────────────
Sketcher 几何与约束已有较强基 每种几何/约束/工具均通
线,但全部 overload、 过求解、编辑、取消、撤
失败消息、编辑工具、自 销、FCStd 和浏览器回放
动约束、虚拟空间和焦点
矩阵未闭合
───────────────── ──────────────────────── ─────────────────────────
Part 基本体和代表性 builder 所有注册 Part 命令、选
已实现,但全部参数、 项和 TypeId 均有原生差
Refine、Section/ 分证据
Slice、Healing、检查和
失败分支未穷尽
───────────────── ──────────────────────── ─────────────────────────
PartDesign Attachment 等独立切片 Pad 到 MultiTransform
已 exact其余特征的全 的每种模式、失败、Body
部模式组合仍未完成 Tip、Support、命名和
FCStd 均一致
───────────────── ──────────────────────── ─────────────────────────
FCStd 当前支持 23 个往返场景 FreeCAD→Web 修改
和未知资源保留,但未完 →FreeCAD 重开/再保存后
成所有对象、Property、 零未知语义差异
Extension、Shape 的可
编辑往返
───────────────── ──────────────────────── ─────────────────────────
数据格式 STEP/IGES 高级元数据、 15 种格式分别具备单位、
装配、颜色层级不完整; 元数据、失败、取消、大
部分 STL/OBJ/PLY/DXF/ 文件和往返报告
SVG/PDF 只读JT/IDF/
OpenSCAD 为代理
───────────────── ──────────────────────── ─────────────────────────
GUI 应用壳可用,但完整 每个工作台端到端流程与
MDI、动态命令状态、所 原生 GUI oracle 一致
有 Task/属性编辑器/对
话框、快捷键和焦点行为
未闭合
───────────────── ──────────────────────── ─────────────────────────
文档工作台 Draft、TechDraw、 对象、命令、表达式、
Spreadsheet、Plot 目前 TopoRef、导出和跨工作台
是兼容子集 引用全部往返
───────────────── ──────────────────────── ─────────────────────────
工程工作台 Assembly、BIM、 装配求解、IFC、曲面修
Surface、Mesh、 复、网格分析和材料继承
Material 均缺高级算法 全部闭合
和完整对象语义
───────────────── ──────────────────────── ─────────────────────────
分析与制造 FEM、CAM、Robot、 完整求解器/刀路/运动学/
Inspection、Points/RE 点云算法、结果对象、失
只有代表性实现 败与导出闭合
───────────────── ──────────────────────── ─────────────────────────
Python 与 Addon 当前沙箱不能运行完整 受控 Python API、宏、权
FreeCAD Python API桌 限、依赖隔离、签名、回
面插件无法原样运行 滚和资源配额完成
───────────────── ──────────────────────── ─────────────────────────
QA 与发布 Chrome 基线较完整,但 52/52 exact、34/34
跨 OS/GPU、长期运行、 exact、零未知指标、签名
全 locale 和完整无障碍 发布和回滚演练通过
认证未完成
1. `config/freecad-active-work-queue.json`
- 全部微任务、依赖、状态、退出条件和唯一 `nextTask` 的机器真值。
2. `docs/freecad-active-work-status.generated.zh-CN.md`
- 当前完成数、剩余数、里程碑状态和唯一活动任务的生成摘要。
3. `docs/freecad-follow-up-execution-plan.zh-CN.md`
- 后续里程碑顺序、A-I 九阶段完成定义和单轮执行协议。
4. `config/freecad-follow-up-task-progress.json`
- A-I 后续任务的完成证据账本;完成项必须形成连续前缀。
5. `config/freecad-ordered-operation-pair-classification.json`
- 19x19 有序操作对的原生接受/拒绝、builder、变异、诊断和 FCStd 证据。
各工作台的细分任务范围已列在 docs/freecad-complete-parity-backlog.zh-
CN.md:88 和 docs/freecad-full-parity-execution-wbs.zh-CN.md:55。
禁止在本文复制实时完成数或手工指定下一任务。需要查看状态时运行:
建议执行顺序
```bash
node -e "const q=require('./config/freecad-active-work-queue.json'); console.log(q.nextTask, q.summary)"
```
1. 先关闭 EX-ORA-01 和 EX-TSN-04不要继续横向增加工作台。
2. 完成 7 个剩余命名漂移 case、生产 Cut/Rotate 漂移和 361 个有序操作
对。
## 2. 当前执行原则
3. 按类型逐项完成 58 种 opaque Property
4. 关闭事务、observer、DAG、Extension、FeaturePython 和多文档语义
5. 按单特征纵向完成 Kernel、Sketcher、Part、PartDesign
6. 完成 FCStd 和 STEP/IGES/BREP 双向往返
7. 完成 GUI 全量工作流
8. 依次关闭文档、工程、分析制造和数据工作台
9. 最后处理 Python、Addon、代理模块和跨平台发布
- 基线固定为 FreeCAD 1.1.1 和仓库已锁定的原生提交
- 任意时刻只能有一个 `in_progress` 任务
- 每轮只处理 `config/freecad-active-work-queue.json` 中的 `nextTask`
- 前一里程碑未闭合时,后一里程碑保持 `pending`
- 原生拒绝是有效分类,不得为了 Web 侧接受而伪造通用 Shape 或隐藏 fallback
- 原生接受必须使用真实 builder并具备参数变异、恢复、history、naming 和 FCStd 往返证据
- 失败路径必须锁定失败阶段、精确诊断、空/无效 Shape 状态、事务回滚和文档无污染
- 动态状态只能由 `scripts/generate-freecad-active-work-queue.mjs` 生成。
立即执行入口
## 3. 后续里程碑顺序
当前唯一机器任务是 config/freecad-active-work-queue.json:1563。完成后
依次处理剩余 Pocket 系列、生产 Cut、生产 Rotate再进入 357 个未分类操
作对
1. 完成 `TSN-ORDERED-PAIRS` 的全部 19x19 操作对。
2. 为所有 opaque Property 类型补齐原生 codec 与往返证据。
3. 闭合 Document observer、事务、DAG、重算失败恢复、Extension、FeaturePython 和多文档语义
4. 逐个闭合核心建模操作的 A-I 九阶段证据。
5. 闭合 FCStd、STEP、IGES、BREP 和其他格式的双向往返。
6. 完成 GUI、文档工作台、工程工作台、分析制造、脚本与代理边界。
7. 完成跨浏览器、跨 OS/GPU、无障碍、locale、fuzz、长稳、签名发布和 exact promotion。
此外需要修复规划治理本身:
详细拆分和依赖关系只在机器队列与执行计划中维护。
- EX-TSN-04 的 blocker 文本仍写着旧的 1/11实际已经是 4/11。
- 早期 Backlog/WBS 仍包含过期完成度描述。
- 当前 487 项队列只细化了 GUI Oracle 和 TSN尚未为 Property、
Document、核心建模及 M10-M14 生成同等粒度的机器任务。
## 4. 单轮执行流程
- 必须让状态摘要由机器报告自动生成,禁止手工维护重复数字
1. 读取唯一 `nextTask`,确认依赖、输入 artifact 和退出条件
2. 只修改该任务所需的 oracle、实现、检查器和锁定报告。
3. 先运行真实 FreeCAD/OCCT/Chrome probe再运行只读 focused check。
4. 验证 Shape、Worker、OPFS、事务和文档对象集回到预期状态。
5. 运行相关 Facade、FCStd、TSN 和 execution-plan 门禁。
6. 所有退出条件通过后,重新生成 active-work queue 与状态页。
7. 确认队列恰好推进一个任务,没有跳号或第二个活动任务。
8. 运行 `git diff --check`、JSON/脚本校验和与风险相称的回归。
9. 发布点运行完整 `./npmw run verify`,再提交并推送。
每个能力应统一采用“原生清册、成功、失败/取消、参数变异、Facade 实现、
事务恢复、FCStd 往返、真实浏览器、能力提升”九步完成定义;缺任何一步只
能保持 compatible。
常用命令:
```bash
./npmw run probe:freecad-ordered-operation-pairs
./npmw run check:freecad-ordered-operation-pairs
./npmw run generate:freecad-active-work-queue
./npmw run check:execution-plan
git diff --check
```
## 5. A-I 完成定义
| 阶段 | 交付物 | 最低退出条件 |
| --- | --- | --- |
| A | 原生清册与前置 | TypeId、输入、默认值、依赖和适用性机器可读 |
| B | 原生成功证据 | 名义值和边界值的 Shape、拓扑、状态与诊断齐全 |
| C | 原生失败/取消证据 | 无效输入、禁用、取消和文档无污染可复现 |
| D | 参数变异/恢复 | 编辑、重算和恢复返回已分类的原生状态 |
| E | Facade 实现 | 生产路径无隐藏 fallbackUI 不直连内核 |
| F | 事务恢复 | abort、undo、redo、stale、失败和资源所有权闭合 |
| G | FCStd 往返 | FreeCAD-Web-FreeCAD 没有未知语义漂移 |
| H | 真实浏览器 | Chrome Worker、OPFS、UI 状态和资源释放通过 |
| I | 能力提升 | A-H 全过focused gate 与 exact blocker 同步 |
缺少任一阶段时,能力最多保持 `compatible` 或既有的显式 `proxy` 等级。
## 6. 最近完成证据
### `TSN-PAIR-cut-thickness`
`cut->thickness` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder以贯穿半体工具生成体积 `500` 的有效单 Solid 和 98 条原生 history。
- 下游使用真实 `BRepOffsetAPI_MakeThickSolid` builder对锁定的原生 Face 执行厚壳。
- 原凹腔 Cut 的非平凡厚壳轨迹存在原生 history 内容漂移,未被误记为恢复;任务改用仍由真实 Cut 产生的稳定单 Solid。
- `-0.4 -> -0.6 -> -0.4` offset 轨迹改变体积与面积,并精确恢复名义摘要、原始 history 哈希和语义 naming。
- 名义结果为有效 1 Solid体积 `129.056`,包含 38 条原生 history 记录。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-cut-draft`
`cut->draft` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepOffsetAPI_DraftAngle` builder对锁定的原生 Face、中性面和拉伸方向执行拔模。
- `5 -> 8 -> 5` 角度轨迹改变体积与面积,并精确恢复名义摘要和语义 naming。
- 名义结果为有效 1 Solid体积 `892.2556682`,包含 5 条原生 history 记录。
- 下游获得唯一 `native-evidence` naming且上游 Cut 证据在恢复态保持一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-cut-hole`
`cut->hole` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut` builder对 Cut 结果执行中心贯穿孔。
- `1 -> 1.5 -> 1` 半径轨迹改变体积、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `904.5840735`,包含 34 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-cut-chamfer`
`cut->chamfer` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepFilletAPI_MakeChamfer` builder对 Cut 结果执行全边倒角。
- `0.4 -> 0.6 -> 0.4` 距离轨迹改变体积与面积,并精确恢复名义摘要和语义 naming。
- 名义结果为有效 1 Solid体积 `926.8266667`,包含 298 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-cut-fillet`
`cut->fillet` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepFilletAPI_MakeFillet` builder对 Cut 结果执行全边圆角。
- `0.4 -> 0.6 -> 0.4` 半径轨迹改变体积与面积,并精确恢复名义摘要和语义 naming。
- 名义结果为有效 1 Solid体积 `931.9696595`,包含 298 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-cut-groove`
`cut->groove` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut` 双输入 builder对 Cut 结果执行旋转减料。
- `360 -> 180 -> 360` 角度轨迹改变拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `931.287611`,包含 18 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-cut-revolution`
`cut->revolution` 已完成原生拒绝分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- OCCT `BRepPrimAPI_MakeRevol` 在 `360 -> 270 -> 360` 角度轨迹中稳定拒绝 Cut Solid 输入,且不产生结果 Shape 或 history。
- FreeCAD `Part::Revolution` 使用同一 Cut Solid 作为 Source返回 `Solids are not Processed`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Cut 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定两阶段 builder、异常传输、精确诊断、回滚和持久化证据。
### `TSN-PAIR-cut-pipe`
`cut->pipe` 已完成原生拒绝分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- OCCT `BRepOffsetAPI_MakePipe` 在 `15 -> 12 -> 15` spine 长度轨迹中只生成无效 Shape该结果仅记为 kernel-invalid-result 诊断。
- FreeCAD `Part::Sweep` 对 Cut Solid section 返回 `A fatal error occurred when making the sweep`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Cut 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定 FreeCAD 决策权、OCCT 无效结果、精确失败信息、回滚和持久化证据。
### `TSN-PAIR-cut-loft`
`cut->loft` 已完成原生拒绝分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- OCCT `BRepOffsetAPI_ThruSections` 在 `false -> true -> false` ruled 轨迹中生成有效 Shape但该结果仅记为 kernel-superset 诊断。
- FreeCAD `Part::Loft` 对 Cut Solid section 返回 `Profile shape is not a single vertex, edge, wire nor face.`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Cut 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定 FreeCAD 决策权、OCCT 诊断、精确失败信息、回滚和持久化证据。
### `TSN-PAIR-cut-pocket`
`cut->pocket` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut` 双输入 builder对 Cut 结果执行减料拉伸。
- `5 -> 4 -> 5` 深度轨迹改变体积、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `906`,包含 70 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-cut-pad`
`cut->pad` 已完成原生拒绝分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- OCCT `BRepPrimAPI_MakePrism` 在 `5 -> 7.5 -> 5` 长度轨迹中稳定拒绝 Cut Solid 输入,且不产生结果 Shape 或 history。
- FreeCAD `PartDesign::Pad` 使用同一 Cut Solid 作为 Profile返回 `FeatureExtrusion: Length: Could not extrude the sketch!`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Cut 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定两阶段 builder、异常传输、精确诊断、回滚和持久化证据。
### `TSN-PAIR-cut-common`
`cut->common` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepAlgoAPI_Common` 双输入 builder对 Cut 结果执行布尔交集。
- `4 -> 5 -> 4` 工具 X 偏移轨迹改变体积、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `93`,包含 148 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-cut-cut`
`cut->cut` 已完成原生接受分类:
- 第一、第二阶段均使用真实 `BRepAlgoAPI_Cut` 双输入 builder。
- 上游 Cut 结果为有效 1 Solid体积 `936`,包含 22 条原生 history 记录。
- `3 -> 4 -> 3` 工具尺寸轨迹改变体积、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义下游结果为有效 1 Solid体积 `909`,包含 42 条原生 history 记录。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 锁定两阶段 builder、变异和恢复偏移后摘要不变的弱轨迹未被采用。
### `TSN-PAIR-cut-fuse`
`cut->fuse` 已完成原生接受分类,并验证分类器可跨起始操作保持连续前缀:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder对 Cut 结果执行布尔并集。
- `8 -> 9 -> 8` 工具 X 偏移轨迹改变几何并精确恢复名义摘要、history 和语义 naming。
- 名义结果为有效 1 Solid体积 `1011`,包含 52 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 同时锁定第一、第二 builder防止跨行后仍误报 Fuse 起点。
### `TSN-PAIR-fuse-multi-transform`
`fuse->multi-transform` 已完成原生接受分类,并闭合 Fuse 起始行的全部 19 个有序操作对:
- 上游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder并生成有效单 Solid。
- 下游使用 ordered `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder组合平移和镜像两步生成 4 个可追踪实例。
- `8 -> 9 -> 8` 首步 X 平移轨迹改变几何、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `2750`,包含 769 条原生 history 记录。
- 上游 Fuse naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
- 机器队列已从 Fuse 行末严格推进到下一行首项,没有跳号或第二个活动任务。
### `TSN-PAIR-fuse-mirrored`
`fuse->mirrored` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder并生成有效单 Solid。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder 生成内部平面镜像副本。
- `5 -> 6 -> 5` 镜像平面 X 原点轨迹改变几何、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `1150`,包含 224 条原生 history 记录。
- 上游 Fuse naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-polar-pattern`
`fuse->polar-pattern` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder并生成有效单 Solid。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder 生成绕 Z 轴的旋转副本阵列。
- `30 -> 45 -> 30` 角度轨迹改变几何、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `1510.7700496`,包含 178 条原生 history 记录。
- 上游 Fuse naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-linear-pattern`
`fuse->linear-pattern` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder并生成有效单 Solid。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder 生成重叠平移副本阵列。
- `8 -> 9 -> 8` X 平移轨迹改变几何、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `1875`,包含 141 条原生 history 记录。
- 完全分离时的 0-history 结果未被误记为接受focused gate 强制原生 source history 非空。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-thickness`
`fuse->thickness` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Fuse` 同形双输入 builder生成有效 6 面单 Solid 和 156 条原生 history。
- 下游使用真实 `BRepOffsetAPI_MakeThickSolid` builder对锁定的原生 Face 执行厚壳。
- `-0.4 -> -0.6 -> -0.4` offset 轨迹改变几何并精确恢复名义摘要、history 和语义 naming。
- 名义结果为有效 1 Solid体积 `187.456`,包含 38 条原生 history 记录。
- 原始部分重叠 Fuse 的 no-op 结果未被误记为接受focused gate 强制变异必须改变 Shape 摘要。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-draft`
`fuse->draft` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder并生成有效单 Solid。
- 下游使用真实 `BRepOffsetAPI_DraftAngle` builder对锁定的原生 Face、中性面和拉伸方向执行拔模。
- `5 -> 8 -> 5` 角度轨迹改变几何并精确恢复名义摘要、history 和语义 naming。
- 名义结果为有效 1 Solid体积 `1031.2556682`,包含 5 条原生 history 记录。
- 下游获得唯一 `native-evidence` naming且上游 Fuse 证据在恢复态保持一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-hole`
`fuse->hole` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder并生成有效单 Solid。
- 下游使用真实 `BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut` builder 执行中心贯穿孔。
- `1 -> 1.5 -> 1` 半径轨迹改变几何并精确恢复名义摘要、history 和语义 naming。
- 名义结果为有效 1 Solid体积 `1043.5840735`,包含 23 条原生 history 记录。
- 下游获得唯一 `native-evidence` naming且上游 Fuse 证据在恢复态保持一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-chamfer`
`fuse->chamfer` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder并生成有效单 Solid。
- 下游使用真实 `BRepFilletAPI_MakeChamfer` builder 对 Fuse 结果执行全边倒角。
- `0.4 -> 0.6 -> 0.4` 距离轨迹改变几何并精确恢复名义摘要、history 和语义 naming。
- 名义结果为有效 1 Solid体积 `1489.1413333`,包含 270 条原生 history 记录。
- 上游 Fuse naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-fillet`
`fuse->fillet` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder并生成有效单 Solid。
- 下游使用真实 `BRepFilletAPI_MakeFillet` builder 对 Fuse 结果执行全边圆角。
- `0.4 -> 0.6 -> 0.4` 半径轨迹改变几何并精确恢复名义摘要、history 和语义 naming。
- 名义结果为有效 1 Solid体积 `1495.2786299`,包含 270 条原生 history 记录。
- 上游 Fuse naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-groove`
`fuse->groove` 已完成原生接受分类:
- 生产路径使用真实 `BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut` 双输入 builder。
- `360 -> 180 -> 360` 角度轨迹改变几何与 history并精确恢复名义摘要和语义 naming。
- 名义结果为有效 1 Solid体积 `1070.287611`,包含 18 条原生 history 记录。
- 上游 Fuse naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-fuse-revolution`
`TSN-PAIR-fuse-revolution` 已完成原生分类:
- OCCT `BRepPrimAPI_MakeRevol` 在 `360 -> 270 -> 360` 参数轨迹中稳定拒绝 Fuse Solid 输入。
- FreeCAD `Part::Revolution` 返回 `Solids are not Processed`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`。
- transaction abort 后对象集与源 Shape 完整恢复。
- 干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定 builder、异常传输、诊断和回滚证据。
### `TSN-PAIR-cut-linear-pattern`
`cut->linear-pattern` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder 生成重叠平移副本阵列。
- `8 -> 9 -> 8` X 平移轨迹改变几何、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `1672`,包含 89 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据,机器队列严格推进一项。
### `TSN-PAIR-cut-polar-pattern`
`cut->polar-pattern` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder 生成绕 Z 轴的旋转副本阵列。
- `30 -> 45 -> 30` 角度轨迹改变几何、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `1361.9420727`,包含 160 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据,机器队列严格推进一项。
### `TSN-PAIR-cut-mirrored`
`cut->mirrored` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder 生成内部平面镜像副本。
- `5 -> 6 -> 5` 镜像平面 X 原点轨迹改变几何、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `968`,包含 230 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据,机器队列严格推进一项。
### `TSN-PAIR-cut-multi-transform`
`cut->multi-transform` 已完成原生接受分类,并闭合 Cut 起始行的全部 19 个有序操作对:
- 上游使用真实 `BRepAlgoAPI_Cut` 双输入 builder生成有效单 Solid 和 22 条原生 history。
- 下游使用 ordered `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder组合平移和镜像两步生成 4 个可追踪实例。
- `8 -> 9 -> 8` 首步 X 平移轨迹改变几何、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `2440`,包含 670 条原生 history 记录。
- 上游 Cut naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据,机器队列已从 Cut 行末严格推进到 Common 行首项。
### `TSN-PAIR-common-fuse`
`common->fuse` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder以体积交叠生成有效 1 Solid体积 `125`,并包含 94 条原生 history。
- 下游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder重叠合并 Common 结果与工具体。
- `8 -> 7 -> 8` 工具 X 偏移轨迹改变体积与边界并精确恢复名义摘要、history 与语义 naming。
- 名义下游结果为有效 1 Solid体积 `225`,包含 66 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 Common 上游构造、两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-cut`
`common->cut` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepAlgoAPI_Cut` 双输入 builder对 Common 结果执行布尔减料。
- `4 -> 3 -> 4` 工具尺寸轨迹改变体积与 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `93`,包含 64 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-common`
`common->common` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游再次使用真实 `BRepAlgoAPI_Common` 双输入 builder两个锁定工具位置都与上游 Solid 存在体积交叠。
- `7 -> 6 -> 7` 工具 X 偏移轨迹使体积从 `32` 变为 `48`并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 121 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-rotate`
`common->rotate` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform` 单输入 builder对 Common 结果执行绕 Z 轴旋转。
- `15 -> 22.5 -> 15` 角度轨迹在保持体积 `125` 的同时改变包围盒,并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid包含 78 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-pad`
`common->pad` 已完成原生拒绝分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- OCCT `BRepPrimAPI_MakePrism` 在 `5 -> 7.5 -> 5` 长度轨迹中稳定拒绝 Common Solid 输入,且不产生结果 Shape 或 history。
- FreeCAD `PartDesign::Pad` 使用同一 Common Solid 作为 Profile返回 `FeatureExtrusion: Length: Could not extrude the sketch!`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Common 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定两阶段 builder、异常传输、精确诊断、回滚和持久化证据。
### `TSN-PAIR-common-pocket`
`common->pocket` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder在原点处生成体积 `125` 的有效单 Solid 和 105 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut` 双输入 builder对 Common 结果执行减料拉伸。
- `5 -> 4 -> 5` 深度轨迹改变体积、拓扑和 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `95`,包含 64 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定上游实体交叠、两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-loft`
`common->loft` 已完成原生拒绝分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- OCCT `BRepOffsetAPI_ThruSections` 在 `false -> true -> false` ruled 轨迹中生成有效 Shape但该结果仅记为 kernel-superset 诊断。
- FreeCAD `Part::Loft` 对 Common Solid section 返回 `Profile shape is not a single vertex, edge, wire nor face.`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Common 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定 FreeCAD 决策权、OCCT 诊断、精确失败信息、回滚和持久化证据。
### `TSN-PAIR-common-pipe`
`common->pipe` 已完成原生拒绝分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- OCCT `BRepOffsetAPI_MakePipe` 在 `15 -> 12 -> 15` spine 长度轨迹中只生成无效 Shape该结果仅记为 kernel-invalid-result 诊断。
- FreeCAD `Part::Sweep` 对 Common Solid section 返回 `A fatal error occurred when making the sweep`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Common 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定 FreeCAD 决策权、OCCT 无效结果、精确失败信息、回滚和持久化证据。
### `TSN-PAIR-common-revolution`
`common->revolution` 已完成原生拒绝分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- OCCT `BRepPrimAPI_MakeRevol` 在 `360 -> 270 -> 360` 角度轨迹中稳定拒绝 Common Solid 输入,且不产生结果 Shape 或 history。
- FreeCAD `Part::Revolution` 使用同一 Common Solid 作为 Source返回 `Solids are not Processed`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Common 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定两阶段 builder、异常传输、精确诊断、回滚和持久化证据。
### `TSN-PAIR-common-groove`
`common->groove` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder在原点处生成体积 `125` 的有效单 Solid 和 105 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut` 双输入 builder对 Common 结果执行旋转减料。
- `360 -> 180 -> 360` 角度轨迹改变拓扑与 history并精确恢复名义摘要与语义 naming。
- 名义结果为有效 1 Solid体积 `120.287611`,包含 28 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定上游实体交叠、两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-fillet`
`common->fillet` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder对 Common 结果执行全边圆角。
- `0.4 -> 0.6 -> 0.4` 半径轨迹改变体积与面积并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid体积 `123.0255334`,包含 150 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-chamfer`
`common->chamfer` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepFilletAPI_MakeChamfer` 单输入 builder对 Common 结果执行全边倒角。
- `0.4 -> 0.6 -> 0.4` 距离轨迹改变体积与面积并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid体积 `120.5413333`,包含 150 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-hole`
`common->hole` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut` builder对 Common 结果执行边界角贯穿孔。
- `1 -> 1.5 -> 1` 半径轨迹改变体积与面积并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid体积 `117.1460184`,包含 30 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-draft`
`common->draft` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepOffsetAPI_DraftAngle` 单输入 builder对 Common 结果的锁定原生 Face 执行拔模。
- `5 -> 8 -> 5` 角度轨迹改变体积与面积并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid体积 `119.5319585`,包含 5 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-thickness`
`common->thickness` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepOffsetAPI_MakeThickSolid` 单输入 builder对 Common 结果的锁定原生 Face 执行厚壳。
- `-0.4 -> -0.6 -> -0.4` offset 轨迹改变体积与面积并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid体积 `43.856`,包含 38 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-linear-pattern`
`common->linear-pattern` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder将 Common 结果平移复制并融合为一个可追踪 Solid。
- 原 `8` 单位平移会产生两个分离 Solid 且无可用 history未被误记为接受改用保持实体交叠的 `4 -> 3 -> 4` 轨迹。
- 专用平移轨迹使体积在 `225 -> 200 -> 225` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 66 条原生 history 记录。
- 上游 Common naming 证据向下游传播FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定专用变异轨迹、两阶段 builder、输入数、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-polar-pattern`
`common->polar-pattern` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder将 Common 结果绕锁定原生轴旋转复制并融合。
- `30 -> 45 -> 30` 角度轨迹改变体积、拓扑与边界,体积在 `220.0961894 -> 247.5 -> 220.0961894` 间变化,并精确恢复原生摘要与语义 naming。
- 名义结果为有效 1 Solid包含 48 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-mirrored`
`common->mirrored` 已完成原生接受分类:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder将 Common 结果绕锁定平面镜像复制并融合。
- `5 -> 6 -> 5` 镜像面 X 原点轨迹改变体积与边界,体积在 `200 -> 150 -> 200` 间变化,并精确恢复原生摘要与语义 naming。
- 名义结果为有效 1 Solid包含 66 条原生 history 记录。
- 上游 Common naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-common-multi-transform`
`common->multi-transform` 已完成原生接受分类,并闭合 Common 起始行的全部 19 个有序操作对:
- 上游使用真实 `BRepAlgoAPI_Common` 双输入 builder生成体积 `125` 的有效单 Solid 和 94 条原生 history。
- 下游使用 ordered `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder组合平移和镜像两步并保留每个实例的原生追踪关系。
- 默认 `8` 单位首步平移会形成 3 个分离 Solid未被误用改用保持全部实例连通的 `4 -> 3 -> 4` 专用轨迹。
- 首步 X 平移轨迹使体积在 `400 -> 350 -> 400` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid名义与恢复态均包含 367 条原生 history 记录。
- 上游 Common naming 证据向下游传播FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 ordered builder、专用变异轨迹、输入数、恢复、history、naming 和持久化证据。
后续任务必须从机器队列的最新 `nextTask` 继续,不在本文手工维护任务名称。