From 03339a63606576873e0b7b40fa66892a0b063ab7 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Sun, 16 Aug 2026 01:02:00 -0400 Subject: [PATCH] feat: classify fillet ordered pair row --- config/freecad-active-work-queue.json | 228 +- ...ordered-operation-pair-classification.json | 5595 ++++++++++++++++- config/release-artifacts.json | 6 +- ...ecad-active-work-status.generated.zh-CN.md | 8 +- ...-ordered-operation-pair-classification.mjs | 41 +- .../freecad-ordered-operation-pair-resave.py | 38 +- ...-ordered-operation-pair-classification.mjs | 29 +- 后续工作.txt | 182 + 8 files changed, 6011 insertions(+), 116 deletions(-) diff --git a/config/freecad-active-work-queue.json b/config/freecad-active-work-queue.json index 6021adc..3ec7348 100644 --- a/config/freecad-active-work-queue.json +++ b/config/freecad-active-work-queue.json @@ -24,12 +24,12 @@ ], "followUpProgress": "config/freecad-follow-up-task-progress.json" }, - "nextTask": "TSN-PAIR-groove-multi-transform", + "nextTask": "TSN-PAIR-chamfer-cut", "summary": { "tasks": 1756, - "completed": 317, + "completed": 337, "inProgress": 1, - "pending": 1438 + "pending": 1418 }, "milestones": [ { @@ -4206,181 +4206,235 @@ { "id": "TSN-PAIR-groove-multi-transform", "title": "Classify ordered operation pair groove->multi-transform", - "status": "in_progress", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "groove->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-fillet-fuse", "title": "Classify ordered operation pair fillet->fuse", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-cut", "title": "Classify ordered operation pair fillet->cut", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-common", "title": "Classify ordered operation pair fillet->common", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-rotate", "title": "Classify ordered operation pair fillet->rotate", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-pad", "title": "Classify ordered operation pair fillet->pad", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-pocket", "title": "Classify ordered operation pair fillet->pocket", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-loft", "title": "Classify ordered operation pair fillet->loft", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-pipe", "title": "Classify ordered operation pair fillet->pipe", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-revolution", "title": "Classify ordered operation pair fillet->revolution", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-groove", "title": "Classify ordered operation pair fillet->groove", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-fillet", "title": "Classify ordered operation pair fillet->fillet", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->fillet", + "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-fillet-chamfer", "title": "Classify ordered operation pair fillet->chamfer", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->chamfer", + "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-fillet-hole", "title": "Classify ordered operation pair fillet->hole", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-draft", "title": "Classify ordered operation pair fillet->draft", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->draft", + "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-fillet-thickness", "title": "Classify ordered operation pair fillet->thickness", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->thickness", + "classification": "rejected", + "evidence": [ + "config/freecad-ordered-operation-pair-classification.json", + "native-and-freecad-profile-no-op-with-clean-resave" + ], "exit": "native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence" }, { "id": "TSN-PAIR-fillet-linear-pattern", "title": "Classify ordered operation pair fillet->linear-pattern", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-fillet-polar-pattern", "title": "Classify ordered operation pair fillet->polar-pattern", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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" }, { @@ -4394,27 +4448,33 @@ { "id": "TSN-PAIR-fillet-multi-transform", "title": "Classify ordered operation pair fillet->multi-transform", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "fillet->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-chamfer-fuse", "title": "Classify ordered operation pair chamfer->fuse", - "status": "pending", - "dependencies": [ - "TSN-PROD-DRIFT-001" - ], + "status": "completed", + "dependencies": [], "pair": "chamfer->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-chamfer-cut", "title": "Classify ordered operation pair chamfer->cut", - "status": "pending", + "status": "in_progress", "dependencies": [ "TSN-PROD-DRIFT-001" ], diff --git a/config/freecad-ordered-operation-pair-classification.json b/config/freecad-ordered-operation-pair-classification.json index 54d8806..60486f3 100644 --- a/config/freecad-ordered-operation-pair-classification.json +++ b/config/freecad-ordered-operation-pair-classification.json @@ -10,8 +10,8 @@ "nativeProbe": { "executor": { "path": "scripts/run-freecad-ordered-operation-pair-classification.mjs", - "bytes": 42111, - "sha256": "50c092be06b50afce576d57dfc96f9e7b32218805a35749aae3ecd647e06cd9b" + "bytes": 44852, + "sha256": "53c2c0bf200a5c8c5edd2a8f6f1c9816ea8784b671a76d9d1df344efcd531280" }, "matrix": { "path": "scripts/freecad-naming-production-matrix.mjs", @@ -20,8 +20,8 @@ }, "resave": { "path": "scripts/freecad-ordered-operation-pair-resave.py", - "bytes": 17630, - "sha256": "d2705080d26136ac635ed0031d6f93e78ff78876baaa570d4a9819e02377e6dd" + "bytes": 20178, + "sha256": "d1340dcac2f364dc3cc1fa5fe51758fac6b960ebfa5ca3ed4526b6fb663d128b" }, "artifacts": [ { @@ -50356,14 +50356,5593 @@ "schemaVersion": 1, "status": "pass" } + }, + { + "taskId": "TSN-PAIR-groove-multi-transform", + "pair": "groove->multi-transform", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "groove", + "builder": "BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 10, + "edges": 24, + "vertices": 16, + "volume": 995.287611, + "area": 606.5663706, + "bounds": [ + -2e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 18, + "selectedRecords": 6, + "ambiguousResults": 6, + "historySha256": "27178e896a90b674464ea8cdfbd25a369b8ca785bb2c8e6716d298999eb87f75", + "namingEvidenceSha256": "c6cfe8649fbeb23549d901e9d67bad1c265d63dcc9ec2eb4945027cb417dd900", + "namingSemanticSha256": "bc670add40d0f62544609ed89edf2328501f916b75aff99923b62894b14aebc7" + }, + "second": { + "operation": "multi-transform", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 24, + "edges": 52, + "vertices": 32, + "volume": 2600, + "area": 1240, + "bounds": [ + -8.0000001, + -1e-7, + -1e-7, + 18.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 525, + "selectedRecords": 24, + "ambiguousResults": 84, + "historySha256": "fe88b35f1c1ffae95e60d968e9448114babe5a6a95e610e5754106e230c0c5d9", + "namingEvidenceSha256": "1fc798e7e92e7f9124532f29ccf26b75ad329d1fadd047b1d252fb8795979324", + "namingSemanticSha256": "78860c1dc6c9a980912522b16aed9127ec866b1dd1ecabd6397e863c130f7196" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "multiTranslationX", + "trajectory": [ + 8, + 9, + 8 + ], + "beforeValue": 8, + "editedValue": 9, + "restoredValue": 8, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "multi-transform", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 40, + "edges": 90, + "vertices": 52, + "volume": 2797.6768884, + "area": 1332.826563, + "bounds": [ + -9.0000002, + -2e-7, + -2e-7, + 19.0000002, + 10.0000002, + 10.0000002 + ] + }, + "historyRecords": 596, + "selectedRecords": 38, + "ambiguousResults": 126, + "historySha256": "5a5dcc4a396ebaa4b4ee6d4b59d53050ca1c4596e27acb5f5aede9277a3b74f2", + "namingEvidenceSha256": "d7ce6c2a7629defc3a8ca6890a38869120643afb574c5bed91fc37f6e91eda2a", + "namingSemanticSha256": "619b98e29e01ccba674cffb6289f8f18c724e48c2e260090f53973696a73c510" + }, + "restoredEvidence": { + "operation": "multi-transform", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 24, + "edges": 52, + "vertices": 32, + "volume": 2600, + "area": 1240, + "bounds": [ + -8.0000001, + -1e-7, + -1e-7, + 18.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 525, + "selectedRecords": 24, + "ambiguousResults": 84, + "historySha256": "fe88b35f1c1ffae95e60d968e9448114babe5a6a95e610e5754106e230c0c5d9", + "namingEvidenceSha256": "ef3c67698adc8e755adc4ef0f451b25383fa6240728ebd7ba49c86435773acbd", + "namingSemanticSha256": "78860c1dc6c9a980912522b16aed9127ec866b1dd1ecabd6397e863c130f7196" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "groove->multi-transform", + "phases": { + "initial": { + "namingEvidenceBytes": 55075, + "namingEvidenceSha256": "1fc798e7e92e7f9124532f29ccf26b75ad329d1fadd047b1d252fb8795979324", + "pair": "groove->multi-transform", + "shape": { + "area": 1240, + "bounds": [ + -8, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 52, + "faces": 24, + "solids": 1, + "valid": true, + "vertices": 32, + "volume": 2600 + } + }, + "reopened": { + "namingEvidenceBytes": 55075, + "namingEvidenceSha256": "1fc798e7e92e7f9124532f29ccf26b75ad329d1fadd047b1d252fb8795979324", + "pair": "groove->multi-transform", + "shape": { + "area": 1240, + "bounds": [ + -8, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 52, + "faces": 24, + "solids": 1, + "valid": true, + "vertices": 32, + "volume": 2600 + } + }, + "resaved": { + "namingEvidenceBytes": 55075, + "namingEvidenceSha256": "1fc798e7e92e7f9124532f29ccf26b75ad329d1fadd047b1d252fb8795979324", + "pair": "groove->multi-transform", + "shape": { + "area": 1240, + "bounds": [ + -8, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 52, + "faces": 24, + "solids": 1, + "valid": true, + "vertices": 32, + "volume": 2600 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-fuse", + "pair": "fillet->fuse", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "deeae67b70e123cc3966524f0c7bfbc84bb90abf3b73dd3c5dbae63c2ad246f6", + "namingSemanticSha256": "43c0a0bf5f607e8bd3dd6bcc3cf8b0894add80d9269d507da30ce929f1d47d7d" + }, + "second": { + "operation": "fuse", + "builder": "BRepAlgoAPI_Fuse", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 33, + "edges": 75, + "vertices": 37, + "volume": 1071.3666774, + "area": 641.4028264, + "bounds": [ + -2e-7, + -2e-7, + -2e-7, + 13.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 79, + "selectedRecords": 8, + "ambiguousResults": 24, + "historySha256": "e61c0941c22ec975cb3ce0bfaf8dd37760314c8aa871f80f9c3eb1a41360ae85", + "namingEvidenceSha256": "0dcf0b9ee2fee9187f81634b96b3342951ac94070d8dfbb22eed79118a3e0042", + "namingSemanticSha256": "4de2d7454a36c2b2a7f60300789af6da89533ffebe45a82e21f6bab5924ed5ea" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "toolOffsetX", + "trajectory": [ + 8, + 7, + 8 + ], + "beforeValue": 8, + "editedValue": 7, + "restoredValue": 8, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "fuse", + "builder": "BRepAlgoAPI_Fuse", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 33, + "edges": 75, + "vertices": 37, + "volume": 1046.4010137, + "area": 621.5745079, + "bounds": [ + -2e-7, + -2e-7, + -2e-7, + 12.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 79, + "selectedRecords": 8, + "ambiguousResults": 24, + "historySha256": "e61c0941c22ec975cb3ce0bfaf8dd37760314c8aa871f80f9c3eb1a41360ae85", + "namingEvidenceSha256": "9fa436e15db7a8e4f9110ae30cef0977df25e907ab2d9752ee6d5237fb915ddf", + "namingSemanticSha256": "4de2d7454a36c2b2a7f60300789af6da89533ffebe45a82e21f6bab5924ed5ea" + }, + "restoredEvidence": { + "operation": "fuse", + "builder": "BRepAlgoAPI_Fuse", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 33, + "edges": 75, + "vertices": 37, + "volume": 1071.3666774, + "area": 641.4028264, + "bounds": [ + -2e-7, + -2e-7, + -2e-7, + 13.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 79, + "selectedRecords": 8, + "ambiguousResults": 24, + "historySha256": "e61c0941c22ec975cb3ce0bfaf8dd37760314c8aa871f80f9c3eb1a41360ae85", + "namingEvidenceSha256": "e6b7148bb697afad6160902808dc11c8bcc83448e56cd1e045c227f828622cfc", + "namingSemanticSha256": "4de2d7454a36c2b2a7f60300789af6da89533ffebe45a82e21f6bab5924ed5ea" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->fuse", + "phases": { + "initial": { + "namingEvidenceBytes": 10861, + "namingEvidenceSha256": "0dcf0b9ee2fee9187f81634b96b3342951ac94070d8dfbb22eed79118a3e0042", + "pair": "fillet->fuse", + "shape": { + "area": 641.4028264, + "bounds": [ + 0, + 0, + 0, + 13, + 10, + 10 + ], + "edges": 75, + "faces": 33, + "solids": 1, + "valid": true, + "vertices": 37, + "volume": 1071.3666774 + } + }, + "reopened": { + "namingEvidenceBytes": 10861, + "namingEvidenceSha256": "0dcf0b9ee2fee9187f81634b96b3342951ac94070d8dfbb22eed79118a3e0042", + "pair": "fillet->fuse", + "shape": { + "area": 641.4028264, + "bounds": [ + 0, + 0, + 0, + 13, + 10, + 10 + ], + "edges": 75, + "faces": 33, + "solids": 1, + "valid": true, + "vertices": 37, + "volume": 1071.3666774 + } + }, + "resaved": { + "namingEvidenceBytes": 10861, + "namingEvidenceSha256": "0dcf0b9ee2fee9187f81634b96b3342951ac94070d8dfbb22eed79118a3e0042", + "pair": "fillet->fuse", + "shape": { + "area": 641.4028264, + "bounds": [ + 0, + 0, + 0, + 13, + 10, + 10 + ], + "edges": 75, + "faces": 33, + "solids": 1, + "valid": true, + "vertices": 37, + "volume": 1071.3666774 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-cut", + "pair": "fillet->cut", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "2677be199316c87fb9e95db035823385f2bb3902fd34deac1c871a971f83269d", + "namingSemanticSha256": "0e9a381a1c794681e2b3a76324ebd83fe13e5a48153c513a959b58aef1ee0db6" + }, + "second": { + "operation": "cut", + "builder": "BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 31, + "edges": 71, + "vertices": 34, + "volume": 932.1027009, + "area": 611.8350384, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 42, + "selectedRecords": 4, + "ambiguousResults": 12, + "historySha256": "5103e4ee18f4098e5680858eb0864707e17f4acf97078a0bbf0352816d0890bf", + "namingEvidenceSha256": "23d5c0fcd0857053df71e9d169f1784d39067be66636881a07a2ae539f9c2d63", + "namingSemanticSha256": "ca0468b6593d72f360bce6fd05eeabc46ea841c34e58a20f31b9f8d39c2647f4" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "toolSize", + "trajectory": [ + 4, + 3, + 4 + ], + "beforeValue": 4, + "editedValue": 3, + "restoredValue": 4, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "cut", + "builder": "BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 31, + "edges": 71, + "vertices": 34, + "volume": 969.0683646, + "area": 597.6633569, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 42, + "selectedRecords": 4, + "ambiguousResults": 12, + "historySha256": "5103e4ee18f4098e5680858eb0864707e17f4acf97078a0bbf0352816d0890bf", + "namingEvidenceSha256": "8f2b6e15626ceedb53a3a04fed0cdbe653e9beac8cd9ab25f9e6b930ed8956ef", + "namingSemanticSha256": "ca0468b6593d72f360bce6fd05eeabc46ea841c34e58a20f31b9f8d39c2647f4" + }, + "restoredEvidence": { + "operation": "cut", + "builder": "BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 31, + "edges": 71, + "vertices": 34, + "volume": 932.1027009, + "area": 611.8350384, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 42, + "selectedRecords": 4, + "ambiguousResults": 12, + "historySha256": "5103e4ee18f4098e5680858eb0864707e17f4acf97078a0bbf0352816d0890bf", + "namingEvidenceSha256": "1e8b28216bfff4652ebacc4c561c5f1f18f10fca9efd35e4e54c0a1d2e4a8842", + "namingSemanticSha256": "ca0468b6593d72f360bce6fd05eeabc46ea841c34e58a20f31b9f8d39c2647f4" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->cut", + "phases": { + "initial": { + "namingEvidenceBytes": 5865, + "namingEvidenceSha256": "23d5c0fcd0857053df71e9d169f1784d39067be66636881a07a2ae539f9c2d63", + "pair": "fillet->cut", + "shape": { + "area": 611.8350384, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 71, + "faces": 31, + "solids": 1, + "valid": true, + "vertices": 34, + "volume": 932.1027009 + } + }, + "reopened": { + "namingEvidenceBytes": 5865, + "namingEvidenceSha256": "23d5c0fcd0857053df71e9d169f1784d39067be66636881a07a2ae539f9c2d63", + "pair": "fillet->cut", + "shape": { + "area": 611.8350384, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 71, + "faces": 31, + "solids": 1, + "valid": true, + "vertices": 34, + "volume": 932.1027009 + } + }, + "resaved": { + "namingEvidenceBytes": 5865, + "namingEvidenceSha256": "23d5c0fcd0857053df71e9d169f1784d39067be66636881a07a2ae539f9c2d63", + "pair": "fillet->cut", + "shape": { + "area": 611.8350384, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 71, + "faces": 31, + "solids": 1, + "valid": true, + "vertices": 34, + "volume": 932.1027009 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-common", + "pair": "fillet->common", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "2f0fc1f81252c675c3ef1a6c2c18ca0d7fd06b135dae0e78c4c2e3d47c331392", + "namingSemanticSha256": "5d6192835d6c8415db4cbbcfaba345abcb4f3acb7dc8c3b4f1c673c5ed8ad355" + }, + "second": { + "operation": "common", + "builder": "BRepAlgoAPI_Common", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 10, + "edges": 22, + "vertices": 13, + "volume": 74.5643421, + "area": 107.6424772, + "bounds": [ + 6.9999999, + -2e-7, + -2e-7, + 10.0000001, + 5.0000001, + 5.0000001 + ] + }, + "historyRecords": 360, + "selectedRecords": 4, + "ambiguousResults": 16, + "historySha256": "1e679b51aea9e5841b92734afee2534c698859eb1fcea1cba38b3258e136bbe4", + "namingEvidenceSha256": "ddadc4c1de303efdc801dfa474b11b6f4085fbd2ed0ff05e9b7c4c3645bff3b9", + "namingSemanticSha256": "74f3abe7e0e8fffe51a45156f9e30952d39d345efc6b67a46341412b1645835b" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "toolOffsetX", + "trajectory": [ + 7, + 6, + 7 + ], + "beforeValue": 7, + "editedValue": 6, + "restoredValue": 7, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "common", + "builder": "BRepAlgoAPI_Common", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 10, + "edges": 22, + "vertices": 13, + "volume": 99.5300058, + "area": 127.4707957, + "bounds": [ + 5.9999999, + -2e-7, + -2e-7, + 10.0000001, + 5.0000001, + 5.0000001 + ] + }, + "historyRecords": 360, + "selectedRecords": 4, + "ambiguousResults": 16, + "historySha256": "1e679b51aea9e5841b92734afee2534c698859eb1fcea1cba38b3258e136bbe4", + "namingEvidenceSha256": "bad6897810ab66dd3d146894b1ca4b1a863786bd0039cedaaebad9ff4bb8716d", + "namingSemanticSha256": "74f3abe7e0e8fffe51a45156f9e30952d39d345efc6b67a46341412b1645835b" + }, + "restoredEvidence": { + "operation": "common", + "builder": "BRepAlgoAPI_Common", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 10, + "edges": 22, + "vertices": 13, + "volume": 74.5643421, + "area": 107.6424772, + "bounds": [ + 6.9999999, + -2e-7, + -2e-7, + 10.0000001, + 5.0000001, + 5.0000001 + ] + }, + "historyRecords": 360, + "selectedRecords": 4, + "ambiguousResults": 16, + "historySha256": "1e679b51aea9e5841b92734afee2534c698859eb1fcea1cba38b3258e136bbe4", + "namingEvidenceSha256": "396f67bf840ced6d98f7567a5ed237d8ca17bdec8eb8fb24e34bdfd550bdf44e", + "namingSemanticSha256": "74f3abe7e0e8fffe51a45156f9e30952d39d345efc6b67a46341412b1645835b" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->common", + "phases": { + "initial": { + "namingEvidenceBytes": 6662, + "namingEvidenceSha256": "ddadc4c1de303efdc801dfa474b11b6f4085fbd2ed0ff05e9b7c4c3645bff3b9", + "pair": "fillet->common", + "shape": { + "area": 107.6424772, + "bounds": [ + 7, + 0, + 0, + 10, + 5, + 5 + ], + "edges": 22, + "faces": 10, + "solids": 1, + "valid": true, + "vertices": 13, + "volume": 74.5643421 + } + }, + "reopened": { + "namingEvidenceBytes": 6662, + "namingEvidenceSha256": "ddadc4c1de303efdc801dfa474b11b6f4085fbd2ed0ff05e9b7c4c3645bff3b9", + "pair": "fillet->common", + "shape": { + "area": 107.6424772, + "bounds": [ + 7, + 0, + 0, + 10, + 5, + 5 + ], + "edges": 22, + "faces": 10, + "solids": 1, + "valid": true, + "vertices": 13, + "volume": 74.5643421 + } + }, + "resaved": { + "namingEvidenceBytes": 6662, + "namingEvidenceSha256": "ddadc4c1de303efdc801dfa474b11b6f4085fbd2ed0ff05e9b7c4c3645bff3b9", + "pair": "fillet->common", + "shape": { + "area": 107.6424772, + "bounds": [ + 7, + 0, + 0, + 10, + 5, + 5 + ], + "edges": 22, + "faces": 10, + "solids": 1, + "valid": true, + "vertices": 13, + "volume": 74.5643421 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-rotate", + "pair": "fillet->rotate", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "92475e02f67558363934420894e13bb39bb9cc98e4f591fbd08af4fe129e9744", + "namingSemanticSha256": "1c37794d1d3dbfceca22297c3ca8aea62939287bf396f0a4af9203e6640c7762" + }, + "second": { + "operation": "rotate", + "builder": "BRepBuilderAPI_Transform", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -2.4982926, + 0.0898978, + -1e-7, + 9.5693604, + 12.1575509, + 10.0000001 + ] + }, + "historyRecords": 338, + "selectedRecords": 14, + "ambiguousResults": 92, + "historySha256": "a2d163702e4528c1d8477f6247d6db087bd691ba51dc770ae8df7c570002eda9", + "namingEvidenceSha256": "c2c9dca84fc27769f3a5104dbc0bda71c8e64950f2026f25e8edd8e61fdbd4e6", + "namingSemanticSha256": "f7bf22691470b7ef7e618c723bd3cc9d4039eb497cae6dd293e0daf877b50c52" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "angle", + "trajectory": [ + 15, + 22.5, + 15 + ], + "beforeValue": 15, + "editedValue": 22.5, + "restoredValue": 15, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "rotate", + "builder": "BRepBuilderAPI_Transform", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -3.7042092, + 0.1226251, + -1e-7, + 9.1161702, + 12.9430046, + 10.0000001 + ] + }, + "historyRecords": 338, + "selectedRecords": 14, + "ambiguousResults": 92, + "historySha256": "a2d163702e4528c1d8477f6247d6db087bd691ba51dc770ae8df7c570002eda9", + "namingEvidenceSha256": "b1fe4aacec7ae3fa04842901b91e1a0ac794050e664e596e3dcce33ae5a7d0bf", + "namingSemanticSha256": "f7bf22691470b7ef7e618c723bd3cc9d4039eb497cae6dd293e0daf877b50c52" + }, + "restoredEvidence": { + "operation": "rotate", + "builder": "BRepBuilderAPI_Transform", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -2.4982926, + 0.0898978, + -1e-7, + 9.5693604, + 12.1575509, + 10.0000001 + ] + }, + "historyRecords": 338, + "selectedRecords": 14, + "ambiguousResults": 92, + "historySha256": "a2d163702e4528c1d8477f6247d6db087bd691ba51dc770ae8df7c570002eda9", + "namingEvidenceSha256": "45b5a4dfcbbcf8d83b0aac74b8ba1121150a185dc71b34afd73c1f03822e4ffc", + "namingSemanticSha256": "f7bf22691470b7ef7e618c723bd3cc9d4039eb497cae6dd293e0daf877b50c52" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->rotate", + "phases": { + "initial": { + "namingEvidenceBytes": 47207, + "namingEvidenceSha256": "c2c9dca84fc27769f3a5104dbc0bda71c8e64950f2026f25e8edd8e61fdbd4e6", + "pair": "fillet->rotate", + "shape": { + "area": 579.2169851, + "bounds": [ + -2.4982925, + 0.0898979, + 0, + 9.5693603, + 12.1575508, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "reopened": { + "namingEvidenceBytes": 47207, + "namingEvidenceSha256": "c2c9dca84fc27769f3a5104dbc0bda71c8e64950f2026f25e8edd8e61fdbd4e6", + "pair": "fillet->rotate", + "shape": { + "area": 579.2169851, + "bounds": [ + -2.4982925, + 0.0898979, + 0, + 9.5693603, + 12.1575508, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "resaved": { + "namingEvidenceBytes": 47207, + "namingEvidenceSha256": "c2c9dca84fc27769f3a5104dbc0bda71c8e64950f2026f25e8edd8e61fdbd4e6", + "pair": "fillet->rotate", + "shape": { + "area": 579.2169851, + "bounds": [ + -2.4982925, + 0.0898979, + 0, + 9.5693603, + 12.1575508, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-pad", + "pair": "fillet->pad", + "classification": "rejected", + "reasonCode": "native-builder-and-freecad-profile-reject-with-clean-resave", + "nativeDecision": "rejected", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "f45bd5ae844dba44b20c2abec332813ea7bdc004eb067266e4b29e6d8c6fb676", + "namingSemanticSha256": "a28bf18c2ef4dd5db3ffeda11f3ede54e824b6bffa2cb9ad97adc4a629cc2442" + }, + "rejection": { + "scope": "second-operation-only", + "authority": "occt-builder", + "parameter": "length", + "trajectory": [ + 5, + 7.5, + 5 + ], + "stable": true, + "attempts": [ + { + "operation": "pad", + "builder": "BRepPrimAPI_MakePrism", + "inputCount": 1, + "parameter": "length", + "parameterValue": 5, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "pad", + "builder": "BRepPrimAPI_MakePrism", + "inputCount": 1, + "parameter": "length", + "parameterValue": 7.5, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "pad", + "builder": "BRepPrimAPI_MakePrism", + "inputCount": 1, + "parameter": "length", + "parameterValue": 5, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + } + ], + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "documentStable": true, + "documentUnpolluted": true, + "freecadProfileAccepted": false, + "fuseSolidUsedAsInput": true, + "nativeFeatureConstructed": true, + "nativeFeatureRejected": true, + "objectSetRestored": true, + "recomputeStatusCaptured": true, + "sourceShapeRestored": true + }, + "decision": "rejected", + "diagnostic": { + "exception": null, + "exceptionType": null, + "input": { + "name": "Part__Feature", + "subelements": [], + "typeId": "Part::Feature" + }, + "inputShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "nativeTypeId": "PartDesign::Pad", + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "Body", + "typeId": "PartDesign::Body" + }, + { + "name": "Origin", + "typeId": "App::Origin" + }, + { + "name": "X_Axis", + "typeId": "App::Line" + }, + { + "name": "Y_Axis", + "typeId": "App::Line" + }, + { + "name": "Z_Axis", + "typeId": "App::Line" + }, + { + "name": "XY_Plane", + "typeId": "App::Plane" + }, + { + "name": "XZ_Plane", + "typeId": "App::Plane" + }, + { + "name": "YZ_Plane", + "typeId": "App::Plane" + }, + { + "name": "Origin001", + "typeId": "App::Point" + }, + { + "name": "PairResult", + "typeId": "PartDesign::Pad" + } + ], + "parameter": { + "name": "length", + "value": 5 + }, + "recomputeResult": true, + "shapeNull": true, + "shapeValid": false, + "state": [ + "Touched", + "Invalid" + ], + "statusString": "FeatureExtrusion: Length: Could not extrude the sketch!" + }, + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "nativeTypeId": "PartDesign::Pad", + "operation": "pad", + "pair": "fillet->pad", + "phases": { + "initial": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "reopened": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "resaved": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + } + }, + "rollback": { + "after": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "before": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "source": { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + }, + "status": "pass" + } + } + }, + { + "taskId": "TSN-PAIR-fillet-pocket", + "pair": "fillet->pocket", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "c95c683f7f7c383afca8a2f1a8ade1cb88b26d90f8710f12e41fe0c5bd5d8f84", + "namingSemanticSha256": "ff7ca8813a356fc0f96f30fb0c95b6042e5eaba34a732b2609cc86cfd783c64d" + }, + "second": { + "operation": "pocket", + "builder": "BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 28, + "edges": 64, + "vertices": 31, + "volume": 966.2980048, + "area": 580.8534457, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 100, + "selectedRecords": 6, + "ambiguousResults": 15, + "historySha256": "5946c9d2a508bc29abb3f7e56d2d573b44d7df6cfdd517eef514b1fc44c800e5", + "namingEvidenceSha256": "1e61959cf5f2fcc9ea0f674dca2bcad8999e35b19c91a93add30b3af37b7760b", + "namingSemanticSha256": "9ed0fede78dd846a8614a761a33d4b4a0ef59064b7795126ec7094a570caefb0" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "length", + "trajectory": [ + 5, + 4, + 5 + ], + "beforeValue": 5, + "editedValue": 4, + "restoredValue": 5, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "pocket", + "builder": "BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 28, + "edges": 64, + "vertices": 31, + "volume": 972.2636685, + "area": 580.6817643, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 100, + "selectedRecords": 6, + "ambiguousResults": 15, + "historySha256": "5946c9d2a508bc29abb3f7e56d2d573b44d7df6cfdd517eef514b1fc44c800e5", + "namingEvidenceSha256": "a811fd6066327d389988f4e275204dc4a4d352267dfa414f33c484f7ce7d7f61", + "namingSemanticSha256": "9ed0fede78dd846a8614a761a33d4b4a0ef59064b7795126ec7094a570caefb0" + }, + "restoredEvidence": { + "operation": "pocket", + "builder": "BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 28, + "edges": 64, + "vertices": 31, + "volume": 966.2980048, + "area": 580.8534457, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 100, + "selectedRecords": 6, + "ambiguousResults": 15, + "historySha256": "5946c9d2a508bc29abb3f7e56d2d573b44d7df6cfdd517eef514b1fc44c800e5", + "namingEvidenceSha256": "fffacc09e86ea9e29bdd994ac2613f2fb830db9363bb293c2d80ca4c7006163d", + "namingSemanticSha256": "9ed0fede78dd846a8614a761a33d4b4a0ef59064b7795126ec7094a570caefb0" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->pocket", + "phases": { + "initial": { + "namingEvidenceBytes": 7340, + "namingEvidenceSha256": "1e61959cf5f2fcc9ea0f674dca2bcad8999e35b19c91a93add30b3af37b7760b", + "pair": "fillet->pocket", + "shape": { + "area": 580.8534457, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 64, + "faces": 28, + "solids": 1, + "valid": true, + "vertices": 31, + "volume": 966.2980048 + } + }, + "reopened": { + "namingEvidenceBytes": 7340, + "namingEvidenceSha256": "1e61959cf5f2fcc9ea0f674dca2bcad8999e35b19c91a93add30b3af37b7760b", + "pair": "fillet->pocket", + "shape": { + "area": 580.8534457, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 64, + "faces": 28, + "solids": 1, + "valid": true, + "vertices": 31, + "volume": 966.2980048 + } + }, + "resaved": { + "namingEvidenceBytes": 7340, + "namingEvidenceSha256": "1e61959cf5f2fcc9ea0f674dca2bcad8999e35b19c91a93add30b3af37b7760b", + "pair": "fillet->pocket", + "shape": { + "area": 580.8534457, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 64, + "faces": 28, + "solids": 1, + "valid": true, + "vertices": 31, + "volume": 966.2980048 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-loft", + "pair": "fillet->loft", + "classification": "rejected", + "reasonCode": "freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave", + "nativeDecision": "rejected", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "795e24b819337fc5d14aca230898016b0134d074c8ef660a0f11a8986bf2366c", + "namingSemanticSha256": "dd6e2dfefae1df4560e733b7d5cf6b01c5d5515ec5baa038daddfbf4f47ee74e" + }, + "rejection": { + "scope": "second-operation-only", + "authority": "freecad-document", + "parameter": "ruled", + "trajectory": [ + false, + true, + false + ], + "kernelAttempts": [ + { + "operation": "loft", + "builder": "BRepOffsetAPI_ThruSections", + "inputCount": 2, + "parameter": "ruled", + "parameterValue": false, + "runtime": "occt-native", + "outcome": "accepted", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": true, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": true, + "solids": 1, + "faces": 6, + "edges": 12, + "vertices": 8, + "volume": 704.4, + "area": 552.5525865, + "bounds": [ + -1e-7, + -1e-7, + 0.3999999, + 10.0000001, + 10.0000001, + 15.0000001 + ] + }, + "historyRecords": 24, + "historySha256": "9f0ec53f6c7b6a6704cd926e6d16c24c51625ef328c2d89275f86d0ccda2ace7", + "authority": "kernel-superset-only" + }, + { + "operation": "loft", + "builder": "BRepOffsetAPI_ThruSections", + "inputCount": 2, + "parameter": "ruled", + "parameterValue": true, + "runtime": "occt-native", + "outcome": "accepted", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": true, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": true, + "solids": 1, + "faces": 6, + "edges": 12, + "vertices": 8, + "volume": 704.4, + "area": 552.5525865, + "bounds": [ + -1e-7, + -1e-7, + 0.3999999, + 10.0000001, + 10.0000001, + 15.0000001 + ] + }, + "historyRecords": 24, + "historySha256": "9f0ec53f6c7b6a6704cd926e6d16c24c51625ef328c2d89275f86d0ccda2ace7", + "authority": "kernel-superset-only" + }, + { + "operation": "loft", + "builder": "BRepOffsetAPI_ThruSections", + "inputCount": 2, + "parameter": "ruled", + "parameterValue": false, + "runtime": "occt-native", + "outcome": "accepted", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": true, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": true, + "solids": 1, + "faces": 6, + "edges": 12, + "vertices": 8, + "volume": 704.4, + "area": 552.5525865, + "bounds": [ + -1e-7, + -1e-7, + 0.3999999, + 10.0000001, + 10.0000001, + 15.0000001 + ] + }, + "historyRecords": 24, + "historySha256": "9f0ec53f6c7b6a6704cd926e6d16c24c51625ef328c2d89275f86d0ccda2ace7", + "authority": "kernel-superset-only" + } + ], + "kernelRestoredExactly": true, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "documentStable": true, + "documentUnpolluted": true, + "freecadProfileAccepted": false, + "fuseSolidUsedAsInput": true, + "nativeFeatureConstructed": true, + "nativeFeatureRejected": true, + "objectSetRestored": true, + "recomputeStatusCaptured": true, + "sourceShapeRestored": true + }, + "decision": "rejected", + "diagnostic": { + "exception": null, + "exceptionType": null, + "input": { + "sections": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "Section", + "typeId": "Part::Feature" + } + ] + }, + "inputShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "nativeTypeId": "Part::Loft", + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "Section", + "typeId": "Part::Feature" + }, + { + "name": "PairResult", + "typeId": "Part::Loft" + } + ], + "parameter": { + "name": "ruled", + "value": false + }, + "recomputeResult": true, + "shapeNull": true, + "shapeValid": false, + "state": [ + "Touched", + "Invalid" + ], + "statusString": "Profile shape is not a single vertex, edge, wire nor face." + }, + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "nativeTypeId": "Part::Loft", + "operation": "loft", + "pair": "fillet->loft", + "phases": { + "initial": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "reopened": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "resaved": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + } + }, + "rollback": { + "after": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "before": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "source": { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + }, + "status": "pass" + } + } + }, + { + "taskId": "TSN-PAIR-fillet-pipe", + "pair": "fillet->pipe", + "classification": "rejected", + "reasonCode": "freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave", + "nativeDecision": "rejected", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "c1fde0b49ab3bf250d0e494ce68d787fd000bcfcb5005282efb36305bb1c4fef", + "namingSemanticSha256": "eb488dd10fc5074a66d9c23c53548d318333b4b53a0ec13840c39e8ed351a576" + }, + "rejection": { + "scope": "second-operation-only", + "authority": "freecad-document", + "parameter": "spineLength", + "trajectory": [ + 15, + 12, + 15 + ], + "kernelAttempts": [ + { + "operation": "pipe", + "builder": "BRepOffsetAPI_MakePipe", + "inputCount": 2, + "parameter": "spineLength", + "parameterValue": 15, + "runtime": "occt-native", + "outcome": "invalid-result", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": false, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": false, + "solids": 1, + "faces": 6, + "edges": 12, + "vertices": 8, + "volume": 0, + "area": 445.28, + "bounds": [ + -1e-7, + 0.3999999, + 0.3999999, + 1e-7, + 9.6000001, + 24.6000001 + ] + }, + "historyRecords": 28, + "historySha256": "0b29085cd086854553f7e799c787527dddb9e1e7e798579dbb78cb09bb5d9d7c", + "authority": "kernel-invalid-result" + }, + { + "operation": "pipe", + "builder": "BRepOffsetAPI_MakePipe", + "inputCount": 2, + "parameter": "spineLength", + "parameterValue": 12, + "runtime": "occt-native", + "outcome": "invalid-result", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": false, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": false, + "solids": 1, + "faces": 6, + "edges": 12, + "vertices": 8, + "volume": 0, + "area": 390.08, + "bounds": [ + -1e-7, + 0.3999999, + 0.3999999, + 1e-7, + 9.6000001, + 21.6000001 + ] + }, + "historyRecords": 28, + "historySha256": "0b29085cd086854553f7e799c787527dddb9e1e7e798579dbb78cb09bb5d9d7c", + "authority": "kernel-invalid-result" + }, + { + "operation": "pipe", + "builder": "BRepOffsetAPI_MakePipe", + "inputCount": 2, + "parameter": "spineLength", + "parameterValue": 15, + "runtime": "occt-native", + "outcome": "invalid-result", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": false, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": false, + "solids": 1, + "faces": 6, + "edges": 12, + "vertices": 8, + "volume": 0, + "area": 445.28, + "bounds": [ + -1e-7, + 0.3999999, + 0.3999999, + 1e-7, + 9.6000001, + 24.6000001 + ] + }, + "historyRecords": 28, + "historySha256": "0b29085cd086854553f7e799c787527dddb9e1e7e798579dbb78cb09bb5d9d7c", + "authority": "kernel-invalid-result" + } + ], + "kernelRestoredExactly": true, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "documentStable": true, + "documentUnpolluted": true, + "freecadProfileAccepted": false, + "fuseSolidUsedAsInput": true, + "nativeFeatureConstructed": true, + "nativeFeatureRejected": true, + "objectSetRestored": true, + "recomputeStatusCaptured": true, + "sourceShapeRestored": true + }, + "decision": "rejected", + "diagnostic": { + "exception": null, + "exceptionType": null, + "input": { + "sections": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "spine": { + "name": "Spine", + "subelements": [], + "typeId": "Part::Feature" + } + }, + "inputShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "nativeTypeId": "Part::Sweep", + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "Spine", + "typeId": "Part::Feature" + }, + { + "name": "PairResult", + "typeId": "Part::Sweep" + } + ], + "parameter": { + "name": "spineLength", + "value": 15 + }, + "recomputeResult": true, + "shapeNull": true, + "shapeValid": false, + "state": [ + "Touched", + "Invalid" + ], + "statusString": "A fatal error occurred when making the sweep" + }, + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "nativeTypeId": "Part::Sweep", + "operation": "pipe", + "pair": "fillet->pipe", + "phases": { + "initial": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "reopened": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "resaved": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + } + }, + "rollback": { + "after": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "before": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "source": { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + }, + "status": "pass" + } + } + }, + { + "taskId": "TSN-PAIR-fillet-revolution", + "pair": "fillet->revolution", + "classification": "rejected", + "reasonCode": "native-builder-and-freecad-profile-reject-with-clean-resave", + "nativeDecision": "rejected", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "7d1c403f5e6f4afddb643cd15bd00cc10eb8d89cbf388982f1238636a2ac88bc", + "namingSemanticSha256": "ef4e2cc8014ee85637a236f170aa70bf9cf980e64fe54659816bd55090fea6aa" + }, + "rejection": { + "scope": "second-operation-only", + "authority": "occt-builder", + "parameter": "angle", + "trajectory": [ + 360, + 270, + 360 + ], + "stable": true, + "attempts": [ + { + "operation": "revolution", + "builder": "BRepPrimAPI_MakeRevol", + "inputCount": 1, + "parameter": "angle", + "parameterValue": 360, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "revolution", + "builder": "BRepPrimAPI_MakeRevol", + "inputCount": 1, + "parameter": "angle", + "parameterValue": 270, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "revolution", + "builder": "BRepPrimAPI_MakeRevol", + "inputCount": 1, + "parameter": "angle", + "parameterValue": 360, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + } + ], + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "documentStable": true, + "documentUnpolluted": true, + "freecadProfileAccepted": false, + "fuseSolidUsedAsInput": true, + "nativeFeatureConstructed": true, + "nativeFeatureRejected": true, + "objectSetRestored": true, + "recomputeStatusCaptured": true, + "sourceShapeRestored": true + }, + "decision": "rejected", + "diagnostic": { + "exception": null, + "exceptionType": null, + "input": { + "name": "Part__Feature", + "subelements": [], + "typeId": "Part::Feature" + }, + "inputShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "nativeTypeId": "Part::Revolution", + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "PairResult", + "typeId": "Part::Revolution" + } + ], + "parameter": { + "name": "angle", + "value": 360 + }, + "recomputeResult": true, + "shapeNull": true, + "shapeValid": false, + "state": [ + "Touched", + "Invalid" + ], + "statusString": "Solids are not Processed" + }, + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "nativeTypeId": "Part::Revolution", + "operation": "revolution", + "pair": "fillet->revolution", + "phases": { + "initial": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "reopened": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "resaved": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + } + }, + "rollback": { + "after": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "before": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "source": { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + }, + "status": "pass" + } + } + }, + { + "taskId": "TSN-PAIR-fillet-groove", + "pair": "fillet->groove", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "aece31fd96a29dd3000382bc7f0a6c498ff4bd2d202a29cdb5f54519961ba41c", + "namingSemanticSha256": "e27f1fda01b18af39c0b879a4afd64519308d8396290356556d659eb2882e4fa" + }, + "second": { + "operation": "groove", + "builder": "BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 30, + "edges": 68, + "vertices": 32, + "volume": 991.2529668, + "area": 585.7833557, + "bounds": [ + -2e-7, + -2e-7, + -2e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 18, + "selectedRecords": 6, + "ambiguousResults": 6, + "historySha256": "892b3438bfa8143f0215f0b98050b4f811a4f8a4cbebbcbfeb4f79ac9c98c140", + "namingEvidenceSha256": "a58a7e5a9bfc0403dfd69db0ef92efb1fb8a421f31060574ebe190139fa8f48a", + "namingSemanticSha256": "935c5ce5ce10a200af2409956487ba5d8b2772458d1ba22e99d797a41a67b28c" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "angle", + "trajectory": [ + 360, + 180, + 360 + ], + "beforeValue": 360, + "editedValue": 180, + "restoredValue": 360, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "groove", + "builder": "BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 27, + "edges": 60, + "vertices": 28, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 56, + "selectedRecords": 1, + "ambiguousResults": 5, + "historySha256": "43d9a2efeee2883c06d02219d2ce8e5096d788945b8bc28a7a3a50eef2a6475a", + "namingEvidenceSha256": "6e3682ff11062de707cba45a85739273e9fb600395974c481ea91d924b1e45c5", + "namingSemanticSha256": "b3fbb4c1ba5648c43fe299bf664cf6be018026a18194211146d1d1f819be8d6c" + }, + "restoredEvidence": { + "operation": "groove", + "builder": "BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 30, + "edges": 68, + "vertices": 32, + "volume": 991.2529668, + "area": 585.7833557, + "bounds": [ + -2e-7, + -2e-7, + -2e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 18, + "selectedRecords": 6, + "ambiguousResults": 6, + "historySha256": "892b3438bfa8143f0215f0b98050b4f811a4f8a4cbebbcbfeb4f79ac9c98c140", + "namingEvidenceSha256": "da5e5acf7a1d67d12d09d800ae6ccdfa2209931e4c96355ae61f3059bbcdda5b", + "namingSemanticSha256": "935c5ce5ce10a200af2409956487ba5d8b2772458d1ba22e99d797a41a67b28c" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->groove", + "phases": { + "initial": { + "namingEvidenceBytes": 5006, + "namingEvidenceSha256": "a58a7e5a9bfc0403dfd69db0ef92efb1fb8a421f31060574ebe190139fa8f48a", + "pair": "fillet->groove", + "shape": { + "area": 585.7833557, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 68, + "faces": 30, + "solids": 1, + "valid": true, + "vertices": 32, + "volume": 991.2529668 + } + }, + "reopened": { + "namingEvidenceBytes": 5006, + "namingEvidenceSha256": "a58a7e5a9bfc0403dfd69db0ef92efb1fb8a421f31060574ebe190139fa8f48a", + "pair": "fillet->groove", + "shape": { + "area": 585.7833557, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 68, + "faces": 30, + "solids": 1, + "valid": true, + "vertices": 32, + "volume": 991.2529668 + } + }, + "resaved": { + "namingEvidenceBytes": 5006, + "namingEvidenceSha256": "a58a7e5a9bfc0403dfd69db0ef92efb1fb8a421f31060574ebe190139fa8f48a", + "pair": "fillet->groove", + "shape": { + "area": 585.7833557, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 68, + "faces": 30, + "solids": 1, + "valid": true, + "vertices": 32, + "volume": 991.2529668 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-fillet", + "pair": "fillet->fillet", + "classification": "rejected", + "reasonCode": "native-builder-and-freecad-profile-reject-with-clean-resave", + "nativeDecision": "rejected", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "80a5c11aa94cf58a5d0b51e8c5b132930352dc91959645577fa6ee749c8744e9", + "namingSemanticSha256": "8abd8e068971505287691bb5f71a50df364477237fef6138fc0660a647bba64e" + }, + "rejection": { + "scope": "second-operation-only", + "authority": "occt-builder", + "parameter": "radius", + "trajectory": [ + 0.4, + 0.6, + 0.4 + ], + "stable": true, + "attempts": [ + { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "parameter": "radius", + "parameterValue": 0.4, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "parameter": "radius", + "parameterValue": 0.6, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "parameter": "radius", + "parameterValue": 0.4, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + } + ], + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "documentStable": true, + "documentUnpolluted": true, + "freecadProfileAccepted": false, + "fuseSolidUsedAsInput": true, + "nativeFeatureConstructed": true, + "nativeFeatureRejected": true, + "objectSetRestored": true, + "recomputeStatusCaptured": true, + "sourceShapeRestored": true + }, + "decision": "rejected", + "diagnostic": { + "exception": null, + "exceptionType": null, + "input": { + "name": "Part__Feature", + "subelements": [], + "typeId": "Part::Feature" + }, + "inputShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "nativeTypeId": "Part::Fillet", + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "PairResult", + "typeId": "Part::Fillet" + } + ], + "parameter": { + "name": "radius", + "value": 0.4 + }, + "recomputeResult": true, + "shapeNull": true, + "shapeValid": false, + "state": [ + "Touched", + "Invalid" + ], + "statusString": "There are no suitable edges for chamfer or fillet" + }, + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "nativeTypeId": "Part::Fillet", + "operation": "fillet", + "pair": "fillet->fillet", + "phases": { + "initial": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "reopened": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "resaved": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + } + }, + "rollback": { + "after": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "before": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "source": { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + }, + "status": "pass" + } + } + }, + { + "taskId": "TSN-PAIR-fillet-chamfer", + "pair": "fillet->chamfer", + "classification": "rejected", + "reasonCode": "native-builder-and-freecad-profile-reject-with-clean-resave", + "nativeDecision": "rejected", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "62e308e1321bdd85f45ca70660a28b9fe44f538eb9f9dc6b4e4c118bd3d8c018", + "namingSemanticSha256": "c17d82700d28c1dd070fc891163782cda3e7afa85915d051b10c4fa1f09403a1" + }, + "rejection": { + "scope": "second-operation-only", + "authority": "occt-builder", + "parameter": "distance", + "trajectory": [ + 0.4, + 0.6, + 0.4 + ], + "stable": true, + "attempts": [ + { + "operation": "chamfer", + "builder": "BRepFilletAPI_MakeChamfer", + "inputCount": 1, + "parameter": "distance", + "parameterValue": 0.4, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "chamfer", + "builder": "BRepFilletAPI_MakeChamfer", + "inputCount": 1, + "parameter": "distance", + "parameterValue": 0.6, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "chamfer", + "builder": "BRepFilletAPI_MakeChamfer", + "inputCount": 1, + "parameter": "distance", + "parameterValue": 0.4, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + } + ], + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "documentStable": true, + "documentUnpolluted": true, + "freecadProfileAccepted": false, + "fuseSolidUsedAsInput": true, + "nativeFeatureConstructed": true, + "nativeFeatureRejected": true, + "objectSetRestored": true, + "recomputeStatusCaptured": true, + "sourceShapeRestored": true + }, + "decision": "rejected", + "diagnostic": { + "exception": null, + "exceptionType": null, + "input": { + "name": "Part__Feature", + "subelements": [], + "typeId": "Part::Feature" + }, + "inputShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "nativeTypeId": "Part::Chamfer", + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "PairResult", + "typeId": "Part::Chamfer" + } + ], + "parameter": { + "name": "distance", + "value": 0.4 + }, + "recomputeResult": true, + "shapeNull": true, + "shapeValid": false, + "state": [ + "Touched", + "Invalid" + ], + "statusString": "There are no suitable edges for chamfer or fillet" + }, + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "nativeTypeId": "Part::Chamfer", + "operation": "chamfer", + "pair": "fillet->chamfer", + "phases": { + "initial": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "reopened": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "resaved": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + } + }, + "rollback": { + "after": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "before": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "source": { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + }, + "status": "pass" + } + } + }, + { + "taskId": "TSN-PAIR-fillet-hole", + "pair": "fillet->hole", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "8606312241a467decfe6e221b7f9f7a02051958e6c78f84ea520fd08cf087d5f", + "namingSemanticSha256": "58a21e9a944158f4eab783a9566e60526745a56fd025a057e59289281b677993" + }, + "second": { + "operation": "hole", + "builder": "BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "native-evidence", + "summary": { + "isValid": true, + "solids": 1, + "faces": 27, + "edges": 59, + "vertices": 26, + "volume": 964.5494292, + "area": 635.7656529, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 23, + "selectedRecords": 2, + "ambiguousResults": 0, + "historySha256": "b6eb4e958364df80a4357b9fecbc88d2477f5911b73d7c44e01ad52c53ab1b9f", + "namingEvidenceSha256": "5706fef0f710b3df22648c4fc3aababc88dd6494a80438ea32a47a745941a10a", + "namingSemanticSha256": "02b879d6dc6bb73fea4f32b7e5c92f2b0b0766ee854fab7ad98f531cc6430e86" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "radius", + "trajectory": [ + 1, + 1.5, + 1 + ], + "beforeValue": 1, + "editedValue": 1.5, + "restoredValue": 1, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "hole", + "builder": "BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "native-evidence", + "summary": { + "isValid": true, + "solids": 1, + "faces": 27, + "edges": 59, + "vertices": 26, + "volume": 925.279521, + "area": 659.3275978, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 23, + "selectedRecords": 2, + "ambiguousResults": 0, + "historySha256": "b6eb4e958364df80a4357b9fecbc88d2477f5911b73d7c44e01ad52c53ab1b9f", + "namingEvidenceSha256": "f38cea634d94a97adee996b258bd9718a64c0ab28011b8bf56e62ca130ed6c93", + "namingSemanticSha256": "02b879d6dc6bb73fea4f32b7e5c92f2b0b0766ee854fab7ad98f531cc6430e86" + }, + "restoredEvidence": { + "operation": "hole", + "builder": "BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "native-evidence", + "summary": { + "isValid": true, + "solids": 1, + "faces": 27, + "edges": 59, + "vertices": 26, + "volume": 964.5494292, + "area": 635.7656529, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 23, + "selectedRecords": 2, + "ambiguousResults": 0, + "historySha256": "b6eb4e958364df80a4357b9fecbc88d2477f5911b73d7c44e01ad52c53ab1b9f", + "namingEvidenceSha256": "c2d5068041581dad9f7593c67936ef6bd52d0b13bf57881e5bddc0e745c223a2", + "namingSemanticSha256": "02b879d6dc6bb73fea4f32b7e5c92f2b0b0766ee854fab7ad98f531cc6430e86" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->hole", + "phases": { + "initial": { + "namingEvidenceBytes": 1839, + "namingEvidenceSha256": "5706fef0f710b3df22648c4fc3aababc88dd6494a80438ea32a47a745941a10a", + "pair": "fillet->hole", + "shape": { + "area": 635.7656529, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 59, + "faces": 27, + "solids": 1, + "valid": true, + "vertices": 26, + "volume": 964.5494292 + } + }, + "reopened": { + "namingEvidenceBytes": 1839, + "namingEvidenceSha256": "5706fef0f710b3df22648c4fc3aababc88dd6494a80438ea32a47a745941a10a", + "pair": "fillet->hole", + "shape": { + "area": 635.7656529, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 59, + "faces": 27, + "solids": 1, + "valid": true, + "vertices": 26, + "volume": 964.5494292 + } + }, + "resaved": { + "namingEvidenceBytes": 1839, + "namingEvidenceSha256": "5706fef0f710b3df22648c4fc3aababc88dd6494a80438ea32a47a745941a10a", + "pair": "fillet->hole", + "shape": { + "area": 635.7656529, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 59, + "faces": 27, + "solids": 1, + "valid": true, + "vertices": 26, + "volume": 964.5494292 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-draft", + "pair": "fillet->draft", + "classification": "rejected", + "reasonCode": "native-builder-and-freecad-profile-reject-with-clean-resave", + "nativeDecision": "rejected", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "8a5ceba0f7cf758514d3929f113e083a4f28e13c4c24c7ad8be86b748750e868", + "namingSemanticSha256": "f43d94aefb71ae74fb1bf47424349911e5c002073980c48248a12990d9c20c31" + }, + "rejection": { + "scope": "second-operation-only", + "authority": "occt-builder", + "parameter": "angle", + "trajectory": [ + 5, + 8, + 5 + ], + "stable": true, + "attempts": [ + { + "operation": "draft", + "builder": "BRepOffsetAPI_DraftAngle", + "inputCount": 1, + "parameter": "angle", + "parameterValue": 5, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "draft", + "builder": "BRepOffsetAPI_DraftAngle", + "inputCount": 1, + "parameter": "angle", + "parameterValue": 8, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + }, + { + "operation": "draft", + "builder": "BRepOffsetAPI_DraftAngle", + "inputCount": 1, + "parameter": "angle", + "parameterValue": 5, + "runtime": "occt-native", + "outcome": "rejected", + "resultProduced": false, + "shapeProduced": false, + "historyProduced": false, + "rejectionStage": "builder", + "exceptionTransport": "emscripten-cpp-exception", + "thrownType": "number" + } + ], + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "documentStable": true, + "documentUnpolluted": true, + "freecadProfileAccepted": false, + "fuseSolidUsedAsInput": true, + "nativeFeatureConstructed": true, + "nativeFeatureRejected": true, + "objectSetRestored": true, + "recomputeStatusCaptured": true, + "sourceShapeRestored": true + }, + "decision": "rejected", + "diagnostic": { + "exception": null, + "exceptionType": null, + "input": { + "draftBaseBrepSha256": "6c38951b48841488744a07db1c733d9fb45c0ae15f63dba8fe526e11e64fefa1", + "name": "DraftBase", + "shapeSummaryTransferredExactly": true, + "sourceBrepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "sourceName": "Part__Feature", + "subelements": [ + "Face1" + ], + "typeId": "PartDesign::Feature" + }, + "inputShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "nativeTypeId": "PartDesign::Draft", + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "Body", + "typeId": "PartDesign::Body" + }, + { + "name": "Origin", + "typeId": "App::Origin" + }, + { + "name": "X_Axis", + "typeId": "App::Line" + }, + { + "name": "Y_Axis", + "typeId": "App::Line" + }, + { + "name": "Z_Axis", + "typeId": "App::Line" + }, + { + "name": "XY_Plane", + "typeId": "App::Plane" + }, + { + "name": "XZ_Plane", + "typeId": "App::Plane" + }, + { + "name": "YZ_Plane", + "typeId": "App::Plane" + }, + { + "name": "Origin001", + "typeId": "App::Point" + }, + { + "name": "DraftBase", + "typeId": "PartDesign::Feature" + }, + { + "name": "DatumPlane", + "typeId": "PartDesign::Plane" + }, + { + "name": "DatumLine", + "typeId": "PartDesign::Line" + }, + { + "name": "PairResult", + "typeId": "PartDesign::Draft" + } + ], + "parameter": { + "name": "angle", + "value": 5 + }, + "recomputeResult": true, + "shapeNull": true, + "shapeValid": false, + "state": [ + "Touched", + "Invalid" + ], + "statusString": "" + }, + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "nativeTypeId": "PartDesign::Draft", + "operation": "draft", + "pair": "fillet->draft", + "phases": { + "initial": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "reopened": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "resaved": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + } + }, + "rollback": { + "after": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "before": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "source": { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + }, + "status": "pass" + } + } + }, + { + "taskId": "TSN-PAIR-fillet-thickness", + "pair": "fillet->thickness", + "classification": "rejected", + "reasonCode": "native-and-freecad-profile-no-op-with-clean-resave", + "nativeDecision": "rejected", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "c753c25b9c203cb4627f323843f3be773bb9e6f2c2b4f07ffc947090dab92497", + "namingSemanticSha256": "569eef0d6a83cf93a1e55bade948a2370266582063fbdfc91af0544d4d2b60c5" + }, + "rejection": { + "scope": "second-operation-only", + "authority": "occt-no-op", + "parameter": "offset", + "trajectory": [ + -0.4, + -0.6, + -0.4 + ], + "kernelAttempts": [ + { + "operation": "thickness", + "builder": "BRepOffsetAPI_MakeThickSolid", + "inputCount": 1, + "parameter": "offset", + "parameterValue": -0.4, + "runtime": "occt-native", + "outcome": "no-op", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": true, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 1, + "historySha256": "c442a112b466339b076bd24c5b22da267b9def534d603c38621f27914a9c78fc", + "authority": "kernel-no-op" + }, + { + "operation": "thickness", + "builder": "BRepOffsetAPI_MakeThickSolid", + "inputCount": 1, + "parameter": "offset", + "parameterValue": -0.6, + "runtime": "occt-native", + "outcome": "no-op", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": true, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 1, + "historySha256": "c442a112b466339b076bd24c5b22da267b9def534d603c38621f27914a9c78fc", + "authority": "kernel-no-op" + }, + { + "operation": "thickness", + "builder": "BRepOffsetAPI_MakeThickSolid", + "inputCount": 1, + "parameter": "offset", + "parameterValue": -0.4, + "runtime": "occt-native", + "outcome": "no-op", + "resultProduced": true, + "shapeProduced": true, + "validShapeProduced": true, + "historyProduced": true, + "historyProvider": "occt-native", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 1, + "historySha256": "c442a112b466339b076bd24c5b22da267b9def534d603c38621f27914a9c78fc", + "authority": "kernel-no-op" + } + ], + "kernelRestoredExactly": true, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "documentStable": true, + "documentUnpolluted": true, + "freecadProfileAccepted": false, + "freecadProfileNoOp": true, + "fuseSolidUsedAsInput": true, + "nativeFeatureConstructed": true, + "nativeFeatureRejected": false, + "objectSetRestored": true, + "recomputeStatusCaptured": true, + "sourceShapeRestored": true + }, + "decision": "rejected", + "diagnostic": { + "exception": null, + "exceptionType": null, + "input": { + "name": "Part__Feature", + "subelements": [ + "Face2" + ], + "typeId": "Part::Feature" + }, + "inputShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "nativeTypeId": "Part::Thickness", + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + }, + { + "name": "PairResult", + "typeId": "Part::Thickness" + } + ], + "parameter": { + "name": "offset", + "value": -0.4 + }, + "recomputeResult": true, + "resultShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "shapeNull": false, + "shapeValid": true, + "state": [ + "Up-to-date" + ], + "statusString": "Valid" + }, + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "nativeTypeId": "Part::Thickness", + "operation": "thickness", + "pair": "fillet->thickness", + "phases": { + "initial": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "reopened": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + }, + "resaved": { + "objects": [ + { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + } + ] + } + }, + "rollback": { + "after": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + }, + "before": { + "objects": [ + { + "name": "Part__Feature", + "typeId": "Part::Feature" + } + ], + "sourceShape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + } + } + }, + "schemaVersion": 1, + "source": { + "name": "Part__Feature", + "shape": { + "area": 579.2169851, + "bounds": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "brepSha256": "ed3a1c5d2e34be37931d5914ecbb44696c1853da9e31e24b74cec9d8aa28aa92", + "edges": 56, + "faces": 26, + "solids": 1, + "valid": true, + "vertices": 24, + "volume": 995.9653557 + }, + "typeId": "Part::Feature" + }, + "status": "pass" + } + } + }, + { + "taskId": "TSN-PAIR-fillet-linear-pattern", + "pair": "fillet->linear-pattern", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "55e4978edf722d7a98458925d376828750d219f26f873e9f9013e3017f055a85", + "namingSemanticSha256": "c8e269c754d16139a29e15962a4409bf2dbb2b813fd9e4461faa6edaab6a451d" + }, + "second": { + "operation": "linear-pattern", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 42, + "edges": 88, + "vertices": 40, + "volume": 1794.8665943, + "area": 893.7231781, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 18.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 266, + "selectedRecords": 8, + "ambiguousResults": 32, + "historySha256": "cda6bd98592e2904a9252272c7848681c17944f4ec143e033a81190062824007", + "namingEvidenceSha256": "f05cd802acf446e1c507556f9914df1a77b09f3061d24542316f30d6a63dfd27", + "namingSemanticSha256": "3a23678d4912d55663b24b91dbd48b498e5561752df9d87d6e0f3e5d83a335ae" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "translationX", + "trajectory": [ + 8, + 9, + 8 + ], + "beforeValue": 8, + "editedValue": 9, + "restoredValue": 8, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "linear-pattern", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 42, + "edges": 88, + "vertices": 40, + "volume": 1894.7292492, + "area": 933.0364522, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 19.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 266, + "selectedRecords": 8, + "ambiguousResults": 32, + "historySha256": "cda6bd98592e2904a9252272c7848681c17944f4ec143e033a81190062824007", + "namingEvidenceSha256": "35de44d070eb7e6f24dd3341b0e0556f59094f0186f7f08ada6a44f7ef11395f", + "namingSemanticSha256": "3a23678d4912d55663b24b91dbd48b498e5561752df9d87d6e0f3e5d83a335ae" + }, + "restoredEvidence": { + "operation": "linear-pattern", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 42, + "edges": 88, + "vertices": 40, + "volume": 1794.8665943, + "area": 893.7231781, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 18.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 266, + "selectedRecords": 8, + "ambiguousResults": 32, + "historySha256": "cda6bd98592e2904a9252272c7848681c17944f4ec143e033a81190062824007", + "namingEvidenceSha256": "daf349c2c408ef9516cbf4df205d8e427d558b60843e483afa10ceb29a543e8c", + "namingSemanticSha256": "3a23678d4912d55663b24b91dbd48b498e5561752df9d87d6e0f3e5d83a335ae" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->linear-pattern", + "phases": { + "initial": { + "namingEvidenceBytes": 13218, + "namingEvidenceSha256": "f05cd802acf446e1c507556f9914df1a77b09f3061d24542316f30d6a63dfd27", + "pair": "fillet->linear-pattern", + "shape": { + "area": 893.7231781, + "bounds": [ + 0, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 88, + "faces": 42, + "solids": 1, + "valid": true, + "vertices": 40, + "volume": 1794.8665943 + } + }, + "reopened": { + "namingEvidenceBytes": 13218, + "namingEvidenceSha256": "f05cd802acf446e1c507556f9914df1a77b09f3061d24542316f30d6a63dfd27", + "pair": "fillet->linear-pattern", + "shape": { + "area": 893.7231781, + "bounds": [ + 0, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 88, + "faces": 42, + "solids": 1, + "valid": true, + "vertices": 40, + "volume": 1794.8665943 + } + }, + "resaved": { + "namingEvidenceBytes": 13218, + "namingEvidenceSha256": "f05cd802acf446e1c507556f9914df1a77b09f3061d24542316f30d6a63dfd27", + "pair": "fillet->linear-pattern", + "shape": { + "area": 893.7231781, + "bounds": [ + 0, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 88, + "faces": 42, + "solids": 1, + "valid": true, + "vertices": 40, + "volume": 1794.8665943 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-polar-pattern", + "pair": "fillet->polar-pattern", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "e9793f3992851f588bb4a93d6faa8a84123069730dd9e2d154a86558914bccd7", + "namingSemanticSha256": "2a1e779a2c63d459919c91babb0b5188f6b59eabd9e5358e241d4b6ae3e8d169" + }, + "second": { + "operation": "polar-pattern", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 46, + "edges": 102, + "vertices": 46, + "volume": 1417.6209625, + "area": 744.510649, + "bounds": [ + -4.85359, + -2e-7, + -2e-7, + 10.0000001, + 13.513844, + 10.0000001 + ] + }, + "historyRecords": 234, + "selectedRecords": 5, + "ambiguousResults": 21, + "historySha256": "768040a263dfefc93fe2d7d66505b6d494f7a78a6c98da199dcc683d029393f1", + "namingEvidenceSha256": "3556f4d9ad653fdd61f86817b0dc1fc2ba2deed16513f48c33db4bd024da8821", + "namingSemanticSha256": "0ff7468ef25193f77766f63fef3f3e33cb955824bc40e744343311188336896d" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "angle", + "trajectory": [ + 30, + 45, + 30 + ], + "beforeValue": 30, + "editedValue": 45, + "restoredValue": 30, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "polar-pattern", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 46, + "edges": 102, + "vertices": 46, + "volume": 1580.485276, + "area": 809.1554613, + "bounds": [ + -6.9053825, + -2e-7, + -2e-7, + 10.0000001, + 13.9764503, + 10.0000001 + ] + }, + "historyRecords": 234, + "selectedRecords": 5, + "ambiguousResults": 21, + "historySha256": "768040a263dfefc93fe2d7d66505b6d494f7a78a6c98da199dcc683d029393f1", + "namingEvidenceSha256": "6a6e2debd12e6c88f3511781bd204fcc0d1e5422c778efe8cf871c34b5cfebfb", + "namingSemanticSha256": "0ff7468ef25193f77766f63fef3f3e33cb955824bc40e744343311188336896d" + }, + "restoredEvidence": { + "operation": "polar-pattern", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 46, + "edges": 102, + "vertices": 46, + "volume": 1417.6209625, + "area": 744.510649, + "bounds": [ + -4.85359, + -2e-7, + -2e-7, + 10.0000001, + 13.513844, + 10.0000001 + ] + }, + "historyRecords": 234, + "selectedRecords": 5, + "ambiguousResults": 21, + "historySha256": "768040a263dfefc93fe2d7d66505b6d494f7a78a6c98da199dcc683d029393f1", + "namingEvidenceSha256": "a40ff3aa28065c82ad6ef054ae938c0add8bd0307dafb337aff6085849b7f0e5", + "namingSemanticSha256": "0ff7468ef25193f77766f63fef3f3e33cb955824bc40e744343311188336896d" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->polar-pattern", + "phases": { + "initial": { + "namingEvidenceBytes": 10621, + "namingEvidenceSha256": "3556f4d9ad653fdd61f86817b0dc1fc2ba2deed16513f48c33db4bd024da8821", + "pair": "fillet->polar-pattern", + "shape": { + "area": 744.510649, + "bounds": [ + -4.8535898, + 0, + 0, + 10, + 13.5138439, + 10 + ], + "edges": 102, + "faces": 46, + "solids": 1, + "valid": true, + "vertices": 46, + "volume": 1417.6209625 + } + }, + "reopened": { + "namingEvidenceBytes": 10621, + "namingEvidenceSha256": "3556f4d9ad653fdd61f86817b0dc1fc2ba2deed16513f48c33db4bd024da8821", + "pair": "fillet->polar-pattern", + "shape": { + "area": 744.510649, + "bounds": [ + -4.8535898, + 0, + 0, + 10, + 13.5138439, + 10 + ], + "edges": 102, + "faces": 46, + "solids": 1, + "valid": true, + "vertices": 46, + "volume": 1417.6209625 + } + }, + "resaved": { + "namingEvidenceBytes": 10621, + "namingEvidenceSha256": "3556f4d9ad653fdd61f86817b0dc1fc2ba2deed16513f48c33db4bd024da8821", + "pair": "fillet->polar-pattern", + "shape": { + "area": 744.510649, + "bounds": [ + -4.8535898, + 0, + 0, + 10, + 13.5138439, + 10 + ], + "edges": 102, + "faces": 46, + "solids": 1, + "valid": true, + "vertices": 46, + "volume": 1417.6209625 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-fillet-multi-transform", + "pair": "fillet->multi-transform", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "fillet", + "builder": "BRepFilletAPI_MakeFillet", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 56, + "vertices": 24, + "volume": 995.9653557, + "area": 579.2169851, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "dde6aa25e8581e5504ed3ae80136eacb5217a8aff284c8954187dbb5550d08ba", + "namingSemanticSha256": "a3ed4f1aad49af430492253714ae186d6f884c6a3b4062d4e0179da422acb1df" + }, + "second": { + "operation": "multi-transform", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 58, + "edges": 120, + "vertices": 56, + "volume": 2593.7678329, + "area": 1208.2293711, + "bounds": [ + -8.0000001, + -1e-7, + -1e-7, + 18.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 1103, + "selectedRecords": 30, + "ambiguousResults": 204, + "historySha256": "f36cb55e1dfe66e316f3b8125ac3826aec27ffd1450a632d77f128284fa3be29", + "namingEvidenceSha256": "30e20b51b1319d73e08893bef486fef190db8518c464542d6ad2cd50dfe42734", + "namingSemanticSha256": "d983adde824bc15211ca4eebe51fb1e221c27b7f2fd0242089a91af218f3d9a9" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "multiTranslationX", + "trajectory": [ + 8, + 9, + 8 + ], + "beforeValue": 8, + "editedValue": 9, + "restoredValue": 8, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "multi-transform", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 58, + "edges": 120, + "vertices": 56, + "volume": 2793.4931426, + "area": 1286.8559193, + "bounds": [ + -9.0000001, + -1e-7, + -1e-7, + 19.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 1103, + "selectedRecords": 30, + "ambiguousResults": 204, + "historySha256": "f36cb55e1dfe66e316f3b8125ac3826aec27ffd1450a632d77f128284fa3be29", + "namingEvidenceSha256": "79073827d354842d0887a734d1cf411df2e422a85e9055f497358e0129fe552c", + "namingSemanticSha256": "d983adde824bc15211ca4eebe51fb1e221c27b7f2fd0242089a91af218f3d9a9" + }, + "restoredEvidence": { + "operation": "multi-transform", + "builder": "BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 58, + "edges": 120, + "vertices": 56, + "volume": 2593.7678329, + "area": 1208.2293711, + "bounds": [ + -8.0000001, + -1e-7, + -1e-7, + 18.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 1103, + "selectedRecords": 30, + "ambiguousResults": 204, + "historySha256": "f36cb55e1dfe66e316f3b8125ac3826aec27ffd1450a632d77f128284fa3be29", + "namingEvidenceSha256": "77ec9b5023479d16788593f0d8183717e45f2dd7fe309b88487ee451b7182dec", + "namingSemanticSha256": "d983adde824bc15211ca4eebe51fb1e221c27b7f2fd0242089a91af218f3d9a9" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "fillet->multi-transform", + "phases": { + "initial": { + "namingEvidenceBytes": 129913, + "namingEvidenceSha256": "30e20b51b1319d73e08893bef486fef190db8518c464542d6ad2cd50dfe42734", + "pair": "fillet->multi-transform", + "shape": { + "area": 1208.2293711, + "bounds": [ + -8, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 120, + "faces": 58, + "solids": 1, + "valid": true, + "vertices": 56, + "volume": 2593.7678329 + } + }, + "reopened": { + "namingEvidenceBytes": 129913, + "namingEvidenceSha256": "30e20b51b1319d73e08893bef486fef190db8518c464542d6ad2cd50dfe42734", + "pair": "fillet->multi-transform", + "shape": { + "area": 1208.2293711, + "bounds": [ + -8, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 120, + "faces": 58, + "solids": 1, + "valid": true, + "vertices": 56, + "volume": 2593.7678329 + } + }, + "resaved": { + "namingEvidenceBytes": 129913, + "namingEvidenceSha256": "30e20b51b1319d73e08893bef486fef190db8518c464542d6ad2cd50dfe42734", + "pair": "fillet->multi-transform", + "shape": { + "area": 1208.2293711, + "bounds": [ + -8, + 0, + 0, + 18, + 10, + 10 + ], + "edges": 120, + "faces": 58, + "solids": 1, + "valid": true, + "vertices": 56, + "volume": 2593.7678329 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } + }, + { + "taskId": "TSN-PAIR-chamfer-fuse", + "pair": "chamfer->fuse", + "classification": "accepted", + "reasonCode": "native-builders-mutation-naming-and-fcstd-resave-pass", + "nativeDecision": "accepted", + "first": { + "operation": "chamfer", + "builder": "BRepFilletAPI_MakeChamfer", + "inputCount": 1, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 26, + "edges": 48, + "vertices": 24, + "volume": 990.7413333, + "area": 571.4001834, + "bounds": [ + -1e-7, + -1e-7, + -1e-7, + 10.0000001, + 10.0000001, + 10.0000001 + ] + }, + "historyRecords": 150, + "selectedRecords": 6, + "ambiguousResults": 20, + "historySha256": "174a5a268c990440fa62f4ec119f35cc7514c7cdb33b8345baf0559b418dac62", + "namingEvidenceSha256": "030f8538b6638cc89b90eaa4a49ed4f4fa8cea9054ecd8f6905f8ea6c5f2ba06", + "namingSemanticSha256": "e6257bddda79f3c20fd0cd776e5c172759ac22ca04fa5db292049d6552aa8f43" + }, + "second": { + "operation": "fuse", + "builder": "BRepAlgoAPI_Fuse", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 33, + "edges": 68, + "vertices": 37, + "volume": 1066.6586667, + "area": 634.5122168, + "bounds": [ + -2e-7, + -2e-7, + -2e-7, + 13.0000001, + 10.0000002, + 10.0000001 + ] + }, + "historyRecords": 78, + "selectedRecords": 8, + "ambiguousResults": 24, + "historySha256": "84274dd25d52cc8c392923915dd7d463997b499e0bcc548af8b7d45c74b33e22", + "namingEvidenceSha256": "bc3200772f61547d31b422b0a1eb49c6beade8e23311ddc4e204e8e11293f9b2", + "namingSemanticSha256": "97fb512c8a8e490e176307774ac102d94c817ca1f8d3a209a0a229ab00fb8187" + }, + "mutation": { + "scope": "second-operation-only", + "parameter": "toolOffsetX", + "trajectory": [ + 8, + 7, + 8 + ], + "beforeValue": 8, + "editedValue": 7, + "restoredValue": 8, + "changed": true, + "restoredExactly": true, + "editedEvidence": { + "operation": "fuse", + "builder": "BRepAlgoAPI_Fuse", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 33, + "edges": 68, + "vertices": 37, + "volume": 1041.7386667, + "area": 614.7465314, + "bounds": [ + -2e-7, + -2e-7, + -2e-7, + 12.0000001, + 10.0000002, + 10.0000001 + ] + }, + "historyRecords": 78, + "selectedRecords": 8, + "ambiguousResults": 24, + "historySha256": "84274dd25d52cc8c392923915dd7d463997b499e0bcc548af8b7d45c74b33e22", + "namingEvidenceSha256": "7567ff6f5285d419db8280f0e9d3b299004521dd823c4efbeedbd4f4faedf514", + "namingSemanticSha256": "97fb512c8a8e490e176307774ac102d94c817ca1f8d3a209a0a229ab00fb8187" + }, + "restoredEvidence": { + "operation": "fuse", + "builder": "BRepAlgoAPI_Fuse", + "inputCount": 2, + "historyProvider": "occt-native", + "namingStatus": "ambiguous", + "summary": { + "isValid": true, + "solids": 1, + "faces": 33, + "edges": 68, + "vertices": 37, + "volume": 1066.6586667, + "area": 634.5122168, + "bounds": [ + -2e-7, + -2e-7, + -2e-7, + 13.0000001, + 10.0000002, + 10.0000001 + ] + }, + "historyRecords": 78, + "selectedRecords": 8, + "ambiguousResults": 24, + "historySha256": "84274dd25d52cc8c392923915dd7d463997b499e0bcc548af8b7d45c74b33e22", + "namingEvidenceSha256": "96109d521247ec49c12b1dcf11ce84bf24e7a73c2d80980db0331e8f9d8d4387", + "namingSemanticSha256": "97fb512c8a8e490e176307774ac102d94c817ca1f8d3a209a0a229ab00fb8187" + } + }, + "naming": { + "upstreamEvidenceRestored": true, + "downstreamEvidence": true, + "jsonRoundtripStable": true + }, + "persistence": { + "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", + "checks": { + "namingEvidenceStable": true, + "shapeStable": true + }, + "decision": "accepted", + "freecadVersion": "1.1.1", + "gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d", + "pair": "chamfer->fuse", + "phases": { + "initial": { + "namingEvidenceBytes": 10921, + "namingEvidenceSha256": "bc3200772f61547d31b422b0a1eb49c6beade8e23311ddc4e204e8e11293f9b2", + "pair": "chamfer->fuse", + "shape": { + "area": 634.5122168, + "bounds": [ + 0, + 0, + 0, + 13, + 10, + 10 + ], + "edges": 68, + "faces": 33, + "solids": 1, + "valid": true, + "vertices": 37, + "volume": 1066.6586667 + } + }, + "reopened": { + "namingEvidenceBytes": 10921, + "namingEvidenceSha256": "bc3200772f61547d31b422b0a1eb49c6beade8e23311ddc4e204e8e11293f9b2", + "pair": "chamfer->fuse", + "shape": { + "area": 634.5122168, + "bounds": [ + 0, + 0, + 0, + 13, + 10, + 10 + ], + "edges": 68, + "faces": 33, + "solids": 1, + "valid": true, + "vertices": 37, + "volume": 1066.6586667 + } + }, + "resaved": { + "namingEvidenceBytes": 10921, + "namingEvidenceSha256": "bc3200772f61547d31b422b0a1eb49c6beade8e23311ddc4e204e8e11293f9b2", + "pair": "chamfer->fuse", + "shape": { + "area": 634.5122168, + "bounds": [ + 0, + 0, + 0, + 13, + 10, + 10 + ], + "edges": 68, + "faces": 33, + "solids": 1, + "valid": true, + "vertices": 37, + "volume": 1066.6586667 + } + } + }, + "schemaVersion": 1, + "status": "pass" + } } ], "summary": { "registeredOperations": 19, "orderedPairs": 361, - "classifiedPairs": 187, - "accepted": 143, - "rejected": 44, - "unknown": 174 + "classifiedPairs": 207, + "accepted": 155, + "rejected": 52, + "unknown": 154 } } diff --git a/config/release-artifacts.json b/config/release-artifacts.json index 5df203d..b031b56 100644 --- a/config/release-artifacts.json +++ b/config/release-artifacts.json @@ -390,7 +390,7 @@ { "path": "sw.js", "bytes": 1390, - "sha256": "dfe8893e68cda6991ca64b5f5eaa19097c5b6d8f4bdc13f2423328950671a5be" + "sha256": "8b0477955514535bb11cef3733135b67422cc8c085b4331c3b9cb1a1adc9d852" }, { "path": "vendor/camotics/camotics-sweep.wasm", @@ -412,7 +412,7 @@ "status": "signed", "algorithm": "Ed25519", "keyId": "bitbybit-local-release-2026", - "payloadSha256": "e6d83894b72503eed170bec685d761d868784e28fbc5a221d78c0b270a472b37", - "signature": "FZ+gouN7G/kpiInw2zMQ5FBLXPJzurcdHv3lk4NThmtPGe6NXoe8KkIngxO8vbRba0E2e1jwoSgbv2HfvY5xAw==" + "payloadSha256": "ad5f25aeb7e1382b3172d9919357a9831ac198841e54304a6789665cd21cda31", + "signature": "c8xaS8E7BOThrQKOK9WlCLpMazuqlBZ6eMKbCTt+tzeC0b4TyEEaiVvjelUtFDjo5PK0fVYPeYISrS2895LTDA==" } } diff --git a/docs/freecad-active-work-status.generated.zh-CN.md b/docs/freecad-active-work-status.generated.zh-CN.md index c849600..252d551 100644 --- a/docs/freecad-active-work-status.generated.zh-CN.md +++ b/docs/freecad-active-work-status.generated.zh-CN.md @@ -3,9 +3,9 @@ 生成日期:2026-08-15。基线:FreeCAD 1.1.1 / `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`。 -- 唯一活动任务:`TSN-PAIR-groove-multi-transform` -- 微任务:1756 total / 317 completed / 1 in_progress / 1438 pending -- 有序操作对:191/361 classified / 170 unknown +- 唯一活动任务:`TSN-PAIR-chamfer-cut` +- 微任务:1756 total / 337 completed / 1 in_progress / 1418 pending +- 有序操作对:211/361 classified / 150 unknown - Property:27/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 | 191 | 1 | 169 | `TSN-PAIR-groove-multi-transform` | +| `TSN-ORDERED-PAIRS` | 361 | 211 | 1 | 149 | `TSN-PAIR-chamfer-cut` | | `PROPERTY-CODECS` | 522 | 0 | 0 | 522 | `-` | | `DOCUMENT-SEMANTICS` | 90 | 0 | 0 | 90 | `-` | | `CORE-MODELING` | 171 | 0 | 0 | 171 | `-` | diff --git a/scripts/check-freecad-ordered-operation-pair-classification.mjs b/scripts/check-freecad-ordered-operation-pair-classification.mjs index fc4be04..5f3e123 100644 --- a/scripts/check-freecad-ordered-operation-pair-classification.mjs +++ b/scripts/check-freecad-ordered-operation-pair-classification.mjs @@ -205,6 +205,26 @@ const expectedPairs = [ { pair: 'groove->linear-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'translationX', mutationTrajectory: [8, 9, 8] }, { pair: 'groove->polar-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [90, 120, 90] }, { pair: 'groove->mirrored', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'planeOriginX', mutationTrajectory: [5, 6, 5] }, + { pair: 'groove->multi-transform', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', firstInputCount: 2, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)', secondInputCount: 1, mutationParameter: 'multiTranslationX', mutationTrajectory: [8, 9, 8] }, + { pair: 'fillet->fuse', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepAlgoAPI_Fuse', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [8, 7, 8] }, + { pair: 'fillet->cut', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'toolSize', mutationTrajectory: [4, 3, 4] }, + { pair: 'fillet->common', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepAlgoAPI_Common', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [7, 6, 7] }, + { pair: 'fillet->rotate', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [15, 22.5, 15] }, + { pair: 'fillet->pad', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepFilletAPI_MakeFillet', 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: 'fillet->pocket', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'length', mutationTrajectory: [5, 4, 5] }, + { pair: 'fillet->loft', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', firstBuilder: 'BRepFilletAPI_MakeFillet', 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: 'fillet->pipe', decision: 'rejected', reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, 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: 'fillet->revolution', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepPrimAPI_MakeRevol', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [360, 270, 360], nativeTypeId: 'Part::Revolution', freeCadDiagnostic: 'Solids are not Processed' }, + { pair: 'fillet->groove', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut', secondInputCount: 2, mutationParameter: 'angle', mutationTrajectory: [360, 180, 360] }, + { pair: 'fillet->fillet', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepFilletAPI_MakeFillet', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [0.4, 0.6, 0.4], nativeTypeId: 'Part::Fillet', freeCadDiagnostic: 'There are no suitable edges for chamfer or fillet' }, + { pair: 'fillet->chamfer', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepFilletAPI_MakeChamfer', secondInputCount: 1, mutationParameter: 'distance', mutationTrajectory: [0.4, 0.6, 0.4], nativeTypeId: 'Part::Chamfer', freeCadDiagnostic: 'There are no suitable edges for chamfer or fillet' }, + { pair: 'fillet->hole', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut', secondInputCount: 1, mutationParameter: 'radius', mutationTrajectory: [1, 1.5, 1] }, + { pair: 'fillet->draft', decision: 'rejected', reasonCode: 'native-builder-and-freecad-profile-reject-with-clean-resave', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, rejectionAuthority: 'occt-builder', secondBuilder: 'BRepOffsetAPI_DraftAngle', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [5, 8, 5], nativeTypeId: 'PartDesign::Draft', freeCadDiagnostic: '', inputShapeTransfer: 'partdesign-feature-summary-exact-with-explicit-brep-drift' }, + { pair: 'fillet->thickness', decision: 'rejected', reasonCode: 'native-and-freecad-profile-no-op-with-clean-resave', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, rejectionAuthority: 'occt-no-op', kernelOutcome: 'no-op', secondBuilder: 'BRepOffsetAPI_MakeThickSolid', secondInputCount: 1, mutationParameter: 'offset', mutationTrajectory: [-0.4, -0.6, -0.4], nativeTypeId: 'Part::Thickness', freeCadDiagnostic: 'Valid', freecadProfileNoOp: true }, + { pair: 'fillet->linear-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'translationX', mutationTrajectory: [8, 9, 8] }, + { pair: 'fillet->polar-pattern', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse', secondInputCount: 1, mutationParameter: 'angle', mutationTrajectory: [30, 45, 30] }, + { pair: 'fillet->multi-transform', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeFillet', firstInputCount: 1, secondBuilder: 'BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse(ordered)', secondInputCount: 1, mutationParameter: 'multiTranslationX', mutationTrajectory: [8, 9, 8] }, + { pair: 'chamfer->fuse', decision: 'accepted', reasonCode: 'native-builders-mutation-naming-and-fcstd-resave-pass', firstBuilder: 'BRepFilletAPI_MakeChamfer', firstInputCount: 1, secondBuilder: 'BRepAlgoAPI_Fuse', secondInputCount: 2, mutationParameter: 'toolOffsetX', mutationTrajectory: [8, 7, 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()) { @@ -226,20 +246,31 @@ for (const [index, entry] of report.classifications.entries()) { } } else { if (rejection.kernelRestoredExactly !== true || rejection.kernelAttempts?.length !== 3) fail(`${expected.pair} OCCT diagnostic trajectory is incomplete.`) - for (const [attemptIndex, attempt] of rejection.kernelAttempts.entries()) if (attempt.operation !== secondOperation || attempt.builder !== expected.secondBuilder || attempt.inputCount !== expected.secondInputCount || attempt.parameter !== expected.mutationParameter || attempt.parameterValue !== expected.mutationTrajectory[attemptIndex] || attempt.runtime !== 'occt-native' || attempt.outcome !== expected.kernelOutcome || attempt.resultProduced !== true || attempt.shapeProduced !== true || attempt.validShapeProduced !== (expected.kernelOutcome === 'accepted') || attempt.historyProduced !== true || attempt.historyProvider !== 'occt-native' || attempt.summary?.isValid !== (expected.kernelOutcome === 'accepted') || attempt.historyRecords < 1 || !attempt.historySha256 || attempt.authority !== (expected.kernelOutcome === 'accepted' ? 'kernel-superset-only' : 'kernel-invalid-result')) fail(`${expected.pair} OCCT compatibility attempt ${attemptIndex} is invalid.`) + for (const [attemptIndex, attempt] of rejection.kernelAttempts.entries()) { + const validKernelShape = expected.kernelOutcome !== 'invalid-result' + const expectedAuthority = expected.kernelOutcome === 'no-op' ? 'kernel-no-op' : expected.kernelOutcome === 'accepted' ? 'kernel-superset-only' : 'kernel-invalid-result' + if (attempt.operation !== secondOperation || attempt.builder !== expected.secondBuilder || attempt.inputCount !== expected.secondInputCount || attempt.parameter !== expected.mutationParameter || attempt.parameterValue !== expected.mutationTrajectory[attemptIndex] || attempt.runtime !== 'occt-native' || attempt.outcome !== expected.kernelOutcome || attempt.resultProduced !== true || attempt.shapeProduced !== true || attempt.validShapeProduced !== validKernelShape || attempt.historyProduced !== true || attempt.historyProvider !== 'occt-native' || attempt.summary?.isValid !== validKernelShape || attempt.historyRecords < 1 || !attempt.historySha256 || attempt.authority !== expectedAuthority || (expected.kernelOutcome === 'no-op' && JSON.stringify(attempt.summary) !== JSON.stringify(entry.first.summary))) fail(`${expected.pair} OCCT compatibility attempt ${attemptIndex} is invalid.`) + } } const persistence = rejection.persistence const diagnostic = persistence?.diagnostic const freecadProfileAccepted = expected.freecadProfileAccepted === true - const persistenceChecksPass = Object.values(persistence?.checks ?? {}).every(Boolean) || (freecadProfileAccepted && persistence?.checks?.nativeFeatureRejected === false && Object.entries(persistence?.checks ?? {}).filter(([key]) => key !== 'nativeFeatureRejected').every(([, value]) => value === true)) || (!freecadProfileAccepted && persistence?.checks?.nativeFeatureRejected === true && Object.entries(persistence?.checks ?? {}).filter(([key]) => key !== 'freecadProfileAccepted').every(([, value]) => value === true)) + const freecadProfileNoOp = expected.freecadProfileNoOp === true + const persistenceChecksPass = Object.values(persistence?.checks ?? {}).every(Boolean) || (freecadProfileAccepted && persistence?.checks?.nativeFeatureRejected === false && Object.entries(persistence?.checks ?? {}).filter(([key]) => key !== 'nativeFeatureRejected').every(([, value]) => value === true)) || (freecadProfileNoOp && persistence?.checks?.freecadProfileNoOp === true && persistence?.checks?.freecadProfileAccepted === false && persistence?.checks?.nativeFeatureRejected === false && Object.entries(persistence?.checks ?? {}).filter(([key]) => !['nativeFeatureRejected', 'freecadProfileAccepted'].includes(key)).every(([, value]) => value === true)) || (!freecadProfileAccepted && !freecadProfileNoOp && persistence?.checks?.nativeFeatureRejected === true && Object.entries(persistence?.checks ?? {}).filter(([key]) => key !== 'freecadProfileAccepted').every(([, value]) => value === true)) if (persistence?.status !== 'pass' || persistence.decision !== 'rejected' || persistence.pair !== entry.pair || persistence.operation !== secondOperation || persistence.nativeTypeId !== expected.nativeTypeId || persistence.freecadVersion !== '1.1.1' || !persistenceChecksPass) 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.objects?.some(({ name, typeId }) => name === 'PairResult' && typeId === expected.nativeTypeId)) fail(`${expected.pair} did not capture a real FreeCAD profile evaluation.`) - if (freecadProfileAccepted) { + if (freecadProfileNoOp) { + if (diagnostic.shapeNull !== false || diagnostic.shapeValid !== true || diagnostic.statusString !== 'Valid' || !diagnostic.state?.includes('Up-to-date') || JSON.stringify(diagnostic.resultShape) !== JSON.stringify(diagnostic.inputShape)) fail(`${expected.pair} FreeCAD no-op evidence is incomplete.`) + } else if (freecadProfileAccepted) { if (persistence.checks.nativeFeatureRejected !== false || persistence.checks.freecadProfileAccepted !== true || diagnostic.shapeNull !== false || diagnostic.shapeValid !== true || diagnostic.statusString !== 'Valid' || !diagnostic.state?.includes('Up-to-date')) fail(`${expected.pair} FreeCAD profile acceptance evidence is incomplete.`) } else if (diagnostic.shapeNull !== true || diagnostic.shapeValid !== false || !diagnostic.state?.includes('Invalid') || diagnostic.statusString === 'Valid') { fail(`${expected.pair} did not capture a real rejected FreeCAD recompute.`) } - if (expected.freeCadDiagnostic && diagnostic.statusString !== expected.freeCadDiagnostic) fail(`${expected.pair} FreeCAD profile diagnostic changed.`) + if (Object.hasOwn(expected, 'freeCadDiagnostic') && diagnostic.statusString !== expected.freeCadDiagnostic) fail(`${expected.pair} FreeCAD profile diagnostic changed.`) + if (expected.inputShapeTransfer === 'partdesign-feature-summary-exact-with-explicit-brep-drift') { + const input = diagnostic.input + if (input?.name !== 'DraftBase' || input.typeId !== 'PartDesign::Feature' || JSON.stringify(input.subelements) !== JSON.stringify(['Face1']) || input.sourceName !== persistence.source?.name || input.shapeSummaryTransferredExactly !== true || typeof input.sourceBrepSha256 !== 'string' || typeof input.draftBaseBrepSha256 !== 'string' || input.sourceBrepSha256 === input.draftBaseBrepSha256) fail(`${expected.pair} PartDesign input Shape transfer evidence is incomplete.`) + } 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' || typeId === 'Part::Revolution')) fail(`${expected.pair} polluted the clean FCStd save/reopen/resave chain.`) @@ -255,6 +286,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: 187, accepted: 143, rejected: 44, unknown: 174 } +const expectedSummary = { registeredOperations: 19, orderedPairs: 361, classifiedPairs: 207, accepted: 155, rejected: 52, unknown: 154 } 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)) diff --git a/scripts/freecad-ordered-operation-pair-resave.py b/scripts/freecad-ordered-operation-pair-resave.py index 2a068d4..36d997c 100644 --- a/scripts/freecad-ordered-operation-pair-resave.py +++ b/scripts/freecad-ordered-operation-pair-resave.py @@ -246,6 +246,29 @@ def collect_rejected(): feature.Edges = [(index, 0.4, 0.4) for index in range(1, len(source.Shape.Edges) + 1)] diagnostic["parameter"] = {"name": "distance", "value": 0.4} diagnostic["input"] = link_snapshot(feature.Base) + elif operation == "draft": + body = document.addObject("PartDesign::Body", "Body") + draft_base = body.newObject("PartDesign::Feature", "DraftBase") + draft_base.Shape = source.Shape.copy() + datum_plane = body.newObject("PartDesign::Plane", "DatumPlane") + datum_plane.AttachmentSupport = [(document.XY_Plane, "")] + datum_plane.MapMode = "FlatFace" + datum_line = body.newObject("PartDesign::Line", "DatumLine") + datum_line.AttachmentSupport = [(document.Z_Axis, "")] + datum_line.MapMode = "TwoPointLine" + feature = body.newObject("PartDesign::Draft", "PairResult") + feature.Base = (draft_base, ["Face1"]) + feature.NeutralPlane = (datum_plane, [""]) + feature.PullDirection = (datum_line, [""]) + feature.Angle = 5.0 + feature.Reversed = False + diagnostic["parameter"] = {"name": "angle", "value": round(float(feature.Angle), 7)} + diagnostic["input"] = link_snapshot(feature.Base) + diagnostic["input"]["sourceName"] = source.Name + draft_base_shape = shape_snapshot_from_shape(draft_base.Shape, include_brep=True) + diagnostic["input"]["shapeSummaryTransferredExactly"] = {key: value for key, value in draft_base_shape.items() if key != "brepSha256"} == {key: value for key, value in baseline_source_shape.items() if key != "brepSha256"} + diagnostic["input"]["sourceBrepSha256"] = baseline_source_shape["brepSha256"] + diagnostic["input"]["draftBaseBrepSha256"] = draft_base_shape["brepSha256"] elif operation == "thickness": feature = document.addObject("Part::Thickness", "PairResult") feature.Faces = (source, ["Face2"]) @@ -268,6 +291,8 @@ def collect_rejected(): diagnostic["state"] = [str(value) for value in feature.State] diagnostic["shapeNull"] = bool(feature.Shape.isNull()) diagnostic["shapeValid"] = False if feature.Shape.isNull() else bool(feature.Shape.isValid()) + if not feature.Shape.isNull(): + diagnostic["resultShape"] = shape_snapshot_from_shape(feature.Shape) finally: document.abortTransaction() document.recompute() @@ -297,12 +322,13 @@ def collect_rejected(): or "Error" in diagnostic["state"] or "Invalid" in diagnostic["state"] ) - freecad_profile_accepted = operation in ("fillet", "chamfer", "thickness") and not feature_rejected and not diagnostic["shapeNull"] and diagnostic["shapeValid"] and diagnostic["statusString"] == "Valid" - expected_type_id = {"pad": "PartDesign::Pad", "loft": "Part::Loft", "pipe": "Part::Sweep", "revolution": "Part::Revolution", "fuse": "Part::Fuse", "fillet": "Part::Fillet", "chamfer": "Part::Chamfer", "thickness": "Part::Thickness"}[operation] - input_names = [diagnostic.get("input", {}).get("name")] if operation in ("pad", "revolution", "fillet", "chamfer", "thickness") else ([diagnostic.get("input", {}).get(key, {}).get("name") for key in ("base", "tool")] if operation == "fuse" else [item["name"] for item in diagnostic.get("input", {}).get("sections", [])]) + freecad_profile_no_op = operation == "thickness" and not feature_rejected and not diagnostic["shapeNull"] and diagnostic["shapeValid"] and diagnostic["statusString"] == "Valid" and diagnostic.get("resultShape") == diagnostic.get("inputShape") + freecad_profile_accepted = operation in ("fillet", "chamfer", "thickness") and not freecad_profile_no_op and not feature_rejected and not diagnostic["shapeNull"] and diagnostic["shapeValid"] and diagnostic["statusString"] == "Valid" + expected_type_id = {"pad": "PartDesign::Pad", "loft": "Part::Loft", "pipe": "Part::Sweep", "revolution": "Part::Revolution", "fuse": "Part::Fuse", "fillet": "Part::Fillet", "chamfer": "Part::Chamfer", "draft": "PartDesign::Draft", "thickness": "Part::Thickness"}[operation] + input_names = [diagnostic.get("input", {}).get("sourceName", diagnostic.get("input", {}).get("name"))] if operation in ("pad", "revolution", "fillet", "chamfer", "draft", "thickness") else ([diagnostic.get("input", {}).get(key, {}).get("name") for key in ("base", "tool")] if operation == "fuse" 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, + "fuseSolidUsedAsInput": source_name in input_names and diagnostic.get("inputShape", {}).get("solids") == 1 and (operation != "draft" or diagnostic.get("input", {}).get("shapeSummaryTransferredExactly") is True), "recomputeStatusCaptured": diagnostic["recomputeResult"] is not None or diagnostic["exceptionType"] is not None, "nativeFeatureRejected": feature_rejected, "freecadProfileAccepted": freecad_profile_accepted, @@ -311,6 +337,8 @@ def collect_rejected(): "documentUnpolluted": baseline == initial, "documentStable": initial == reopened_snapshot and initial == resaved_snapshot, } + if freecad_profile_no_op: + checks["freecadProfileNoOp"] = True return { "schemaVersion": 1, "baselineId": "freecad-1.1.1-ordered-operation-pair-resave", @@ -332,7 +360,7 @@ def collect_rejected(): }, "phases": {"initial": initial, "reopened": reopened_snapshot, "resaved": resaved_snapshot}, "checks": checks, - "status": "pass" if all(checks.values()) or (operation in ("fillet", "chamfer", "thickness") and freecad_profile_accepted and all(value for key, value in checks.items() if key != "nativeFeatureRejected")) or (not freecad_profile_accepted and feature_rejected and all(value for key, value in checks.items() if key != "freecadProfileAccepted")) else "failed", + "status": "pass" if all(checks.values()) or (operation in ("fillet", "chamfer", "thickness") and freecad_profile_accepted and all(value for key, value in checks.items() if key != "nativeFeatureRejected")) or (freecad_profile_no_op and all(value for key, value in checks.items() if key not in ("nativeFeatureRejected", "freecadProfileAccepted"))) or (not freecad_profile_accepted and feature_rejected and all(value for key, value in checks.items() if key != "freecadProfileAccepted")) else "failed", } finally: for name in list(App.listDocuments().keys()): diff --git a/scripts/run-freecad-ordered-operation-pair-classification.mjs b/scripts/run-freecad-ordered-operation-pair-classification.mjs index a05c011..8ba8d28 100644 --- a/scripts/run-freecad-ordered-operation-pair-classification.mjs +++ b/scripts/run-freecad-ordered-operation-pair-classification.mjs @@ -119,6 +119,13 @@ const pairSpecOverrides = { 'groove->thickness': { ...operationSpecs.thickness, decision: 'rejected', rejectionAuthority: 'occt-builder' }, 'groove->polar-pattern': { ...operationSpecs['polar-pattern'], nominal: { ...operationSpecs['polar-pattern'].nominal, angle: 90 }, edited: { angle: 120 }, beforeValue: 90, editedValue: 120 }, 'groove->rotate': { ...operationSpecs.rotate }, + 'fillet->fuse': { ...operationSpecs.fuse, nominal: { toolSize: 5, toolOffset: 8 }, edited: { toolSize: 5, toolOffset: 7 }, beforeValue: 8, editedValue: 7 }, + 'fillet->common': { ...operationSpecs.common, nominal: { toolSize: 5, toolOffset: 7 }, edited: { toolSize: 5, toolOffset: 6 }, beforeValue: 7, editedValue: 6 }, + 'fillet->fillet': { ...operationSpecs.fillet, decision: 'rejected', rejectionAuthority: 'occt-builder' }, + 'fillet->chamfer': { ...operationSpecs.chamfer, decision: 'rejected', rejectionAuthority: 'occt-builder' }, + 'fillet->draft': { ...operationSpecs.draft, decision: 'rejected', rejectionAuthority: 'occt-builder' }, + 'fillet->thickness': { ...operationSpecs.thickness, decision: 'rejected', rejectionAuthority: 'occt-no-op', kernelOutcome: 'no-op' }, + 'chamfer->fuse': { ...operationSpecs.fuse, nominal: { toolSize: 5, toolOffset: 8 }, edited: { toolSize: 5, toolOffset: 7 }, beforeValue: 8, editedValue: 7 }, } const createOperation = (module, { operation, objectStep, toolSize, toolOffset, angle, length, profileWidth = 2, profileHeight = 3, profileX = 0.5, profileY = 2, profileZ = 0, ruled, spineLength, radius, distance, depth, position, direction, faceIndex, axisOrigin, neutralPlaneDirection, reversed, offset, intersectionJoin, translationX, planeOriginX, multiTranslationX, multiMirrorPlaneX = 5, stage }) => { @@ -236,7 +243,8 @@ const captureKernelCompatibilityStage = (module, definition, parameterValue, exp try { const outcome = response.summary?.isValid === true ? 'accepted' : 'invalid-result' const noHistorySuperset = expectedOutcome === 'accepted-no-history' && outcome === 'accepted' - if (response.provider !== 'occt-native' || (!noHistorySuperset && outcome !== expectedOutcome) || !response.resultStep?.startsWith('ISO-10303-21;') || (response.records?.length < 1 && !noHistorySuperset)) fail(`${definition.stage.stageId} OCCT compatibility probe returned an unexpected result: ${JSON.stringify({ provider: response.provider, outcome, expectedOutcome, summary: response.summary, resultStep: Boolean(response.resultStep), records: response.records?.length, result: Boolean(response.result) })}`) + const noOp = expectedOutcome === 'no-op' && outcome === 'accepted' && JSON.stringify(canonicalSummary(response.summary)) === JSON.stringify(definition.inputSummary) + if (response.provider !== 'occt-native' || (!noHistorySuperset && !noOp && outcome !== expectedOutcome) || !response.resultStep?.startsWith('ISO-10303-21;') || (response.records?.length < 1 && !noHistorySuperset)) fail(`${definition.stage.stageId} OCCT compatibility probe returned an unexpected result: ${JSON.stringify({ provider: response.provider, outcome, expectedOutcome, summary: response.summary, inputSummary: definition.inputSummary, resultStep: Boolean(response.resultStep), records: response.records?.length, result: Boolean(response.result) })}`) return { operation: definition.operation, builder: operationSpecs[definition.operation].builder, @@ -244,7 +252,7 @@ const captureKernelCompatibilityStage = (module, definition, parameterValue, exp parameter: operationSpecs[definition.operation].parameter, parameterValue, runtime: 'occt-native', - outcome: noHistorySuperset ? expectedOutcome : outcome, + outcome: noHistorySuperset || noOp ? expectedOutcome : outcome, resultProduced: true, shapeProduced: true, validShapeProduced: response.summary.isValid === true, @@ -253,7 +261,7 @@ const captureKernelCompatibilityStage = (module, definition, parameterValue, exp summary: canonicalSummary(response.summary), historyRecords: response.records.length, historySha256: sha256(JSON.stringify(response.records)), - authority: noHistorySuperset ? 'kernel-superset-no-history' : outcome === 'accepted' ? 'kernel-superset-only' : 'kernel-invalid-result', + authority: noOp ? 'kernel-no-op' : noHistorySuperset ? 'kernel-superset-no-history' : outcome === 'accepted' ? 'kernel-superset-only' : 'kernel-invalid-result', } } finally { response.result?.delete?.() @@ -340,7 +348,8 @@ const persistPair = async (pair, step, namingEvidence, decision) => { const payload = markerIndex >= 0 ? output.slice(markerIndex + marker.length).match(/\{.*\}/s)?.[0] : undefined if (execution.error || execution.status !== 0 || !payload) fail(`FreeCAD FCStd replay exited with ${execution.status}: ${execution.error?.message || output.trim()}`) const persistence = JSON.parse(payload) - const checksPass = Object.values(persistence.checks).every(Boolean) || (decision === 'rejected' && persistence.checks.freecadProfileAccepted === true && persistence.checks.nativeFeatureRejected === false && Object.entries(persistence.checks).filter(([key]) => key !== 'nativeFeatureRejected').every(([, value]) => value === true)) || (decision === 'rejected' && persistence.checks.freecadProfileAccepted === false && persistence.checks.nativeFeatureRejected === true && Object.entries(persistence.checks).filter(([key]) => key !== 'freecadProfileAccepted').every(([, value]) => value === true)) + if (!persistence?.checks || typeof persistence.checks !== 'object') fail(`FreeCAD FCStd replay returned incomplete evidence: ${JSON.stringify(persistence)}`) + const checksPass = Object.values(persistence.checks).every(Boolean) || (decision === 'rejected' && persistence.checks.freecadProfileAccepted === true && persistence.checks.nativeFeatureRejected === false && Object.entries(persistence.checks).filter(([key]) => key !== 'nativeFeatureRejected').every(([, value]) => value === true)) || (decision === 'rejected' && persistence.checks.freecadProfileNoOp === true && persistence.checks.freecadProfileAccepted === false && persistence.checks.nativeFeatureRejected === false && Object.entries(persistence.checks).filter(([key]) => !['nativeFeatureRejected', 'freecadProfileAccepted'].includes(key)).every(([, value]) => value === true)) || (decision === 'rejected' && persistence.checks.freecadProfileAccepted === false && persistence.checks.nativeFeatureRejected === true && Object.entries(persistence.checks).filter(([key]) => key !== 'freecadProfileAccepted').every(([, value]) => value === true)) if (persistence.status !== 'pass' || persistence.decision !== decision || persistence.freecadVersion !== '1.1.1' || persistence.gitCommit !== '0108fd4b4850cc46e625b60e53cea7a7bbe69f8d' || !checksPass) fail(`FreeCAD FCStd replay failed: ${JSON.stringify(persistence)}`) return persistence } finally { @@ -384,25 +393,30 @@ const classifyPair = async (fromOperation, toOperation, pairIndex) => { const secondDefinition = { operation: toOperation, objectStep: first.response.resultStep, + inputSummary: first.report.summary, ...spec.nominal, stage: { stageId: `pair:${pairId}:second`, ordinal: 1, objectId: `pair:${pairId}:first`, objectTag: 1101 + pairIndex * 100, resultObjectId: `pair:${pairId}:second`, resultObjectTag: 1201 + pairIndex * 100, namingEvidence: first.namingEvidence }, } if (spec.decision === 'rejected') { try { const trajectory = [spec.beforeValue, spec.editedValue, spec.beforeValue] - if (spec.rejectionAuthority === 'freecad-document') { + if (['freecad-document', 'occt-no-op'].includes(spec.rejectionAuthority)) { const kernelAttempts = trajectory.map((value) => captureKernelCompatibilityStage(module, { ...secondDefinition, [spec.parameter]: value }, value, spec.kernelOutcome)) const kernelRestoredExactly = JSON.stringify(kernelAttempts[0]) === JSON.stringify(kernelAttempts[2]) if (!kernelRestoredExactly) fail(`${pair} OCCT diagnostic probe did not restore exactly.`) const persistence = await persistPair(pair, first.response.resultStep, first.namingEvidence, 'rejected') + const freecadProfileAccepted = persistence.checks.freecadProfileAccepted === true + const freecadProfileNoOp = persistence.checks.freecadProfileNoOp === true return { taskId: `TSN-PAIR-${pairId}`, pair, classification: 'rejected', - reasonCode: 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', + reasonCode: spec.rejectionAuthority === 'occt-no-op' + ? freecadProfileAccepted ? 'native-builder-no-op-with-freecad-profile-acceptance-and-clean-resave' : freecadProfileNoOp ? 'native-and-freecad-profile-no-op-with-clean-resave' : 'native-builder-no-op-and-freecad-profile-reject-with-clean-resave' + : 'freecad-input-precondition-reject-with-kernel-diagnostic-and-clean-resave', nativeDecision: 'rejected', first: first.report, - rejection: { scope: 'second-operation-only', authority: 'freecad-document', parameter: spec.parameter, trajectory, kernelAttempts, kernelRestoredExactly, persistence }, + rejection: { scope: 'second-operation-only', authority: spec.rejectionAuthority, parameter: spec.parameter, trajectory, kernelAttempts, kernelRestoredExactly, persistence }, } } const attempts = trajectory.map((value) => captureRejectedStage(module, { ...secondDefinition, [spec.parameter]: value })) @@ -453,6 +467,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'], ['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'], ['pad', 'fuse'], ['pad', 'cut'], ['pad', 'common'], ['pad', 'rotate'], ['pad', 'pad'], ['pad', 'pocket'], ['pad', 'loft'], ['pad', 'pipe'], ['pad', 'revolution'], ['pad', 'groove'], ['pad', 'fillet'], ['pad', 'chamfer'], ['pad', 'hole'], ['pad', 'draft'], ['pad', 'thickness'], ['pad', 'linear-pattern'], ['pad', 'polar-pattern'], ['pad', 'mirrored'], ['pad', 'multi-transform'], ['pocket', 'fuse'], ['pocket', 'cut'], ['pocket', 'common'], ['pocket', 'rotate'], ['pocket', 'pad'], ['pocket', 'pocket'], ['pocket', 'loft'], ['pocket', 'pipe'], ['pocket', 'revolution'], ['pocket', 'groove'], ['pocket', 'fillet'], ['pocket', 'chamfer'], ['pocket', 'hole'], ['pocket', 'draft'], ['pocket', 'thickness'], ['pocket', 'linear-pattern'], ['pocket', 'polar-pattern'], ['pocket', 'mirrored'], ['pocket', 'multi-transform'], ['loft', 'fuse'], ['loft', 'cut'], ['loft', 'common'], ['loft', 'rotate'], ['loft', 'pad'], ['loft', 'pocket'], ['loft', 'loft'], ['loft', 'pipe'], ['loft', 'revolution'], ['loft', 'groove'], ['loft', 'fillet'], ['loft', 'chamfer'], ['loft', 'hole'], ['loft', 'draft'], ['loft', 'thickness'], ['loft', 'linear-pattern'], ['loft', 'polar-pattern'], ['loft', 'mirrored'], ['loft', 'multi-transform'], ['pipe', 'fuse'], ['pipe', 'cut'], ['pipe', 'common'], ['pipe', 'rotate'], ['pipe', 'pad'], ['pipe', 'pocket'], ['pipe', 'loft'], ['pipe', 'pipe'], ['pipe', 'revolution'], ['pipe', 'groove'], ['pipe', 'fillet'], ['pipe', 'chamfer'], ['pipe', 'hole'], ['pipe', 'draft'], ['pipe', 'thickness'], ['pipe', 'linear-pattern'], ['pipe', 'polar-pattern'], ['pipe', 'mirrored'], ['pipe', 'multi-transform'], ['revolution', 'fuse'], ['revolution', 'cut'], ['revolution', 'common'], ['revolution', 'rotate'], ['revolution', 'pad'], ['revolution', 'pocket'], ['revolution', 'loft'], ['revolution', 'pipe'], ['revolution', 'revolution'], ['revolution', 'groove'], ['revolution', 'fillet'], ['revolution', 'chamfer'], ['revolution', 'hole'], ['revolution', 'draft'], ['revolution', 'thickness'], ['revolution', 'linear-pattern'], ['revolution', 'polar-pattern'], ['revolution', 'mirrored'], ['revolution', 'multi-transform'], ['groove', 'fuse'], ['groove', 'cut'], ['groove', 'common'], ['groove', 'rotate'], ['groove', 'pad'], ['groove', 'pocket'], ['groove', 'loft'], ['groove', 'pipe'], ['groove', 'revolution'], ['groove', 'groove'], ['groove', 'fillet'], ['groove', 'chamfer'], ['groove', 'hole'], ['groove', 'draft'], ['groove', 'thickness'], ['groove', 'linear-pattern'], ['groove', 'polar-pattern'], ['groove', 'mirrored']] +orderedPairPrefix.push(['groove', 'multi-transform'], ['fillet', 'fuse'], ['fillet', 'cut'], ['fillet', 'common'], ['fillet', 'rotate'], ['fillet', 'pad'], ['fillet', 'pocket'], ['fillet', 'loft'], ['fillet', 'pipe'], ['fillet', 'revolution'], ['fillet', 'groove'], ['fillet', 'fillet'], ['fillet', 'chamfer'], ['fillet', 'hole'], ['fillet', 'draft'], ['fillet', 'thickness'], ['fillet', 'linear-pattern'], ['fillet', 'polar-pattern'], ['fillet', 'multi-transform'], ['chamfer', 'fuse']) const classifications = [] const selectedPairs = process.env.FREECAD_ONLY_PAIR ? orderedPairPrefix.filter(([fromOperation, toOperation]) => `${fromOperation}->${toOperation}` === process.env.FREECAD_ONLY_PAIR) : orderedPairPrefix if (process.env.FREECAD_ONLY_PAIR && selectedPairs.length !== 1) fail(`focused pair ${process.env.FREECAD_ONLY_PAIR} is not in the classified prefix.`) diff --git a/后续工作.txt b/后续工作.txt index 633bbc3..aeb432b 100644 --- a/后续工作.txt +++ b/后续工作.txt @@ -1919,4 +1919,186 @@ git diff --check - `5 -> 6 -> 5` 镜像平面轨迹使体积在 `1000 -> 1190.575222 -> 1000` 间变化,编辑态增至 22 Face,并精确恢复名义摘要、history 与语义 naming。 - 上游 Groove naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定镜像平面、互补融合、变异、恢复和持久化证据。 +### `TSN-PAIR-groove-multi-transform` + +`groove->multi-transform` 已完成原生接受分类,并闭合 Groove 起始行的全部 19 个有序操作对: + +- 上游使用真实 `BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut` 双输入 builder,生成有效 1 Solid、体积 `995.287611`、10 Face 和 18 条原生 history。 +- 下游使用 ordered `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder,依次执行 X 平移和关于 `x=5` 的镜像并融合;名义结果为有效 1 Solid、24 Face、体积 `2600`,包含 525 条原生 history。 +- `8 -> 9 -> 8` 首步 X 平移轨迹使体积在 `2600 -> 2797.6768884 -> 2600` 间变化,编辑态增至 40 Face,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Groove naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定 ordered builder、变异、恢复和持久化证据。 + +### `TSN-PAIR-fillet-fuse` + +`fillet->fuse` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder,并以相交工具形成有效 1 Solid;名义结果为 33 Face、体积 `1071.3666774`,包含 79 条原生 history。 +- `8 -> 7 -> 8` 工具 X 偏移轨迹使体积在 `1071.3666774 -> 1046.4010137 -> 1071.3666774` 间变化,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定相交融合、变异、恢复和持久化证据。 + +### `TSN-PAIR-fillet-cut` + +`fillet->cut` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepAlgoAPI_Cut` 双输入 builder,对 Fillet 结果执行减料;名义结果为有效 1 Solid、31 Face、体积 `932.1027009`,包含 42 条原生 history。 +- `4 -> 3 -> 4` 工具尺寸轨迹使体积在 `932.1027009 -> 969.0683646 -> 932.1027009` 间变化,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定减料变异、恢复和持久化证据。 + +### `TSN-PAIR-fillet-common` + +`fillet->common` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepAlgoAPI_Common` 双输入 builder,以相交工具求 Fillet 结果的布尔交集;名义结果为有效 1 Solid、10 Face、体积 `74.5643421`,包含 360 条原生 history。 +- `7 -> 6 -> 7` 工具 X 偏移轨迹使体积在 `74.5643421 -> 99.5300058 -> 74.5643421` 间变化,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定有体积交集、变异、恢复和持久化证据。 + +### `TSN-PAIR-fillet-rotate` + +`fillet->rotate` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepBuilderAPI_Transform` 单输入 builder 绕 Z 轴旋转 Fillet 结果;名义结果保持有效 1 Solid、26 Face 和体积 `995.9653557`,包含 338 条原生 history。 +- `15 -> 22.5 -> 15` 角度轨迹改变包围盒(名义 `[-2.4982926, 0.0898978, -1e-7, 9.5693604, 12.1575509, 10.0000001]`,编辑态 `[-3.7042092, 0.1226251, -1e-7, 9.1161702, 12.9430046, 10.0000001]`),并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定刚体变换、恢复和持久化证据。 + +### `TSN-PAIR-fillet-pad` + +`fillet->pad` 已完成原生拒绝分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- OCCT `BRepPrimAPI_MakePrism` 对 Fillet Solid 在 `5 -> 7.5 -> 5` 长度轨迹中稳定于 builder 阶段拒绝,三次均不产生结果 Shape 或 history。 +- FreeCAD `PartDesign::Pad` 使用同一 Fillet Solid 作为 Profile,返回 `FeatureExtrusion: Length: Could not extrude the sketch!`,结果 Shape 为空且状态含 `Invalid`;未伪造下游 naming 或接受变异证据。 +- transaction abort 后对象集、源 Shape 和 BREP 哈希精确恢复;干净 FCStd save/reopen/resave 三阶段一致,focused gate 已锁定拒绝阶段、诊断、回滚和持久化证据。 + +### `TSN-PAIR-fillet-pocket` + +`fillet->pocket` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepPrimAPI_MakePrism+BRepAlgoAPI_Cut` 双输入 builder,对 Fillet 结果执行减料拉伸;名义结果为有效 1 Solid、28 Face、体积 `966.2980048`,包含 100 条原生 history。 +- `5 -> 4 -> 5` 深度轨迹使体积在 `966.2980048 -> 972.2636685 -> 966.2980048` 间变化,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定减料拉伸、恢复和持久化证据。 + +### `TSN-PAIR-fillet-loft` + +`fillet->loft` 已完成原生拒绝分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- OCCT `BRepOffsetAPI_ThruSections` 在 `false -> true -> false` ruled 轨迹中生成有效 1 Solid 和 24 条 history,但该结果仅作为 `kernel-superset-only` 诊断,不提升 FreeCAD 能力。 +- FreeCAD `Part::Loft` 对 Fillet Solid section 返回 `Profile shape is not a single vertex, edge, wire nor face.`,结果 Shape 为空且状态含 `Invalid`;未伪造下游 naming 或接受变异证据。 +- transaction abort 后对象集、源 Shape 和 BREP 哈希精确恢复;干净 FCStd save/reopen/resave 三阶段一致,focused gate 已锁定 FreeCAD 决策权、kernel 诊断、回滚和持久化证据。 + +### `TSN-PAIR-fillet-pipe` + +`fillet->pipe` 已完成原生拒绝分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- OCCT `BRepOffsetAPI_MakePipe` 在 `15 -> 12 -> 15` spine 长度轨迹中均产生无效零体积 Shape 和 28 条 history,仅记为 `kernel-invalid-result`,不伪造接受 Shape。 +- FreeCAD `Part::Sweep` 对 Fillet Solid section 返回 `A fatal error occurred when making the sweep`,结果 Shape 为空且状态含 `Invalid`。 +- transaction abort 后对象集、源 Shape 和 BREP 哈希精确恢复;干净 FCStd save/reopen/resave 三阶段一致,focused gate 已锁定 FreeCAD 决策权、kernel 无效诊断、回滚和持久化证据。 + +### `TSN-PAIR-fillet-revolution` + +`fillet->revolution` 已完成原生拒绝分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- OCCT `BRepPrimAPI_MakeRevol` 对 Fillet Solid 在 `360 -> 270 -> 360` 角度轨迹中稳定于 builder 阶段拒绝,三次均不产生结果 Shape 或 history。 +- FreeCAD `Part::Revolution` 使用同一 Fillet Solid 作为 Source,返回 `Solids are not Processed`,结果 Shape 为空且状态含 `Invalid`;未伪造下游 naming 或接受变异证据。 +- transaction abort 后对象集、源 Shape 和 BREP 哈希精确恢复;干净 FCStd save/reopen/resave 三阶段一致,focused gate 已锁定拒绝阶段、精确诊断、回滚和持久化证据。 + +### `TSN-PAIR-fillet-groove` + +`fillet->groove` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepPrimAPI_MakeRevol+BRepAlgoAPI_Cut` 双输入 builder 对 Fillet 结果执行旋转减料;名义结果为有效 1 Solid、30 Face、体积 `991.2529668`,包含 18 条原生 history。 +- `360 -> 180 -> 360` 角度轨迹使拓扑从 30 Face 变为 27 Face 后恢复,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定旋转减料、变异、恢复和持久化证据。 + +### `TSN-PAIR-fillet-fillet` + +`fillet->fillet` 已完成原生拒绝分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 第二个 OCCT `BRepFilletAPI_MakeFillet` 对已圆角 Solid 在 `0.4 -> 0.6 -> 0.4` 半径轨迹中稳定于 builder 阶段拒绝,三次均不产生结果 Shape 或 history。 +- FreeCAD `Part::Fillet` 使用同一 Fillet Solid 作为 Base,返回 `There are no suitable edges for chamfer or fillet`,结果 Shape 为空且状态含 `Invalid`;未伪造下游 naming 或接受变异证据。 +- transaction abort 后对象集、源 Shape 和 BREP 哈希精确恢复;干净 FCStd save/reopen/resave 三阶段一致,focused gate 已锁定拒绝阶段、精确诊断、回滚和持久化证据。 + +### `TSN-PAIR-fillet-chamfer` + +`fillet->chamfer` 已完成原生拒绝分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- OCCT `BRepFilletAPI_MakeChamfer` 对 Fillet Solid 在 `0.4 -> 0.6 -> 0.4` 距离轨迹中稳定于 builder 阶段拒绝,三次均不产生结果 Shape 或 history。 +- FreeCAD `Part::Chamfer` 使用同一 Fillet Solid 作为 Base,返回 `There are no suitable edges for chamfer or fillet`,结果 Shape 为空且状态含 `Invalid`;未伪造下游 naming 或接受变异证据。 +- transaction abort 后对象集、源 Shape 和 BREP 哈希精确恢复;干净 FCStd save/reopen/resave 三阶段一致,focused gate 已锁定拒绝阶段、精确诊断、回滚和持久化证据。 + +### `TSN-PAIR-fillet-hole` + +`fillet->hole` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepPrimAPI_MakeCylinder+BRepAlgoAPI_Cut` builder 对 Fillet 结果执行中心贯穿孔;名义结果为有效 1 Solid、27 Face、体积 `964.5494292`,包含 23 条原生 history。 +- `1 -> 1.5 -> 1` 半径轨迹使体积在 `964.5494292 -> 925.279521 -> 964.5494292` 间变化,并精确恢复名义摘要、history 与语义 naming。 +- 下游获得无歧义 `native-evidence` naming,上游 Fillet 证据已传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定。 + +### `TSN-PAIR-fillet-draft` + +`fillet->draft` 已完成原生拒绝分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 只读原生适用性扫描枚举 Fillet 结果的全部 26 个 Face,在锁定的 +Z 拉伸方向与 XY 中性面下均无有效 Draft Shape;没有用选面 fallback 伪造接受。 +- OCCT `BRepOffsetAPI_DraftAngle` 在 `5 -> 8 -> 5` 角度轨迹中稳定于 builder 阶段拒绝,三次均不产生结果 Shape 或 history。 +- FreeCAD `PartDesign::Draft` 通过事务内 Body、DatumPlane、DatumLine 和 `PartDesign::Feature` Base 评估同一 Fillet 几何;Base 的有效性、拓扑数、体积、面积和边界摘要精确一致,同时显式记录 FreeCAD 元素映射导致的 BREP 重序列化哈希差异。 +- FreeCAD 结果合同为空状态字符串、空 Shape 和 `Touched/Invalid`;transaction abort 后 Body 及所有临时对象消失,顶层源 Shape 的 BREP 哈希精确恢复,干净 FCStd save/reopen/resave 三阶段一致。 + +### `TSN-PAIR-fillet-thickness` + +`fillet->thickness` 已完成原生 no-op 拒绝分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 只读原生扫描确认:全部 26 个 Face 在 `-0.4/-0.6` offset 下均返回与输入同摘要的 Shape;6 个主面的 `0.4/0.6` 正向 offset 只产生无效 Shape 或 builder 拒绝,没有可用的真实变异轨迹。 +- OCCT `BRepOffsetAPI_MakeThickSolid` 在 `-0.4 -> -0.6 -> -0.4` 轨迹中每次均返回有效 Shape 和 1 条 history,但有效性、Solid/Face/Edge/Vertex、体积、面积、边界与 history 哈希全部不变,因此被显式分类为 `kernel-no-op`,不冒充接受。 +- FreeCAD `Part::Thickness` 对同一 Fillet Solid 和 `Face2` 返回 `Valid/Up-to-date` 且 Shape 非空,但结果 Shape 摘要与输入逐字段相同,因此同样记为 `freecadProfileNoOp`。 +- transaction abort 后对象集、源 Shape 和 BREP 哈希精确恢复;干净 FCStd save/reopen/resave 三阶段一致,focused gate 已锁定双 no-op、回滚和持久化证据。 + +### `TSN-PAIR-fillet-linear-pattern` + +`fillet->linear-pattern` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder 沿 X 方向复制并融合 Fillet 结果;名义结果为有效 1 Solid、42 Face、体积 `1794.8665943`,包含 266 条原生 history。 +- `8 -> 9 -> 8` 平移轨迹使体积在 `1794.8665943 -> 1894.7292492 -> 1794.8665943` 间变化,X 上界从 18 变为 19 后恢复,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定交叠融合、变异、恢复和持久化证据。 + +### `TSN-PAIR-fillet-polar-pattern` + +`fillet->polar-pattern` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用真实 `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder 绕 Z 轴旋转复制并融合 Fillet 结果;30 度名义结果为有效 1 Solid、46 Face、体积 `1417.6209625`,包含 234 条原生 history。 +- `30 -> 45 -> 30` 角度轨迹使体积在 `1417.6209625 -> 1580.485276 -> 1417.6209625` 间变化,面积和边界也同步变化,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定旋转融合、变异、恢复和持久化证据。 + +### `TSN-PAIR-fillet-multi-transform` + +`fillet->multi-transform` 已完成原生接受分类,并闭合 Fillet 起始行中尚需分类的全部有序操作对: + +- 上游使用真实 `BRepFilletAPI_MakeFillet` 单输入 builder,对 10x10x10 Box 的全部边执行圆角,生成有效 1 Solid、26 Face、体积 `995.9653557` 和 150 条原生 history。 +- 下游使用 ordered `BRepBuilderAPI_Transform+BRepAlgoAPI_Fuse` builder,依次执行 X 平移、关于 `x=5` 的镜像并融合;名义结果为有效 1 Solid、58 Face、体积 `2593.7678329`,包含 1103 条原生 history。 +- `8 -> 9 -> 8` 首步 X 平移轨迹使体积在 `2593.7678329 -> 2793.4931426 -> 2593.7678329` 间变化,边界从 `[-8, 18]` 扩展为 `[-9, 19]` 后恢复,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Fillet naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定 ordered builder、变异、恢复和持久化证据。 + +### `TSN-PAIR-chamfer-fuse` + +`chamfer->fuse` 已完成原生接受分类: + +- 上游使用真实 `BRepFilletAPI_MakeChamfer` 单输入 builder,对 10x10x10 Box 的全部边执行倒角,生成有效 1 Solid、26 Face、体积 `990.7413333` 和 150 条原生 history。 +- 下游使用真实 `BRepAlgoAPI_Fuse` 双输入 builder,以相交工具融合 Chamfer 结果;名义结果为有效 1 Solid、33 Face、体积 `1066.6586667`,包含 78 条原生 history。 +- `8 -> 7 -> 8` 工具 X 偏移轨迹使体积在 `1066.6586667 -> 1041.7386667 -> 1066.6586667` 间变化,X 上界从 13 变为 12 后恢复,并精确恢复名义摘要、history 与语义 naming。 +- 上游 Chamfer naming 证据向下游传播;FreeCAD FCStd save/reopen/resave 三阶段 Shape 与 naming evidence 稳定,focused gate 已锁定相交融合、变异、恢复和持久化证据。 + 后续任务必须从机器队列的最新 `nextTask` 继续,不在本文手工维护任务名称。