draftwright 0.4.16__tar.gz → 0.4.18__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 (532) hide show
  1. {draftwright-0.4.16 → draftwright-0.4.18}/CHANGELOG.md +394 -1
  2. {draftwright-0.4.16 → draftwright-0.4.18}/PKG-INFO +12 -7
  3. {draftwright-0.4.16 → draftwright-0.4.18}/README.md +10 -5
  4. draftwright-0.4.18/docs/adr/README.md +48 -0
  5. draftwright-0.4.18/docs/reference/recogniser-capabilities.md +737 -0
  6. {draftwright-0.4.16 → draftwright-0.4.18}/docs/reference/sheet.md +117 -0
  7. {draftwright-0.4.16 → draftwright-0.4.18}/docs/research/1062-repeating-radial-profile-evidence.md +5 -5
  8. {draftwright-0.4.16 → draftwright-0.4.18}/pyproject.toml +3 -2
  9. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/__init__.py +17 -0
  10. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_core.py +48 -18
  11. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_geometry.py +219 -5
  12. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_warnings.py +1 -1
  13. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/analysis.py +406 -150
  14. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/__init__.py +1 -1
  15. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/_common.py +219 -32
  16. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/balloons.py +5 -5
  17. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/from_model.py +1702 -162
  18. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/holes.py +139 -96
  19. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/leaders.py +1 -1
  20. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/orchestrator.py +86 -27
  21. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/sections.py +63 -18
  22. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/audit.py +1 -1
  23. draftwright-0.4.18/src/draftwright/blend_contract.py +147 -0
  24. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/builder.py +134 -62
  25. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/cli.py +38 -4
  26. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/compose.py +85 -24
  27. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/drawing.py +610 -115
  28. draftwright-0.4.18/src/draftwright/evaluation/step_analysis.py +5817 -0
  29. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/export.py +2 -2
  30. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fits.py +1 -1
  31. draftwright-0.4.18/src/draftwright/inspection.py +281 -0
  32. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/inspection_contract.py +1 -1
  33. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/intents.py +1 -1
  34. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/layout.py +17 -17
  35. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/__init__.py +39 -1
  36. draftwright-0.4.18/src/draftwright/linting/angled_step_coverage.py +38 -0
  37. draftwright-0.4.18/src/draftwright/linting/blend_coverage.py +219 -0
  38. draftwright-0.4.18/src/draftwright/linting/chamfer_coverage.py +195 -0
  39. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/channel_coverage.py +5 -1
  40. draftwright-0.4.18/src/draftwright/linting/circular_blind_step_coverage.py +355 -0
  41. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/coverage.py +832 -181
  42. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/evidence.py +5 -5
  43. draftwright-0.4.18/src/draftwright/linting/fillet_coverage.py +192 -0
  44. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/flat_coverage.py +11 -3
  45. draftwright-0.4.18/src/draftwright/linting/groove_coverage.py +268 -0
  46. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/hole_coverage.py +48 -19
  47. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/ink_overlap.py +3 -3
  48. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/issues.py +42 -1
  49. draftwright-0.4.18/src/draftwright/linting/pad_coverage.py +399 -0
  50. draftwright-0.4.18/src/draftwright/linting/paired_ramp_step_coverage.py +231 -0
  51. draftwright-0.4.18/src/draftwright/linting/passage_coverage.py +38 -0
  52. draftwright-0.4.18/src/draftwright/linting/plate_coverage.py +774 -0
  53. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/pmi_coverage.py +1 -1
  54. draftwright-0.4.18/src/draftwright/linting/pocket_coverage.py +333 -0
  55. draftwright-0.4.18/src/draftwright/linting/pocket_pattern_coverage.py +389 -0
  56. draftwright-0.4.18/src/draftwright/linting/polygonal_boss_coverage.py +394 -0
  57. draftwright-0.4.18/src/draftwright/linting/polygonal_stock_coverage.py +472 -0
  58. draftwright-0.4.18/src/draftwright/linting/prismatic_pocket_coverage.py +38 -0
  59. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/quality.py +151 -44
  60. draftwright-0.4.18/src/draftwright/linting/rectangular_blind_slot_coverage.py +322 -0
  61. draftwright-0.4.18/src/draftwright/linting/requirements.py +102 -0
  62. draftwright-0.4.18/src/draftwright/linting/round_bottom_blind_slot_coverage.py +328 -0
  63. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/slot_coverage.py +16 -9
  64. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/structural.py +5 -5
  65. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/suggest.py +1 -1
  66. draftwright-0.4.18/src/draftwright/linting/through_step_coverage.py +662 -0
  67. draftwright-0.4.18/src/draftwright/linting/turned_step_coverage.py +525 -0
  68. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/make_drawing.py +1 -1
  69. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/__init__.py +28 -2
  70. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/callout.py +6 -6
  71. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/compiled.py +180 -37
  72. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/declare.py +255 -21
  73. draftwright-0.4.18/src/draftwright/model/detect.py +2666 -0
  74. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/ir.py +766 -33
  75. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/planner.py +77 -38
  76. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/pmi_lowering.py +31 -6
  77. draftwright-0.4.18/src/draftwright/plate_correspondence.py +318 -0
  78. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/pmi.py +172 -52
  79. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/projection.py +39 -3
  80. draftwright-0.4.18/src/draftwright/recogniser_contract.py +1366 -0
  81. draftwright-0.4.18/src/draftwright/recogniser_policy.py +132 -0
  82. draftwright-0.4.18/src/draftwright/recogniser_schema.py +89 -0
  83. draftwright-0.4.18/src/draftwright/recognition_cache.py +78 -0
  84. draftwright-0.4.18/src/draftwright/recognition_frame.py +350 -0
  85. draftwright-0.4.18/src/draftwright/recognition_ownership.py +812 -0
  86. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/registry.py +6 -6
  87. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/repair.py +4 -2
  88. draftwright-0.4.18/src/draftwright/reporting.py +583 -0
  89. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/sheet.py +134 -53
  90. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/sheet_emit.py +343 -78
  91. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/view_plan.py +18 -18
  92. {draftwright-0.4.16 → draftwright-0.4.18}/tests/_kernel.py +1 -1
  93. {draftwright-0.4.16 → draftwright-0.4.18}/tests/_layout_sig.py +1 -1
  94. draftwright-0.4.18/tests/_recogniser_public_contract.py +150 -0
  95. {draftwright-0.4.16 → draftwright-0.4.18}/tests/conftest.py +63 -23
  96. draftwright-0.4.18/tests/fixtures/evaluation/README.md +243 -0
  97. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-asymmetric.step +505 -0
  98. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-compound.step +547 -0
  99. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-overlap.step +776 -0
  100. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-plain.step +415 -0
  101. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-planar-x.step +535 -0
  102. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-planar-y.step +535 -0
  103. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-planar-z.step +505 -0
  104. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-topology-a.step +596 -0
  105. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-topology-b.step +596 -0
  106. draftwright-0.4.18/tests/fixtures/evaluation/chamfer-turned.step +210 -0
  107. draftwright-0.4.18/tests/fixtures/evaluation/corpus-chamfers-v1.json +200 -0
  108. draftwright-0.4.18/tests/fixtures/evaluation/corpus-countersinks-v1.json +188 -0
  109. draftwright-0.4.18/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +287 -0
  110. draftwright-0.4.18/tests/fixtures/evaluation/corpus-fillets-v1.json +211 -0
  111. draftwright-0.4.18/tests/fixtures/evaluation/corpus-flats-v1.json +227 -0
  112. draftwright-0.4.18/tests/fixtures/evaluation/corpus-grooves-v1.json +164 -0
  113. draftwright-0.4.18/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +151 -0
  114. draftwright-0.4.18/tests/fixtures/evaluation/corpus-plates-v1.json +257 -0
  115. draftwright-0.4.18/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +199 -0
  116. draftwright-0.4.18/tests/fixtures/evaluation/corpus-pockets-v1.json +269 -0
  117. draftwright-0.4.18/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +939 -0
  118. draftwright-0.4.18/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +198 -0
  119. draftwright-0.4.18/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +222 -0
  120. draftwright-0.4.18/tests/fixtures/evaluation/corpus-turned-steps-v1.json +166 -0
  121. draftwright-0.4.18/tests/fixtures/evaluation/countersink-deburr.step +876 -0
  122. draftwright-0.4.18/tests/fixtures/evaluation/countersink-external-cone.step +274 -0
  123. draftwright-0.4.18/tests/fixtures/evaluation/countersink-mixed-pair.step +736 -0
  124. draftwright-0.4.18/tests/fixtures/evaluation/countersink-single.step +575 -0
  125. draftwright-0.4.18/tests/fixtures/evaluation/countersink-topology-a.step +736 -0
  126. draftwright-0.4.18/tests/fixtures/evaluation/countersink-topology-b.step +736 -0
  127. draftwright-0.4.18/tests/fixtures/evaluation/double-d-axis-x.step +814 -0
  128. draftwright-0.4.18/tests/fixtures/evaluation/double-d-axis-y.step +814 -0
  129. draftwright-0.4.18/tests/fixtures/evaluation/double-d-blind.step +790 -0
  130. draftwright-0.4.18/tests/fixtures/evaluation/double-d-coaxial-compound.step +1591 -0
  131. draftwright-0.4.18/tests/fixtures/evaluation/double-d-opposed-blind.step +1164 -0
  132. draftwright-0.4.18/tests/fixtures/evaluation/double-d-roll-30.step +814 -0
  133. draftwright-0.4.18/tests/fixtures/evaluation/double-d-round-bore.step +511 -0
  134. draftwright-0.4.18/tests/fixtures/evaluation/double-d-single-z.step +784 -0
  135. draftwright-0.4.18/tests/fixtures/evaluation/double-d-topology-a.step +1591 -0
  136. draftwright-0.4.18/tests/fixtures/evaluation/double-d-topology-b.step +1591 -0
  137. draftwright-0.4.18/tests/fixtures/evaluation/fillet-compound.step +977 -0
  138. draftwright-0.4.18/tests/fixtures/evaluation/fillet-overlap.step +597 -0
  139. draftwright-0.4.18/tests/fixtures/evaluation/fillet-plain.step +415 -0
  140. draftwright-0.4.18/tests/fixtures/evaluation/fillet-planar-x.step +537 -0
  141. draftwright-0.4.18/tests/fixtures/evaluation/fillet-planar-y.step +537 -0
  142. draftwright-0.4.18/tests/fixtures/evaluation/fillet-planar-z.step +507 -0
  143. draftwright-0.4.18/tests/fixtures/evaluation/fillet-repeated.step +820 -0
  144. draftwright-0.4.18/tests/fixtures/evaluation/fillet-topology-a.step +617 -0
  145. draftwright-0.4.18/tests/fixtures/evaluation/fillet-topology-b.step +617 -0
  146. draftwright-0.4.18/tests/fixtures/evaluation/fillet-turned.step +211 -0
  147. draftwright-0.4.18/tests/fixtures/evaluation/flat-coaxial.step +437 -0
  148. draftwright-0.4.18/tests/fixtures/evaluation/flat-double-d.step +419 -0
  149. draftwright-0.4.18/tests/fixtures/evaluation/flat-lone-d.step +237 -0
  150. draftwright-0.4.18/tests/fixtures/evaluation/flat-nonround.step +415 -0
  151. draftwright-0.4.18/tests/fixtures/evaluation/flat-slanted-double-d.step +449 -0
  152. draftwright-0.4.18/tests/fixtures/evaluation/flat-topology-a.step +437 -0
  153. draftwright-0.4.18/tests/fixtures/evaluation/flat-topology-b.step +437 -0
  154. draftwright-0.4.18/tests/fixtures/evaluation/groove-compound.step +665 -0
  155. draftwright-0.4.18/tests/fixtures/evaluation/groove-lone-x.step +381 -0
  156. draftwright-0.4.18/tests/fixtures/evaluation/groove-lone-y.step +381 -0
  157. draftwright-0.4.18/tests/fixtures/evaluation/groove-lone-z.step +351 -0
  158. draftwright-0.4.18/tests/fixtures/evaluation/groove-monotonic-negative.step +249 -0
  159. draftwright-0.4.18/tests/fixtures/evaluation/groove-narrow.step +351 -0
  160. draftwright-0.4.18/tests/fixtures/evaluation/groove-topology-a.step +556 -0
  161. draftwright-0.4.18/tests/fixtures/evaluation/groove-topology-b.step +556 -0
  162. draftwright-0.4.18/tests/fixtures/evaluation/pad-compound-equal.step +1595 -0
  163. draftwright-0.4.18/tests/fixtures/evaluation/pad-detached-body-negative.step +853 -0
  164. draftwright-0.4.18/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +776 -0
  165. draftwright-0.4.18/tests/fixtures/evaluation/pad-nested-staircase-negative.step +2230 -0
  166. draftwright-0.4.18/tests/fixtures/evaluation/pad-topology-a.step +1156 -0
  167. draftwright-0.4.18/tests/fixtures/evaluation/pad-topology-b.step +1156 -0
  168. draftwright-0.4.18/tests/fixtures/evaluation/pad-x-negative.step +786 -0
  169. draftwright-0.4.18/tests/fixtures/evaluation/pad-x-positive.step +786 -0
  170. draftwright-0.4.18/tests/fixtures/evaluation/pad-y-negative.step +786 -0
  171. draftwright-0.4.18/tests/fixtures/evaluation/pad-y-positive.step +786 -0
  172. draftwright-0.4.18/tests/fixtures/evaluation/pad-z-negative.step +786 -0
  173. draftwright-0.4.18/tests/fixtures/evaluation/pad-z-positive.step +786 -0
  174. draftwright-0.4.18/tests/fixtures/evaluation/pattern-ambiguous.step +703 -0
  175. draftwright-0.4.18/tests/fixtures/evaluation/pattern-grid.step +992 -0
  176. draftwright-0.4.18/tests/fixtures/evaluation/pattern-topology-a.step +1090 -0
  177. draftwright-0.4.18/tests/fixtures/evaluation/pattern-topology-b.step +1090 -0
  178. draftwright-0.4.18/tests/fixtures/evaluation/plate-compound-equal.step +1575 -0
  179. draftwright-0.4.18/tests/fixtures/evaluation/plate-cross-topology-a.step +1497 -0
  180. draftwright-0.4.18/tests/fixtures/evaluation/plate-cross-topology-b.step +1497 -0
  181. draftwright-0.4.18/tests/fixtures/evaluation/plate-detached-negative.step +793 -0
  182. draftwright-0.4.18/tests/fixtures/evaluation/plate-rotational-negative.step +147 -0
  183. draftwright-0.4.18/tests/fixtures/evaluation/plate-single-negative.step +415 -0
  184. draftwright-0.4.18/tests/fixtures/evaluation/plate-t-xz.step +776 -0
  185. draftwright-0.4.18/tests/fixtures/evaluation/plate-t-yz.step +776 -0
  186. draftwright-0.4.18/tests/fixtures/evaluation/plate-thick-negative.step +776 -0
  187. draftwright-0.4.18/tests/fixtures/evaluation/plate-u-additive.step +776 -0
  188. draftwright-0.4.18/tests/fixtures/evaluation/plate-u-cut.step +776 -0
  189. draftwright-0.4.18/tests/fixtures/evaluation/pocket-compound.step +1595 -0
  190. draftwright-0.4.18/tests/fixtures/evaluation/pocket-edge-anchored.step +685 -0
  191. draftwright-0.4.18/tests/fixtures/evaluation/pocket-lone.step +786 -0
  192. draftwright-0.4.18/tests/fixtures/evaluation/pocket-opposed.step +1156 -0
  193. draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +1526 -0
  194. draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-grid.step +2638 -0
  195. draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-linear.step +1897 -0
  196. draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-pair.step +1156 -0
  197. draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-topology-a.step +3008 -0
  198. draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-topology-b.step +3007 -0
  199. draftwright-0.4.18/tests/fixtures/evaluation/pocket-prismatic-negative.step +966 -0
  200. draftwright-0.4.18/tests/fixtures/evaluation/pocket-side.step +816 -0
  201. draftwright-0.4.18/tests/fixtures/evaluation/pocket-through-negative.step +780 -0
  202. draftwright-0.4.18/tests/fixtures/evaluation/pocket-topology-a.step +1156 -0
  203. draftwright-0.4.18/tests/fixtures/evaluation/pocket-topology-b.step +1156 -0
  204. draftwright-0.4.18/tests/fixtures/evaluation/pocket-two-equal.step +1156 -0
  205. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +1008 -0
  206. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +1033 -0
  207. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +966 -0
  208. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +990 -0
  209. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +966 -0
  210. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +625 -0
  211. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-topology-a.step +1516 -0
  212. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-topology-b.step +1516 -0
  213. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-x.step +996 -0
  214. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-y.step +996 -0
  215. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-z.step +966 -0
  216. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +637 -0
  217. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +147 -0
  218. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +595 -0
  219. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +776 -0
  220. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +705 -0
  221. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-roll17.step +625 -0
  222. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-topology-a.step +595 -0
  223. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-topology-b.step +595 -0
  224. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-translated.step +625 -0
  225. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-x.step +625 -0
  226. draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-y.step +625 -0
  227. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-axis-x.step +381 -0
  228. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-axis-y.step +279 -0
  229. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-axis-z.step +249 -0
  230. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-compound.step +521 -0
  231. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-repeated-lengths.step +381 -0
  232. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-through-bore.step +345 -0
  233. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-topology-a.step +351 -0
  234. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-topology-b.step +381 -0
  235. draftwright-0.4.18/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +381 -0
  236. draftwright-0.4.18/tests/fixtures/issue_1247_angled_blind_step.step +776 -0
  237. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_add_dimension.py +50 -7
  238. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_adr0018_arrangement_gate.py +4 -4
  239. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_adr0018_view_routing.py +3 -3
  240. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_adr0018_view_selection.py +42 -4
  241. draftwright-0.4.18/tests/test_adr_corpus.py +134 -0
  242. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_architecture_docs.py +7 -4
  243. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_audit_differential.py +8 -6
  244. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_carve_free_position_callers.py +10 -10
  245. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_compiled_plan_boundary.py +123 -28
  246. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_counting_calls.py +25 -1
  247. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_declare.py +44 -14
  248. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_declared_recognition_gate.py +32 -38
  249. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_dense_sheet_canary.py +2 -2
  250. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_deprecation_dates.py +3 -2
  251. draftwright-0.4.18/tests/test_detect_once.py +147 -0
  252. draftwright-0.4.18/tests/test_detect_registry.py +309 -0
  253. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_drawing_encapsulation.py +41 -25
  254. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_e2e_slice.py +1 -1
  255. draftwright-0.4.18/tests/test_external_recognition_boundary.py +127 -0
  256. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_fits.py +1 -1
  257. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_flat_completeness.py +1 -2
  258. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_flat_stock_identity.py +2 -2
  259. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_gdt_placement.py +4 -4
  260. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_grid_lattice_convention.py +3 -3
  261. draftwright-0.4.18/tests/test_import_boundaries.py +1220 -0
  262. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_inspection_contract.py +7 -3
  263. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1058_wheel_profile.py +203 -293
  264. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1082_polygonal_stock.py +9 -5
  265. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1130_view_planning_evidence.py +9 -7
  266. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1142_hole_leader_labels.py +1 -1
  267. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1143_hole_completeness.py +36 -12
  268. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1146_scale_completeness.py +13 -10
  269. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1153_contradictory_dimensions.py +1 -1
  270. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1166_cross_pass_feature_leaders.py +30 -26
  271. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1176_quality_fidelity.py +2 -2
  272. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1177_angular_dimensions.py +1 -1
  273. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1196_deterministic_view_names.py +2 -2
  274. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1202_observed_drawing_consumer.py +11 -12
  275. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1215_envelope_tolerance.py +1 -1
  276. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +11 -11
  277. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1216_callout_reservation_measures_ink.py +1 -1
  278. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1217_claimed_representations.py +2 -2
  279. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1217_the_facility_is_shared.py +3 -3
  280. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1229_ledger_member_keying.py +2 -1
  281. draftwright-0.4.18/tests/test_issue_1245_passage_disposition.py +180 -0
  282. draftwright-0.4.18/tests/test_issue_1246_prismatic_pocket_disposition.py +187 -0
  283. draftwright-0.4.18/tests/test_issue_1247_angled_step_disposition.py +100 -0
  284. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1254_turned_chamfers.py +10 -14
  285. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1260_view_constraints.py +31 -2
  286. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1262_automatic_turned_views.py +5 -2
  287. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1308_machined_leader_analytics.py +10 -2
  288. draftwright-0.4.16/tests/test_issue_1332_overlap_remedy_fast.py → draftwright-0.4.18/tests/test_issue_1332_overlap_remedy.py +17 -24
  289. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1351_structured_note_coverage.py +4 -2
  290. draftwright-0.4.18/tests/test_issue_1357_framed_activation.py +224 -0
  291. draftwright-0.4.18/tests/test_issue_1357_framed_boundary.py +312 -0
  292. draftwright-0.4.18/tests/test_issue_1357_plural_turned_profiles.py +1013 -0
  293. draftwright-0.4.18/tests/test_issue_1357_pmi_frame.py +171 -0
  294. draftwright-0.4.18/tests/test_issue_1369_hole_completeness_evidence.py +166 -0
  295. draftwright-0.4.18/tests/test_issue_1370_countersink_completeness_evidence.py +524 -0
  296. draftwright-0.4.18/tests/test_issue_1370_double_d_completeness_evidence.py +702 -0
  297. draftwright-0.4.18/tests/test_issue_1370_hole_pattern_completeness_evidence.py +335 -0
  298. draftwright-0.4.18/tests/test_issue_1371_flat_completeness_evidence.py +287 -0
  299. draftwright-0.4.18/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +1206 -0
  300. draftwright-0.4.18/tests/test_issue_1372_groove_completeness_evidence.py +677 -0
  301. draftwright-0.4.18/tests/test_issue_1372_pad_completeness_evidence.py +789 -0
  302. draftwright-0.4.18/tests/test_issue_1372_pocket_completeness_evidence.py +454 -0
  303. draftwright-0.4.18/tests/test_issue_1372_pocket_pattern_completeness_evidence.py +906 -0
  304. draftwright-0.4.18/tests/test_issue_1372_polygonal_boss_completeness_evidence.py +847 -0
  305. draftwright-0.4.18/tests/test_issue_1373_plate_completeness_evidence.py +1427 -0
  306. draftwright-0.4.18/tests/test_issue_1374_chamfer_completeness_evidence.py +560 -0
  307. draftwright-0.4.18/tests/test_issue_1374_fillet_completeness_evidence.py +528 -0
  308. draftwright-0.4.18/tests/test_issue_1374_turned_step_completeness_evidence.py +1503 -0
  309. draftwright-0.4.18/tests/test_issue_1382_046_step_inventory.py +66 -0
  310. draftwright-0.4.18/tests/test_issue_1382_circular_blind_step_semantics.py +1071 -0
  311. draftwright-0.4.18/tests/test_issue_1382_framed_step_family_evidence.py +426 -0
  312. draftwright-0.4.18/tests/test_issue_1382_paired_ramp_semantics.py +468 -0
  313. draftwright-0.4.18/tests/test_issue_1382_through_step_semantics.py +1749 -0
  314. draftwright-0.4.18/tests/test_issue_1392_recognisers_048.py +584 -0
  315. draftwright-0.4.18/tests/test_issue_1395_degenerate_iso_region.py +277 -0
  316. draftwright-0.4.18/tests/test_issue_1397_unverifiable_requirement_message.py +247 -0
  317. draftwright-0.4.18/tests/test_issue_1421_rectangular_blind_slot_completeness.py +589 -0
  318. draftwright-0.4.18/tests/test_issue_1421_rectangular_blind_slot_semantics.py +448 -0
  319. draftwright-0.4.18/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +621 -0
  320. draftwright-0.4.18/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +479 -0
  321. draftwright-0.4.18/tests/test_issue_1433_blend_semantics.py +1061 -0
  322. draftwright-0.4.18/tests/test_issue_1438_boss_ownership.py +481 -0
  323. draftwright-0.4.18/tests/test_issue_1438_channel_ownership.py +376 -0
  324. draftwright-0.4.18/tests/test_issue_1438_cli_report_sidecar.py +132 -0
  325. draftwright-0.4.18/tests/test_issue_1438_generation_snapshot.py +276 -0
  326. draftwright-0.4.18/tests/test_issue_1438_nested_ownership.py +318 -0
  327. draftwright-0.4.18/tests/test_issue_1438_occurrence_ownership.py +329 -0
  328. draftwright-0.4.18/tests/test_issue_1438_pattern_ownership.py +350 -0
  329. draftwright-0.4.18/tests/test_issue_1438_plate_ownership.py +444 -0
  330. draftwright-0.4.18/tests/test_issue_1438_policy_dispositions.py +316 -0
  331. draftwright-0.4.18/tests/test_issue_1438_report_projection.py +882 -0
  332. draftwright-0.4.18/tests/test_issue_1438_report_writer.py +136 -0
  333. draftwright-0.4.18/tests/test_issue_1438_through_step_ownership.py +462 -0
  334. draftwright-0.4.18/tests/test_issue_1438_turned_step_ownership.py +249 -0
  335. draftwright-0.4.18/tests/test_issue_1460_step_inspection.py +790 -0
  336. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_676_polygonal_boss.py +3 -1
  337. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_740_leader_assignment.py +7 -2
  338. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_798_silhouette_lint.py +12 -10
  339. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_885_prismatic_coverage.py +7 -3
  340. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_915_dense_case.py +23 -14
  341. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_958_cross_solid_recognition.py +7 -5
  342. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_label_provenance.py +2 -2
  343. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_layout.py +5 -4
  344. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_layout_cleanliness.py +6 -6
  345. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_layout_hypothesis.py +1 -1
  346. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_layout_property.py +1 -1
  347. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_lint_ink_overlap.py +1 -1
  348. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_lint_structural.py +2 -2
  349. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_linting.py +1 -1
  350. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_location_vocabulary.py +3 -3
  351. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_make_drawing.py +115 -58
  352. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_object_aspects.py +1 -1
  353. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_parameter_id.py +66 -3
  354. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_part_model.py +11 -10
  355. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pitch_dim_footprint.py +2 -2
  356. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pmi.py +1 -1
  357. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pocket_pattern_recognition.py +10 -6
  358. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_private_test_attr_reads.py +3 -1
  359. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_private_test_imports.py +1 -1
  360. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_quality_components.py +122 -1
  361. draftwright-0.4.18/tests/test_recogniser_capabilities.py +1862 -0
  362. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_recogniser_contract.py +325 -68
  363. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_recognition_result.py +18 -73
  364. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_refactor_golden.py +9 -9
  365. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_registry.py +1 -1
  366. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_render_seam.py +4 -4
  367. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_repack_geometry_seam.py +1 -1
  368. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_emit.py +234 -14
  369. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_gdt.py +1 -1
  370. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_identity_invariant.py +6 -0
  371. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_notes.py +2 -2
  372. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_of.py +1 -1
  373. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_section.py +1 -1
  374. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_tables.py +3 -3
  375. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_slanted_blind_step.py +1 -49
  376. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_slot_pattern_recognition.py +10 -2
  377. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_soft_deprecation.py +2 -2
  378. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_strip_layout.py +100 -21
  379. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_suppression_ledger.py +3 -3
  380. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_suppression_marks.py +1 -1
  381. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_tolerances.py +8 -8
  382. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_turned_steps.py +1 -1
  383. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_view_plan.py +28 -13
  384. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_workflows.py +159 -0
  385. draftwright-0.4.16/docs/adr/README.md +0 -57
  386. draftwright-0.4.16/docs/reference/recogniser-capabilities.md +0 -98
  387. draftwright-0.4.16/src/draftwright/evaluation/step_analysis.py +0 -924
  388. draftwright-0.4.16/src/draftwright/linting/polygonal_stock_coverage.py +0 -129
  389. draftwright-0.4.16/src/draftwright/model/detect.py +0 -1142
  390. draftwright-0.4.16/src/draftwright/recogniser_contract.py +0 -667
  391. draftwright-0.4.16/src/draftwright/recognition_cache.py +0 -26
  392. draftwright-0.4.16/tests/fixtures/evaluation/README.md +0 -20
  393. draftwright-0.4.16/tests/test_detect_once.py +0 -121
  394. draftwright-0.4.16/tests/test_detect_registry.py +0 -209
  395. draftwright-0.4.16/tests/test_external_recognition_boundary.py +0 -62
  396. draftwright-0.4.16/tests/test_import_boundaries.py +0 -512
  397. draftwright-0.4.16/tests/test_issue_1332_overlap_remedy.py +0 -89
  398. draftwright-0.4.16/tests/test_recogniser_capabilities.py +0 -762
  399. draftwright-0.4.16/tests/test_recognition_manifest.py +0 -723
  400. {draftwright-0.4.16 → draftwright-0.4.18}/.gitignore +0 -0
  401. {draftwright-0.4.16 → draftwright-0.4.18}/LICENSE +0 -0
  402. {draftwright-0.4.16 → draftwright-0.4.18}/skills/SKILL.md +0 -0
  403. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_build_profile.py +0 -0
  404. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_pmi_part21.py +0 -0
  405. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotate.py +0 -0
  406. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/gears.py +0 -0
  407. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/evaluation/__init__.py +0 -0
  408. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  409. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  410. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  411. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  412. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/__init__.py +0 -0
  413. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/_registry.py +0 -0
  414. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/gear_coverage.py +0 -0
  415. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  416. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/py.typed +0 -0
  417. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/recognition/__init__.py +0 -0
  418. {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/score.py +0 -0
  419. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  420. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  421. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/blind-hole.step +0 -0
  422. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  423. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/plain-block.step +0 -0
  424. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/topology-a.step +0 -0
  425. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/topology-b.step +0 -0
  426. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  427. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  428. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/grm04_drive_plate.step +0 -0
  429. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  430. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  431. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  432. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/issue_915_case_study_2.step +0 -0
  433. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  434. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  435. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  436. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  437. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  438. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  439. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  440. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  441. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  442. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  443. {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  444. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/bracket_section.json +0 -0
  445. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/centered_rebate.json +0 -0
  446. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/chamfered.json +0 -0
  447. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/filleted.json +0 -0
  448. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/flange_dense.json +0 -0
  449. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/grid_plate.json +0 -0
  450. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/grooved_shaft.json +0 -0
  451. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/hex_bar.json +0 -0
  452. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/holed_slot.json +0 -0
  453. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/pocketed.json +0 -0
  454. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/prismatic_ladder.json +0 -0
  455. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/scattered_plate.json +0 -0
  456. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/side_drilled.json +0 -0
  457. {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/turned_stepped.json +0 -0
  458. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_agents_guide.py +0 -0
  459. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_api_docs.py +0 -0
  460. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_balloon_ring_standoff.py +0 -0
  461. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_build_profile_harness.py +0 -0
  462. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_dimension_role_vocabulary.py +0 -0
  463. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_e2e_standards.py +0 -0
  464. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_export_dxf_curves.py +0 -0
  465. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_export_dxf_zoom.py +0 -0
  466. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_export_reproducible.py +0 -0
  467. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_fillets_adjacency.py +0 -0
  468. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_flat_stock_opposition.py +0 -0
  469. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_geometry_graph_spike.py +0 -0
  470. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_iso_nts_caption_placement.py +0 -0
  471. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1000_envelope_reuse.py +0 -0
  472. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  473. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1086_declared_gears.py +0 -0
  474. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  475. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  476. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  477. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  478. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  479. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  480. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1188_per_view_assignment.py +0 -0
  481. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1190_section_decision.py +0 -0
  482. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  483. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  484. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  485. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  486. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  487. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  488. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1281_turned_fillets.py +0 -0
  489. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  490. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
  491. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1299_page_escalation.py +0 -0
  492. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1312_engine_costs.py +0 -0
  493. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1332_zone_labels.py +0 -0
  494. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1334_prevent_ink.py +0 -0
  495. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  496. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
  497. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1349_precision_display.py +0 -0
  498. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1350_detected_takeover.py +0 -0
  499. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  500. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  501. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1360_thread_depth.py +0 -0
  502. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_367_leader_ink.py +0 -0
  503. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  504. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_563_placement_intent.py +0 -0
  505. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  506. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_798_floor_cardinality.py +0 -0
  507. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_798_material_field.py +0 -0
  508. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_909_sloped_profile.py +0 -0
  509. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_916_pocket_leader.py +0 -0
  510. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_917_open_channel.py +0 -0
  511. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  512. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_955_height_contingency.py +0 -0
  513. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_leader_footprint.py +0 -0
  514. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_lint_box_cache.py +0 -0
  515. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_lint_reconciliation.py +0 -0
  516. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_note_verb.py +0 -0
  517. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_occupancy_boxes.py +0 -0
  518. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pmi_datum_lowering.py +0 -0
  519. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pmi_gtol_lowering.py +0 -0
  520. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pmi_part21.py +0 -0
  521. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pocket_pattern.py +0 -0
  522. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_principal_profile_classifier.py +0 -0
  523. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_recogniser_adoption.py +0 -0
  524. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_recognition.py +0 -0
  525. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_score.py +0 -0
  526. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_script_detail_parity.py +0 -0
  527. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_shared_box_memo.py +0 -0
  528. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_slot_completeness.py +0 -0
  529. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_slot_pattern.py +0 -0
  530. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_solve_trace.py +0 -0
  531. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_step_analysis_evaluation.py +0 -0
  532. {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_witness_label_reconciliation.py +0 -0
@@ -4,6 +4,123 @@
4
4
 
5
5
  ### Added
6
6
 
7
+ - Report schema v1 now projects one recognition-owned physical requirement ledger shared with
8
+ completeness. Each bounded requirement identifies its accepted source occurrence(s), final IR
9
+ owner(s), semantic parameter where applicable, placement/satisfaction state, annotation names,
10
+ and representation rationale. The roster is evaluated once per report and fails closed when
11
+ exact same-run evidence or provenance is absent; it does not create a second recognition scan,
12
+ persistent topology identity, inferred manufacturing intent, or visual change (#1438, ADR 0017
13
+ Amendment 26).
14
+
15
+ - Direct CLI rendering now writes `<output>.draftwright.json` by default, after successful visual
16
+ export, and prints its path with the requested artefacts. `--no-report` is the explicit opt-out;
17
+ library `Drawing.export()` remains free of report-writing side effects (#1438, ADR 0017
18
+ Amendment 25).
19
+
20
+ - Generated Sheet Python now embeds a deterministic, versioned, JSON-compatible snapshot of
21
+ actionable accepted-occurrence gaps from the exact recognition run that produced its model.
22
+ The compact snapshot carries only unsupported, deferred, evidence-only, and unexpectedly
23
+ missing public records; STEP inputs are read once and recognition uses a private copy of the
24
+ exact bytes named by the embedded basename and SHA-256, with a best-effort final replay-target
25
+ check before writing. The hash is a later reconciliation boundary, not a lock on the mutable
26
+ source path. It is explicitly generation-time evidence, never current completeness authority
27
+ (#1438, ADR 0017 Amendment 24).
28
+
29
+ - Accepted Plate occurrences now retain exact conditional ownership. Genuine multi-axis plates
30
+ keep their direct `PlateFeature`; other slabs are absorbed only when released same-run AAG
31
+ evidence joins them to the exact retained face-level, riser-shoulder, or slot-pattern owner.
32
+ Multi-owner claims are conjunctive, while whole-envelope, polygonal-boss, disconnected,
33
+ ambiguous, or malformed cases remain visibly `unexpectedly_missing` rather than borrowing an
34
+ owner from matching values or traversal order (#1438, ADR 0017 Amendment 23).
35
+
36
+ - `Drawing.write_report(path)` now atomically writes the versioned report as deterministic,
37
+ strict UTF-8 JSON without coupling library export to sidecar generation. Report and filesystem
38
+ failures leave any existing destination untouched, with best-effort temporary cleanup that does
39
+ not mask the primary error (#1438, ADR 0017 Amendment 22).
40
+
41
+ - Raw automatic drawings now expose `Drawing.report()`, a strict version-1 JSON-compatible
42
+ projection of every accepted recognition occurrence, its explicit consumer disposition and
43
+ report-local final IR owner(s), plus the existing lint summary. The published schema never
44
+ serializes provider references, topology IDs, object addresses, or transient member positions;
45
+ it makes requirement coverage an explicit field (subsequently populated by Amendment 26) and
46
+ calls a clean result `bounded-clear`, not manufacturing-ready. Paths without exact occurrence
47
+ ownership and raw paths with an unclassified accepted occurrence fail explicitly rather than
48
+ emit an empty or inferred report. Rendering remains unchanged (#1438, ADR 0017 Amendment 21).
49
+
50
+ - Accepted `FaceLevel` and `RiserEvidence` occurrences now receive explicit `evidence_only`
51
+ outcomes. The released records remain shared substrate for the supported correlated height
52
+ ladder and shoulder projection, not independent inferred features or drawing requirements; no
53
+ IR, Sheet DSL, renderer, or recogniser API change is introduced (#1438, ADR 0017 Amendment 20).
54
+
55
+ - Accepted round-boss occurrences now retain the exact existing consumer outcome: a singleton
56
+ `BossFeature`, one diameter-consolidated representative with transient member lineage, the exact
57
+ turned-step owner, or the exact groove owner reached through that step or the profile-gate
58
+ fallback. Ambiguous or missing correspondence fails closed without another scan, persistent ID,
59
+ generated artefact, or visual change (#1438, ADR 0017 Amendment 19).
60
+
61
+ - Accepted through-step occurrences now retain either their exact `ThroughStepFeature` or every
62
+ exact final `StepLevelFeature`, `PlateFeature`, and `EnvelopeFeature` that jointly carries the
63
+ established compatibility projection. Plate claims are body-local, replacement is atomic, and a
64
+ missing or ambiguous selected owner fails closed rather than granting partial credit. One
65
+ occurrence can name multiple run-local IR owners without a second scan, persistent ID, generated
66
+ artefact, or change to rendering machinery (#1438, ADR 0017 Amendment 18).
67
+
68
+ - Accepted turned-step occurrences now retain the conversion decision that already gives an
69
+ ordinary profile band its exact `StepFeature` or absorbs a groove-floor band into the exact
70
+ same-run `GrooveFeature`. The takeover must be one-to-one in both directions, so an ambiguous
71
+ groove, an adjacent band inside its positional tolerance, or any missing final owner fails closed
72
+ as `unexpectedly_missing`, with no second scan, persistent ID, generated artefact, or visual
73
+ change (#1438, ADR 0017 Amendment 17).
74
+
75
+ - Accepted channel occurrences now receive an exact conditional consumer outcome. A genuine
76
+ multi-axis plate channel is `represented` by its `ChannelFeature`; a monolithic Z-depth rebate is
77
+ `absorbed` only when one retained body-local support carries its floor and both shoulders into the
78
+ final step ladder. Cross-axis, disconnected, or filtered channels fail closed as
79
+ `unexpectedly_missing` instead of inheriting an unrelated ladder, without a second scan,
80
+ persistent ID, generated artefact, or visual change (#1438, ADR 0017 Amendment 16).
81
+
82
+ - Accepted countersink occurrences now receive an exact run-local outcome. A seat carried by a
83
+ `HoleRecord` is `absorbed` by that hole's final feature and transient member lineage; an unattached,
84
+ unowned, or duplicate nested occurrence fails closed without dimension matching, topology IDs, a
85
+ second scan, duplicate IR requirements, or visual changes (#1438, ADR 0017 Amendment 15).
86
+
87
+ - Accepted angled-step, passage, prismatic-pocket, oriented-slot, and repeating-radial-profile
88
+ occurrences now receive exact run-local ownerless outcomes from Draftwright's existing consumer
89
+ capability declaration: `unsupported`, `deferred`, or report-facing `evidence_only`, with closed
90
+ reason codes and existing tracking issues. Equal-valued occurrences stay distinct; policy does
91
+ not invent IR owners, requirements, topology IDs, recognition scans, generated artefacts, or
92
+ visual output (#1438, ADR 0017 Amendment 14).
93
+
94
+ - Accepted physical hole, slot, and pocket occurrences now retain explicit run-local ownership
95
+ when conversion represents a singleton or absorbs members into one same-spec hole group or
96
+ derived pattern feature. Family-specific reason codes and transient member lineage follow
97
+ member-specific AP242 splits to the exact final IR objects; missing lineage fails closed rather
98
+ than retaining a stale owner. Provider-derived patterns do not become invented occurrences, and
99
+ no report ID, extra recognition scan, generated artefact, or visual output is introduced (#1438,
100
+ ADR 0017 Amendment 13).
101
+
102
+ - Raw automatic builds now capture run-local, conversion-time ownership from accepted provider
103
+ occurrences to their exact Draftwright IR features for unconditional one-to-one adapters. Equal
104
+ record values, order, coordinates and topology indices cannot create a binding; an omitted direct
105
+ binding fails closed as unexpectedly missing, while ownership rules not yet implemented remain
106
+ explicitly unclassified. The experimental read-only `Drawing.recognition_ownership()` exposes
107
+ the non-serializable ledger; it stays outside the IR/compiler and changes no generated or visual
108
+ artefact (#1438, ADR 0017 Amendment 12).
109
+
110
+ - Raw automatic recognition now retains the provider's run-scoped `RecognitionEvidence` beside
111
+ its exact `RecognitionResult`, exposed through the experimental read-only
112
+ `Drawing.recognition_evidence()`. Declared drawings acquire the pair lazily on first physical
113
+ critique; bare and framed results remain evidence-less, and Draftwright never rescans merely to
114
+ backfill evidence. This is a non-visual reporting foundation and changes no rendered artefact
115
+ (#1438, ADRs 0015, 0017, 0020).
116
+
117
+ - Automatic drawings can opt into the provider-owned local recognition frame with
118
+ `framed_recognition=True`. The returned drawing exposes caller provenance, the exact downstream
119
+ working solid, frame, and a copied framed/raw/refusal decision. PMI correlation, off-axis pattern
120
+ placement, compilation, projection and physical lint remain in one coordinate system; typed frame
121
+ refusal performs one visible top-level raw fallback. Raw remains the rollout default (#1357,
122
+ ADR 0020).
123
+
7
124
  - Referential and measured Sheet dimensions accept optional `view=` / `side=` placement
8
125
  intent. Supported pairs survive IR/compiler and generated-script round trips, constrain
9
126
  ordinary corridor candidates without exposing page coordinates, and fail clearly when a
@@ -37,11 +154,287 @@
37
154
 
38
155
  ### Changed
39
156
 
157
+ - Accepted schema-v3 straight or circular `Blend` chains, including concave occurrences, now cross
158
+ a dedicated end-to-end consumer path:
159
+ `BlendFeature`, explicit `Sheet.blend(...)`, executable generated declarations, one
160
+ compiler-approved `blend.radius` requirement, and a solver-owned grouped `n× R` leader. The
161
+ discriminated path kind, full canonical direction/normal, circular-path major radius,
162
+ rolling-ball radius, and material side remain in IR instead of being coerced to legacy Fillet
163
+ semantics; the provider aggregate remains the sole exact Fillet/Blend precedence authority.
164
+ Exact public-record/IR validation and completeness follow every accepted occurrence to placed,
165
+ structured-note, authored-suppressed, dropped, missing, or unverifiable outcomes. Raw and
166
+ provider-framed arbitrary rigid motions retain straight-path radius meaning; framed recognition
167
+ also retains circular paths, while raw arbitrarily rotated circular recognition remains an
168
+ upstream limitation (b123d-recognisers#491) (#1433; ADRs 0011, 0013–0017, 0020).
169
+
170
+ - Draftwright now exactly pins the immutable `b123d-recognisers` 0.4.14 release and advances its
171
+ fail-closed capability and inspection joins. `Blend` schema v3 replaces the old flat cylindrical
172
+ fields with exact `StraightBlendPath` and `CircularBlendPath` records and admits proved concave
173
+ and toroidal occurrences; Draftwright preserves those semantics through IR, `Sheet.blend(...)`,
174
+ generated replay, reporting, drawing, and completeness. Passage nested records advance to schema
175
+ v2 without changing Draftwright's unsupported passage policy. The provider's previously
176
+ recognised shallow nonzero `PairedRampStep` keeps its existing
177
+ two-requirement IR, public `Sheet.paired_ramp_step(...)` declaration, generated-code, compiler
178
+ callout, solver placement, and completeness meaning (#1430; ADRs 0011, 0013–0017, 0020).
179
+
180
+ - Rectangular blind slots recognised by `b123d-recognisers` 0.4.10 now cross a dedicated
181
+ Draftwright semantic path: `RectangularBlindSlotFeature`, the explicit
182
+ `Sheet.rectangular_blind_slot(...)` word, generated-code and role-specific tolerance round
183
+ trips, compiler-approved width/capped-run/depth measurements, and one solver-owned
184
+ `OPEN SLOT … DEEP` leader. Authored subsets retain every approved value with explicit
185
+ `WIDE`/`LONG`/`DEEP` roles, and leaders target proved cap/side material rather than the open
186
+ mouth. Native raw and rigidly moved framed builds retain the same three
187
+ measurement outcomes. A seven-case independently authored corpus now pins all six run/open-side
188
+ orientations plus an independently sized specimen: each occurrence contributes separate width,
189
+ capped-run and depth requirements followed by exact structural correspondence and measurement
190
+ provenance to placed, structured-note, suppressed, dropped, missing or unverifiable outcomes.
191
+ Removing recognition cannot shrink that 21-requirement benchmark (#1421; ADRs 0011,
192
+ 0013–0017, 0020).
193
+
194
+ - Round-bottom blind slots recognised by `b123d-recognisers` 0.4.10 now have their own complete
195
+ Draftwright path rather than borrowing through-slot, pocket or rectangular-blind-slot grammar.
196
+ `RoundBottomBlindSlotFeature` retains the released run/opening topology and exposes the three
197
+ independent manufacturing requirements: capped run length, straight bottom-flat width and equal
198
+ side radius. `Sheet.round_bottom_blind_slot(...)`, generated code, role-specific tolerances and
199
+ one solver-owned `ROUND-BOTTOM OPEN SLOT …` leader all preserve those exact identities; derived
200
+ total width and depth are not double-counted. A seven-case independently authored corpus covers
201
+ all six signed principal orientations plus a separately sized specimen (21 physical requirements),
202
+ proves raw/framed drawing parity, and follows exact source-to-IR correspondence to placed,
203
+ structured-note, suppressed, dropped, missing or unverifiable outcomes without labels, views or
204
+ page coordinates. The released 0.4.10 API is sufficient; no recogniser change is required (#1421;
205
+ ADRs 0011, 0013–0017, 0020).
206
+
207
+ - Turned-step completeness is now backed by an independently authored, hash-pinned 11-case STEP
208
+ corpus with 26 physical outside-diameter bands, 52 parameter checks and 104 downstream checks.
209
+ Axis line and station preserve body-local occurrence identity across automatic IR, the existing
210
+ public `Sheet.step(...)` DSL word, executed-and-built generated code, and exact compiler-confirmed
211
+ length and OD drawing evidence. Grouped equal-length chains retain every adjacent member identity
212
+ and their exact compiler-approved multiplier and value; native and global OD labels are checked
213
+ in full. Generated declarations preserve the half-thousandth midpoint of odd-thousandth spans,
214
+ complete body-local profile ownership is compared at its full published precision, and malformed
215
+ or surplus records fail closed—including coercible or non-finite groove evidence that controls
216
+ band ownership. The root turned-step and groove inventories must remain immutable tuples; a
217
+ mutable or one-shot substitute is snapshotted once only to preserve its observable requirement
218
+ denominator, then remains unverifiable; a non-iterable substitute retains one explicit aggregate
219
+ contract outcome rather than masquerading as an empty family. A profile OD may
220
+ satisfy one uniquely identifiable equivalent largest-band diameter
221
+ without multiplying across disjoint bodies; and uniquely groove-owned narrow
222
+ bands are excluded once by a shared fail-closed Groove schema and ownership rule used by lowering,
223
+ lint and the evidence ledger. That join accounts for the provider's 0.001 mm Groove coordinate
224
+ quantum against its eight-decimal profile axis without widening either published identity
225
+ (#1374; ADRs 0010, 0011, 0013, 0015, 0017, 0020).
226
+
227
+ - Framed recognition now carries all three 0.4.6 step families through their complete existing
228
+ consumer paths. `CircularBlindStep`, `PairedRampStep` and `ThroughStep` retain the same
229
+ manufacturing requirements from raw recognition through their public `Sheet` words, generated
230
+ code, compiler-owned drawing ink and lint; the provider-owned local records and Draftwright IR
231
+ remain invariant under a combined non-principal rotation and translation. Circular-step
232
+ validation now derives its bound from each independently published endpoint, centre, radius and
233
+ depth value's six-significant-figure decimal cell, while outside-cell geometric inconsistencies
234
+ still fail closed (#1382; ADRs 0011, 0013, 0015, 0017, 0018, 0020).
235
+
236
+ - Countersink completeness is now backed by an independently authored, hash-pinned seven-case STEP
237
+ corpus covering functional seats, solid external-cone and deburr negatives, grouped equal seats,
238
+ and reverse-serialized topology. Detection identity and all four provider measurements are scored
239
+ separately from the two actual drawing requirements. Exact aggregate object ownership follows
240
+ each seat once, validates the provider-selected hole semantically, and fails closed on swapped,
241
+ duplicated, or canonically colliding owners. It then crosses automatic IR, public `Sheet.hole`,
242
+ generated code, and role-specific confirmed placed diameter/angle ink without recounting the parent bore. The known second seat of a two-sided bore
243
+ remains explicitly unverifiable rather than hidden or heuristically attached (#1370; ADRs 0010,
244
+ 0013, 0015, 0017).
245
+
246
+ - Double-D completeness is now backed by an independently authored, hash-pinned 11-case STEP
247
+ corpus with ten physical profile facts, 50 provider-parameter checks and 40 downstream checks.
248
+ Full-frame identity preserves disconnected coaxial bodies; exact multiplicity crosses automatic
249
+ IR, public `Sheet.double_d_bore`, generated code and role-specific compiler-confirmed
250
+ `⌀major THRU DOUBLE-D across A/F` ink. Round, blind, opposed-blind, malformed, duplicated and
251
+ foreign-owner mutations fail closed, while the provider's exclusive aggregate ownership keeps
252
+ each profile from being recounted as an ordinary hole (#1370; ADRs 0010, 0011, 0013, 0015,
253
+ 0017).
254
+ - Updated the immutable `b123d-recognisers` pin and fail-closed inspection/capability joins to
255
+ 0.4.10. All 28 previously consumed family schemas remain unchanged. The two new blind-slot
256
+ families were adopted fail-closed under #1421 and remain visible as unscored recognised
257
+ inventories until each gains independent completeness evidence; Draftwright does not coerce
258
+ their depth, terminal/open-end, or round-floor evidence into its ordinary through-slot grammar.
259
+ The provider's additive evidence API is not consumed by
260
+ this bounded adoption slice. Recognition output does change under the unchanged schemas: the
261
+ release closes slot-depth, subdivided paired-ramp/AngledStep, and noisy stubby-pocket gaps; fixes
262
+ Double-D/Hole ownership, external-cone countersink false positives, Plate tie covariance, and
263
+ turned-step translation covariance; and can move an edge-open rectangular recess from `Pocket`
264
+ to the dedicated blind-slot inventory. Draftwright regression tests pin the consumer-visible
265
+ ownership changes while the provider release suite owns its private predicates
266
+ ([provider release](https://github.com/pzfreo/b123d-recognisers/releases/tag/v0.4.10); ADRs 0013,
267
+ 0015, 0017, 0020).
268
+
269
+ - Principal-profile lint now correlates its independent extremal-face evidence with the cached
270
+ public `DoubleDBore` aggregate instead of importing provider-private profile helpers. Exact
271
+ axis/span, end-plane, centre, radius, A/F, chord, arc, and flat-direction checks fail closed;
272
+ occurrence mouths are consumed with matching multiplicity, and malformed records cannot earn
273
+ coverage. The exported low-level check now requires the aggregate projection explicitly so an
274
+ omitted inventory fails loudly; lint still owns its physical denominator and never reruns
275
+ recognition (#1411, ADRs 0013, 0015, 0017).
276
+
277
+ - Whole polygonal-stock completeness is now backed by an independently authored, hash-pinned
278
+ 13-case STEP corpus covering all principal axes, in-plane rotation, translation, topology
279
+ order and circular/rectangular/irregular/octagonal/attached/recessed/compound negatives. The
280
+ provider's exact six-side stock boundary, A/F, axial length and coupled physical flat supports
281
+ are scored separately from four downstream boundaries. A fail-closed two-requirement ledger
282
+ follows A/F and stock length through automatic IR, public `Sheet.polygonal_stock`, generated
283
+ code and solver-placed semantic ink; malformed or duplicate correspondence cannot borrow
284
+ credit from another support ring (#1371).
285
+
286
+ - Multi-plate slab completeness is now backed by an independently authored, hash-pinned 11-case
287
+ STEP corpus covering all principal orientations, additive/cut channels, equal compound
288
+ occurrences, topology order and envelope/detached/thick/rotational negatives. A fail-closed
289
+ one-requirement ledger follows each body-local `thickness.length` through automatic IR, public
290
+ `Sheet.plate`, generated code and solver-placed Dimension provenance; the compiler-derived
291
+ opposite U-channel wall is represented explicitly without inventing duplicate ink. The corpus
292
+ owns 20 physical occurrences and cannot shrink when provider output is weakened or removed.
293
+ Exact step-level, slot-pattern, polygonal-boss and envelope ownership prevents derived material
294
+ spans from becoming duplicate Plate requirements while failing closed when that ownership cannot
295
+ be established (#1373).
296
+
297
+ - Polygonal-boss completeness is now backed by an independently authored, hash-pinned STEP
298
+ corpus covering all three principal axes, in-plane rotation, equal compound occurrences,
299
+ topology order, and recess/detached/stock/other-protrusion negatives. Detection, the provider's
300
+ six-side schema invariant, across-flats, height, physical flat supports, and four downstream
301
+ boundaries are observed; a
302
+ two-requirement fail-closed ledger follows across-flats and boss height through the existing
303
+ IR/compiler/shared-solve path. The corpus owns the independent evaluation denominator; runtime
304
+ drawing lint remains explicitly denominated by the recognition inventory (#1372).
305
+
306
+ - Updated the immutable `b123d-recognisers` pin and fail-closed manifest joins to 0.4.9. The
307
+ provider's body-local FaceLevel, RiserEvidence, and TurnedProfile schemas now cross an owned
308
+ prepared-frame boundary that normalizes, reuses one cylinder substrate, classifies locally,
309
+ and preserves the exact working solid/result pair. Every frame gauge and typed refusal has an
310
+ explicit conservative policy; refusal never hides a raw retry. Multiple physical turned
311
+ profiles fail explicitly where a singular adapter is required, while the unchanged raw
312
+ production route preserves its historical no-global-profile compound behavior with a visible
313
+ #1357 deferral. Production drawing remains on the explicit raw boundary until rigid-motion,
314
+ PMI, platform, and canary activation evidence is complete (ADR 0020, #1357).
315
+
316
+ - Updated the immutable `b123d-recognisers` pin and lock to 0.4.8. Draftwright now names
317
+ its existing caller/world-coordinate aggregate boundary explicitly with
318
+ `build_raw_recognition_result`; framed recognition remains disabled until #1357's
319
+ frame-to-IR adapter is reviewed end to end. Installed-wheel tests exercise the public
320
+ framed fixes for rectangular pads, polygonal bosses, and nested multi-body plates without
321
+ making that API the production path (#1392).
322
+
323
+ - Rectangular pads now consume `RaisedPad` schema v2 without assuming +Z. The IR, public
324
+ `Sheet.pad`, generated code, compiler, semantic-view planner, shared placement solve, and
325
+ lint correspondence preserve the exact footprint, terminal-to-attachment height, two
326
+ in-plane locations, axis, direction, and world bounds for all six signed principal
327
+ orientations. Every height uses one solver-placed `… HIGH` leader with stable measurement
328
+ identity; side-normal pad footprints no longer leak into the unrelated Z-level grammar
329
+ (#1392).
330
+
331
+ - Rectangular-pad completeness is now independently evidenced by a hash-pinned 12-case STEP
332
+ corpus covering all six signed principal orientations, equal compound occurrences, topology
333
+ order, and ledge/staircase/detached-body negatives. Detection, width/length/height fidelity,
334
+ and four downstream boundaries are scored separately; a five-requirement fail-closed ledger
335
+ follows both footprint sizes, height and directional location evidence through the shared
336
+ compiler and placement solve (#1372).
337
+
338
+ - Circular blind steps recognised by `b123d-recognisers` now have a complete consumer path.
339
+ The oriented terminal-to-open centreline and transverse quarter-arc lower without rescanning
340
+ to an explicit-only IR/Sheet feature; generated code preserves the full correspondence.
341
+ Radius and stopped depth remain independently addressable and tolerance-aware while sharing
342
+ one solver-placed end-view `R… × … DEEP` leader, and a fail-closed two-requirement ledger
343
+ follows each outcome without parsing labels or guessing by order (#1382).
344
+
345
+ - Paired-ramp steps recognised by `b123d-recognisers` now have one complete consumer path:
346
+ exact IR conversion, explicit `Sheet.paired_ramp_step(...)` declaration, generated-code
347
+ round trip, end-view solver-placed `2× angle × run RUN` leader, independent angle/run
348
+ tolerances and authored suppression, and a two-requirement fail-closed completeness ledger
349
+ (#1382).
350
+
351
+ - Rectangular through steps recognised by `b123d-recognisers` now lower without rescanning to
352
+ an explicit-only IR/Sheet feature. Automatic and explicit lowering support every principal
353
+ axis; an X/Y occurrence stays with the established face-level and shoulder/plate grammar only
354
+ when that grammar proves both exact leg intervals, avoiding both silent loss and duplicate
355
+ dimensions. The two
356
+ orthogonal open-section legs are independently addressable, tolerance-aware, solver-placed in
357
+ the end view, preserved by generated code and scored by a fail-closed two-requirement
358
+ completeness ledger. The through extent stays owned by the envelope (#1382).
359
+
360
+ - Hole completeness is now supported by a versioned, independently authored STEP corpus rather
361
+ than a Draftwright-derived census. Detection, parameter fidelity and downstream usefulness stay
362
+ separate, while the IR adapter, public Sheet declaration, executed generated code and placed
363
+ drawing are each observed through their real seam. Mutations prove that a missing provider hole
364
+ or a broken downstream boundary lowers the relevant evidence even when internal state remains
365
+ self-consistent (#1369).
366
+ - Hole-pattern completeness is now supported by a separate independently authored STEP
367
+ arrangement corpus covering grids, bolt circles, linear arrays, false-positive controls,
368
+ compound cases and topology-order variants. It scores one grouping fact per pattern while the
369
+ hole corpus remains the sole owner of member diameter/depth/location requirements, and follows
370
+ each group through the IR, public Sheet declaration, generated code and placed pattern
371
+ dimensions (#1370).
372
+ - Flat completeness is now supported by an independently authored STEP corpus covering lone,
373
+ opposed, slanted, parallel and coaxial stock plus negative and topology-order controls. It
374
+ counts one physical across-flats requirement per stock line and span, then observes automatic
375
+ IR, public `Sheet.flat`, executed generated code and placed measurement provenance independently
376
+ (#1371).
377
+ - Lone-pocket completeness is now supported by an independently authored STEP corpus covering
378
+ off-centre, edge-anchored, equal, opposed-opening, side-opening, compound, ownership-negative
379
+ and topology-order cases. Provider `open_sign` now survives the IR, declaration and generated
380
+ code boundaries; pocket sizes and both physical location ordinates are followed through exact
381
+ semantic placement evidence without counting pocket-pattern members twice (#1372).
382
+ - Pocket-pattern completeness is now supported by a separate independently authored STEP corpus
383
+ covering axis-aligned and 30° linear/grid arrangements, threshold and unequal-spacing
384
+ negatives, a compound underside pattern and reverse-serialized topology variants. One grouped
385
+ count/size/lattice/location requirement reaches automatic IR, public `Sheet.pocket_pattern`,
386
+ generated code and exact placed ink—including approved pitch tolerances—without recounting its
387
+ member pockets. Diagonal pocket-pattern dimensions use exact label-ink clearance instead of a
388
+ false-blocking hull; generated code preserves the member opening side and grouped callouts
389
+ retain structured count provenance (#1372).
390
+ - Groove completeness is now supported by an independently authored STEP corpus covering a
391
+ monotonic-step negative, all principal axes, a narrow circlip ownership contest, equal grooves
392
+ on separate bodies and reversed Boolean order. Each physical groove's width and floor diameter
393
+ pass independently through automatic IR, public `Sheet.groove`, executed generated code and
394
+ one exact compiler-backed `WIDE × ø` callout; mutations prove that recognition, identity,
395
+ parameters, provenance and printed syntax cannot disappear without lowering evidence (#1372).
396
+ - Chamfer completeness is now supported by an independently authored STEP corpus covering all
397
+ principal axes, equal and asymmetric planar bevels, conical turned treatments, equal features
398
+ on separate bodies, topology-order variants, a plain negative and the AngledStep ownership
399
+ boundary. Each physical bevel is followed through exact IR, public `Sheet.chamfer`, executed
400
+ generated code, compiler measurement provenance, callout syntax and its physical leader target;
401
+ equal requirements may share ink without collapsing occurrence identity (#1374).
402
+ - Fillet completeness is now supported by an independently authored STEP corpus covering all
403
+ principal axes, repeated equal rounds, turned toroidal treatments, separate bodies,
404
+ topology-order variants, a plain negative and the CircularBlindStep ownership boundary. Each
405
+ physical round is followed through exact IR, public `Sheet.fillet`, executed generated code,
406
+ compiler measurement provenance, `R`/`n× R` syntax and its physical leader target; grouped ink
407
+ retains every rounded edge's measurement identity (#1374).
408
+
409
+ - Recognised angled blind steps now fail visibly instead of remaining an undecided inventory.
410
+ Each aggregate-reconciled `AngledStep` produces an actionable warning and one `unsupported`
411
+ completeness outcome. A frozen STEP corpus fixture pins the AngledStep/Chamfer ownership
412
+ boundary, while Draftwright deliberately invents no angle/run, IR, Sheet, generated-code,
413
+ section/detail, or annotation semantics (#1247).
414
+
415
+ - Aggregate-reconciled `PrismaticPocket` occurrences now fail visibly instead of
416
+ remaining an unscored inventory. Each produces an actionable warning and one `unsupported`
417
+ completeness outcome, without repeating the provider's cross-family reconciliation or
418
+ inventing width/length, across-flats, IR, Sheet, generated-code, or annotation semantics (#1246).
419
+
420
+ - Recognised prismatic passages now fail visibly instead of disappearing into an unscored
421
+ inventory. Each authoritative `SectionPassage` produces an actionable warning and an
422
+ `unsupported` completeness outcome; the legacy `Passage` compatibility projection is never
423
+ double-counted. Draftwright retains the family-level unsupported disposition rather than
424
+ claiming a regular-polygon callout represents the provider's complete line/arc schema (#1245).
425
+
40
426
  - Declared Double-D bore, countersink, chamfer, fillet, and groove geometry reads now use the
41
- stable `b123d_recognisers.inspection` namespace from the exact 0.4.5 wheel. A separate
427
+ stable `b123d_recognisers.inspection` namespace from the exact 0.4.6 wheel. A separate
42
428
  Draftwright-owned format-1 contract fails closed on changes to the consumed signatures, result
43
429
  schemas, units, bevel rejection reasons, or cylindrical surface layout (#1362).
44
430
 
431
+ - Updated the exact `b123d-recognisers` production lock to 0.4.6. At adoption time, circular
432
+ blind, paired ramp, and through-step inventories were carried from the one aggregate and
433
+ surfaced as unscored completeness evidence pending the #1382 semantic slices now recorded
434
+ above. Rectangular-grid pitch placement also uses a
435
+ deterministic outer witness line across plan, front, and side views despite the release's
436
+ coordinate-rounding differences.
437
+
45
438
  - `annotation_overlap` now reports the whole defect when the same pair also draws
46
439
  line-work through one of the two labels: the message names the crosser, the label
47
440
  crossed and the millimetres, and replaces the "use `label_offset_x`" remedy, which
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.4.16
3
+ Version: 0.4.18
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
@@ -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.4.5
687
+ Requires-Dist: b123d-recognisers==0.4.14
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)**
@@ -736,13 +740,14 @@ Point it at a STEP file — that's the whole workflow:
736
740
 
737
741
  ```
738
742
  draftwright my_part.step --title "Mounting Plate" --number DWG-001
739
- # writes my_part.pdf (the default)
743
+ # writes my_part.pdf and my_part.draftwright.json (the defaults)
740
744
  ```
741
745
 
742
746
  Choose formats, scale, and page; or emit an editable drawing script:
743
747
 
744
748
  ```
745
749
  draftwright my_part.step --format pdf,dxf # also: svg, all
750
+ draftwright my_part.step --no-report # opt out of the JSON sidecar
746
751
  draftwright my_part.step --scale 2 --page A3 # override the auto scale / page
747
752
  draftwright my_part.step --scale 1 --page A4 --scale-policy strict
748
753
  draftwright my_part.step --script # write an editable declarative Sheet script
@@ -790,7 +795,7 @@ and removed in 0.5.0 (see [docs/deprecations.md](docs/deprecations.md)).
790
795
  Instead of relying on detection, **reference the build123d objects you built** and declare
791
796
  only the drawing intent — geometry supplies the sizes (⌀ read off the object), you supply
792
797
  tolerances, fits, datums, GD&T, and surface finish. The fluent `Sheet` skips detection and
793
- dimensions exactly what you declare (ADR 0011):
798
+ dimensions exactly what you declare (ADR 4 (was 0011)):
794
799
 
795
800
  ```python
796
801
  from build123d import Box, Cylinder, Pos
@@ -806,7 +811,7 @@ hole = sheet.hole(bore).finish("1.6").note("M3x0.5 TAP") # ⌀8 bore, Ra 1.6, t
806
811
  sheet.control(hole).position(0.1, to="A", diameter=True) # ⌀0.1 position wrt A
807
812
 
808
813
  sheet.authored_dimensions() # THIS is the complete set
809
- sheet.dimension(env, "width.length") # (ADR 0016: a build says where
814
+ sheet.dimension(env, "width.length") # (ADR 4 (was 0016): a build says where
810
815
  sheet.dimension(env, "height.length") # its dimensions come from, and
811
816
  sheet.dimension(hole, "bore.diameter") # omitting one means suppress it)
812
817
 
@@ -853,7 +858,7 @@ draftwright mymodule:thumbwheel --script
853
858
 
854
859
  The emitted values are *detected* off the geometry — honest, and a good starting point. Since
855
860
  you have the objects, swap each numbered line for a reference so the object stays the single
856
- source of truth (ADR 0011 — the size is read off the object, no numbers restated):
861
+ source of truth (ADR 4 (was 0011) — the size is read off the object, no numbers restated):
857
862
 
858
863
  ```python
859
864
  # generated (detected):
@@ -987,7 +992,7 @@ generation, the lint→repair loop, and collect-then-solve placement).
987
992
 
988
993
  ## Architecture
989
994
 
990
- draftwright is structured as a **part-drawing compiler** (ADR 0015): recognised
995
+ draftwright is structured as a **part-drawing compiler** (ADR 1 (was 0015)): recognised
991
996
  or declared features converge on a `PartModel` IR, then planner-fed and
992
997
  sanctioned model-routed render intents feed shared placement, projection, and
993
998
  export. Coverage lint independently compares recognised geometry with the
@@ -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)**
@@ -36,13 +40,14 @@ Point it at a STEP file — that's the whole workflow:
36
40
 
37
41
  ```
38
42
  draftwright my_part.step --title "Mounting Plate" --number DWG-001
39
- # writes my_part.pdf (the default)
43
+ # writes my_part.pdf and my_part.draftwright.json (the defaults)
40
44
  ```
41
45
 
42
46
  Choose formats, scale, and page; or emit an editable drawing script:
43
47
 
44
48
  ```
45
49
  draftwright my_part.step --format pdf,dxf # also: svg, all
50
+ draftwright my_part.step --no-report # opt out of the JSON sidecar
46
51
  draftwright my_part.step --scale 2 --page A3 # override the auto scale / page
47
52
  draftwright my_part.step --scale 1 --page A4 --scale-policy strict
48
53
  draftwright my_part.step --script # write an editable declarative Sheet script
@@ -90,7 +95,7 @@ and removed in 0.5.0 (see [docs/deprecations.md](docs/deprecations.md)).
90
95
  Instead of relying on detection, **reference the build123d objects you built** and declare
91
96
  only the drawing intent — geometry supplies the sizes (⌀ read off the object), you supply
92
97
  tolerances, fits, datums, GD&T, and surface finish. The fluent `Sheet` skips detection and
93
- dimensions exactly what you declare (ADR 0011):
98
+ dimensions exactly what you declare (ADR 4 (was 0011)):
94
99
 
95
100
  ```python
96
101
  from build123d import Box, Cylinder, Pos
@@ -106,7 +111,7 @@ hole = sheet.hole(bore).finish("1.6").note("M3x0.5 TAP") # ⌀8 bore, Ra 1.6, t
106
111
  sheet.control(hole).position(0.1, to="A", diameter=True) # ⌀0.1 position wrt A
107
112
 
108
113
  sheet.authored_dimensions() # THIS is the complete set
109
- sheet.dimension(env, "width.length") # (ADR 0016: a build says where
114
+ sheet.dimension(env, "width.length") # (ADR 4 (was 0016): a build says where
110
115
  sheet.dimension(env, "height.length") # its dimensions come from, and
111
116
  sheet.dimension(hole, "bore.diameter") # omitting one means suppress it)
112
117
 
@@ -153,7 +158,7 @@ draftwright mymodule:thumbwheel --script
153
158
 
154
159
  The emitted values are *detected* off the geometry — honest, and a good starting point. Since
155
160
  you have the objects, swap each numbered line for a reference so the object stays the single
156
- source of truth (ADR 0011 — the size is read off the object, no numbers restated):
161
+ source of truth (ADR 4 (was 0011) — the size is read off the object, no numbers restated):
157
162
 
158
163
  ```python
159
164
  # generated (detected):
@@ -287,7 +292,7 @@ generation, the lint→repair loop, and collect-then-solve placement).
287
292
 
288
293
  ## Architecture
289
294
 
290
- draftwright is structured as a **part-drawing compiler** (ADR 0015): recognised
295
+ draftwright is structured as a **part-drawing compiler** (ADR 1 (was 0015)): recognised
291
296
  or declared features converge on a `PartModel` IR, then planner-fed and
292
297
  sanctioned model-routed render intents feed shared placement, projection, and
293
298
  export. Coverage lint independently compares recognised geometry with the
@@ -0,0 +1,48 @@
1
+ # Architecture decision records
2
+
3
+ Five live records, one per core aspect of Draftwright. Read them before changing anything they
4
+ govern. Each states a decision, then a numbered list of invariants an agent must not violate,
5
+ each naming the test that fails if it is — that list is the reason the document exists.
6
+
7
+ | ADR | Owns | Guard tests (representative) |
8
+ | --- | --- | --- |
9
+ | [1 — The compiler pipeline](0001-compiler-pipeline.md) | One engine, the `PartModel` IR waist, the module DAG, single-owner build state, the compiled plan fed to placement | `test_import_boundaries.py`, `test_drawing_encapsulation.py`, `test_detect_once.py`, `test_compiled_plan_boundary.py` |
10
+ | [2 — Sheet layout and view planning](0002-sheet-layout-and-view-planning.md) | Requirement-driven view planning, compose-then-pack, collect-then-solve placement, Policy B, scale-before-sheet | `test_carve_free_position_callers.py`, `test_layout_cleanliness.py`, `test_issue_1146_scale_completeness.py`, `test_issue_1260_view_constraints.py` |
11
+ | [3 — The recognition boundary](0003-recognition-boundary.md) | External geometry-only recognition, one run per build, the fail-closed provider join, occurrence ownership, the framed boundary | `test_recogniser_capabilities.py`, `test_declared_recognition_gate.py`, `test_detect_registry.py`, `test_issue_1357_framed_boundary.py` |
12
+ | [4 — Declared intent](0004-declared-intent.md) | The IR as public input, authored dimension sets, suppression by omission, the compiled-plan boundary, one declarative script | `test_declare.py`, `test_label_provenance.py`, `test_parameter_id.py`, `test_sheet_identity_invariant.py` |
13
+ | [5 — Trust and honest failure](0005-trust-and-honest-failure.md) | Determinism, lint as an independent judge, provenance, reports that refuse rather than shrink, absences reported | `test_export_reproducible.py`, `test_render_seam.py`, `test_issue_1215_no_approved_tolerance_is_dropped.py`, `test_issue_1438_report_projection.py` |
14
+
15
+ `archive/` holds the twenty records these replaced, frozen, with their filenames and numbers
16
+ unchanged. Each is stamped with the live record that now owns its decision. They are the
17
+ why-trail; nothing in them is a work instruction.
18
+
19
+ ## Rules of engagement
20
+
21
+ These exist because the previous corpus reached 21 files, 8,787 lines and one record with 28
22
+ amendments, and its own "at roughly four amendments, write a successor" rule was a convention
23
+ that nothing enforced. Each rule below is enforced by `tests/test_adr_corpus.py` where a test can
24
+ enforce it.
25
+
26
+ 1. **A record changes only when a boundary or invariant changes.** Adopting a provider version,
27
+ adding a feature family, recording ownership for one more record type, adding a report field:
28
+ that is a PR body, not an amendment. If the change does not alter the Invariants section, it
29
+ does not touch the record.
30
+ 2. **No record text is written without the maintainer's sign-off.** An agent or contributor who
31
+ believes a record needs to change says so in the PR in two sentences and waits. A reviewer
32
+ recommending an ADR is a recommendation, not an authorisation.
33
+ 3. **Each live record is at most 200 lines; the five together at most 1,000.** Enforced.
34
+ 4. **No live document cites an archived record as its authority.** Code, tests and docs cite
35
+ ADR 1–5. A pointer into the archive is written `ADR n (was 00NN …)` so the history stays
36
+ findable while the live number is the one a reader acts on. A bare `ADR 00NN` outside
37
+ `archive/` fails the guard.
38
+ 5. **Every invariant names its guard.** One without a test is listed under *Unguarded* with the
39
+ reason, never mixed into the numbered list. The guard checks that every named test module and
40
+ test function exists. That list is expected to shrink.
41
+ 6. **Cite symbols and test names, never source line numbers.**
42
+
43
+ ## Reading order
44
+
45
+ Pipeline first (1), then whichever aspect the change touches. Layout (2) and declared intent (4)
46
+ each assume the pipeline; recognition (3) and trust (5) each assume the other four's boundaries.
47
+
48
+ The consolidation itself is recorded in `docs/plans/adr-consolidation-plan.md`.