feat: classify rotate ordered pair row
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 11:39:58 -04:00
parent 1ee55b1338
commit 8ef796552d
6 changed files with 5263 additions and 354 deletions

View File

@@ -24,12 +24,12 @@
],
"followUpProgress": "config/freecad-follow-up-task-progress.json"
},
"nextTask": "TSN-PAIR-rotate-fuse",
"nextTask": "TSN-PAIR-pad-fuse",
"summary": {
"tasks": 1756,
"completed": 186,
"completed": 204,
"inProgress": 1,
"pending": 1569
"pending": 1551
},
"milestones": [
{
@@ -2495,101 +2495,131 @@
{
"id": "TSN-PAIR-rotate-fuse",
"title": "Classify ordered operation pair rotate->fuse",
"status": "in_progress",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-cut",
"title": "Classify ordered operation pair rotate->cut",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-common",
"title": "Classify ordered operation pair rotate->common",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-rotate",
"title": "Classify ordered operation pair rotate->rotate",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-pad",
"title": "Classify ordered operation pair rotate->pad",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-pocket",
"title": "Classify ordered operation pair rotate->pocket",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-loft",
"title": "Classify ordered operation pair rotate->loft",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-pipe",
"title": "Classify ordered operation pair rotate->pipe",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-revolution",
"title": "Classify ordered operation pair rotate->revolution",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-groove",
"title": "Classify ordered operation pair rotate->groove",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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"
},
{
@@ -2603,87 +2633,111 @@
{
"id": "TSN-PAIR-rotate-chamfer",
"title": "Classify ordered operation pair rotate->chamfer",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-hole",
"title": "Classify ordered operation pair rotate->hole",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-draft",
"title": "Classify ordered operation pair rotate->draft",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-thickness",
"title": "Classify ordered operation pair rotate->thickness",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-linear-pattern",
"title": "Classify ordered operation pair rotate->linear-pattern",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-polar-pattern",
"title": "Classify ordered operation pair rotate->polar-pattern",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-mirrored",
"title": "Classify ordered operation pair rotate->mirrored",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-rotate-multi-transform",
"title": "Classify ordered operation pair rotate->multi-transform",
"status": "pending",
"dependencies": [
"TSN-PROD-DRIFT-001"
],
"status": "completed",
"dependencies": [],
"pair": "rotate->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-pad-fuse",
"title": "Classify ordered operation pair pad->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-rotate-fuse`
- 微任务1756 total / 186 completed / 1 in_progress / 1569 pending
- 有序操作对:60/361 classified / 301 unknown
- 唯一活动任务:`TSN-PAIR-pad-fuse`
- 微任务1756 total / 204 completed / 1 in_progress / 1551 pending
- 有序操作对:78/361 classified / 283 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 | 60 | 1 | 300 | `TSN-PAIR-rotate-fuse` |
| `TSN-ORDERED-PAIRS` | 361 | 78 | 1 | 282 | `TSN-PAIR-pad-fuse` |
| `PROPERTY-CODECS` | 522 | 0 | 0 | 522 | `-` |
| `DOCUMENT-SEMANTICS` | 90 | 0 | 0 | 90 | `-` |
| `CORE-MODELING` | 171 | 0 | 0 | 171 | `-` |

View File

@@ -74,6 +74,24 @@ const expectedPairs = [
{ 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] },
{ pair: 'rotate->fuse', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepAlgoAPI_Fuse', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [8, 7, 8] },
{ pair: 'rotate->cut', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'toolSize', mutationTrajectory: [4, 3, 4] },
{ pair: 'rotate->common', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepAlgoAPI_Common', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [7, 6, 7] },
{ pair: 'rotate->rotate', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [15, 22.5, 15] },
{ pair: 'rotate->pad', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, 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: 'rotate->pocket', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'length', mutationTrajectory: [5, 4, 5] },
{ pair: 'rotate->loft', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, 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: 'rotate->pipe', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, rejectionAuthority: 'freecad-document', kernelOutcome: 'accepted', secondBuilder: 'BRepOffsetAPI_MakePipe', secondInputCount: 2, mutationParameter: 'spineLength', mutationTrajectory: [15, 12, 15], nativeTypeId: 'Part::Sweep', freeCadDiagnostic: 'A fatal error occurred when making the sweep' },
{ pair: 'rotate->revolution', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakeRevol', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [360, 270, 360], nativeTypeId: 'Part::Revolution', freeCadDiagnostic: 'BRep_API: command not done' },
{ pair: 'rotate->groove', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'angle', mutationTrajectory: [360, 180, 360] },
{ pair: 'rotate->chamfer', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepFilletAPI_MakeChamfer', secondInputCount: 1, mutationParameter: 'distance', mutationTrajectory: [0.4, 0.6, 0.4] },
{ pair: 'rotate->hole', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [1, 1.5, 1] },
{ pair: 'rotate->draft', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepOffsetAPI_DraftAngle', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [5, 8, 5] },
{ pair: 'rotate->thickness', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepOffsetAPI_MakeThickSolid', secondInputCount: 1, mutationParameter: 'offset', mutationTrajectory: [-0.4, -0.6, -0.4] },
{ pair: 'rotate->linear-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'translationX', mutationTrajectory: [8, 9, 8] },
{ pair: 'rotate->polar-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [30, 45, 30] },
{ pair: 'rotate->mirrored', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'planeOriginX', mutationTrajectory: [5, 6, 5] },
{ pair: 'rotate->multi-transform', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepBuilderAPI_Transform', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)', secondInputCount: 1, mutationParameter: 'multiTranslationX', mutationTrajectory: [8, 9, 8] },
]
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()) {
@@ -116,6 +134,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: 56, accepted: 44, rejected: 12, unknown: 305 }
const expectedSummary = { registeredOperations: 19, orderedPairs: 361, classifiedPairs: 74, accepted: 58, rejected: 16, unknown: 287 }
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

@@ -74,6 +74,9 @@ const pairSpecOverrides = {
'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 },
'rotate->fuse': { ...operationSpecs.fuse, nominal: { toolSize: 5, toolOffset: 8 }, edited: { toolSize: 5, toolOffset: 7 }, beforeValue: 8, editedValue: 7 },
'rotate->common': { ...operationSpecs.common, nominal: { toolSize: 5, toolOffset: 7 }, edited: { toolSize: 5, toolOffset: 6 }, beforeValue: 7, editedValue: 6 },
'rotate->pipe': { ...operationSpecs.pipe, kernelOutcome: 'accepted' },
}
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 }) => {
@@ -364,7 +367,7 @@ const classifyPair = async (fromOperation, 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 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'], ['rotate', 'fuse'], ['rotate', 'cut'], ['rotate', 'common'], ['rotate', 'rotate'], ['rotate', 'pad'], ['rotate', 'pocket'], ['rotate', 'loft'], ['rotate', 'pipe'], ['rotate', 'revolution'], ['rotate', 'groove'], ['rotate', 'chamfer'], ['rotate', 'hole'], ['rotate', 'draft'], ['rotate', 'thickness'], ['rotate', 'linear-pattern'], ['rotate', 'polar-pattern'], ['rotate', 'mirrored'], ['rotate', 'multi-transform']]
const classifications = []
for (const [index, [fromOperation, toOperation]] of orderedPairPrefix.entries()) classifications.push(await classifyPair(fromOperation, toOperation, index))

View File

@@ -650,4 +650,215 @@ git diff --check
- 上游 Common naming 证据向下游传播FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 ordered builder、专用变异轨迹、输入数、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-fuse`
`rotate->fuse` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder对 Rotate 结果执行布尔并集。
- 默认工具 X 偏移 `12` 会产生两个分离 Solid 且 history 为空,未被误记为接受;改用保持实体交叠的 `8 -> 7 -> 8` 专用轨迹。
- 工具偏移轨迹使体积在 `1107.0432067 -> 1092.0913015 -> 1107.0432067` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 39 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、专用变异轨迹、输入数、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-cut`
`rotate->cut` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepAlgoAPI_Cut` 双输入 builder对 Rotate 结果执行布尔减料。
- `4 -> 3 -> 4` 工具尺寸轨迹改变体积与面积,体积在 `953.1487483 -> 981.4403996 -> 953.1487483` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 53 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、输入数、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-common`
`rotate->common` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepAlgoAPI_Common` 双输入 builder对 Rotate 结果执行布尔交集。
- 默认工具 X 偏移 `10` 与旋转实体无交叠并被原生 builder 拒绝,未被误记为接受;改用 `7 -> 6 -> 7` 专用轨迹。
- 工具偏移轨迹使交集体积在 `32.9086985 -> 49.2003498 -> 32.9086985` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 136 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、专用变异轨迹、输入数、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-rotate`
`rotate->rotate` 已完成原生接受分类:
- 上下游均使用真实 `BRepBuilderAPI_Transform` 单输入 builder两阶段均生成有效单 Solid 和 78 条原生 history。
- `15 -> 22.5 -> 15` 角度轨迹保持体积 `1000` 和拓扑不变,但明确改变世界空间边界,未因体积不变而误判为无变异。
- 恢复态精确返回名义摘要、原生 history 与语义 naming。
- 上游 Rotate naming 证据向下游传播,下游获得完整原生证据。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定两阶段 builder、边界变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-pad`
`rotate->pad` 已完成原生拒绝分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- OCCT `BRepPrimAPI_MakePrism` 在 `5 -> 7.5 -> 5` 长度轨迹中稳定拒绝 Rotate Solid 输入,且不产生结果 Shape 或 history。
- FreeCAD `PartDesign::Pad` 使用同一 Rotate Solid 作为 Profile返回 `FeatureExtrusion: Length: Could not extrude the sketch!`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Rotate 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定跨行首阶段 builder、异常传输、精确诊断、回滚和持久化证据。
### `TSN-PAIR-rotate-pocket`
`rotate->pocket` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut` 双输入 builder对 Rotate 结果执行减料拉伸。
- `5 -> 4 -> 5` 深度轨迹改变体积与面积,体积在 `972.6794919 -> 978.1435935 -> 972.6794919` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 56 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、两输入减料、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-loft`
`rotate->loft` 已完成原生拒绝分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- OCCT `BRepOffsetAPI_ThruSections` 在 `false -> true -> false` ruled 轨迹中生成有效 Shape 和 24 条 history但该结果仅记为 kernel-superset 诊断。
- FreeCAD `Part::Loft` 对 Rotate Solid section 返回 `Profile shape is not a single vertex, edge, wire nor face.`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Rotate 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定 FreeCAD 决策权、OCCT 超集诊断、精确失败信息、回滚和持久化证据。
### `TSN-PAIR-rotate-pipe`
`rotate->pipe` 已完成原生拒绝分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- OCCT `BRepOffsetAPI_MakePipe` 在 `15 -> 12 -> 15` spine 长度轨迹中生成体积 `1500 -> 1200 -> 1500` 的有效单 Solid 和 28 条 history但该结果仅记为 kernel-superset 诊断。
- FreeCAD `Part::Sweep` 对 Rotate Solid section 返回 `A fatal error occurred when making the sweep`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Rotate 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定 FreeCAD 决策权、OCCT 超集诊断、精确失败信息、回滚和持久化证据。
### `TSN-PAIR-rotate-revolution`
`rotate->revolution` 已完成原生拒绝分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- OCCT `BRepPrimAPI_MakeRevol` 在 `360 -> 270 -> 360` 角度轨迹中稳定拒绝 Rotate Solid 输入,三次均在 builder 阶段传输原生 C++ 异常,且不产生结果 Shape 或 history。
- FreeCAD `Part::Revolution` 使用同一 Rotate Solid 作为 Source返回该操作对专有诊断 `BRep_API: command not done`。
- FreeCAD 结果 Shape 为空、状态包含 `Invalid`,拒绝任务没有伪造下游 naming 或变异证据。
- transaction abort 后对象集与 Rotate 源 Shape 完整恢复,干净 FCStd save/reopen/resave 三阶段一致。
- focused ordered-pair gate 已锁定跨行首阶段 builder、异常传输、精确诊断、回滚和持久化证据。
### `TSN-PAIR-rotate-groove`
`rotate->groove` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut` 双输入 builder对 Rotate 结果执行旋转槽减料。
- `360 -> 180 -> 360` 角度轨迹改变体积与拓扑:名义态体积为 `992.0171547`、10 Face编辑态体积为 `1000`、8 Face并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 22 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、双输入减料、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-chamfer`
`rotate->chamfer` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepFilletAPI_MakeChamfer` 单输入 builder对 Rotate 结果的锁定原生边执行倒角。
- `0.4 -> 0.6 -> 0.4` 距离轨迹改变体积、面积与边界,体积在 `990.7413333 -> 979.552 -> 990.7413333` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 150 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、原生边选择、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-hole`
`rotate->hole` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut` 单输入 builder以锁定位置和方向的圆柱刀具贯穿 Rotate 结果。
- `1 -> 1.5 -> 1` 半径轨迹改变体积与面积,体积在 `968.5840735 -> 929.3141653 -> 968.5840735` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 23 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、圆柱减料、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-draft`
`rotate->draft` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepOffsetAPI_DraftAngle` 单输入 builder对 Rotate 结果的锁定原生 Face 执行拔模。
- `5 -> 8 -> 5` 角度轨迹改变体积与面积,体积在 `956.2556682 -> 929.7295826 -> 956.2556682` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 5 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、原生 Face 选择、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-thickness`
`rotate->thickness` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepOffsetAPI_MakeThickSolid` 单输入 builder对 Rotate 结果的锁定原生 Face 执行厚壳。
- `-0.4 -> -0.6 -> -0.4` offset 轨迹改变体积与面积,体积在 `187.456 -> 272.064 -> 187.456` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 38 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、原生 Face 选择、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-linear-pattern`
`rotate->linear-pattern` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder将 Rotate 结果沿 X 方向平移复制并融合为一个可追踪 Solid。
- `8 -> 9 -> 8` 平移轨迹保持实例交叠,体积在 `1819.7958971 -> 1899.7703843 -> 1819.7958971` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 48 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、单 Solid 约束、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-polar-pattern`
`rotate->polar-pattern` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder将 Rotate 结果绕锁定 Z 轴旋转复制并融合。
- `30 -> 45 -> 30` 角度轨迹改变体积、面积与边界,体积在 `1422.6497308 -> 1585.7864376 -> 1422.6497308` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 78 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、旋转实例融合、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-mirrored`
`rotate->mirrored` 已完成原生接受分类:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder将 Rotate 结果绕锁定平面镜像复制并融合。
- `5 -> 6 -> 5` 镜像面 X 原点轨迹改变体积、面积与边界,体积在 `1329.767789 -> 1517.3794222 -> 1329.767789` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid包含 80 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定跨行首阶段 builder、镜像实例融合、变异、恢复、history、naming 和持久化证据。
### `TSN-PAIR-rotate-multi-transform`
`rotate->multi-transform` 已完成原生接受分类,并闭合机器队列中 Rotate 起始行的剩余有序操作对:
- 上游使用真实 `BRepBuilderAPI_Transform` 单输入 builder生成体积 `1000` 的有效单 Solid 和 78 条原生 history。
- 下游使用 ordered `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder组合 X 平移和 X=5 镜像两步并保留每个实例的原生追踪关系。
- `8 -> 9 -> 8` 首步 X 平移轨迹保持全部实例连通,体积在 `2392.1349751 -> 2589.9081788 -> 2392.1349751` 间变化并精确恢复名义摘要、history 与语义 naming。
- 名义结果为有效 1 Solid名义与编辑态均包含 470 条原生 history 记录。
- 上游 Rotate naming 证据向下游传播,恢复态语义摘要与名义态一致。
- FreeCAD FCStd save/reopen/resave 三阶段的 Shape 与 naming evidence 稳定。
- focused ordered-pair gate 已锁定 ordered builder、单 Solid 约束、变异、恢复、history、naming 和持久化证据。
后续任务必须从机器队列的最新 `nextTask` 继续,不在本文手工维护任务名称。