draftwright 0.4.15__tar.gz → 0.4.17__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 (506) hide show
  1. {draftwright-0.4.15 → draftwright-0.4.17}/CHANGELOG.md +307 -0
  2. {draftwright-0.4.15 → draftwright-0.4.17}/PKG-INFO +25 -3
  3. {draftwright-0.4.15 → draftwright-0.4.17}/README.md +22 -0
  4. {draftwright-0.4.15 → draftwright-0.4.17}/docs/adr/README.md +2 -1
  5. draftwright-0.4.17/docs/reference/recogniser-capabilities.md +691 -0
  6. draftwright-0.4.17/docs/reference/sheet.md +283 -0
  7. {draftwright-0.4.15 → draftwright-0.4.17}/pyproject.toml +3 -3
  8. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/_core.py +128 -16
  9. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/_geometry.py +242 -3
  10. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/analysis.py +358 -139
  11. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/_common.py +220 -15
  12. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/from_model.py +1844 -237
  13. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/holes.py +191 -108
  14. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/orchestrator.py +63 -5
  15. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/sections.py +56 -8
  16. draftwright-0.4.17/src/draftwright/blend_contract.py +90 -0
  17. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/builder.py +133 -23
  18. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/compose.py +172 -36
  19. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/drawing.py +1116 -81
  20. draftwright-0.4.17/src/draftwright/evaluation/step_analysis.py +5817 -0
  21. draftwright-0.4.17/src/draftwright/export.py +748 -0
  22. draftwright-0.4.17/src/draftwright/inspection_contract.py +243 -0
  23. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/__init__.py +38 -0
  24. draftwright-0.4.17/src/draftwright/linting/_registry.py +32 -0
  25. draftwright-0.4.17/src/draftwright/linting/angled_step_coverage.py +38 -0
  26. draftwright-0.4.17/src/draftwright/linting/blend_coverage.py +205 -0
  27. draftwright-0.4.17/src/draftwright/linting/chamfer_coverage.py +190 -0
  28. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/channel_coverage.py +19 -4
  29. draftwright-0.4.17/src/draftwright/linting/circular_blind_step_coverage.py +345 -0
  30. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/coverage.py +954 -137
  31. draftwright-0.4.17/src/draftwright/linting/fillet_coverage.py +187 -0
  32. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/flat_coverage.py +21 -3
  33. draftwright-0.4.17/src/draftwright/linting/groove_coverage.py +228 -0
  34. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/hole_coverage.py +57 -7
  35. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/issues.py +5 -0
  36. draftwright-0.4.17/src/draftwright/linting/pad_coverage.py +384 -0
  37. draftwright-0.4.17/src/draftwright/linting/paired_ramp_step_coverage.py +221 -0
  38. draftwright-0.4.17/src/draftwright/linting/passage_coverage.py +38 -0
  39. draftwright-0.4.17/src/draftwright/linting/plate_coverage.py +1038 -0
  40. draftwright-0.4.17/src/draftwright/linting/pocket_coverage.py +323 -0
  41. draftwright-0.4.17/src/draftwright/linting/pocket_pattern_coverage.py +381 -0
  42. draftwright-0.4.17/src/draftwright/linting/polygonal_boss_coverage.py +387 -0
  43. draftwright-0.4.17/src/draftwright/linting/polygonal_stock_coverage.py +442 -0
  44. draftwright-0.4.17/src/draftwright/linting/prismatic_pocket_coverage.py +38 -0
  45. draftwright-0.4.17/src/draftwright/linting/profiled_bore_coverage.py +238 -0
  46. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/quality.py +198 -26
  47. draftwright-0.4.17/src/draftwright/linting/rectangular_blind_slot_coverage.py +314 -0
  48. draftwright-0.4.17/src/draftwright/linting/round_bottom_blind_slot_coverage.py +320 -0
  49. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/slot_coverage.py +19 -4
  50. draftwright-0.4.17/src/draftwright/linting/through_step_coverage.py +644 -0
  51. draftwright-0.4.17/src/draftwright/linting/turned_step_coverage.py +495 -0
  52. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/model/__init__.py +28 -0
  53. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/model/callout.py +75 -8
  54. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/model/compiled.py +184 -32
  55. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/model/declare.py +282 -36
  56. draftwright-0.4.17/src/draftwright/model/detect.py +2011 -0
  57. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/model/ir.py +943 -8
  58. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/model/planner.py +203 -18
  59. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/pmi.py +172 -52
  60. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/projection.py +7 -2
  61. draftwright-0.4.17/src/draftwright/recogniser_contract.py +1425 -0
  62. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/recognition_cache.py +2 -2
  63. draftwright-0.4.17/src/draftwright/recognition_frame.py +350 -0
  64. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/registry.py +32 -1
  65. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/repair.py +2 -0
  66. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/sheet.py +429 -55
  67. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/sheet_emit.py +467 -44
  68. draftwright-0.4.17/tests/_recogniser_public_contract.py +144 -0
  69. {draftwright-0.4.15 → draftwright-0.4.17}/tests/conftest.py +67 -3
  70. draftwright-0.4.17/tests/fixtures/evaluation/README.md +243 -0
  71. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-asymmetric.step +505 -0
  72. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-compound.step +547 -0
  73. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-overlap.step +776 -0
  74. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-plain.step +415 -0
  75. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-planar-x.step +535 -0
  76. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-planar-y.step +535 -0
  77. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-planar-z.step +505 -0
  78. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-topology-a.step +596 -0
  79. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-topology-b.step +596 -0
  80. draftwright-0.4.17/tests/fixtures/evaluation/chamfer-turned.step +210 -0
  81. draftwright-0.4.17/tests/fixtures/evaluation/corpus-chamfers-v1.json +200 -0
  82. draftwright-0.4.17/tests/fixtures/evaluation/corpus-countersinks-v1.json +188 -0
  83. draftwright-0.4.17/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +287 -0
  84. draftwright-0.4.17/tests/fixtures/evaluation/corpus-fillets-v1.json +211 -0
  85. draftwright-0.4.17/tests/fixtures/evaluation/corpus-flats-v1.json +227 -0
  86. draftwright-0.4.17/tests/fixtures/evaluation/corpus-grooves-v1.json +164 -0
  87. draftwright-0.4.17/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +151 -0
  88. draftwright-0.4.17/tests/fixtures/evaluation/corpus-plates-v1.json +257 -0
  89. draftwright-0.4.17/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +199 -0
  90. draftwright-0.4.17/tests/fixtures/evaluation/corpus-pockets-v1.json +269 -0
  91. draftwright-0.4.17/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +939 -0
  92. draftwright-0.4.17/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +198 -0
  93. draftwright-0.4.17/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +222 -0
  94. draftwright-0.4.17/tests/fixtures/evaluation/corpus-turned-steps-v1.json +166 -0
  95. draftwright-0.4.17/tests/fixtures/evaluation/countersink-deburr.step +876 -0
  96. draftwright-0.4.17/tests/fixtures/evaluation/countersink-external-cone.step +274 -0
  97. draftwright-0.4.17/tests/fixtures/evaluation/countersink-mixed-pair.step +736 -0
  98. draftwright-0.4.17/tests/fixtures/evaluation/countersink-single.step +575 -0
  99. draftwright-0.4.17/tests/fixtures/evaluation/countersink-topology-a.step +736 -0
  100. draftwright-0.4.17/tests/fixtures/evaluation/countersink-topology-b.step +736 -0
  101. draftwright-0.4.17/tests/fixtures/evaluation/double-d-axis-x.step +814 -0
  102. draftwright-0.4.17/tests/fixtures/evaluation/double-d-axis-y.step +814 -0
  103. draftwright-0.4.17/tests/fixtures/evaluation/double-d-blind.step +790 -0
  104. draftwright-0.4.17/tests/fixtures/evaluation/double-d-coaxial-compound.step +1591 -0
  105. draftwright-0.4.17/tests/fixtures/evaluation/double-d-opposed-blind.step +1164 -0
  106. draftwright-0.4.17/tests/fixtures/evaluation/double-d-roll-30.step +814 -0
  107. draftwright-0.4.17/tests/fixtures/evaluation/double-d-round-bore.step +511 -0
  108. draftwright-0.4.17/tests/fixtures/evaluation/double-d-single-z.step +784 -0
  109. draftwright-0.4.17/tests/fixtures/evaluation/double-d-topology-a.step +1591 -0
  110. draftwright-0.4.17/tests/fixtures/evaluation/double-d-topology-b.step +1591 -0
  111. draftwright-0.4.17/tests/fixtures/evaluation/fillet-compound.step +977 -0
  112. draftwright-0.4.17/tests/fixtures/evaluation/fillet-overlap.step +597 -0
  113. draftwright-0.4.17/tests/fixtures/evaluation/fillet-plain.step +415 -0
  114. draftwright-0.4.17/tests/fixtures/evaluation/fillet-planar-x.step +537 -0
  115. draftwright-0.4.17/tests/fixtures/evaluation/fillet-planar-y.step +537 -0
  116. draftwright-0.4.17/tests/fixtures/evaluation/fillet-planar-z.step +507 -0
  117. draftwright-0.4.17/tests/fixtures/evaluation/fillet-repeated.step +820 -0
  118. draftwright-0.4.17/tests/fixtures/evaluation/fillet-topology-a.step +617 -0
  119. draftwright-0.4.17/tests/fixtures/evaluation/fillet-topology-b.step +617 -0
  120. draftwright-0.4.17/tests/fixtures/evaluation/fillet-turned.step +211 -0
  121. draftwright-0.4.17/tests/fixtures/evaluation/flat-coaxial.step +437 -0
  122. draftwright-0.4.17/tests/fixtures/evaluation/flat-double-d.step +419 -0
  123. draftwright-0.4.17/tests/fixtures/evaluation/flat-lone-d.step +237 -0
  124. draftwright-0.4.17/tests/fixtures/evaluation/flat-nonround.step +415 -0
  125. draftwright-0.4.17/tests/fixtures/evaluation/flat-slanted-double-d.step +449 -0
  126. draftwright-0.4.17/tests/fixtures/evaluation/flat-topology-a.step +437 -0
  127. draftwright-0.4.17/tests/fixtures/evaluation/flat-topology-b.step +437 -0
  128. draftwright-0.4.17/tests/fixtures/evaluation/groove-compound.step +665 -0
  129. draftwright-0.4.17/tests/fixtures/evaluation/groove-lone-x.step +381 -0
  130. draftwright-0.4.17/tests/fixtures/evaluation/groove-lone-y.step +381 -0
  131. draftwright-0.4.17/tests/fixtures/evaluation/groove-lone-z.step +351 -0
  132. draftwright-0.4.17/tests/fixtures/evaluation/groove-monotonic-negative.step +249 -0
  133. draftwright-0.4.17/tests/fixtures/evaluation/groove-narrow.step +351 -0
  134. draftwright-0.4.17/tests/fixtures/evaluation/groove-topology-a.step +556 -0
  135. draftwright-0.4.17/tests/fixtures/evaluation/groove-topology-b.step +556 -0
  136. draftwright-0.4.17/tests/fixtures/evaluation/pad-compound-equal.step +1595 -0
  137. draftwright-0.4.17/tests/fixtures/evaluation/pad-detached-body-negative.step +853 -0
  138. draftwright-0.4.17/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +776 -0
  139. draftwright-0.4.17/tests/fixtures/evaluation/pad-nested-staircase-negative.step +2230 -0
  140. draftwright-0.4.17/tests/fixtures/evaluation/pad-topology-a.step +1156 -0
  141. draftwright-0.4.17/tests/fixtures/evaluation/pad-topology-b.step +1156 -0
  142. draftwright-0.4.17/tests/fixtures/evaluation/pad-x-negative.step +786 -0
  143. draftwright-0.4.17/tests/fixtures/evaluation/pad-x-positive.step +786 -0
  144. draftwright-0.4.17/tests/fixtures/evaluation/pad-y-negative.step +786 -0
  145. draftwright-0.4.17/tests/fixtures/evaluation/pad-y-positive.step +786 -0
  146. draftwright-0.4.17/tests/fixtures/evaluation/pad-z-negative.step +786 -0
  147. draftwright-0.4.17/tests/fixtures/evaluation/pad-z-positive.step +786 -0
  148. draftwright-0.4.17/tests/fixtures/evaluation/pattern-ambiguous.step +703 -0
  149. draftwright-0.4.17/tests/fixtures/evaluation/pattern-grid.step +992 -0
  150. draftwright-0.4.17/tests/fixtures/evaluation/pattern-topology-a.step +1090 -0
  151. draftwright-0.4.17/tests/fixtures/evaluation/pattern-topology-b.step +1090 -0
  152. draftwright-0.4.17/tests/fixtures/evaluation/plate-compound-equal.step +1575 -0
  153. draftwright-0.4.17/tests/fixtures/evaluation/plate-cross-topology-a.step +1497 -0
  154. draftwright-0.4.17/tests/fixtures/evaluation/plate-cross-topology-b.step +1497 -0
  155. draftwright-0.4.17/tests/fixtures/evaluation/plate-detached-negative.step +793 -0
  156. draftwright-0.4.17/tests/fixtures/evaluation/plate-rotational-negative.step +147 -0
  157. draftwright-0.4.17/tests/fixtures/evaluation/plate-single-negative.step +415 -0
  158. draftwright-0.4.17/tests/fixtures/evaluation/plate-t-xz.step +776 -0
  159. draftwright-0.4.17/tests/fixtures/evaluation/plate-t-yz.step +776 -0
  160. draftwright-0.4.17/tests/fixtures/evaluation/plate-thick-negative.step +776 -0
  161. draftwright-0.4.17/tests/fixtures/evaluation/plate-u-additive.step +776 -0
  162. draftwright-0.4.17/tests/fixtures/evaluation/plate-u-cut.step +776 -0
  163. draftwright-0.4.17/tests/fixtures/evaluation/pocket-compound.step +1595 -0
  164. draftwright-0.4.17/tests/fixtures/evaluation/pocket-edge-anchored.step +685 -0
  165. draftwright-0.4.17/tests/fixtures/evaluation/pocket-lone.step +786 -0
  166. draftwright-0.4.17/tests/fixtures/evaluation/pocket-opposed.step +1156 -0
  167. draftwright-0.4.17/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +1526 -0
  168. draftwright-0.4.17/tests/fixtures/evaluation/pocket-pattern-grid.step +2638 -0
  169. draftwright-0.4.17/tests/fixtures/evaluation/pocket-pattern-linear.step +1897 -0
  170. draftwright-0.4.17/tests/fixtures/evaluation/pocket-pattern-pair.step +1156 -0
  171. draftwright-0.4.17/tests/fixtures/evaluation/pocket-pattern-topology-a.step +3008 -0
  172. draftwright-0.4.17/tests/fixtures/evaluation/pocket-pattern-topology-b.step +3007 -0
  173. draftwright-0.4.17/tests/fixtures/evaluation/pocket-prismatic-negative.step +966 -0
  174. draftwright-0.4.17/tests/fixtures/evaluation/pocket-side.step +816 -0
  175. draftwright-0.4.17/tests/fixtures/evaluation/pocket-through-negative.step +780 -0
  176. draftwright-0.4.17/tests/fixtures/evaluation/pocket-topology-a.step +1156 -0
  177. draftwright-0.4.17/tests/fixtures/evaluation/pocket-topology-b.step +1156 -0
  178. draftwright-0.4.17/tests/fixtures/evaluation/pocket-two-equal.step +1156 -0
  179. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +1008 -0
  180. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +1033 -0
  181. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +966 -0
  182. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +990 -0
  183. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +966 -0
  184. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +625 -0
  185. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-topology-a.step +1516 -0
  186. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-topology-b.step +1516 -0
  187. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-x.step +996 -0
  188. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-y.step +996 -0
  189. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-boss-z.step +966 -0
  190. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +637 -0
  191. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +147 -0
  192. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +595 -0
  193. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +776 -0
  194. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +705 -0
  195. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-roll17.step +625 -0
  196. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-topology-a.step +595 -0
  197. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-topology-b.step +595 -0
  198. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-translated.step +625 -0
  199. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-x.step +625 -0
  200. draftwright-0.4.17/tests/fixtures/evaluation/polygonal-stock-y.step +625 -0
  201. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-axis-x.step +381 -0
  202. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-axis-y.step +279 -0
  203. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-axis-z.step +249 -0
  204. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-compound.step +521 -0
  205. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-repeated-lengths.step +381 -0
  206. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-through-bore.step +345 -0
  207. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-topology-a.step +351 -0
  208. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-topology-b.step +381 -0
  209. draftwright-0.4.17/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +381 -0
  210. draftwright-0.4.17/tests/fixtures/issue_1247_angled_blind_step.step +776 -0
  211. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_add_dimension.py +43 -0
  212. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_adr0018_view_selection.py +39 -1
  213. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_compiled_plan_boundary.py +64 -24
  214. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_counting_calls.py +25 -1
  215. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_declare.py +33 -3
  216. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_declared_recognition_gate.py +24 -35
  217. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_detect_once.py +47 -34
  218. draftwright-0.4.17/tests/test_detect_registry.py +282 -0
  219. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_drawing_encapsulation.py +10 -8
  220. draftwright-0.4.17/tests/test_export_reproducible.py +699 -0
  221. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_external_recognition_boundary.py +8 -5
  222. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_flat_completeness.py +1 -2
  223. draftwright-0.4.17/tests/test_geometry_graph_spike.py +68 -0
  224. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_grid_lattice_convention.py +2 -2
  225. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_import_boundaries.py +453 -0
  226. draftwright-0.4.17/tests/test_inspection_contract.py +162 -0
  227. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1058_wheel_profile.py +202 -289
  228. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1082_polygonal_stock.py +9 -5
  229. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1143_hole_completeness.py +36 -12
  230. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1146_scale_completeness.py +4 -4
  231. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1166_cross_pass_feature_leaders.py +30 -26
  232. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1202_observed_drawing_consumer.py +8 -9
  233. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1229_ledger_member_keying.py +2 -1
  234. draftwright-0.4.17/tests/test_issue_1245_passage_disposition.py +180 -0
  235. draftwright-0.4.17/tests/test_issue_1246_prismatic_pocket_disposition.py +187 -0
  236. draftwright-0.4.17/tests/test_issue_1247_angled_step_disposition.py +100 -0
  237. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1254_turned_chamfers.py +10 -14
  238. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1260_view_constraints.py +49 -4
  239. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1262_automatic_turned_views.py +5 -2
  240. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1308_machined_leader_analytics.py +5 -1
  241. draftwright-0.4.15/tests/test_issue_1332_overlap_remedy_fast.py → draftwright-0.4.17/tests/test_issue_1332_overlap_remedy.py +16 -23
  242. draftwright-0.4.17/tests/test_issue_1349_precision_display.py +506 -0
  243. draftwright-0.4.17/tests/test_issue_1350_detected_takeover.py +559 -0
  244. draftwright-0.4.17/tests/test_issue_1351_structured_note_coverage.py +653 -0
  245. draftwright-0.4.17/tests/test_issue_1352_searchable_pdf_text.py +989 -0
  246. draftwright-0.4.17/tests/test_issue_1353_cnc_authoritative_workflow.py +333 -0
  247. draftwright-0.4.17/tests/test_issue_1357_framed_activation.py +224 -0
  248. draftwright-0.4.17/tests/test_issue_1357_framed_boundary.py +312 -0
  249. draftwright-0.4.17/tests/test_issue_1357_plural_turned_profiles.py +1013 -0
  250. draftwright-0.4.17/tests/test_issue_1357_pmi_frame.py +171 -0
  251. draftwright-0.4.17/tests/test_issue_1360_thread_depth.py +197 -0
  252. draftwright-0.4.17/tests/test_issue_1369_hole_completeness_evidence.py +166 -0
  253. draftwright-0.4.17/tests/test_issue_1370_countersink_completeness_evidence.py +524 -0
  254. draftwright-0.4.17/tests/test_issue_1370_double_d_completeness_evidence.py +702 -0
  255. draftwright-0.4.17/tests/test_issue_1370_hole_pattern_completeness_evidence.py +335 -0
  256. draftwright-0.4.17/tests/test_issue_1371_flat_completeness_evidence.py +287 -0
  257. draftwright-0.4.17/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +1206 -0
  258. draftwright-0.4.17/tests/test_issue_1372_groove_completeness_evidence.py +677 -0
  259. draftwright-0.4.17/tests/test_issue_1372_pad_completeness_evidence.py +789 -0
  260. draftwright-0.4.17/tests/test_issue_1372_pocket_completeness_evidence.py +454 -0
  261. draftwright-0.4.17/tests/test_issue_1372_pocket_pattern_completeness_evidence.py +906 -0
  262. draftwright-0.4.17/tests/test_issue_1372_polygonal_boss_completeness_evidence.py +847 -0
  263. draftwright-0.4.17/tests/test_issue_1373_plate_completeness_evidence.py +1427 -0
  264. draftwright-0.4.17/tests/test_issue_1374_chamfer_completeness_evidence.py +560 -0
  265. draftwright-0.4.17/tests/test_issue_1374_fillet_completeness_evidence.py +528 -0
  266. draftwright-0.4.17/tests/test_issue_1374_turned_step_completeness_evidence.py +1503 -0
  267. draftwright-0.4.17/tests/test_issue_1382_046_step_inventory.py +66 -0
  268. draftwright-0.4.17/tests/test_issue_1382_circular_blind_step_semantics.py +1071 -0
  269. draftwright-0.4.17/tests/test_issue_1382_framed_step_family_evidence.py +426 -0
  270. draftwright-0.4.17/tests/test_issue_1382_paired_ramp_semantics.py +468 -0
  271. draftwright-0.4.17/tests/test_issue_1382_through_step_semantics.py +1745 -0
  272. draftwright-0.4.17/tests/test_issue_1392_recognisers_048.py +584 -0
  273. draftwright-0.4.17/tests/test_issue_1421_rectangular_blind_slot_completeness.py +589 -0
  274. draftwright-0.4.17/tests/test_issue_1421_rectangular_blind_slot_semantics.py +448 -0
  275. draftwright-0.4.17/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +621 -0
  276. draftwright-0.4.17/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +479 -0
  277. draftwright-0.4.17/tests/test_issue_1433_blend_semantics.py +651 -0
  278. draftwright-0.4.17/tests/test_issue_563_placement_intent.py +681 -0
  279. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_676_polygonal_boss.py +3 -1
  280. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_740_leader_assignment.py +7 -2
  281. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_798_silhouette_lint.py +10 -8
  282. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_885_prismatic_coverage.py +7 -3
  283. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_958_cross_solid_recognition.py +7 -5
  284. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_label_provenance.py +2 -15
  285. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_layout.py +2 -1
  286. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_location_vocabulary.py +3 -3
  287. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_make_drawing.py +138 -33
  288. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_parameter_id.py +64 -1
  289. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_part_model.py +8 -8
  290. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_pmi.py +1 -1
  291. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_pocket_pattern_recognition.py +10 -6
  292. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_private_test_attr_reads.py +3 -0
  293. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_quality_components.py +121 -1
  294. draftwright-0.4.17/tests/test_recogniser_capabilities.py +1839 -0
  295. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_recogniser_contract.py +322 -65
  296. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_recognition_result.py +16 -71
  297. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_registry.py +19 -2
  298. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_render_seam.py +9 -4
  299. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_sheet_emit.py +112 -6
  300. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_sheet_identity_invariant.py +20 -16
  301. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_sheet_of.py +1 -1
  302. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_slanted_blind_step.py +0 -48
  303. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_slot_pattern_recognition.py +10 -2
  304. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_strip_layout.py +104 -15
  305. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_view_plan.py +19 -4
  306. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_workflows.py +159 -0
  307. draftwright-0.4.15/docs/reference/recogniser-capabilities.md +0 -97
  308. draftwright-0.4.15/docs/reference/sheet.md +0 -71
  309. draftwright-0.4.15/src/draftwright/evaluation/step_analysis.py +0 -924
  310. draftwright-0.4.15/src/draftwright/export.py +0 -356
  311. draftwright-0.4.15/src/draftwright/linting/polygonal_stock_coverage.py +0 -115
  312. draftwright-0.4.15/src/draftwright/linting/profiled_bore_coverage.py +0 -123
  313. draftwright-0.4.15/src/draftwright/model/detect.py +0 -1137
  314. draftwright-0.4.15/src/draftwright/recogniser_contract.py +0 -660
  315. draftwright-0.4.15/tests/fixtures/evaluation/README.md +0 -20
  316. draftwright-0.4.15/tests/test_detect_registry.py +0 -209
  317. draftwright-0.4.15/tests/test_issue_1332_overlap_remedy.py +0 -89
  318. draftwright-0.4.15/tests/test_recogniser_capabilities.py +0 -755
  319. draftwright-0.4.15/tests/test_recognition_manifest.py +0 -715
  320. {draftwright-0.4.15 → draftwright-0.4.17}/.gitignore +0 -0
  321. {draftwright-0.4.15 → draftwright-0.4.17}/LICENSE +0 -0
  322. {draftwright-0.4.15 → draftwright-0.4.17}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  323. {draftwright-0.4.15 → draftwright-0.4.17}/skills/SKILL.md +0 -0
  324. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/__init__.py +0 -0
  325. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/_build_profile.py +0 -0
  326. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/_pmi_part21.py +0 -0
  327. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/_warnings.py +0 -0
  328. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotate.py +0 -0
  329. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/__init__.py +0 -0
  330. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/balloons.py +0 -0
  331. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/gears.py +0 -0
  332. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/annotations/leaders.py +0 -0
  333. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/audit.py +0 -0
  334. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/cli.py +0 -0
  335. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/evaluation/__init__.py +0 -0
  336. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/fits.py +0 -0
  337. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  338. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  339. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  340. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  341. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/fonts/__init__.py +0 -0
  342. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/intents.py +0 -0
  343. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/layout.py +0 -0
  344. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/evidence.py +0 -0
  345. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/gear_coverage.py +0 -0
  346. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/ink_overlap.py +0 -0
  347. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/pmi_coverage.py +0 -0
  348. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/structural.py +0 -0
  349. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/linting/suggest.py +0 -0
  350. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/make_drawing.py +0 -0
  351. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/model/pmi_lowering.py +0 -0
  352. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/py.typed +0 -0
  353. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/recognition/__init__.py +0 -0
  354. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/score.py +0 -0
  355. {draftwright-0.4.15 → draftwright-0.4.17}/src/draftwright/view_plan.py +0 -0
  356. {draftwright-0.4.15 → draftwright-0.4.17}/tests/_kernel.py +0 -0
  357. {draftwright-0.4.15 → draftwright-0.4.17}/tests/_layout_sig.py +0 -0
  358. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  359. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  360. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/evaluation/blind-hole.step +0 -0
  361. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  362. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/evaluation/plain-block.step +0 -0
  363. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/evaluation/topology-a.step +0 -0
  364. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/evaluation/topology-b.step +0 -0
  365. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  366. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  367. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/grm04_drive_plate.step +0 -0
  368. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  369. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  370. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  371. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/issue_915_case_study_2.step +0 -0
  372. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  373. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  374. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  375. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  376. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  377. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  378. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  379. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  380. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  381. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  382. {draftwright-0.4.15 → draftwright-0.4.17}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  383. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/bracket_section.json +0 -0
  384. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/centered_rebate.json +0 -0
  385. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/chamfered.json +0 -0
  386. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/filleted.json +0 -0
  387. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/flange_dense.json +0 -0
  388. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/grid_plate.json +0 -0
  389. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/grooved_shaft.json +0 -0
  390. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/hex_bar.json +0 -0
  391. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/holed_slot.json +0 -0
  392. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/pocketed.json +0 -0
  393. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/prismatic_ladder.json +0 -0
  394. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/scattered_plate.json +0 -0
  395. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/side_drilled.json +0 -0
  396. {draftwright-0.4.15 → draftwright-0.4.17}/tests/refactor_golden/turned_stepped.json +0 -0
  397. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_adr0018_arrangement_gate.py +0 -0
  398. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_adr0018_view_routing.py +0 -0
  399. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_agents_guide.py +0 -0
  400. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_api_docs.py +0 -0
  401. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_architecture_docs.py +0 -0
  402. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_audit_differential.py +0 -0
  403. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_balloon_ring_standoff.py +0 -0
  404. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_build_profile_harness.py +0 -0
  405. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_carve_free_position_callers.py +0 -0
  406. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_dense_sheet_canary.py +0 -0
  407. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_deprecation_dates.py +0 -0
  408. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_dimension_role_vocabulary.py +0 -0
  409. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_e2e_slice.py +0 -0
  410. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_e2e_standards.py +0 -0
  411. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_export_dxf_curves.py +0 -0
  412. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_export_dxf_zoom.py +0 -0
  413. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_fillets_adjacency.py +0 -0
  414. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_fits.py +0 -0
  415. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_flat_stock_identity.py +0 -0
  416. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_flat_stock_opposition.py +0 -0
  417. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_gdt_placement.py +0 -0
  418. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_iso_nts_caption_placement.py +0 -0
  419. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1000_envelope_reuse.py +0 -0
  420. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  421. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1086_declared_gears.py +0 -0
  422. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  423. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1130_view_planning_evidence.py +0 -0
  424. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  425. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  426. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  427. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  428. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  429. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  430. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1176_quality_fidelity.py +0 -0
  431. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1177_angular_dimensions.py +0 -0
  432. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  433. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1188_per_view_assignment.py +0 -0
  434. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1190_section_decision.py +0 -0
  435. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  436. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  437. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  438. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  439. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
  440. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  441. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  442. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1217_claimed_representations.py +0 -0
  443. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1217_the_facility_is_shared.py +0 -0
  444. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  445. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  446. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  447. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1281_turned_fillets.py +0 -0
  448. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  449. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
  450. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1299_page_escalation.py +0 -0
  451. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1312_engine_costs.py +0 -0
  452. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1332_zone_labels.py +0 -0
  453. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1334_prevent_ink.py +0 -0
  454. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  455. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
  456. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_367_leader_ink.py +0 -0
  457. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  458. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  459. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_798_floor_cardinality.py +0 -0
  460. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_798_material_field.py +0 -0
  461. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_909_sloped_profile.py +0 -0
  462. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_915_dense_case.py +0 -0
  463. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_916_pocket_leader.py +0 -0
  464. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_917_open_channel.py +0 -0
  465. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  466. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_issue_955_height_contingency.py +0 -0
  467. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_layout_cleanliness.py +0 -0
  468. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_layout_hypothesis.py +0 -0
  469. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_layout_property.py +0 -0
  470. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_leader_footprint.py +0 -0
  471. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_lint_box_cache.py +0 -0
  472. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_lint_ink_overlap.py +0 -0
  473. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_lint_reconciliation.py +0 -0
  474. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_lint_structural.py +0 -0
  475. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_linting.py +0 -0
  476. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_note_verb.py +0 -0
  477. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_object_aspects.py +0 -0
  478. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_occupancy_boxes.py +0 -0
  479. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_pitch_dim_footprint.py +0 -0
  480. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_pmi_datum_lowering.py +0 -0
  481. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_pmi_gtol_lowering.py +0 -0
  482. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_pmi_part21.py +0 -0
  483. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_pocket_pattern.py +0 -0
  484. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_principal_profile_classifier.py +0 -0
  485. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_private_test_imports.py +0 -0
  486. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_recogniser_adoption.py +0 -0
  487. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_recognition.py +0 -0
  488. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_refactor_golden.py +0 -0
  489. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_repack_geometry_seam.py +0 -0
  490. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_score.py +0 -0
  491. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_script_detail_parity.py +0 -0
  492. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_shared_box_memo.py +0 -0
  493. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_sheet_gdt.py +0 -0
  494. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_sheet_notes.py +0 -0
  495. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_sheet_section.py +0 -0
  496. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_sheet_tables.py +0 -0
  497. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_slot_completeness.py +0 -0
  498. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_slot_pattern.py +0 -0
  499. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_soft_deprecation.py +0 -0
  500. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_solve_trace.py +0 -0
  501. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_step_analysis_evaluation.py +0 -0
  502. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_suppression_ledger.py +0 -0
  503. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_suppression_marks.py +0 -0
  504. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_tolerances.py +0 -0
  505. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_turned_steps.py +0 -0
  506. {draftwright-0.4.15 → draftwright-0.4.17}/tests/test_witness_label_reconciliation.py +0 -0
