draftwright 0.4.31__tar.gz → 0.4.32__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. {draftwright-0.4.31 → draftwright-0.4.32}/PKG-INFO +2 -2
  2. {draftwright-0.4.31 → draftwright-0.4.32}/docs/reference/recogniser-capabilities.md +11 -3
  3. {draftwright-0.4.31 → draftwright-0.4.32}/pyproject.toml +2 -2
  4. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_core.py +61 -1
  5. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/from_model.py +59 -5
  6. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/orchestrator.py +2 -0
  7. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/builder.py +29 -5
  8. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/drawing.py +18 -4
  9. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/inspection_contract.py +1 -1
  10. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/__init__.py +6 -0
  11. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/compiled.py +3 -0
  12. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/declare.py +8 -0
  13. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/detect.py +1 -0
  14. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/ir.py +86 -0
  15. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/pmi_lowering.py +274 -1
  16. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/pmi.py +34 -1
  17. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recogniser_schema.py +8 -8
  18. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/section_recess_contract.py +28 -8
  19. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/sheet.py +74 -1
  20. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/sheet_emit.py +45 -2
  21. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_add_dimension.py +3 -0
  22. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_compiled_plan_boundary.py +6 -5
  23. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_inspection_contract.py +1 -1
  24. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1157_no_implicit_general_tolerance.py +18 -0
  25. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1298_manufacturing_requirements.py +462 -10
  26. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1308_machined_leader_analytics.py +34 -0
  27. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1485_curved_pockets.py +4 -4
  28. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pareto_loop_canary_issue_1753.py +2 -2
  29. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_capabilities.py +19 -20
  30. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_section_recess_pockets.py +40 -16
  31. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_emit.py +67 -1
  32. {draftwright-0.4.31 → draftwright-0.4.32}/.gitignore +0 -0
  33. {draftwright-0.4.31 → draftwright-0.4.32}/CHANGELOG.md +0 -0
  34. {draftwright-0.4.31 → draftwright-0.4.32}/LICENSE +0 -0
  35. {draftwright-0.4.31 → draftwright-0.4.32}/README.md +0 -0
  36. {draftwright-0.4.31 → draftwright-0.4.32}/docs/adr/README.md +0 -0
  37. {draftwright-0.4.31 → draftwright-0.4.32}/docs/reference/sheet.md +0 -0
  38. {draftwright-0.4.31 → draftwright-0.4.32}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  39. {draftwright-0.4.31 → draftwright-0.4.32}/skills/SKILL.md +0 -0
  40. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/__init__.py +0 -0
  41. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_build_profile.py +0 -0
  42. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_geometry.py +0 -0
  43. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_pmi_part21.py +0 -0
  44. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_warnings.py +0 -0
  45. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/analysis.py +0 -0
  46. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/angular_geometry.py +0 -0
  47. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotate.py +0 -0
  48. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/__init__.py +0 -0
  49. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/_common.py +0 -0
  50. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/angular.py +0 -0
  51. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/balloons.py +0 -0
  52. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/gears.py +0 -0
  53. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/holes.py +0 -0
  54. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/leaders.py +0 -0
  55. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/sections.py +0 -0
  56. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/audit.py +0 -0
  57. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/blend_contract.py +0 -0
  58. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/cli.py +0 -0
  59. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/compose.py +0 -0
  60. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/document.py +0 -0
  61. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/document_evidence.py +0 -0
  62. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/document_input.py +0 -0
  63. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/evaluation/__init__.py +0 -0
  64. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/evaluation/step_analysis.py +0 -0
  65. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/export.py +0 -0
  66. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/feature_identity.py +0 -0
  67. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fits.py +0 -0
  68. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  69. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  70. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  71. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  72. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/__init__.py +0 -0
  73. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/inspection.py +0 -0
  74. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/intents.py +0 -0
  75. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/layout.py +0 -0
  76. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/leader_policy.py +0 -0
  77. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/__init__.py +0 -0
  78. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/_registry.py +0 -0
  79. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/angled_step_coverage.py +0 -0
  80. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/angular.py +0 -0
  81. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/blend_coverage.py +0 -0
  82. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/chamfer_coverage.py +0 -0
  83. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/channel_coverage.py +0 -0
  84. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/circular_blind_step_coverage.py +0 -0
  85. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/coverage.py +0 -0
  86. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/evidence.py +0 -0
  87. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/fillet_coverage.py +0 -0
  88. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/flat_coverage.py +0 -0
  89. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/gear_coverage.py +0 -0
  90. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/groove_coverage.py +0 -0
  91. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/gusset_rib_coverage.py +0 -0
  92. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/hole_coverage.py +0 -0
  93. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/ink_overlap.py +0 -0
  94. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/issues.py +0 -0
  95. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/oriented_slot_coverage.py +0 -0
  96. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/pad_coverage.py +0 -0
  97. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/paired_ramp_step_coverage.py +0 -0
  98. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/passage_coverage.py +0 -0
  99. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/plate_coverage.py +0 -0
  100. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/pmi_coverage.py +0 -0
  101. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/pocket_coverage.py +0 -0
  102. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/pocket_pattern_coverage.py +0 -0
  103. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/polygonal_boss_coverage.py +0 -0
  104. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
  105. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
  106. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  107. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/quality.py +0 -0
  108. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/rectangular_blind_slot_coverage.py +0 -0
  109. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/requirements.py +0 -0
  110. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +0 -0
  111. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/schedule_evidence.py +0 -0
  112. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/section_recess_coverage.py +0 -0
  113. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/slot_coverage.py +0 -0
  114. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/structural.py +0 -0
  115. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/suggest.py +0 -0
  116. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/through_step_coverage.py +0 -0
  117. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/turned_step_coverage.py +0 -0
  118. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/location_contract.py +0 -0
  119. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/make_drawing.py +0 -0
  120. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/measurement_support.py +0 -0
  121. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/callout.py +0 -0
  122. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/planner.py +0 -0
  123. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/oriented_slot_contract.py +0 -0
  124. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/plate_correspondence.py +0 -0
  125. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/profile_angles.py +0 -0
  126. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/progress.py +0 -0
  127. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/projection.py +0 -0
  128. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/py.typed +0 -0
  129. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recogniser_contract.py +0 -0
  130. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recogniser_policy.py +0 -0
  131. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recognition/__init__.py +0 -0
  132. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recognition_cache.py +0 -0
  133. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recognition_frame.py +0 -0
  134. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recognition_ownership.py +0 -0
  135. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/registry.py +0 -0
  136. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/repair.py +0 -0
  137. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/replay_assessment.py +0 -0
  138. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/reporting.py +0 -0
  139. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/score.py +0 -0
  140. {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/view_plan.py +0 -0
  141. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_burden_report.py +0 -0
  142. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_corpus_cover.py +0 -0
  143. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_drawing_helpers.py +0 -0
  144. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_evidence_contract.py +0 -0
  145. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_kernel.py +0 -0
  146. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_layout_helpers.py +0 -0
  147. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_layout_sig.py +0 -0
  148. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_mutation_corpus.py +0 -0
  149. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_parts.py +0 -0
  150. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_recogniser_public_contract.py +0 -0
  151. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_section_recess_cases.py +0 -0
  152. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_tier_manifest.py +0 -0
  153. {draftwright-0.4.31 → draftwright-0.4.32}/tests/_unit_manifest.py +0 -0
  154. {draftwright-0.4.31 → draftwright-0.4.32}/tests/conftest.py +0 -0
  155. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  156. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/README.md +0 -0
  157. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  158. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/blind-hole.step +0 -0
  159. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
  160. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
  161. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
  162. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
  163. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
  164. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
  165. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
  166. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
  167. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
  168. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
  169. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
  170. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
  171. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
  172. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
  173. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
  174. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
  175. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
  176. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
  177. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
  178. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
  179. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
  180. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
  181. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
  182. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
  183. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  184. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
  185. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
  186. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
  187. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-single.step +0 -0
  188. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
  189. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
  190. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
  191. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
  192. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-blind.step +0 -0
  193. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
  194. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
  195. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
  196. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
  197. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
  198. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
  199. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
  200. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-compound.step +0 -0
  201. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
  202. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-plain.step +0 -0
  203. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
  204. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
  205. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
  206. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
  207. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
  208. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
  209. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-turned.step +0 -0
  210. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
  211. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-double-d.step +0 -0
  212. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
  213. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-nonround.step +0 -0
  214. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
  215. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
  216. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
  217. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-compound.step +0 -0
  218. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
  219. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
  220. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
  221. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
  222. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-narrow.step +0 -0
  223. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
  224. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
  225. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
  226. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
  227. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
  228. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
  229. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
  230. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
  231. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
  232. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
  233. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
  234. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
  235. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
  236. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
  237. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
  238. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pattern-grid.step +0 -0
  239. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
  240. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
  241. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plain-block.step +0 -0
  242. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
  243. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
  244. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
  245. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
  246. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
  247. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
  248. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
  249. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
  250. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
  251. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
  252. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
  253. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-compound.step +0 -0
  254. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
  255. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-lone.step +0 -0
  256. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
  257. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
  258. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
  259. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
  260. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
  261. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
  262. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
  263. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
  264. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-side.step +0 -0
  265. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
  266. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
  267. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
  268. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
  269. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
  270. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
  271. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
  272. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
  273. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
  274. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
  275. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
  276. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
  277. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
  278. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
  279. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
  280. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
  281. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
  282. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
  283. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
  284. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
  285. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
  286. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
  287. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
  288. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
  289. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
  290. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
  291. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/topology-a.step +0 -0
  292. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/topology-b.step +0 -0
  293. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
  294. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
  295. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
  296. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
  297. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
  298. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
  299. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
  300. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
  301. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
  302. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  303. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  304. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/grm04_drive_plate.step +0 -0
  305. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  306. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  307. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
  308. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_1595_whistle_key_frame.step +0 -0
  309. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_1595_whistle_key_lever.step +0 -0
  310. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  311. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_915_case_study_2.step +0 -0
  312. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  313. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  314. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  315. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  316. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  317. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  318. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  319. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  320. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  321. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  322. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  323. {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/whistle_frame_reference.step +0 -0
  324. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/bracket_section.json +0 -0
  325. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/centered_rebate.json +0 -0
  326. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/chamfered.json +0 -0
  327. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/filleted.json +0 -0
  328. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/flange_dense.json +0 -0
  329. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/grid_plate.json +0 -0
  330. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/grooved_shaft.json +0 -0
  331. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/hex_bar.json +0 -0
  332. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/holed_slot.json +0 -0
  333. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/pocketed.json +0 -0
  334. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/prismatic_ladder.json +0 -0
  335. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/scattered_plate.json +0 -0
  336. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/side_drilled.json +0 -0
  337. {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/turned_stepped.json +0 -0
  338. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_adr0018_view_routing.py +0 -0
  339. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_adr0018_view_selection.py +0 -0
  340. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_adr_corpus.py +0 -0
  341. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_agent_improvement_canary_issue_1716.py +0 -0
  342. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_agents_guide.py +0 -0
  343. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_analysis_geometry.py +0 -0
  344. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_angle_patterns.py +0 -0
  345. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_angular_references.py +0 -0
  346. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_angular_rendering.py +0 -0
  347. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_annotation_box_composition.py +0 -0
  348. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_annotation_box_corpus.py +0 -0
  349. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_api_docs.py +0 -0
  350. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_architecture_docs.py +0 -0
  351. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_arrangement_gate.py +0 -0
  352. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_assessment_comparison_issue_1712.py +0 -0
  353. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_audit_differential.py +0 -0
  354. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_axial_dimensions.py +0 -0
  355. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_balloon_ring_standoff.py +0 -0
  356. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_boss_ownership.py +0 -0
  357. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_build_drawing_entrypoints.py +0 -0
  358. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_build_profile_harness.py +0 -0
  359. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_burden_report.py +0 -0
  360. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_candidate_evidence_issue_1726.py +0 -0
  361. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_canonical_angles.py +0 -0
  362. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_carve_free_position_callers.py +0 -0
  363. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_channel_ownership.py +0 -0
  364. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_circular_blind_step_semantics.py +0 -0
  365. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_cli_behavior.py +0 -0
  366. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_cli_report_sidecar.py +0 -0
  367. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_clone_budget.py +0 -0
  368. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_compose_then_pack.py +0 -0
  369. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_corpus_cover.py +0 -0
  370. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_counting_calls.py +0 -0
  371. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_coverage_mode.py +0 -0
  372. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declaration_identity_issue_1710.py +0 -0
  373. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declaration_report_issue_1710.py +0 -0
  374. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declare.py +0 -0
  375. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declared_recognition_gate.py +0 -0
  376. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declared_report_issue_1688.py +0 -0
  377. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_deferred_edits.py +0 -0
  378. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_dense_sheet_canary.py +0 -0
  379. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_deprecation_dates.py +0 -0
  380. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_depth_estimators.py +0 -0
  381. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_detail_views.py +0 -0
  382. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_detect_once.py +0 -0
  383. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_detect_registry.py +0 -0
  384. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_diameter_deduplication.py +0 -0
  385. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_diameter_leaders.py +0 -0
  386. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_dimension_lane_canary_issue_1757.py +0 -0
  387. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_dimension_role_vocabulary.py +0 -0
  388. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_build.py +0 -0
  389. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_claim_authority.py +0 -0
  390. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_claims.py +0 -0
  391. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_coverage.py +0 -0
  392. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_report.py +0 -0
  393. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_report_authority.py +0 -0
  394. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_drawing_encapsulation.py +0 -0
  395. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_drawing_operations.py +0 -0
  396. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_drawing_state.py +0 -0
  397. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_dynamic_corridors.py +0 -0
  398. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_e2e_slice.py +0 -0
  399. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_e2e_standards.py +0 -0
  400. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_equivalent_dimension_presentations_issue_1759.py +0 -0
  401. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_dxf_curves.py +0 -0
  402. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_dxf_zoom.py +0 -0
  403. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_formats.py +0 -0
  404. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_reproducible.py +0 -0
  405. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_shape.py +0 -0
  406. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_external_recognition_boundary.py +0 -0
  407. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_edit_corridors.py +0 -0
  408. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_edit_replay.py +0 -0
  409. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_edit_verbs.py +0 -0
  410. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_leader_candidate_regions.py +0 -0
  411. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_provenance.py +0 -0
  412. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_queries.py +0 -0
  413. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_fillets_adjacency.py +0 -0
  414. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_fit_calculations.py +0 -0
  415. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_fits.py +0 -0
  416. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_flat_completeness.py +0 -0
  417. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_flat_stock_identity.py +0 -0
  418. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_flat_stock_opposition.py +0 -0
  419. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_format_selector.py +0 -0
  420. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_formatting.py +0 -0
  421. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_framed_step_family_evidence.py +0 -0
  422. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_gdt_placement.py +0 -0
  423. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_geometry_graph_spike.py +0 -0
  424. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_grid_lattice_convention.py +0 -0
  425. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_groove_completeness_evidence.py +0 -0
  426. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_groove_profile.py +0 -0
  427. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_gusset_rib_semantics.py +0 -0
  428. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_hole_annotations.py +0 -0
  429. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_hole_pattern_callouts.py +0 -0
  430. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_hole_table.py +0 -0
  431. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_import_boundaries.py +0 -0
  432. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_interior_label_placement.py +0 -0
  433. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_iso_layout.py +0 -0
  434. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_iso_nts_caption_placement.py +0 -0
  435. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_isometric_orientation.py +0 -0
  436. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_isometric_placement.py +0 -0
  437. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1000_envelope_reuse.py +0 -0
  438. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1006_measurement_comparison.py +0 -0
  439. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1058_wheel_profile.py +0 -0
  440. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  441. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1082_polygonal_stock.py +0 -0
  442. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1086_declared_gears.py +0 -0
  443. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  444. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1126_requesting_less_never_scores_better.py +0 -0
  445. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1130_view_planning_evidence.py +0 -0
  446. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1132_turned_profile_span_is_reported.py +0 -0
  447. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  448. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1143_hole_completeness.py +0 -0
  449. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  450. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1146_scale_completeness.py +0 -0
  451. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  452. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  453. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  454. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  455. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1166_cross_pass_feature_leaders.py +0 -0
  456. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1176_quality_fidelity.py +0 -0
  457. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1177_angular_dimensions.py +0 -0
  458. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  459. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1188_per_view_assignment.py +0 -0
  460. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1190_section_decision.py +0 -0
  461. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  462. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
  463. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  464. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  465. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  466. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
  467. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  468. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  469. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1217_claimed_representations.py +0 -0
  470. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1217_the_facility_is_shared.py +0 -0
  471. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  472. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  473. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  474. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1245_passage_disposition.py +0 -0
  475. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
  476. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1247_angled_step_disposition.py +0 -0
  477. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1254_turned_chamfers.py +0 -0
  478. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1260_view_constraints.py +0 -0
  479. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1262_automatic_turned_views.py +0 -0
  480. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  481. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1281_turned_fillets.py +0 -0
  482. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  483. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1299_page_escalation.py +0 -0
  484. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1312_engine_costs.py +0 -0
  485. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1325_nominal_agreement.py +0 -0
  486. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1332_overlap_remedy.py +0 -0
  487. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1332_zone_labels.py +0 -0
  488. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
  489. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1334_prevent_ink.py +0 -0
  490. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  491. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
  492. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1349_precision_display.py +0 -0
  493. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1350_detected_takeover.py +0 -0
  494. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1351_structured_note_coverage.py +0 -0
  495. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  496. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  497. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1357_framed_activation.py +0 -0
  498. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1357_framed_boundary.py +0 -0
  499. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
  500. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1357_pmi_frame.py +0 -0
  501. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1360_thread_depth.py +0 -0
  502. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
  503. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
  504. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
  505. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
  506. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
  507. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
  508. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1373_plate_completeness_evidence.py +0 -0
  509. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
  510. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
  511. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1374_turned_step_completeness_evidence.py +0 -0
  512. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1378_diameter_leader_targets.py +0 -0
  513. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1390_sheet_registration.py +0 -0
  514. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1392_recognisers_048.py +0 -0
  515. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
  516. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1396_layout_advisories.py +0 -0
  517. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
  518. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1421_rectangular_blind_slot_completeness.py +0 -0
  519. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1421_rectangular_blind_slot_semantics.py +0 -0
  520. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +0 -0
  521. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +0 -0
  522. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1432_adoption.py +0 -0
  523. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1432_boundary_failures.py +0 -0
  524. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
  525. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1433_blend_semantics.py +0 -0
  526. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
  527. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1460_step_inspection.py +0 -0
  528. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1466_dimension_options.py +0 -0
  529. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1466_semantic_sides.py +0 -0
  530. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1479_radius_leader_targets.py +0 -0
  531. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
  532. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1485_rounded_pockets.py +0 -0
  533. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1505_diameter_coverage.py +0 -0
  534. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1505_short_axial_chains.py +0 -0
  535. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1511_turned_boss_heights.py +0 -0
  536. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1514_projection_safeguard.py +0 -0
  537. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1515_first_angle.py +0 -0
  538. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1516_dimension_text.py +0 -0
  539. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1517_through_indicator.py +0 -0
  540. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1518_explicit_rear.py +0 -0
  541. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
  542. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1530_section_provenance.py +0 -0
  543. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1531_semantic_hole_counts.py +0 -0
  544. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1532_authored_section_examples.py +0 -0
  545. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1533_review_diagnostics.py +0 -0
  546. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1534_build_progress.py +0 -0
  547. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1536_title_overflow.py +0 -0
  548. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1543_feature_schedules.py +0 -0
  549. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1543_schedule_requirements.py +0 -0
  550. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1544_frame_document_canary.py +0 -0
  551. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1555_turned_recognition_format_invariance.py +0 -0
  552. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1560_envelope_axes.py +0 -0
  553. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1563_sheet_pmi_reconciliation.py +0 -0
  554. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1585_title_block_date.py +0 -0
  555. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1593_title_block_keepout.py +0 -0
  556. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1596_bolt_circle_corroboration.py +0 -0
  557. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1598_hex_pockets.py +0 -0
  558. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1599_duplicate_slot_widths.py +0 -0
  559. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1601_flat_precision.py +0 -0
  560. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1603_cli_output_paths.py +0 -0
  561. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1604_internal_section.py +0 -0
  562. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1612_frame_sergio_coverage.py +0 -0
  563. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1612_sheet_margins.py +0 -0
  564. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1613_circular_channel.py +0 -0
  565. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_367_leader_ink.py +0 -0
  566. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  567. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_563_placement_intent.py +0 -0
  568. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_676_polygonal_boss.py +0 -0
  569. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  570. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_740_leader_assignment.py +0 -0
  571. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_798_floor_cardinality.py +0 -0
  572. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_798_material_field.py +0 -0
  573. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_798_silhouette_lint.py +0 -0
  574. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_827_real_part_canary.py +0 -0
  575. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_883_location_identity.py +0 -0
  576. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_885_prismatic_coverage.py +0 -0
  577. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_909_sloped_profile.py +0 -0
  578. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_915_dense_case.py +0 -0
  579. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_916_pocket_leader.py +0 -0
  580. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_917_open_channel.py +0 -0
  581. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  582. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_955_height_contingency.py +0 -0
  583. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  584. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_label_provenance.py +0 -0
  585. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout.py +0 -0
  586. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_cleanliness.py +0 -0
  587. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_constants.py +0 -0
  588. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_evidence_issue_1711.py +0 -0
  589. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_generalisation.py +0 -0
  590. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_hypothesis.py +0 -0
  591. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_override_lane_issue_1757.py +0 -0
  592. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_override_side_issue_1757.py +0 -0
  593. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_property.py +0 -0
  594. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_leader_footprint.py +0 -0
  595. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_leader_region_policy.py +0 -0
  596. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_box_cache.py +0 -0
  597. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_coverage.py +0 -0
  598. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_ink_overlap.py +0 -0
  599. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_reconciliation.py +0 -0
  600. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_structural.py +0 -0
  601. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_suggestions.py +0 -0
  602. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_summary.py +0 -0
  603. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_linting.py +0 -0
  604. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_location_dimensions.py +0 -0
  605. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_location_vocabulary.py +0 -0
  606. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_machined_feature_callouts.py +0 -0
  607. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_make_drawing_entrypoints.py +0 -0
  608. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_nested_recognition_ownership.py +0 -0
  609. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_note_verb.py +0 -0
  610. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_object_aspects.py +0 -0
  611. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_occupancy_boxes.py +0 -0
  612. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_occurrence_recognition_ownership.py +0 -0
  613. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_overall_height_coverage.py +0 -0
  614. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pad_completeness_evidence.py +0 -0
  615. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_paired_ramp_semantics.py +0 -0
  616. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_parameter_id.py +0 -0
  617. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_part_classification.py +0 -0
  618. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_part_model.py +0 -0
  619. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pattern_ownership.py +0 -0
  620. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pitch_dim_footprint.py +0 -0
  621. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_place_dimension.py +0 -0
  622. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_plate_ownership.py +0 -0
  623. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi.py +0 -0
  624. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi_common_labels.py +0 -0
  625. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi_datum_lowering.py +0 -0
  626. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi_gtol_lowering.py +0 -0
  627. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi_part21.py +0 -0
  628. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pocket_completeness_evidence.py +0 -0
  629. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pocket_pattern.py +0 -0
  630. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pocket_pattern_completeness_evidence.py +0 -0
  631. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pocket_pattern_recognition.py +0 -0
  632. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_polygonal_boss_completeness_evidence.py +0 -0
  633. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_principal_profile_classifier.py +0 -0
  634. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_prismatic_boss_diameter.py +0 -0
  635. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_prismatic_classification.py +0 -0
  636. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_prismatic_dimensions.py +0 -0
  637. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_private_test_attr_reads.py +0 -0
  638. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_private_test_imports.py +0 -0
  639. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_profile_angles.py +0 -0
  640. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_projection_symbol_default.py +0 -0
  641. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_quality_components.py +0 -0
  642. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_quiddity_lifecycle_boundary.py +0 -0
  643. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_real_part_fixtures.py +0 -0
  644. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_adoption.py +0 -0
  645. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_contract.py +0 -0
  646. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_policy.py +0 -0
  647. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_step_inventory.py +0 -0
  648. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recognition_boundary_failures.py +0 -0
  649. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recognition_evidence_schema.py +0 -0
  650. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recognition_policy_dispositions.py +0 -0
  651. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recognition_result.py +0 -0
  652. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_refactor_golden.py +0 -0
  653. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_registry.py +0 -0
  654. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_render_seam.py +0 -0
  655. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_repack_geometry_seam.py +0 -0
  656. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_repair.py +0 -0
  657. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_replay_assessment_issue_1715.py +0 -0
  658. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_report_projection.py +0 -0
  659. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_report_status_reasons_issue_1618.py +0 -0
  660. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_report_writer.py +0 -0
  661. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_requirement_applicability.py +0 -0
  662. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_requirement_carriers.py +0 -0
  663. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_requirement_catalog.py +0 -0
  664. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_requirement_catalog_families.py +0 -0
  665. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_scale_policy.py +0 -0
  666. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_scale_selection.py +0 -0
  667. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_score.py +0 -0
  668. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_script_detail_parity.py +0 -0
  669. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_section_hatching.py +0 -0
  670. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_section_recess_contract.py +0 -0
  671. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_shared_box_memo.py +0 -0
  672. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_shared_drawing_cache.py +0 -0
  673. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_furniture.py +0 -0
  674. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_gdt.py +0 -0
  675. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_generation_snapshot.py +0 -0
  676. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_identity_invariant.py +0 -0
  677. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_notes.py +0 -0
  678. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_of.py +0 -0
  679. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_section.py +0 -0
  680. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_tables.py +0 -0
  681. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slanted_blind_step.py +0 -0
  682. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slot_completeness.py +0 -0
  683. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slot_pattern.py +0 -0
  684. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slot_pattern_recognition.py +0 -0
  685. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slot_recognition.py +0 -0
  686. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_soft_deprecation.py +0 -0
  687. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_solve_trace.py +0 -0
  688. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_step_analysis_evaluation.py +0 -0
  689. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_strip_layout.py +0 -0
  690. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_strip_zones.py +0 -0
  691. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_suite_shape.py +0 -0
  692. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_suppression_ledger.py +0 -0
  693. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_suppression_marks.py +0 -0
  694. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_through_step_ownership.py +0 -0
  695. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_through_step_semantics.py +0 -0
  696. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_tier_manifest.py +0 -0
  697. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_title_block_units_format.py +0 -0
  698. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_tolerances.py +0 -0
  699. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_turned_diameters.py +0 -0
  700. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_turned_lengths.py +0 -0
  701. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_turned_step_ownership.py +0 -0
  702. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_turned_steps.py +0 -0
  703. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_two_pass_layout.py +0 -0
  704. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_typ_dimensions.py +0 -0
  705. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_typed_remediation_projection_issue_1759.py +0 -0
  706. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_version_bump_ci.py +0 -0
  707. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_view_blocks.py +0 -0
  708. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_view_coordinates.py +0 -0
  709. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_view_plan.py +0 -0
  710. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_witness_label_reconciliation.py +0 -0
  711. {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.4.31
3
+ Version: 0.4.32
4
4
  Summary: Automated technical-drawing generation for build123d
5
5
  Project-URL: Homepage, https://github.com/pzfreo/draftwright
6
6
  Project-URL: Repository, https://github.com/pzfreo/draftwright
@@ -692,7 +692,7 @@ Requires-Dist: numpy>=1.24
692
692
  Requires-Dist: ocp-gordon<0.3
693
693
  Requires-Dist: pillow>=10
694
694
  Requires-Dist: pypdfium2>=4
695
- Requires-Dist: quiddity==0.3.2
695
+ Requires-Dist: quiddity==0.3.3
696
696
  Requires-Dist: reportlab>=4.0
697
697
  Requires-Dist: rich>=10.11
698
698
  Requires-Dist: steputils==0.1
@@ -70,11 +70,19 @@ issue. The contract test derives package record outputs, converter registries, l
70
70
  and emitter branches independently, so copying a new name into the declaration alone cannot make CI
71
71
  pass.
72
72
 
73
- ### Quiddity 0.3.2 runtime contract
73
+ ### Quiddity 0.3.3 runtime contract
74
74
 
75
- The runtime pins the published `quiddity==0.3.2` package, following the 0.2.4 adoption in
75
+ The runtime pins the published `quiddity==0.3.3` package. This release adds material-side
76
+ reconstruction facts to fillets, planar chamfers and angled steps, paired ramps, and open-section
77
+ profiles. Draftwright consumes these records to describe and annotate the recognised part; it does
78
+ not reconstruct a cut solid from them, so the new `side`, `corner`, `opening_direction`,
79
+ `half_width`, and `material_side` fields do not enter the drafting IR. The exact consumer schema
80
+ declarations advance with the provider, and the section-recess adapter accepts document schema 4
81
+ while continuing to reject unknown later schemas.
82
+
83
+ Version 0.3.2 followed the 0.2.4 adoption in
76
84
  [#1486](https://github.com/pzfreo/draftwright/pull/1486) and the migration in
77
- [#1471](https://github.com/pzfreo/draftwright/issues/1471). Version 0.3.2 advances the public
85
+ [#1471](https://github.com/pzfreo/draftwright/issues/1471). It advanced the public
78
86
  `Slot` record to schema 2: `end_radius` distinguishes two semicircular stadium ends and
79
87
  `corner_radius` distinguishes rounded rectangular corners. Draftwright consumes
80
88
  `end_radius` for through-slot radius requirements; rounded-corner rectangular slots remain a
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "draftwright"
7
- version = "0.4.31"
7
+ version = "0.4.32"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -23,7 +23,7 @@ dependencies = [
23
23
  # published wheels, not only uv's development resolver constraints.
24
24
  "cadquery-ocp-novtk!=7.9.3.1.1 ; python_full_version >= '3.13'",
25
25
  "build123d-drafting-helpers>=0.15.4",
26
- "quiddity==0.3.2",
26
+ "quiddity==0.3.3",
27
27
  "numpy>=1.24",
28
28
  # PNG raster export (SVG→PDF→PNG). Both permissively licensed (Pillow HPND; pypdfium2
29
29
  # Apache-2.0 wrapping Google PDFium BSD-3) and ship pre-built wheels with NO native system
@@ -1689,7 +1689,13 @@ def _add_title_block(dwg, a: Analysis):
1689
1689
  bx + cell["max_x"],
1690
1690
  margins.bottom + cell["max_y"],
1691
1691
  )
1692
- place_annotation(dwg.registry, dwg.items, tb, "title_block")
1692
+ place_annotation(
1693
+ dwg.registry,
1694
+ dwg.items,
1695
+ tb,
1696
+ "title_block",
1697
+ feature=dwg._build.general_tolerance_source,
1698
+ )
1693
1699
 
1694
1700
 
1695
1701
  def _make_sheet_frame(a: Analysis) -> Compound:
@@ -1768,6 +1774,60 @@ def _add_scale_note(dwg, a: Analysis):
1768
1774
  place_annotation(dwg.registry, dwg.items, note, "scale_note")
1769
1775
 
1770
1776
 
1777
+ def _add_default_surface_finish(dwg, a: Analysis):
1778
+ """Draw an imported document-wide ISO 1302 requirement without a leader.
1779
+
1780
+ The reserved band above the title block is sheet furniture space. A document default
1781
+ belongs there: hanging it from model geometry would falsely narrow its scope to one face.
1782
+ """
1783
+ requirement = dwg._build.default_surface_finish_source
1784
+ if requirement is None:
1785
+ return
1786
+
1787
+ from build123d_drafting import SurfaceFinish
1788
+
1789
+ symbol = SurfaceFinish(
1790
+ f"Ra {requirement.ra}",
1791
+ (0, 0),
1792
+ draft=draft_preset(
1793
+ font_size=dwg.draft.font_size,
1794
+ decimal_precision=dwg.draft.decimal_precision,
1795
+ font_path=PLEX_SANS_CONDENSED,
1796
+ ),
1797
+ )
1798
+ box = symbol.bounding_box()
1799
+ width, height = box.max.X - box.min.X, box.max.Y - box.min.Y
1800
+ label = symbol.label_bbox
1801
+ label_x = (label[0] + label[2] - box.min.X - box.max.X) / 2
1802
+ label_y = (label[1] + label[3] - box.min.Y - box.max.Y) / 2
1803
+ # Occupy the left end of the title-block furniture band. Scale and projection method use
1804
+ # its right end, leaving independent document controls readable on every standard sheet.
1805
+ cx = a.PAGE_W - a.TB_W - _title_margins(a).right + width / 2
1806
+ cy = _title_block_top(a) + _TB_FURNITURE_GAP + height / 2
1807
+ symbol = symbol.locate(Location((cx - box.min.X - width / 2, cy - box.min.Y - height / 2, 0)))
1808
+ symbol.pdf_text_relative_specs = (
1809
+ (
1810
+ symbol.label,
1811
+ label_x,
1812
+ label_y,
1813
+ dwg.draft.font_size,
1814
+ PLEX_SANS_CONDENSED,
1815
+ "IBM Plex Sans Condensed",
1816
+ "REGULAR",
1817
+ "center",
1818
+ "middle",
1819
+ ),
1820
+ )
1821
+ symbol.is_default_surface_finish = True
1822
+ place_annotation(
1823
+ dwg.registry,
1824
+ dwg.items,
1825
+ symbol,
1826
+ "default_surface_finish",
1827
+ feature=requirement,
1828
+ )
1829
+
1830
+
1771
1831
  def _add_projection_symbol(dwg, a: Analysis):
1772
1832
  """Place the ISO 5456-2 projection-method glyph (#769) in the reserved title-block band,
1773
1833
  just above the drawn title block (deterministic empty space — the block reserves _TB_H but
@@ -2704,6 +2704,7 @@ def place_machined_leader_jobs(
2704
2704
  expand_lanes=True,
2705
2705
  region_policy=LeaderRegionPolicy.EXTERIOR,
2706
2706
  source_ids_by_name=None,
2707
+ source_drop_severity="warning",
2707
2708
  priority=0.0,
2708
2709
  ) -> int:
2709
2710
  """Lower every machined callout to the one shared ``FeatureLeaderJob`` path.
@@ -2819,8 +2820,25 @@ def place_machined_leader_jobs(
2819
2820
  feature,
2820
2821
  )
2821
2822
 
2822
- def _build(tip, elbow, _feature, *, _label=label):
2823
- return Leader(tip=(tip[0], tip[1], 0), elbow=elbow, label=_label, draft=dwg.draft)
2823
+ source_features = tuple(
2824
+ {
2825
+ id(getattr(identity, "feature", None)): getattr(identity, "feature", None)
2826
+ for identity in measurement
2827
+ if getattr(identity, "feature", None) is not None
2828
+ }.values()
2829
+ )
2830
+
2831
+ def _build(
2832
+ tip,
2833
+ elbow,
2834
+ _feature,
2835
+ *,
2836
+ _label=label,
2837
+ _source_features=source_features,
2838
+ ):
2839
+ leader = Leader(tip=(tip[0], tip[1], 0), elbow=elbow, label=_label, draft=dwg.draft)
2840
+ leader.source_features = _source_features
2841
+ return leader
2824
2842
 
2825
2843
  def _fallback_accept(
2826
2844
  candidate,
@@ -2883,8 +2901,13 @@ def place_machined_leader_jobs(
2883
2901
  ):
2884
2902
  validation = reason == "geometry_validation"
2885
2903
  detail = "rendered geometry validation failed" if validation else "no clear room"
2904
+ severity = (
2905
+ ("error" if _source_ids else "warning")
2906
+ if source_drop_severity == "source"
2907
+ else source_drop_severity
2908
+ )
2886
2909
  ctx.record_issue(
2887
- "warning",
2910
+ severity,
2888
2911
  drop_code,
2889
2912
  f"{noun} callout {_label} not placed ({detail})",
2890
2913
  measurement=_measurement,
@@ -2934,7 +2957,7 @@ def place_machined_leader_jobs(
2934
2957
  fallback_accept=_fallback_accept,
2935
2958
  interior_label_clear=interior_label_clear,
2936
2959
  allow_policy_b_fixed=True,
2937
- on_drop=_on_drop if source_ids else None,
2960
+ on_drop=(_on_drop if source_ids or source_drop_severity == "source" else None),
2938
2961
  )
2939
2962
  )
2940
2963
 
@@ -2996,6 +3019,7 @@ def render_chamfers(dwg, plan, a, *, ctx, only=None) -> int:
2996
3019
  collapse.setdefault(spec, []).append((g, pd))
2997
3020
 
2998
3021
  jobs = []
3022
+ source_ids_by_name = {}
2999
3023
  for gi, (_spec, members) in enumerate(sorted(collapse.items())):
3000
3024
  if only is not None:
3001
3025
  # Filter after enumerating the full collapse so a surviving group keeps the same
@@ -3023,9 +3047,17 @@ def render_chamfers(dwg, plan, a, *, ctx, only=None) -> int:
3023
3047
  label = _chamfer_label(representative_pd.value_text, representative_pd.value, ch)
3024
3048
  if len(members) > 1:
3025
3049
  label = f"{len(members)}× {label}"
3050
+ name = f"m_chamfer_{axis}{gi}"
3051
+ source_ids_by_name[name] = tuple(
3052
+ dict.fromkeys(
3053
+ source_id
3054
+ for member, _pd in members
3055
+ for source_id in getattr(member.facts, "source_ids", ())
3056
+ )
3057
+ )
3026
3058
  jobs.append(
3027
3059
  (
3028
- f"m_chamfer_{axis}{gi}",
3060
+ name,
3029
3061
  view,
3030
3062
  vb,
3031
3063
  label + _tol_suffix(representative_pd.tolerance, draft),
@@ -3050,6 +3082,8 @@ def render_chamfers(dwg, plan, a, *, ctx, only=None) -> int:
3050
3082
  ctx=ctx,
3051
3083
  joint=True,
3052
3084
  region_policy=LeaderRegionPolicy.AUTO,
3085
+ source_ids_by_name=source_ids_by_name,
3086
+ source_drop_severity="source",
3053
3087
  )
3054
3088
 
3055
3089
 
@@ -8872,6 +8906,26 @@ def _pmi_source_ids(item) -> tuple[str, ...]:
8872
8906
  return tuple(dict.fromkeys(((singular,) if singular else ()) + plural))
8873
8907
 
8874
8908
 
8909
+ def render_document_notes(dwg, model) -> int:
8910
+ """Place source-proven drawing-wide requirements in one solver-owned notes block."""
8911
+ notes = [feature for feature in model.features if feature.kind == "document_note"]
8912
+ if not notes:
8913
+ return 0
8914
+ rows = [("GENERAL NOTES",)] + [
8915
+ (f"{index} {_font_safe_text(note.text)}",) for index, note in enumerate(notes, 1)
8916
+ ]
8917
+ placed = dwg.add_table(
8918
+ rows,
8919
+ prefer="tr",
8920
+ name="general_notes",
8921
+ _source_ids=tuple(source_id for note in notes for source_id in _pmi_source_ids(note)),
8922
+ _features=tuple(notes),
8923
+ _drop_code="pmi_dropped",
8924
+ _drop_severity="error",
8925
+ )
8926
+ return len(notes) if placed is not None else 0
8927
+
8928
+
8875
8929
  def _gdt_glyph(item, draft):
8876
8930
  """Build the ISO 1101/5459/1302 glyph sketch for one GD&T IR item at the origin
8877
8931
  (the :class:`Leader` repositions it). A fresh sketch per call — the leader translate
@@ -24,6 +24,7 @@ from draftwright._core import (
24
24
  Analysis,
25
25
  DetailRequest,
26
26
  HoleRef,
27
+ _add_default_surface_finish,
27
28
  _add_projection_symbol,
28
29
  _add_scale_note,
29
30
  _add_sheet_frame,
@@ -936,6 +937,7 @@ def _auto_annotate(dwg, a: Analysis, *, detail_view: bool = False):
936
937
  # ISO 5456-2 projection-method glyph (#769) in the reserved title-block band.
937
938
  _add_projection_symbol(dwg, a)
938
939
  _add_scale_note(dwg, a)
940
+ _add_default_surface_finish(dwg, a)
939
941
 
940
942
  def _s_tabulate():
941
943
  # Escalate to a hole table when the plan view is too dense to dimension
@@ -34,6 +34,7 @@ from draftwright._core import (
34
34
  _LADDER,
35
35
  _PAGE_SIZES,
36
36
  _SCALES,
37
+ _add_default_surface_finish,
37
38
  _add_projection_symbol,
38
39
  _add_scale_note,
39
40
  _add_sheet_frame,
@@ -58,6 +59,7 @@ from draftwright.annotations._common import (
58
59
  annotation_ink_obstacles,
59
60
  place_iso_nts_note,
60
61
  )
62
+ from draftwright.annotations.from_model import render_document_notes
61
63
  from draftwright.annotations.gears import render_gear_tables
62
64
  from draftwright.annotations.orchestrator import (
63
65
  _WITHHOLDING_CODES,
@@ -567,6 +569,7 @@ def _assemble(
567
569
  features=[*pm.features, rot],
568
570
  declaration_identities=(*identities, None) if identities else (),
569
571
  )
572
+
570
573
  # A z step declares a segment of a z-turned profile. `.step()` on a BOSS — an external
571
574
  # cylinder on a prismatic part — is a misuse of the verb, and the symptom is that the
572
575
  # declared steps leave the bulk of the part unspanned (#631). This is a verb-misuse
@@ -586,13 +589,16 @@ def _assemble(
586
589
  # annotations detection would (render_pmi reads them off the model, gated on a.pmi_mode)
587
590
  # so a re-run reproduces the PMI dims (#472). Gated on the caller not having declared
588
591
  # imported authored annotations, so an explicit set wins.
592
+ def _declares_imported_pmi(feature) -> bool:
593
+ if feature.kind in ("authored_dimension", "pmi"):
594
+ return True
595
+ return bool(
596
+ getattr(feature, "source_id", "") or tuple(getattr(feature, "source_ids", ()))
597
+ )
598
+
589
599
  if (
590
600
  a.pmi_mode == "annotate"
591
- and not any(
592
- f.kind in ("authored_dimension", "pmi")
593
- or (f.kind == "control_frame" and bool(getattr(f, "source_id", "")))
594
- for f in pm.features
595
- )
601
+ and not any(_declares_imported_pmi(feature) for feature in pm.features)
596
602
  and not any(
597
603
  getattr(value, "source", "") == "ap242_pmi" and getattr(value, "source_ids", ())
598
604
  for value in pm.decorations.values()
@@ -636,6 +642,15 @@ def _assemble(
636
642
  else ()
637
643
  ),
638
644
  )
645
+ # A source-proven document default uses the existing title-block carrier when the caller
646
+ # did not explicitly author one. An explicit tolerance, including the blank string, wins.
647
+ general_tolerance_source = None
648
+ if a.tolerance is None:
649
+ defaults = [feature for feature in pm.features if feature.kind == "general_tolerance"]
650
+ if len(defaults) == 1:
651
+ general_tolerance_source = defaults[0]
652
+ a = replace(a, tolerance=getattr(general_tolerance_source, "designation"))
653
+
639
654
  # ADR 1 (was 0005 §2) (#639): the ONE build-context attachment — analysis + finished model
640
655
  # in a single typed BuildState; the compat properties on Drawing read through it.
641
656
  dwg._build.analysis = a
@@ -655,6 +670,13 @@ def _assemble(
655
670
  ownership=a.recognition_ownership,
656
671
  )
657
672
  dwg._build.part_model = pm
673
+ dwg._build.general_tolerance_source = general_tolerance_source
674
+ default_finishes = [
675
+ feature for feature in pm.features if feature.kind == "default_surface_finish"
676
+ ]
677
+ dwg._build.default_surface_finish_source = (
678
+ default_finishes[0] if len(default_finishes) == 1 else None
679
+ )
658
680
  # Persist the caller's detail-view setting: on the auto_dims=False path the flag
659
681
  # reaches no pass here, but the finalize drain gates the prismatic detail
660
682
  # request on it exactly as the auto pass does (#661).
@@ -784,6 +806,7 @@ def _assemble(
784
806
  _add_zone_grid(dwg, a)
785
807
  _add_projection_symbol(dwg, a)
786
808
  _add_scale_note(dwg, a)
809
+ _add_default_surface_finish(dwg, a)
787
810
 
788
811
  # The NTS caption is post-fit late furniture too, and goes FIRST: it is tied to the
789
812
  # iso block it labels, whereas a table may sit anywhere the sheet has room. Placing
@@ -796,6 +819,7 @@ def _assemble(
796
819
  # `_fit_iso_view`; placing a table there lets the subsequently fitted ISO view move into
797
820
  # it. Every initial/repacked assembly reaches this common point after its final ISO fit,
798
821
  # and `add_table()` now sees the settled views plus all earlier annotations as obstacles.
822
+ render_document_notes(dwg, pm)
799
823
  render_gear_tables(dwg, pm)
800
824
 
801
825
  # The audit ledger, filled at ONE site for both paths (#996 / ADR 1 (was 0005 §2)).
@@ -20,7 +20,7 @@ from contextvars import ContextVar
20
20
  from dataclasses import dataclass
21
21
  from dataclasses import field as dataclasses_field
22
22
  from itertools import permutations
23
- from typing import TYPE_CHECKING, Any, NamedTuple
23
+ from typing import TYPE_CHECKING, Any, Literal, NamedTuple
24
24
 
25
25
  if TYPE_CHECKING:
26
26
  from quiddity import RecognitionResult
@@ -526,6 +526,11 @@ class BuildState:
526
526
  #: The title block's deterministic page-space footprint, measured before it is
527
527
  #: drawn so strip placement can avoid it (#1593). None until the builder sets it.
528
528
  pending_title_block_box: tuple | None = None
529
+ #: Imported document default selected as the title-block tolerance carrier. ``None``
530
+ #: when the caller supplied any explicit value, even identical display text.
531
+ general_tolerance_source: object | None = None
532
+ #: Imported document-wide surface finish rendered as title-block furniture.
533
+ default_surface_finish_source: object | None = None
529
534
  #: Per-view filled projected material (#798) as ``{id(view_shape): (shape, field)}``.
530
535
  #: Keyed by shape identity because the projected shapes carry no view label (lint
531
536
  #: takes their names from ``Drawing.views`` since #1196), and holding the shape
@@ -3804,6 +3809,10 @@ class Drawing:
3804
3809
  name="table",
3805
3810
  block_cols=None,
3806
3811
  _source_id: str | None = None,
3812
+ _source_ids: tuple[str, ...] = (),
3813
+ _features: tuple[object, ...] = (),
3814
+ _drop_code: str = "table_dropped",
3815
+ _drop_severity: Literal["error", "warning", "info"] = "warning",
3807
3816
  _cells=(),
3808
3817
  ):
3809
3818
  """Add a generic data table in the preferred available sheet region (#93/#1145).
@@ -3876,18 +3885,23 @@ class Drawing:
3876
3885
  detail = "solver returned no placement trace"
3877
3886
  self._registry.record_issue(
3878
3887
  LintIssue(
3879
- severity="warning",
3880
- code="table_dropped",
3888
+ severity=_drop_severity,
3889
+ code=_drop_code,
3881
3890
  message=(
3882
3891
  f"table {name!r} did not fit the sheet; measured page-space footprint "
3883
3892
  f"{measured}; {detail}"
3884
3893
  ),
3885
- source_ids=(_source_id,) if _source_id is not None else (),
3894
+ source_ids=tuple(
3895
+ dict.fromkeys(
3896
+ ((_source_id,) if _source_id is not None else ()) + _source_ids
3897
+ )
3898
+ ),
3886
3899
  measurement_ids=tuple(cell.measurement for cell in _cells),
3887
3900
  )
3888
3901
  )
3889
3902
  return None
3890
3903
  placed = table.locate(Location((pos[0], pos[1], 0)))
3904
+ placed.source_features = _features
3891
3905
  if not _cells:
3892
3906
  return self._add(placed, name)
3893
3907
  snapshot = self._registry.snapshot()
@@ -17,7 +17,7 @@ from quiddity.inspection import inspection_api_manifest
17
17
  CONSUMER_INSPECTION_FORMAT = "draftwright-inspection-api"
18
18
  CONSUMER_INSPECTION_FORMAT_VERSION = 1
19
19
  SUPPORTED_INSPECTION_API_MAJOR = 1
20
- SUPPORTED_RECOGNISER_VERSION = "0.3.2"
20
+ SUPPORTED_RECOGNISER_VERSION = "0.3.3"
21
21
  _DISTRIBUTION = "quiddity"
22
22
  _PROVIDER_FORMAT = "quiddity-inspection-api"
23
23
  _NAMESPACE = "quiddity.inspection"
@@ -82,8 +82,10 @@ from draftwright.model.ir import (
82
82
  Datum,
83
83
  DatumRef,
84
84
  DeclarationIdentity,
85
+ DefaultSurfaceFinish,
85
86
  DimensionParameterId,
86
87
  DimParameter,
88
+ DocumentNote,
87
89
  EnvelopeFeature,
88
90
  ExternalSpurGearFeature,
89
91
  Feature,
@@ -91,6 +93,7 @@ from draftwright.model.ir import (
91
93
  FilletFeature,
92
94
  FlatFeature,
93
95
  Frame,
96
+ GeneralTolerance,
94
97
  GrooveFeature,
95
98
  GussetRibFeature,
96
99
  HexPocketFeature,
@@ -165,8 +168,10 @@ __all__ = [
165
168
  "GussetRibFeature",
166
169
  "Datum",
167
170
  "DatumRef",
171
+ "DefaultSurfaceFinish",
168
172
  "DeclarationIdentity",
169
173
  "DimParameter",
174
+ "DocumentNote",
170
175
  "EnvelopeFeature",
171
176
  "ExternalSpurGearFeature",
172
177
  "AddressableDimension",
@@ -176,6 +181,7 @@ __all__ = [
176
181
  "ViewPlanIncomplete",
177
182
  "Feature",
178
183
  "Frame",
184
+ "GeneralTolerance",
179
185
  "HoleFeature",
180
186
  "KnurlRequirement",
181
187
  "LayoutOverride",
@@ -471,6 +471,9 @@ _FACTS: dict[str, tuple[str, ...]] = {
471
471
  "datum_ref": (),
472
472
  "finish": (),
473
473
  "note": (),
474
+ "general_tolerance": (),
475
+ "default_surface_finish": (),
476
+ "document_note": (),
474
477
  }
475
478
 
476
479
 
@@ -603,6 +603,10 @@ def chamfer(
603
603
  angle=None,
604
604
  at=None,
605
605
  turned=False,
606
+ source_ids=(),
607
+ part21_id="",
608
+ shape_aspect_ids=(),
609
+ reference_item_ids=(),
606
610
  ) -> ChamferFeature:
607
611
  """A chamfer (bevelled edge, #560/#576). Either ``chamfer(bevel_face)`` — the oblique
608
612
  chamfer face supplies axis, both legs and a leader point **on the bevel** — or explicit
@@ -647,6 +651,10 @@ def chamfer(
647
651
  leg2=lo,
648
652
  angle=angle,
649
653
  turned=bool(turned),
654
+ source_ids=tuple(source_ids),
655
+ part21_id=str(part21_id),
656
+ shape_aspect_ids=tuple(shape_aspect_ids),
657
+ reference_item_ids=tuple(reference_item_ids),
650
658
  )
651
659
 
652
660
 
@@ -487,6 +487,7 @@ def build_pmi_features(
487
487
  semantic_name=r.semantic_name,
488
488
  shape_aspect_ids=r.shape_aspect_ids,
489
489
  cylindrical_refs=r.cylindrical_refs,
490
+ reference_bboxes=r.reference_bboxes,
490
491
  )
491
492
  if r.source_category == "geometric_tolerance" and not r.lowering_blockers:
492
493
  material_modifier = None
@@ -2393,6 +2393,10 @@ class ChamferFeature:
2393
2393
  # same ``axis`` field is the bevel-edge direction for a prismatic chamfer, so this semantic
2394
2394
  # discriminator is required for faithful view selection and Sheet round-trip (#1276).
2395
2395
  turned: bool = False
2396
+ source_ids: tuple[str, ...] = ()
2397
+ part21_id: str = ""
2398
+ shape_aspect_ids: tuple[str, ...] = ()
2399
+ reference_item_ids: tuple[str, ...] = ()
2396
2400
  kind: ClassVar[str] = "chamfer"
2397
2401
 
2398
2402
  def parameters(self) -> list[DimParameter]:
@@ -3687,6 +3691,7 @@ class PmiFeature:
3687
3691
  semantic_name: str = ""
3688
3692
  shape_aspect_ids: tuple[str, ...] = ()
3689
3693
  cylindrical_refs: tuple[CylindricalReference, ...] = ()
3694
+ reference_bboxes: tuple[tuple[float, float, float, float, float, float], ...] = ()
3690
3695
  kind: ClassVar[str] = "pmi"
3691
3696
 
3692
3697
  def parameters(self) -> list[DimParameter]:
@@ -3696,6 +3701,87 @@ class PmiFeature:
3696
3701
  return []
3697
3702
 
3698
3703
 
3704
+ @dataclass(frozen=True)
3705
+ class GeneralTolerance:
3706
+ """A document-wide dimensional tolerance requirement carried by the title block."""
3707
+
3708
+ frame: Frame
3709
+ designation: str
3710
+ statement: str = ""
3711
+ source_id: str = ""
3712
+ part21_id: str = ""
3713
+ kind: ClassVar[str] = "general_tolerance"
3714
+
3715
+ def __post_init__(self) -> None:
3716
+ if not isinstance(self.designation, str) or not self.designation.strip():
3717
+ raise ValueError("general tolerance needs a non-empty designation")
3718
+ if self.designation != self.designation.strip():
3719
+ raise ValueError("general tolerance designation cannot contain surrounding whitespace")
3720
+
3721
+ def parameters(self) -> list[DimParameter]:
3722
+ return []
3723
+
3724
+ def references(self) -> list[Datum]:
3725
+ return []
3726
+
3727
+
3728
+ @dataclass(frozen=True)
3729
+ class DefaultSurfaceFinish:
3730
+ """A document-wide ISO 1302 surface-texture requirement.
3731
+
3732
+ Unlike :class:`Finish`, this requirement has no geometric target and therefore renders as
3733
+ sheet furniture without a leader. ``statement`` retains the source wording while ``ra`` is
3734
+ the normalized micrometre value shown by the drafting symbol.
3735
+ """
3736
+
3737
+ frame: Frame
3738
+ ra: str
3739
+ statement: str = ""
3740
+ source_id: str = ""
3741
+ part21_id: str = ""
3742
+ kind: ClassVar[str] = "default_surface_finish"
3743
+
3744
+ def __post_init__(self) -> None:
3745
+ if not isinstance(self.ra, str) or not self.ra.strip():
3746
+ raise ValueError("default surface finish needs a non-empty Ra value")
3747
+ if self.ra != self.ra.strip():
3748
+ raise ValueError(
3749
+ "default surface finish Ra value cannot contain surrounding whitespace"
3750
+ )
3751
+
3752
+ def parameters(self) -> list[DimParameter]:
3753
+ return []
3754
+
3755
+ def references(self) -> list[Datum]:
3756
+ return []
3757
+
3758
+
3759
+ @dataclass(frozen=True)
3760
+ class DocumentNote:
3761
+ """A source-proven document requirement with no honest geometric attachment."""
3762
+
3763
+ frame: Frame
3764
+ text: str
3765
+ note_kind: str
3766
+ source_id: str = ""
3767
+ part21_id: str = ""
3768
+ kind: ClassVar[str] = "document_note"
3769
+
3770
+ def __post_init__(self) -> None:
3771
+ if not isinstance(self.text, str) or not self.text.strip():
3772
+ raise ValueError("document note needs non-empty text")
3773
+ if self.text != self.text.strip():
3774
+ raise ValueError("document note text cannot contain surrounding whitespace")
3775
+ if self.note_kind not in ("datum_scheme", "model_representation"):
3776
+ raise ValueError(f"unsupported document-note kind {self.note_kind!r}")
3777
+
3778
+ def parameters(self) -> list[DimParameter]:
3779
+ return []
3780
+
3781
+ def references(self) -> list[Datum]:
3782
+ return []
3783
+
3784
+
3699
3785
  @dataclass(frozen=True)
3700
3786
  class ControlFrame:
3701
3787
  """A geometric-tolerance feature control frame (ISO 1101) declared on the drawing