@@ -4,6 +4,33 @@
4
4
 
5
5
  ### Added
6
6
 
7
+ - Automatic drawings can opt into the provider-owned local recognition frame with
8
+ `framed_recognition=True`. The returned drawing exposes caller provenance, the exact downstream
9
+ working solid, frame, and a copied framed/raw/refusal decision. PMI correlation, off-axis pattern
10
+ placement, compilation, projection and physical lint remain in one coordinate system; typed frame
11
+ refusal performs one visible top-level raw fallback. Raw remains the rollout default (#1357,
12
+ ADR 0020).
13
+
14
+ - Referential and measured Sheet dimensions accept optional `view=` / `side=` placement
15
+ intent. Supported pairs survive IR/compiler and generated-script round trips, constrain
16
+ ordinary corridor candidates without exposing page coordinates, and fail clearly when a
17
+ renderer cannot honour the requested view/strip. Compound hole callouts can therefore be
18
+ authored to opposite sides of one end view while retaining normal solve and lint behavior
19
+ (#563).
20
+ - Feature-linked Sheet notes can explicitly satisfy one or more canonical requirement ids with
21
+ `.note(..., satisfies=(...))`. Placed structured notes retain each requirement's identity in
22
+ coverage reports and generated scripts without masquerading as dimensions or parsing prose;
23
+ removing the note restores the ordinary missing/suppressed diagnostics (#1351).
24
+ - `Sheet.from_part(...).take_over(...)` now adopts detected features in place while choosing
25
+ authored or automatic dimension, principal-view, and derived-view sources explicitly. This
26
+ preserves detected handles, supports automatic principal views with authored requirements,
27
+ replaces or suppresses inferred sections without duplicates, and round-trips the adopted view
28
+ request through generated Sheet code (#1350).
29
+ - Referential Sheet dimensions can preserve an explicit number of decimal places with
30
+ `sheet.dimension(feature, "parameter.id").format(decimals=n)`. The policy changes only
31
+ printed display text: numeric reconciliation, tolerances, suppression and dimension
32
+ provenance continue to use the feature parameter, and generated Sheet scripts round-trip the
33
+ policy (#1349).
7
34
  - New lint code `annotation_ink_overlap`: reports another annotation's line-work —
8
35
  a dimension line, an extension line or a leader shaft — drawn through a label's
9
36
  text, which `annotation_overlap` cannot see because it compares label boxes to
@@ -17,6 +44,283 @@
17
44
 
18
45
  ### Changed
19
46
 
47
+ - Accepted schema-v1 convex `Blend` chains now cross a dedicated end-to-end consumer path:
48
+ `BlendFeature`, explicit `Sheet.blend(...)`, executable generated declarations, one
49
+ compiler-approved `blend.radius` requirement, and a solver-owned grouped `n× R` leader. The
50
+ full canonical `axis_direction` remains in IR instead of being coerced to legacy Fillet
51
+ semantics; the provider aggregate remains the sole exact Fillet/Blend precedence authority.
52
+ Exact public-record/IR validation and completeness follow every accepted occurrence to placed,
53
+ structured-note, authored-suppressed, dropped, missing, or unverifiable outcomes. Raw and
54
+ provider-framed arbitrary rigid motions retain the same radius meaning (#1433; ADRs 0011,
55
+ 0013–0017, 0020).
56
+
57
+ - Draftwright now exactly pins the immutable `b123d-recognisers` 0.4.12 release and advances its
58
+ fail-closed capability and inspection joins. This adoption first made the additive `Blend`,
59
+ `OrientedSlot`, `OrientedSlotArray`, and `OrientedSlotGrid` records visible and deferred under
60
+ #1430; Blend is now promoted by #1433 above, while oriented slots/patterns remain deferred and
61
+ recognised-but-unscored. All earlier record schemas remain compatible. The provider's newly
62
+ recognised shallow nonzero `PairedRampStep` keeps its existing
63
+ two-requirement IR, public `Sheet.paired_ramp_step(...)` declaration, generated-code, compiler
64
+ callout, solver placement, and completeness meaning (#1430; ADRs 0011, 0013–0017, 0020).
65
+
66
+ - Rectangular blind slots recognised by `b123d-recognisers` 0.4.10 now cross a dedicated
67
+ Draftwright semantic path: `RectangularBlindSlotFeature`, the explicit
68
+ `Sheet.rectangular_blind_slot(...)` word, generated-code and role-specific tolerance round
69
+ trips, compiler-approved width/capped-run/depth measurements, and one solver-owned
70
+ `OPEN SLOT … DEEP` leader. Authored subsets retain every approved value with explicit
71
+ `WIDE`/`LONG`/`DEEP` roles, and leaders target proved cap/side material rather than the open
72
+ mouth. Native raw and rigidly moved framed builds retain the same three
73
+ measurement outcomes. A seven-case independently authored corpus now pins all six run/open-side
74
+ orientations plus an independently sized specimen: each occurrence contributes separate width,
75
+ capped-run and depth requirements followed by exact structural correspondence and measurement
76
+ provenance to placed, structured-note, suppressed, dropped, missing or unverifiable outcomes.
77
+ Removing recognition cannot shrink that 21-requirement benchmark (#1421; ADRs 0011,
78
+ 0013–0017, 0020).
79
+
80
+ - Round-bottom blind slots recognised by `b123d-recognisers` 0.4.10 now have their own complete
81
+ Draftwright path rather than borrowing through-slot, pocket or rectangular-blind-slot grammar.
82
+ `RoundBottomBlindSlotFeature` retains the released run/opening topology and exposes the three
83
+ independent manufacturing requirements: capped run length, straight bottom-flat width and equal
84
+ side radius. `Sheet.round_bottom_blind_slot(...)`, generated code, role-specific tolerances and
85
+ one solver-owned `ROUND-BOTTOM OPEN SLOT …` leader all preserve those exact identities; derived
86
+ total width and depth are not double-counted. A seven-case independently authored corpus covers
87
+ all six signed principal orientations plus a separately sized specimen (21 physical requirements),
88
+ proves raw/framed drawing parity, and follows exact source-to-IR correspondence to placed,
89
+ structured-note, suppressed, dropped, missing or unverifiable outcomes without labels, views or
90
+ page coordinates. The released 0.4.10 API is sufficient; no recogniser change is required (#1421;
91
+ ADRs 0011, 0013–0017, 0020).
92
+
93
+ - Turned-step completeness is now backed by an independently authored, hash-pinned 11-case STEP
94
+ corpus with 26 physical outside-diameter bands, 52 parameter checks and 104 downstream checks.
95
+ Axis line and station preserve body-local occurrence identity across automatic IR, the existing
96
+ public `Sheet.step(...)` DSL word, executed-and-built generated code, and exact compiler-confirmed
97
+ length and OD drawing evidence. Grouped equal-length chains retain every adjacent member identity
98
+ and their exact compiler-approved multiplier and value; native and global OD labels are checked
99
+ in full. Generated declarations preserve the half-thousandth midpoint of odd-thousandth spans,
100
+ complete body-local profile ownership is compared at its full published precision, and malformed
101
+ or surplus records fail closed—including coercible or non-finite groove evidence that controls
102
+ band ownership. The root turned-step and groove inventories must remain immutable tuples; a
103
+ mutable or one-shot substitute is snapshotted once only to preserve its observable requirement
104
+ denominator, then remains unverifiable; a non-iterable substitute retains one explicit aggregate
105
+ contract outcome rather than masquerading as an empty family. A profile OD may
106
+ satisfy one uniquely identifiable equivalent largest-band diameter
107
+ without multiplying across disjoint bodies; and uniquely groove-owned narrow
108
+ bands are excluded once by a shared fail-closed Groove schema and ownership rule used by lowering,
109
+ lint and the evidence ledger. That join accounts for the provider's 0.001 mm Groove coordinate
110
+ quantum against its eight-decimal profile axis without widening either published identity
111
+ (#1374; ADRs 0010, 0011, 0013, 0015, 0017, 0020).
112
+
113
+ - Framed recognition now carries all three 0.4.6 step families through their complete existing
114
+ consumer paths. `CircularBlindStep`, `PairedRampStep` and `ThroughStep` retain the same
115
+ manufacturing requirements from raw recognition through their public `Sheet` words, generated
116
+ code, compiler-owned drawing ink and lint; the provider-owned local records and Draftwright IR
117
+ remain invariant under a combined non-principal rotation and translation. Circular-step
118
+ validation now derives its bound from each independently published endpoint, centre, radius and
119
+ depth value's six-significant-figure decimal cell, while outside-cell geometric inconsistencies
120
+ still fail closed (#1382; ADRs 0011, 0013, 0015, 0017, 0018, 0020).
121
+
122
+ - Countersink completeness is now backed by an independently authored, hash-pinned seven-case STEP
123
+ corpus covering functional seats, solid external-cone and deburr negatives, grouped equal seats,
124
+ and reverse-serialized topology. Detection identity and all four provider measurements are scored
125
+ separately from the two actual drawing requirements. Exact aggregate object ownership follows
126
+ each seat once, validates the provider-selected hole semantically, and fails closed on swapped,
127
+ duplicated, or canonically colliding owners. It then crosses automatic IR, public `Sheet.hole`,
128
+ generated code, and role-specific confirmed placed diameter/angle ink without recounting the parent bore. The known second seat of a two-sided bore
129
+ remains explicitly unverifiable rather than hidden or heuristically attached (#1370; ADRs 0010,
130
+ 0013, 0015, 0017).
131
+
132
+ - Double-D completeness is now backed by an independently authored, hash-pinned 11-case STEP
133
+ corpus with ten physical profile facts, 50 provider-parameter checks and 40 downstream checks.
134
+ Full-frame identity preserves disconnected coaxial bodies; exact multiplicity crosses automatic
135
+ IR, public `Sheet.double_d_bore`, generated code and role-specific compiler-confirmed
136
+ `⌀major THRU DOUBLE-D across A/F` ink. Round, blind, opposed-blind, malformed, duplicated and
137
+ foreign-owner mutations fail closed, while the provider's exclusive aggregate ownership keeps
138
+ each profile from being recounted as an ordinary hole (#1370; ADRs 0010, 0011, 0013, 0015,
139
+ 0017).
140
+ - Updated the immutable `b123d-recognisers` pin and fail-closed inspection/capability joins to
141
+ 0.4.10. All 28 previously consumed family schemas remain unchanged. The two new blind-slot
142
+ families were adopted fail-closed under #1421 and remain visible as unscored recognised
143
+ inventories until each gains independent completeness evidence; Draftwright does not coerce
144
+ their depth, terminal/open-end, or round-floor evidence into its ordinary through-slot grammar.
145
+ The provider's additive evidence API is not consumed by
146
+ this bounded adoption slice. Recognition output does change under the unchanged schemas: the
147
+ release closes slot-depth, subdivided paired-ramp/AngledStep, and noisy stubby-pocket gaps; fixes
148
+ Double-D/Hole ownership, external-cone countersink false positives, Plate tie covariance, and
149
+ turned-step translation covariance; and can move an edge-open rectangular recess from `Pocket`
150
+ to the dedicated blind-slot inventory. Draftwright regression tests pin the consumer-visible
151
+ ownership changes while the provider release suite owns its private predicates
152
+ ([provider release](https://github.com/pzfreo/b123d-recognisers/releases/tag/v0.4.10); ADRs 0013,
153
+ 0015, 0017, 0020).
154
+
155
+ - Principal-profile lint now correlates its independent extremal-face evidence with the cached
156
+ public `DoubleDBore` aggregate instead of importing provider-private profile helpers. Exact
157
+ axis/span, end-plane, centre, radius, A/F, chord, arc, and flat-direction checks fail closed;
158
+ occurrence mouths are consumed with matching multiplicity, and malformed records cannot earn
159
+ coverage. The exported low-level check now requires the aggregate projection explicitly so an
160
+ omitted inventory fails loudly; lint still owns its physical denominator and never reruns
161
+ recognition (#1411, ADRs 0013, 0015, 0017).
162
+
163
+ - Whole polygonal-stock completeness is now backed by an independently authored, hash-pinned
164
+ 13-case STEP corpus covering all principal axes, in-plane rotation, translation, topology
165
+ order and circular/rectangular/irregular/octagonal/attached/recessed/compound negatives. The
166
+ provider's exact six-side stock boundary, A/F, axial length and coupled physical flat supports
167
+ are scored separately from four downstream boundaries. A fail-closed two-requirement ledger
168
+ follows A/F and stock length through automatic IR, public `Sheet.polygonal_stock`, generated
169
+ code and solver-placed semantic ink; malformed or duplicate correspondence cannot borrow
170
+ credit from another support ring (#1371).
171
+
172
+ - Multi-plate slab completeness is now backed by an independently authored, hash-pinned 11-case
173
+ STEP corpus covering all principal orientations, additive/cut channels, equal compound
174
+ occurrences, topology order and envelope/detached/thick/rotational negatives. A fail-closed
175
+ one-requirement ledger follows each body-local `thickness.length` through automatic IR, public
176
+ `Sheet.plate`, generated code and solver-placed Dimension provenance; the compiler-derived
177
+ opposite U-channel wall is represented explicitly without inventing duplicate ink. The corpus
178
+ owns 20 physical occurrences and cannot shrink when provider output is weakened or removed.
179
+ Exact step-level, slot-pattern, polygonal-boss and envelope ownership prevents derived material
180
+ spans from becoming duplicate Plate requirements while failing closed when that ownership cannot
181
+ be established (#1373).
182
+
183
+ - Polygonal-boss completeness is now backed by an independently authored, hash-pinned STEP
184
+ corpus covering all three principal axes, in-plane rotation, equal compound occurrences,
185
+ topology order, and recess/detached/stock/other-protrusion negatives. Detection, the provider's
186
+ six-side schema invariant, across-flats, height, physical flat supports, and four downstream
187
+ boundaries are observed; a
188
+ two-requirement fail-closed ledger follows across-flats and boss height through the existing
189
+ IR/compiler/shared-solve path. The corpus owns the independent evaluation denominator; runtime
190
+ drawing lint remains explicitly denominated by the recognition inventory (#1372).
191
+
192
+ - Updated the immutable `b123d-recognisers` pin and fail-closed manifest joins to 0.4.9. The
193
+ provider's body-local FaceLevel, RiserEvidence, and TurnedProfile schemas now cross an owned
194
+ prepared-frame boundary that normalizes, reuses one cylinder substrate, classifies locally,
195
+ and preserves the exact working solid/result pair. Every frame gauge and typed refusal has an
196
+ explicit conservative policy; refusal never hides a raw retry. Multiple physical turned
197
+ profiles fail explicitly where a singular adapter is required, while the unchanged raw
198
+ production route preserves its historical no-global-profile compound behavior with a visible
199
+ #1357 deferral. Production drawing remains on the explicit raw boundary until rigid-motion,
200
+ PMI, platform, and canary activation evidence is complete (ADR 0020, #1357).
201
+
202
+ - Updated the immutable `b123d-recognisers` pin and lock to 0.4.8. Draftwright now names
203
+ its existing caller/world-coordinate aggregate boundary explicitly with
204
+ `build_raw_recognition_result`; framed recognition remains disabled until #1357's
205
+ frame-to-IR adapter is reviewed end to end. Installed-wheel tests exercise the public
206
+ framed fixes for rectangular pads, polygonal bosses, and nested multi-body plates without
207
+ making that API the production path (#1392).
208
+
209
+ - Rectangular pads now consume `RaisedPad` schema v2 without assuming +Z. The IR, public
210
+ `Sheet.pad`, generated code, compiler, semantic-view planner, shared placement solve, and
211
+ lint correspondence preserve the exact footprint, terminal-to-attachment height, two
212
+ in-plane locations, axis, direction, and world bounds for all six signed principal
213
+ orientations. Every height uses one solver-placed `… HIGH` leader with stable measurement
214
+ identity; side-normal pad footprints no longer leak into the unrelated Z-level grammar
215
+ (#1392).
216
+
217
+ - Rectangular-pad completeness is now independently evidenced by a hash-pinned 12-case STEP
218
+ corpus covering all six signed principal orientations, equal compound occurrences, topology
219
+ order, and ledge/staircase/detached-body negatives. Detection, width/length/height fidelity,
220
+ and four downstream boundaries are scored separately; a five-requirement fail-closed ledger
221
+ follows both footprint sizes, height and directional location evidence through the shared
222
+ compiler and placement solve (#1372).
223
+
224
+ - Circular blind steps recognised by `b123d-recognisers` now have a complete consumer path.
225
+ The oriented terminal-to-open centreline and transverse quarter-arc lower without rescanning
226
+ to an explicit-only IR/Sheet feature; generated code preserves the full correspondence.
227
+ Radius and stopped depth remain independently addressable and tolerance-aware while sharing
228
+ one solver-placed end-view `R… × … DEEP` leader, and a fail-closed two-requirement ledger
229
+ follows each outcome without parsing labels or guessing by order (#1382).
230
+
231
+ - Paired-ramp steps recognised by `b123d-recognisers` now have one complete consumer path:
232
+ exact IR conversion, explicit `Sheet.paired_ramp_step(...)` declaration, generated-code
233
+ round trip, end-view solver-placed `2× angle × run RUN` leader, independent angle/run
234
+ tolerances and authored suppression, and a two-requirement fail-closed completeness ledger
235
+ (#1382).
236
+
237
+ - Rectangular through steps recognised by `b123d-recognisers` now lower without rescanning to
238
+ an explicit-only IR/Sheet feature. Automatic and explicit lowering support every principal
239
+ axis; an X/Y occurrence stays with the established face-level and shoulder/plate grammar only
240
+ when that grammar proves both exact leg intervals, avoiding both silent loss and duplicate
241
+ dimensions. The two
242
+ orthogonal open-section legs are independently addressable, tolerance-aware, solver-placed in
243
+ the end view, preserved by generated code and scored by a fail-closed two-requirement
244
+ completeness ledger. The through extent stays owned by the envelope (#1382).
245
+
246
+ - Hole completeness is now supported by a versioned, independently authored STEP corpus rather
247
+ than a Draftwright-derived census. Detection, parameter fidelity and downstream usefulness stay
248
+ separate, while the IR adapter, public Sheet declaration, executed generated code and placed
249
+ drawing are each observed through their real seam. Mutations prove that a missing provider hole
250
+ or a broken downstream boundary lowers the relevant evidence even when internal state remains
251
+ self-consistent (#1369).
252
+ - Hole-pattern completeness is now supported by a separate independently authored STEP
253
+ arrangement corpus covering grids, bolt circles, linear arrays, false-positive controls,
254
+ compound cases and topology-order variants. It scores one grouping fact per pattern while the
255
+ hole corpus remains the sole owner of member diameter/depth/location requirements, and follows
256
+ each group through the IR, public Sheet declaration, generated code and placed pattern
257
+ dimensions (#1370).
258
+ - Flat completeness is now supported by an independently authored STEP corpus covering lone,
259
+ opposed, slanted, parallel and coaxial stock plus negative and topology-order controls. It
260
+ counts one physical across-flats requirement per stock line and span, then observes automatic
261
+ IR, public `Sheet.flat`, executed generated code and placed measurement provenance independently
262
+ (#1371).
263
+ - Lone-pocket completeness is now supported by an independently authored STEP corpus covering
264
+ off-centre, edge-anchored, equal, opposed-opening, side-opening, compound, ownership-negative
265
+ and topology-order cases. Provider `open_sign` now survives the IR, declaration and generated
266
+ code boundaries; pocket sizes and both physical location ordinates are followed through exact
267
+ semantic placement evidence without counting pocket-pattern members twice (#1372).
268
+ - Pocket-pattern completeness is now supported by a separate independently authored STEP corpus
269
+ covering axis-aligned and 30° linear/grid arrangements, threshold and unequal-spacing
270
+ negatives, a compound underside pattern and reverse-serialized topology variants. One grouped
271
+ count/size/lattice/location requirement reaches automatic IR, public `Sheet.pocket_pattern`,
272
+ generated code and exact placed ink—including approved pitch tolerances—without recounting its
273
+ member pockets. Diagonal pocket-pattern dimensions use exact label-ink clearance instead of a
274
+ false-blocking hull; generated code preserves the member opening side and grouped callouts
275
+ retain structured count provenance (#1372).
276
+ - Groove completeness is now supported by an independently authored STEP corpus covering a
277
+ monotonic-step negative, all principal axes, a narrow circlip ownership contest, equal grooves
278
+ on separate bodies and reversed Boolean order. Each physical groove's width and floor diameter
279
+ pass independently through automatic IR, public `Sheet.groove`, executed generated code and
280
+ one exact compiler-backed `WIDE × ø` callout; mutations prove that recognition, identity,
281
+ parameters, provenance and printed syntax cannot disappear without lowering evidence (#1372).
282
+ - Chamfer completeness is now supported by an independently authored STEP corpus covering all
283
+ principal axes, equal and asymmetric planar bevels, conical turned treatments, equal features
284
+ on separate bodies, topology-order variants, a plain negative and the AngledStep ownership
285
+ boundary. Each physical bevel is followed through exact IR, public `Sheet.chamfer`, executed
286
+ generated code, compiler measurement provenance, callout syntax and its physical leader target;
287
+ equal requirements may share ink without collapsing occurrence identity (#1374).
288
+ - Fillet completeness is now supported by an independently authored STEP corpus covering all
289
+ principal axes, repeated equal rounds, turned toroidal treatments, separate bodies,
290
+ topology-order variants, a plain negative and the CircularBlindStep ownership boundary. Each
291
+ physical round is followed through exact IR, public `Sheet.fillet`, executed generated code,
292
+ compiler measurement provenance, `R`/`n× R` syntax and its physical leader target; grouped ink
293
+ retains every rounded edge's measurement identity (#1374).
294
+
295
+ - Recognised angled blind steps now fail visibly instead of remaining an undecided inventory.
296
+ Each aggregate-reconciled `AngledStep` produces an actionable warning and one `unsupported`
297
+ completeness outcome. A frozen STEP corpus fixture pins the AngledStep/Chamfer ownership
298
+ boundary, while Draftwright deliberately invents no angle/run, IR, Sheet, generated-code,
299
+ section/detail, or annotation semantics (#1247).
300
+
301
+ - Aggregate-reconciled `PrismaticPocket` occurrences now fail visibly instead of
302
+ remaining an unscored inventory. Each produces an actionable warning and one `unsupported`
303
+ completeness outcome, without repeating the provider's cross-family reconciliation or
304
+ inventing width/length, across-flats, IR, Sheet, generated-code, or annotation semantics (#1246).
305
+
306
+ - Recognised prismatic passages now fail visibly instead of disappearing into an unscored
307
+ inventory. Each authoritative `SectionPassage` produces an actionable warning and an
308
+ `unsupported` completeness outcome; the legacy `Passage` compatibility projection is never
309
+ double-counted. Draftwright retains the family-level unsupported disposition rather than
310
+ claiming a regular-polygon callout represents the provider's complete line/arc schema (#1245).
311
+
312
+ - Declared Double-D bore, countersink, chamfer, fillet, and groove geometry reads now use the
313
+ stable `b123d_recognisers.inspection` namespace from the exact 0.4.6 wheel. A separate
314
+ Draftwright-owned format-1 contract fails closed on changes to the consumed signatures, result
315
+ schemas, units, bevel rejection reasons, or cylindrical surface layout (#1362).
316
+
317
+ - Updated the exact `b123d-recognisers` production lock to 0.4.6. At adoption time, circular
318
+ blind, paired ramp, and through-step inventories were carried from the one aggregate and
319
+ surfaced as unscored completeness evidence pending the #1382 semantic slices now recorded
320
+ above. Rectangular-grid pitch placement also uses a
321
+ deterministic outer witness line across plan, front, and side views despite the release's
322
+ coordinate-rounding differences.
323
+
20
324
  - `annotation_overlap` now reports the whole defect when the same pair also draws
21
325
  line-work through one of the two labels: the message names the crosser, the label
22
326
  crossed and the millimetres, and replaces the "use `label_offset_x`" remedy, which
@@ -40,6 +344,9 @@
40
344
 
41
345
  ### Fixed
42
346
 
347
+ - Non-1:1 orthographic and isometric projection now scales extracted solids about the world
348
+ origin, matching the view-coordinate mapper and solver zones. Solids carrying a non-zero
349
+ build123d `Location` no longer shift their silhouette away from dimensions and callouts.
43
350
  - Notes and generic table cells now render U+2300 `⌀` with the established supported drafting
44
351
  glyph instead of IBM Plex Mono's missing-glyph square. The substitution happens at the one
45
352
  shared measurement/render seam, so source rows remain unchanged and table sizing stays exact
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.4.15
3
+ Version: 0.4.17
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
7
7
  Project-URL: Issues, https://github.com/pzfreo/draftwright/issues
8
8
  Project-URL: Changelog, https://github.com/pzfreo/draftwright/blob/main/CHANGELOG.md
9
9
  Project-URL: Documentation, https://pzfreo.github.io/draftwright/
10
- Author-email: Paul Fremantle <pzfreo@gmail.com>
10
+ Author-email: Paul Fremantle <paul@fremantle.org>
11
11
  License: GNU AFFERO GENERAL PUBLIC LICENSE
12
12
  Version 3, 19 November 2007
13
13
 
@@ -684,7 +684,7 @@ Classifier: Programming Language :: Python :: 3.14
684
684
  Classifier: Topic :: Scientific/Engineering
685
685
  Requires-Python: <3.15,>=3.10
686
686
  Requires-Dist: antlr4-python3-runtime<4.10
687
- Requires-Dist: b123d-recognisers==0.3.1
687
+ Requires-Dist: b123d-recognisers==0.4.12
688
688
  Requires-Dist: build123d-drafting-helpers>=0.14.2
689
689
  Requires-Dist: build123d<0.11,>=0.9.0; python_full_version < '3.13'
690
690
  Requires-Dist: build123d<0.12,>=0.11; python_full_version >= '3.13'
@@ -703,11 +703,15 @@ Description-Content-Type: text/markdown
703
703
  </h1>
704
704
 
705
705
  [![CI](https://github.com/pzfreo/draftwright/actions/workflows/ci.yml/badge.svg)](https://github.com/pzfreo/draftwright/actions/workflows/ci.yml)
706
+ [![Docs](https://github.com/pzfreo/draftwright/actions/workflows/docs.yml/badge.svg)](https://pzfreo.github.io/draftwright/)
706
707
  [![codecov](https://codecov.io/gh/pzfreo/draftwright/branch/main/graph/badge.svg)](https://codecov.io/gh/pzfreo/draftwright)
707
708
  [![PyPI](https://img.shields.io/pypi/v/draftwright.svg)](https://pypi.org/project/draftwright/)
708
709
  [![Python](https://img.shields.io/pypi/pyversions/draftwright.svg)](https://pypi.org/project/draftwright/)
710
+ [![Downloads](https://static.pepy.tech/badge/draftwright/month)](https://pepy.tech/project/draftwright)
709
711
  [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)
710
712
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
713
+ [![mypy](https://img.shields.io/badge/mypy-checked-2a6db2.svg)](https://mypy-lang.org/)
714
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
711
715
 
712
716
  **[API reference](https://pzfreo.github.io/draftwright/)** ·
713
717
  **[Examples and source](https://github.com/pzfreo/draftwright#readme)**
@@ -823,6 +827,24 @@ a chainable handle (`sheet.hole(bore)`) that the aspect and `control(...)` verbs
823
827
  targets are placed automatically — the view and strip are derived from the referenced
824
828
  feature or face, with `view=`/`side=` overrides.
825
829
 
830
+ A feature-linked note can explicitly satisfy requirements that are legitimately communicated
831
+ as one compound shop instruction instead of separate dimensions. Use the canonical ids exposed
832
+ by the handle; free prose alone never changes coverage:
833
+
834
+ ```python
835
+ assert "counterbore.diameter" in hole.dimension_ids()
836
+ hole.note(
837
+ "PROFILED BORE: ⌀14 × 8 DEEP",
838
+ satisfies=("counterbore.diameter", "counterbore.depth"),
839
+ )
840
+ ```
841
+
842
+ Each id remains independent provenance in `drawing.registry.satisfaction_of(annotation_name)`;
843
+ the semantic family outcomes report `satisfied_by_structured_note`, while
844
+ `drawing.lint_summary()["quality"]["completeness"]` aggregates the count. The assertion counts
845
+ only if the normal placement solve places the note. Generated Sheet scripts preserve the
846
+ structured claim. Invalid, duplicate, ambiguous, or face-only claims fail at declaration time.
847
+
826
848
  ### From a part to an object-referenced script
827
849
 
828
850
  `draftwright part.step --script` writes an editable `Sheet` script. When you built the part
@@ -3,11 +3,15 @@
3
3
  </h1>
4
4
 
5
5
  [![CI](https://github.com/pzfreo/draftwright/actions/workflows/ci.yml/badge.svg)](https://github.com/pzfreo/draftwright/actions/workflows/ci.yml)
6
+ [![Docs](https://github.com/pzfreo/draftwright/actions/workflows/docs.yml/badge.svg)](https://pzfreo.github.io/draftwright/)
6
7
  [![codecov](https://codecov.io/gh/pzfreo/draftwright/branch/main/graph/badge.svg)](https://codecov.io/gh/pzfreo/draftwright)
7
8
  [![PyPI](https://img.shields.io/pypi/v/draftwright.svg)](https://pypi.org/project/draftwright/)
8
9
  [![Python](https://img.shields.io/pypi/pyversions/draftwright.svg)](https://pypi.org/project/draftwright/)
10
+ [![Downloads](https://static.pepy.tech/badge/draftwright/month)](https://pepy.tech/project/draftwright)
9
11
  [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)
10
12
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
13
+ [![mypy](https://img.shields.io/badge/mypy-checked-2a6db2.svg)](https://mypy-lang.org/)
14
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
11
15
 
12
16
  **[API reference](https://pzfreo.github.io/draftwright/)** ·
13
17
  **[Examples and source](https://github.com/pzfreo/draftwright#readme)**
@@ -123,6 +127,24 @@ a chainable handle (`sheet.hole(bore)`) that the aspect and `control(...)` verbs
123
127
  targets are placed automatically — the view and strip are derived from the referenced
124
128
  feature or face, with `view=`/`side=` overrides.
125
129
 
130
+ A feature-linked note can explicitly satisfy requirements that are legitimately communicated
131
+ as one compound shop instruction instead of separate dimensions. Use the canonical ids exposed
132
+ by the handle; free prose alone never changes coverage:
133
+
134
+ ```python
135
+ assert "counterbore.diameter" in hole.dimension_ids()
136
+ hole.note(
137
+ "PROFILED BORE: ⌀14 × 8 DEEP",
138
+ satisfies=("counterbore.diameter", "counterbore.depth"),
139
+ )
140
+ ```
141
+
142
+ Each id remains independent provenance in `drawing.registry.satisfaction_of(annotation_name)`;
143
+ the semantic family outcomes report `satisfied_by_structured_note`, while
144
+ `drawing.lint_summary()["quality"]["completeness"]` aggregates the count. The assertion counts
145
+ only if the normal placement solve places the note. Generated Sheet scripts preserve the
146
+ structured claim. Invalid, duplicate, ambiguous, or face-only claims fail at declaration time.
147
+
126
148
  ### From a part to an object-referenced script
127
149
 
128
150
  `draftwright part.step --script` writes an editable `Sheet` script. When you built the part
@@ -33,9 +33,10 @@ architecture** table; open retired or superseded records only for design history
33
33
  | [0014](0014-collect-then-solve-annotation-placement.md) | Collect-then-solve annotation placement (as built) | Collect, select, assign, and deterministically solve annotations per corridor before rendering; compatible sparse ordinary side/plan hole and post-drain machined leaders share one bounded late inventory. | Accepted; supersedes 0009; #740 Amendment 1; #1166 Amendment 2 | `test_carve_free_position_callers.py`, `test_strip_layout.py`, `test_layout_property.py`, `test_issue_740_leader_assignment.py`, `test_issue_1166_cross_pass_feature_leaders.py`, `test_import_boundaries.py` |
34
34
  | [0015](0015-part-drawing-compiler-as-built.md) | The part-drawing compiler, as built | Use one detected-or-declared feature IR and planner-fed dimension groups as the compiler waist. | Accepted; supersedes 0008 | `test_part_model.py`, `test_detect_once.py`, `test_import_boundaries.py` |
35
35
  | [0016](0016-declared-dimensioning-intent.md) | Declared dimensioning intent: capture what to measure, let the engine place it | Declare which measurements matter as scale-independent intent routed through the planner and corridor solve; never hardcode dimension geometry. | Accepted; epic #867 complete; phase 6 landed (#940) | `test_compiled_plan_boundary.py`, `test_issue_1215_no_approved_tolerance_is_dropped.py`, `test_label_provenance.py`, `test_sheet_emit.py`, `test_add_dimension.py` |
36
- | [0017](0017-recognition-inventory-correspondence-and-measurement-provenance.md) | One recognition result per run; correspondence is evidence-gated | Produce one external immutable recognition result held by Draftwright's per-run cache; require vertical-slice evidence before generalising correspondence, identity, requirements, outcomes, or reconciliation. | Accepted; external cache ownership clarified, extensions gated by #1018 | `test_external_recognition_boundary.py`, `test_recognition_manifest.py`, `test_declared_recognition_gate.py` |
36
+ | [0017](0017-recognition-inventory-correspondence-and-measurement-provenance.md) | One recognition result per run; correspondence is evidence-gated | Produce one external immutable recognition result held by Draftwright's per-run cache; require vertical-slice evidence before generalising correspondence, identity, requirements, outcomes, or reconciliation. | Accepted; external cache ownership clarified, extensions gated by #1018 | `test_external_recognition_boundary.py`, `test_detect_once.py`, `test_declared_recognition_gate.py` |
37
37
  | [0018](0018-requirement-driven-view-planning-and-editable-sheet-layout.md) | Requirement-driven view planning and editable sheet layout | Use one `ViewSpec` vocabulary and planner with distinct authored `ViewConstraints` and immutable `ResolvedViewPlan`; jointly validate views, typography, convention, scale, paper and layout against requirement survival. Supersedes ADR 0004's fixed-topology assumption while retaining compose-then-pack. | Accepted 2026-08-16; partially implemented (`ViewSpec`, `ResolvedViewPlan`, `ViewCoverage`, arrangement choice and requirement gate); tracked by #1130/#1259-#1262 | Required guards are listed in the ADR |
38
38
  | [0019](0019-display-complete-labels-and-dimension-outcomes.md) | Display-complete labels and a dimension-outcome ledger | The compiled plan carries the full label text (tolerance and collapse wording included) so renderers render and never compose; dimension outcomes reconcile at one seam on both build routes; ladder rungs get per-mark identity. Finishes the ADR 0016 Amdt 1 boundary; supersedes Amdt 6's enforcement mechanism. | Proposed | `test_issue_1215_no_approved_tolerance_is_dropped.py` reduces to plan-equality when implemented |
39
+ | [0020](0020-provider-owned-frame-boundary.md) | Provider-owned frame boundary for detected compilation | Prepare, classify, and recognise against one exact local working solid; retain source provenance, propagate typed refusals, and gate semantic direction claims by frame gauge. | Accepted; explicit opt-in activation, raw rollout default | `test_issue_1357_framed_boundary.py`, `test_issue_1357_framed_activation.py`, `test_recogniser_capabilities.py`, `test_import_boundaries.py` |
39
40
 
40
41
  ## Historical records
41
42