draftwright 0.4.30__tar.gz → 0.4.31__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 (713) hide show
  1. {draftwright-0.4.30 → draftwright-0.4.31}/CHANGELOG.md +89 -0
  2. {draftwright-0.4.30 → draftwright-0.4.31}/PKG-INFO +14 -4
  3. {draftwright-0.4.30 → draftwright-0.4.31}/README.md +12 -2
  4. {draftwright-0.4.30 → draftwright-0.4.31}/docs/reference/recogniser-capabilities.md +25 -4
  5. {draftwright-0.4.30 → draftwright-0.4.31}/docs/reference/sheet.md +127 -0
  6. {draftwright-0.4.30 → draftwright-0.4.31}/pyproject.toml +3 -2
  7. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/__init__.py +3 -0
  8. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/_core.py +57 -20
  9. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/analysis.py +2 -0
  10. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/_common.py +583 -23
  11. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/from_model.py +567 -66
  12. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/holes.py +302 -46
  13. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/leaders.py +502 -93
  14. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/orchestrator.py +7 -0
  15. draftwright-0.4.31/src/draftwright/audit.py +1342 -0
  16. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/builder.py +267 -88
  17. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/cli.py +17 -4
  18. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/drawing.py +92 -18
  19. draftwright-0.4.31/src/draftwright/inspection.py +789 -0
  20. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/inspection_contract.py +2 -1
  21. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/layout.py +56 -10
  22. draftwright-0.4.31/src/draftwright/leader_policy.py +52 -0
  23. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/__init__.py +4 -1
  24. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/evidence.py +68 -14
  25. draftwright-0.4.31/src/draftwright/linting/gusset_rib_coverage.py +182 -0
  26. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/issues.py +5 -0
  27. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/quality.py +79 -20
  28. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/requirements.py +12 -0
  29. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/slot_coverage.py +14 -6
  30. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/structural.py +48 -2
  31. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/model/__init__.py +8 -0
  32. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/model/compiled.py +12 -0
  33. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/model/declare.py +55 -2
  34. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/model/detect.py +106 -1
  35. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/model/ir.py +365 -4
  36. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/model/planner.py +51 -5
  37. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/recogniser_contract.py +16 -0
  38. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/recogniser_schema.py +4 -1
  39. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/recognition_ownership.py +20 -4
  40. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/registry.py +37 -1
  41. draftwright-0.4.31/src/draftwright/replay_assessment.py +348 -0
  42. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/reporting.py +1204 -17
  43. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/sheet.py +388 -6
  44. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/sheet_emit.py +237 -18
  45. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_tier_manifest.py +3 -0
  46. {draftwright-0.4.30 → draftwright-0.4.31}/tests/conftest.py +40 -0
  47. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/flange_dense.json +21 -40
  48. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/grid_plate.json +190 -207
  49. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/scattered_plate.json +302 -311
  50. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_add_dimension.py +8 -0
  51. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_adr0018_view_selection.py +17 -2
  52. draftwright-0.4.31/tests/test_agent_improvement_canary_issue_1716.py +281 -0
  53. draftwright-0.4.31/tests/test_assessment_comparison_issue_1712.py +888 -0
  54. draftwright-0.4.31/tests/test_candidate_evidence_issue_1726.py +191 -0
  55. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_circular_blind_step_semantics.py +3 -1
  56. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_compiled_plan_boundary.py +1 -0
  57. draftwright-0.4.31/tests/test_declaration_identity_issue_1710.py +151 -0
  58. draftwright-0.4.31/tests/test_declaration_report_issue_1710.py +139 -0
  59. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_declare.py +53 -0
  60. draftwright-0.4.31/tests/test_declared_report_issue_1688.py +113 -0
  61. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_detect_once.py +14 -0
  62. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_detect_registry.py +17 -0
  63. draftwright-0.4.31/tests/test_dimension_lane_canary_issue_1757.py +151 -0
  64. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_document_report.py +11 -4
  65. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_e2e_standards.py +21 -6
  66. draftwright-0.4.31/tests/test_equivalent_dimension_presentations_issue_1759.py +102 -0
  67. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_external_recognition_boundary.py +57 -1
  68. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_feature_edit_corridors.py +16 -0
  69. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_feature_edit_replay.py +15 -1
  70. draftwright-0.4.31/tests/test_feature_leader_candidate_regions.py +687 -0
  71. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_groove_completeness_evidence.py +11 -2
  72. draftwright-0.4.31/tests/test_gusset_rib_semantics.py +238 -0
  73. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_hole_annotations.py +17 -13
  74. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_import_boundaries.py +11 -3
  75. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_inspection_contract.py +1 -1
  76. draftwright-0.4.31/tests/test_interior_label_placement.py +268 -0
  77. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1130_view_planning_evidence.py +12 -46
  78. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1143_hole_completeness.py +1 -0
  79. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1146_scale_completeness.py +76 -6
  80. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1155_grm04_sheet_use.py +19 -10
  81. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1166_cross_pass_feature_leaders.py +5 -5
  82. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1176_quality_fidelity.py +32 -0
  83. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1187_unroutable_leaders.py +1 -0
  84. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1202_observed_drawing_consumer.py +1 -1
  85. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1204_multiscale_view_issues.py +1 -0
  86. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +24 -3
  87. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1217_the_facility_is_shared.py +10 -1
  88. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1219_location_claims_its_own_axis.py +27 -6
  89. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1276_turned_leader_targets.py +3 -2
  90. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1298_manufacturing_requirements.py +12 -7
  91. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1299_page_escalation.py +146 -4
  92. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1308_machined_leader_analytics.py +32 -20
  93. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1333_bounded_ink_repair.py +11 -9
  94. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +7 -2
  95. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1351_structured_note_coverage.py +2 -2
  96. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1397_unverifiable_requirement_message.py +1 -1
  97. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1433_blend_semantics.py +2 -0
  98. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1460_step_inspection.py +227 -11
  99. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1536_title_overflow.py +12 -11
  100. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1543_schedule_requirements.py +1 -1
  101. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1563_sheet_pmi_reconciliation.py +2 -2
  102. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1585_title_block_date.py +2 -1
  103. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1593_title_block_keepout.py +37 -4
  104. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1612_frame_sergio_coverage.py +4 -0
  105. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_740_leader_assignment.py +35 -9
  106. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_798_silhouette_lint.py +10 -7
  107. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_885_prismatic_coverage.py +5 -8
  108. draftwright-0.4.31/tests/test_layout_evidence_issue_1711.py +186 -0
  109. draftwright-0.4.31/tests/test_layout_override_lane_issue_1757.py +264 -0
  110. draftwright-0.4.31/tests/test_layout_override_side_issue_1757.py +223 -0
  111. draftwright-0.4.31/tests/test_leader_region_policy.py +160 -0
  112. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_lint_structural.py +4 -0
  113. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_lint_suggestions.py +12 -5
  114. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_parameter_id.py +18 -0
  115. draftwright-0.4.31/tests/test_pareto_loop_canary_issue_1753.py +288 -0
  116. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pattern_ownership.py +1 -1
  117. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pitch_dim_footprint.py +54 -1
  118. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pmi.py +31 -0
  119. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_prismatic_classification.py +4 -5
  120. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_quality_components.py +37 -0
  121. draftwright-0.4.31/tests/test_quiddity_lifecycle_boundary.py +308 -0
  122. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recogniser_capabilities.py +29 -2
  123. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recogniser_contract.py +22 -0
  124. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_refactor_golden.py +7 -0
  125. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_registry.py +16 -2
  126. draftwright-0.4.31/tests/test_replay_assessment_issue_1715.py +517 -0
  127. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_report_projection.py +66 -9
  128. draftwright-0.4.31/tests/test_report_status_reasons_issue_1618.py +155 -0
  129. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_report_writer.py +3 -1
  130. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_requirement_catalog.py +1 -1
  131. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_requirement_catalog_families.py +1 -0
  132. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_emit.py +38 -3
  133. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_gdt.py +5 -5
  134. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_generation_snapshot.py +4 -3
  135. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_identity_invariant.py +61 -11
  136. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_slanted_blind_step.py +5 -5
  137. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_slot_completeness.py +16 -1
  138. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_slot_pattern.py +38 -0
  139. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_slot_recognition.py +45 -0
  140. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_strip_layout.py +38 -0
  141. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_through_step_semantics.py +1 -1
  142. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_tier_manifest.py +12 -0
  143. draftwright-0.4.31/tests/test_title_block_units_format.py +60 -0
  144. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_tolerances.py +27 -0
  145. draftwright-0.4.31/tests/test_typed_remediation_projection_issue_1759.py +214 -0
  146. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_workflows.py +16 -6
  147. draftwright-0.4.30/src/draftwright/audit.py +0 -408
  148. draftwright-0.4.30/src/draftwright/inspection.py +0 -281
  149. {draftwright-0.4.30 → draftwright-0.4.31}/.gitignore +0 -0
  150. {draftwright-0.4.30 → draftwright-0.4.31}/LICENSE +0 -0
  151. {draftwright-0.4.30 → draftwright-0.4.31}/docs/adr/README.md +0 -0
  152. {draftwright-0.4.30 → draftwright-0.4.31}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  153. {draftwright-0.4.30 → draftwright-0.4.31}/skills/SKILL.md +0 -0
  154. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/_build_profile.py +0 -0
  155. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/_geometry.py +0 -0
  156. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/_pmi_part21.py +0 -0
  157. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/_warnings.py +0 -0
  158. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/angular_geometry.py +0 -0
  159. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotate.py +0 -0
  160. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/__init__.py +0 -0
  161. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/angular.py +0 -0
  162. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/balloons.py +0 -0
  163. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/gears.py +0 -0
  164. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/annotations/sections.py +0 -0
  165. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/blend_contract.py +0 -0
  166. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/compose.py +0 -0
  167. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/document.py +0 -0
  168. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/document_evidence.py +0 -0
  169. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/document_input.py +0 -0
  170. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/evaluation/__init__.py +0 -0
  171. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/evaluation/step_analysis.py +0 -0
  172. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/export.py +0 -0
  173. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/feature_identity.py +0 -0
  174. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/fits.py +0 -0
  175. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  176. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  177. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  178. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  179. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/fonts/__init__.py +0 -0
  180. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/intents.py +0 -0
  181. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/_registry.py +0 -0
  182. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/angled_step_coverage.py +0 -0
  183. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/angular.py +0 -0
  184. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/blend_coverage.py +0 -0
  185. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/chamfer_coverage.py +0 -0
  186. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/channel_coverage.py +0 -0
  187. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/circular_blind_step_coverage.py +0 -0
  188. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/coverage.py +0 -0
  189. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/fillet_coverage.py +0 -0
  190. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/flat_coverage.py +0 -0
  191. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/gear_coverage.py +0 -0
  192. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/groove_coverage.py +0 -0
  193. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/hole_coverage.py +0 -0
  194. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/ink_overlap.py +0 -0
  195. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/oriented_slot_coverage.py +0 -0
  196. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/pad_coverage.py +0 -0
  197. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/paired_ramp_step_coverage.py +0 -0
  198. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/passage_coverage.py +0 -0
  199. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/plate_coverage.py +0 -0
  200. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/pmi_coverage.py +0 -0
  201. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/pocket_coverage.py +0 -0
  202. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/pocket_pattern_coverage.py +0 -0
  203. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/polygonal_boss_coverage.py +0 -0
  204. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
  205. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
  206. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  207. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/rectangular_blind_slot_coverage.py +0 -0
  208. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +0 -0
  209. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/schedule_evidence.py +0 -0
  210. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/section_recess_coverage.py +0 -0
  211. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/suggest.py +0 -0
  212. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/through_step_coverage.py +0 -0
  213. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/linting/turned_step_coverage.py +0 -0
  214. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/location_contract.py +0 -0
  215. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/make_drawing.py +0 -0
  216. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/measurement_support.py +0 -0
  217. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/model/callout.py +0 -0
  218. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/model/pmi_lowering.py +0 -0
  219. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/oriented_slot_contract.py +0 -0
  220. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/plate_correspondence.py +0 -0
  221. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/pmi.py +0 -0
  222. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/profile_angles.py +0 -0
  223. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/progress.py +0 -0
  224. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/projection.py +0 -0
  225. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/py.typed +0 -0
  226. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/recogniser_policy.py +0 -0
  227. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/recognition/__init__.py +0 -0
  228. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/recognition_cache.py +0 -0
  229. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/recognition_frame.py +0 -0
  230. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/repair.py +0 -0
  231. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/score.py +0 -0
  232. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/section_recess_contract.py +0 -0
  233. {draftwright-0.4.30 → draftwright-0.4.31}/src/draftwright/view_plan.py +0 -0
  234. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_burden_report.py +0 -0
  235. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_corpus_cover.py +0 -0
  236. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_drawing_helpers.py +0 -0
  237. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_evidence_contract.py +0 -0
  238. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_kernel.py +0 -0
  239. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_layout_helpers.py +0 -0
  240. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_layout_sig.py +0 -0
  241. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_mutation_corpus.py +0 -0
  242. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_parts.py +0 -0
  243. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_recogniser_public_contract.py +0 -0
  244. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_section_recess_cases.py +0 -0
  245. {draftwright-0.4.30 → draftwright-0.4.31}/tests/_unit_manifest.py +0 -0
  246. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  247. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/README.md +0 -0
  248. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  249. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/blind-hole.step +0 -0
  250. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
  251. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
  252. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
  253. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
  254. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
  255. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
  256. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
  257. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
  258. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
  259. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
  260. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
  261. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
  262. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
  263. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
  264. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
  265. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
  266. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
  267. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
  268. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
  269. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
  270. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
  271. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
  272. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
  273. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
  274. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  275. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
  276. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
  277. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
  278. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/countersink-single.step +0 -0
  279. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
  280. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
  281. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
  282. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
  283. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-blind.step +0 -0
  284. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
  285. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
  286. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
  287. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
  288. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
  289. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
  290. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
  291. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-compound.step +0 -0
  292. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
  293. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-plain.step +0 -0
  294. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
  295. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
  296. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
  297. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
  298. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
  299. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
  300. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/fillet-turned.step +0 -0
  301. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
  302. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/flat-double-d.step +0 -0
  303. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
  304. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/flat-nonround.step +0 -0
  305. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
  306. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
  307. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
  308. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/groove-compound.step +0 -0
  309. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
  310. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
  311. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
  312. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
  313. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/groove-narrow.step +0 -0
  314. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
  315. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
  316. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
  317. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
  318. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
  319. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
  320. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
  321. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
  322. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
  323. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
  324. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
  325. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
  326. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
  327. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
  328. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
  329. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pattern-grid.step +0 -0
  330. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
  331. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
  332. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plain-block.step +0 -0
  333. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
  334. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
  335. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
  336. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
  337. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
  338. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
  339. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
  340. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
  341. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
  342. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
  343. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
  344. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-compound.step +0 -0
  345. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
  346. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-lone.step +0 -0
  347. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
  348. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
  349. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
  350. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
  351. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
  352. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
  353. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
  354. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
  355. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-side.step +0 -0
  356. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
  357. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
  358. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
  359. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
  360. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
  361. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
  362. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
  363. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
  364. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
  365. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
  366. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
  367. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
  368. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
  369. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
  370. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
  371. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
  372. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
  373. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
  374. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
  375. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
  376. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
  377. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
  378. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
  379. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
  380. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
  381. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
  382. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/topology-a.step +0 -0
  383. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/topology-b.step +0 -0
  384. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
  385. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
  386. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
  387. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
  388. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
  389. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
  390. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
  391. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
  392. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
  393. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  394. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  395. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/grm04_drive_plate.step +0 -0
  396. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  397. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  398. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
  399. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/issue_1595_whistle_key_frame.step +0 -0
  400. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/issue_1595_whistle_key_lever.step +0 -0
  401. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  402. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/issue_915_case_study_2.step +0 -0
  403. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  404. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  405. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  406. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  407. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  408. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  409. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  410. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  411. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  412. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  413. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  414. {draftwright-0.4.30 → draftwright-0.4.31}/tests/fixtures/whistle_frame_reference.step +0 -0
  415. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/bracket_section.json +0 -0
  416. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/centered_rebate.json +0 -0
  417. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/chamfered.json +0 -0
  418. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/filleted.json +0 -0
  419. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/grooved_shaft.json +0 -0
  420. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/hex_bar.json +0 -0
  421. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/holed_slot.json +0 -0
  422. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/pocketed.json +0 -0
  423. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/prismatic_ladder.json +0 -0
  424. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/side_drilled.json +0 -0
  425. {draftwright-0.4.30 → draftwright-0.4.31}/tests/refactor_golden/turned_stepped.json +0 -0
  426. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_adr0018_view_routing.py +0 -0
  427. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_adr_corpus.py +0 -0
  428. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_agents_guide.py +0 -0
  429. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_analysis_geometry.py +0 -0
  430. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_angle_patterns.py +0 -0
  431. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_angular_references.py +0 -0
  432. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_angular_rendering.py +0 -0
  433. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_annotation_box_composition.py +0 -0
  434. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_annotation_box_corpus.py +0 -0
  435. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_api_docs.py +0 -0
  436. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_architecture_docs.py +0 -0
  437. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_arrangement_gate.py +0 -0
  438. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_audit_differential.py +0 -0
  439. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_axial_dimensions.py +0 -0
  440. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_balloon_ring_standoff.py +0 -0
  441. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_boss_ownership.py +0 -0
  442. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_build_drawing_entrypoints.py +0 -0
  443. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_build_profile_harness.py +0 -0
  444. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_burden_report.py +0 -0
  445. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_canonical_angles.py +0 -0
  446. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_carve_free_position_callers.py +0 -0
  447. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_channel_ownership.py +0 -0
  448. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_cli_behavior.py +0 -0
  449. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_cli_report_sidecar.py +0 -0
  450. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_clone_budget.py +0 -0
  451. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_compose_then_pack.py +0 -0
  452. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_corpus_cover.py +0 -0
  453. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_counting_calls.py +0 -0
  454. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_coverage_mode.py +0 -0
  455. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_declared_recognition_gate.py +0 -0
  456. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_deferred_edits.py +0 -0
  457. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_dense_sheet_canary.py +0 -0
  458. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_deprecation_dates.py +0 -0
  459. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_depth_estimators.py +0 -0
  460. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_detail_views.py +0 -0
  461. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_diameter_deduplication.py +0 -0
  462. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_diameter_leaders.py +0 -0
  463. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_dimension_role_vocabulary.py +0 -0
  464. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_document_build.py +0 -0
  465. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_document_claim_authority.py +0 -0
  466. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_document_claims.py +0 -0
  467. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_document_coverage.py +0 -0
  468. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_document_report_authority.py +0 -0
  469. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_drawing_encapsulation.py +0 -0
  470. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_drawing_operations.py +0 -0
  471. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_drawing_state.py +0 -0
  472. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_dynamic_corridors.py +0 -0
  473. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_e2e_slice.py +0 -0
  474. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_export_dxf_curves.py +0 -0
  475. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_export_dxf_zoom.py +0 -0
  476. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_export_formats.py +0 -0
  477. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_export_reproducible.py +0 -0
  478. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_export_shape.py +0 -0
  479. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_feature_edit_verbs.py +0 -0
  480. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_feature_provenance.py +0 -0
  481. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_feature_queries.py +0 -0
  482. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_fillets_adjacency.py +0 -0
  483. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_fit_calculations.py +0 -0
  484. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_fits.py +0 -0
  485. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_flat_completeness.py +0 -0
  486. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_flat_stock_identity.py +0 -0
  487. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_flat_stock_opposition.py +0 -0
  488. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_format_selector.py +0 -0
  489. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_formatting.py +0 -0
  490. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_framed_step_family_evidence.py +0 -0
  491. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_gdt_placement.py +0 -0
  492. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_geometry_graph_spike.py +0 -0
  493. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_grid_lattice_convention.py +0 -0
  494. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_groove_profile.py +0 -0
  495. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_hole_pattern_callouts.py +0 -0
  496. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_hole_table.py +0 -0
  497. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_iso_layout.py +0 -0
  498. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_iso_nts_caption_placement.py +0 -0
  499. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_isometric_orientation.py +0 -0
  500. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_isometric_placement.py +0 -0
  501. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1000_envelope_reuse.py +0 -0
  502. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1006_measurement_comparison.py +0 -0
  503. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1058_wheel_profile.py +0 -0
  504. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  505. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1082_polygonal_stock.py +0 -0
  506. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1086_declared_gears.py +0 -0
  507. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  508. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1126_requesting_less_never_scores_better.py +0 -0
  509. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1132_turned_profile_span_is_reported.py +0 -0
  510. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  511. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  512. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  513. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  514. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  515. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1157_no_implicit_general_tolerance.py +0 -0
  516. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1177_angular_dimensions.py +0 -0
  517. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1188_per_view_assignment.py +0 -0
  518. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1190_section_decision.py +0 -0
  519. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  520. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  521. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  522. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  523. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  524. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1217_claimed_representations.py +0 -0
  525. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  526. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  527. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1245_passage_disposition.py +0 -0
  528. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
  529. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1247_angled_step_disposition.py +0 -0
  530. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1254_turned_chamfers.py +0 -0
  531. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1260_view_constraints.py +0 -0
  532. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1262_automatic_turned_views.py +0 -0
  533. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1281_turned_fillets.py +0 -0
  534. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  535. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1312_engine_costs.py +0 -0
  536. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1325_nominal_agreement.py +0 -0
  537. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1332_overlap_remedy.py +0 -0
  538. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1332_zone_labels.py +0 -0
  539. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1334_prevent_ink.py +0 -0
  540. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
  541. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1349_precision_display.py +0 -0
  542. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1350_detected_takeover.py +0 -0
  543. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  544. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  545. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1357_framed_activation.py +0 -0
  546. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1357_framed_boundary.py +0 -0
  547. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
  548. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1357_pmi_frame.py +0 -0
  549. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1360_thread_depth.py +0 -0
  550. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
  551. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
  552. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
  553. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
  554. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
  555. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
  556. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1373_plate_completeness_evidence.py +0 -0
  557. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
  558. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
  559. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1374_turned_step_completeness_evidence.py +0 -0
  560. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1378_diameter_leader_targets.py +0 -0
  561. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1390_sheet_registration.py +0 -0
  562. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1392_recognisers_048.py +0 -0
  563. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
  564. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1396_layout_advisories.py +0 -0
  565. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1421_rectangular_blind_slot_completeness.py +0 -0
  566. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1421_rectangular_blind_slot_semantics.py +0 -0
  567. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +0 -0
  568. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +0 -0
  569. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1432_adoption.py +0 -0
  570. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1432_boundary_failures.py +0 -0
  571. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
  572. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
  573. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1466_dimension_options.py +0 -0
  574. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1466_semantic_sides.py +0 -0
  575. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1479_radius_leader_targets.py +0 -0
  576. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1485_curved_pockets.py +0 -0
  577. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
  578. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1485_rounded_pockets.py +0 -0
  579. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1505_diameter_coverage.py +0 -0
  580. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1505_short_axial_chains.py +0 -0
  581. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1511_turned_boss_heights.py +0 -0
  582. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1514_projection_safeguard.py +0 -0
  583. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1515_first_angle.py +0 -0
  584. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1516_dimension_text.py +0 -0
  585. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1517_through_indicator.py +0 -0
  586. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1518_explicit_rear.py +0 -0
  587. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
  588. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1530_section_provenance.py +0 -0
  589. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1531_semantic_hole_counts.py +0 -0
  590. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1532_authored_section_examples.py +0 -0
  591. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1533_review_diagnostics.py +0 -0
  592. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1534_build_progress.py +0 -0
  593. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1543_feature_schedules.py +0 -0
  594. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1544_frame_document_canary.py +0 -0
  595. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1555_turned_recognition_format_invariance.py +0 -0
  596. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1560_envelope_axes.py +0 -0
  597. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1596_bolt_circle_corroboration.py +0 -0
  598. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1598_hex_pockets.py +0 -0
  599. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1599_duplicate_slot_widths.py +0 -0
  600. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1601_flat_precision.py +0 -0
  601. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1603_cli_output_paths.py +0 -0
  602. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1604_internal_section.py +0 -0
  603. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1612_sheet_margins.py +0 -0
  604. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_1613_circular_channel.py +0 -0
  605. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_367_leader_ink.py +0 -0
  606. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  607. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_563_placement_intent.py +0 -0
  608. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_676_polygonal_boss.py +0 -0
  609. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  610. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_798_floor_cardinality.py +0 -0
  611. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_798_material_field.py +0 -0
  612. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_827_real_part_canary.py +0 -0
  613. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_883_location_identity.py +0 -0
  614. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_909_sloped_profile.py +0 -0
  615. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_915_dense_case.py +0 -0
  616. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_916_pocket_leader.py +0 -0
  617. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_917_open_channel.py +0 -0
  618. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  619. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_955_height_contingency.py +0 -0
  620. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  621. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_label_provenance.py +0 -0
  622. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_layout.py +0 -0
  623. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_layout_cleanliness.py +0 -0
  624. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_layout_constants.py +0 -0
  625. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_layout_generalisation.py +0 -0
  626. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_layout_hypothesis.py +0 -0
  627. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_layout_property.py +0 -0
  628. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_leader_footprint.py +0 -0
  629. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_lint_box_cache.py +0 -0
  630. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_lint_coverage.py +0 -0
  631. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_lint_ink_overlap.py +0 -0
  632. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_lint_reconciliation.py +0 -0
  633. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_lint_summary.py +0 -0
  634. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_linting.py +0 -0
  635. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_location_dimensions.py +0 -0
  636. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_location_vocabulary.py +0 -0
  637. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_machined_feature_callouts.py +0 -0
  638. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_make_drawing_entrypoints.py +0 -0
  639. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_nested_recognition_ownership.py +0 -0
  640. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_note_verb.py +0 -0
  641. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_object_aspects.py +0 -0
  642. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_occupancy_boxes.py +0 -0
  643. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_occurrence_recognition_ownership.py +0 -0
  644. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_overall_height_coverage.py +0 -0
  645. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pad_completeness_evidence.py +0 -0
  646. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_paired_ramp_semantics.py +0 -0
  647. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_part_classification.py +0 -0
  648. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_part_model.py +0 -0
  649. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_place_dimension.py +0 -0
  650. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_plate_ownership.py +0 -0
  651. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pmi_common_labels.py +0 -0
  652. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pmi_datum_lowering.py +0 -0
  653. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pmi_gtol_lowering.py +0 -0
  654. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pmi_part21.py +0 -0
  655. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pocket_completeness_evidence.py +0 -0
  656. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pocket_pattern.py +0 -0
  657. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pocket_pattern_completeness_evidence.py +0 -0
  658. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_pocket_pattern_recognition.py +0 -0
  659. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_polygonal_boss_completeness_evidence.py +0 -0
  660. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_principal_profile_classifier.py +0 -0
  661. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_prismatic_boss_diameter.py +0 -0
  662. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_prismatic_dimensions.py +0 -0
  663. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_private_test_attr_reads.py +0 -0
  664. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_private_test_imports.py +0 -0
  665. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_profile_angles.py +0 -0
  666. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_projection_symbol_default.py +0 -0
  667. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_real_part_fixtures.py +0 -0
  668. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recogniser_adoption.py +0 -0
  669. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recogniser_policy.py +0 -0
  670. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recogniser_step_inventory.py +0 -0
  671. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recognition_boundary_failures.py +0 -0
  672. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recognition_evidence_schema.py +0 -0
  673. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recognition_policy_dispositions.py +0 -0
  674. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_recognition_result.py +0 -0
  675. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_render_seam.py +0 -0
  676. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_repack_geometry_seam.py +0 -0
  677. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_repair.py +0 -0
  678. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_requirement_applicability.py +0 -0
  679. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_requirement_carriers.py +0 -0
  680. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_scale_policy.py +0 -0
  681. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_scale_selection.py +0 -0
  682. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_score.py +0 -0
  683. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_script_detail_parity.py +0 -0
  684. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_section_hatching.py +0 -0
  685. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_section_recess_contract.py +0 -0
  686. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_section_recess_pockets.py +0 -0
  687. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_shared_box_memo.py +0 -0
  688. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_shared_drawing_cache.py +0 -0
  689. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_furniture.py +0 -0
  690. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_notes.py +0 -0
  691. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_of.py +0 -0
  692. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_section.py +0 -0
  693. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_sheet_tables.py +0 -0
  694. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_slot_pattern_recognition.py +0 -0
  695. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_soft_deprecation.py +0 -0
  696. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_solve_trace.py +0 -0
  697. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_step_analysis_evaluation.py +0 -0
  698. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_strip_zones.py +0 -0
  699. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_suite_shape.py +0 -0
  700. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_suppression_ledger.py +0 -0
  701. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_suppression_marks.py +0 -0
  702. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_through_step_ownership.py +0 -0
  703. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_turned_diameters.py +0 -0
  704. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_turned_lengths.py +0 -0
  705. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_turned_step_ownership.py +0 -0
  706. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_turned_steps.py +0 -0
  707. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_two_pass_layout.py +0 -0
  708. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_typ_dimensions.py +0 -0
  709. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_version_bump_ci.py +0 -0
  710. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_view_blocks.py +0 -0
  711. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_view_coordinates.py +0 -0
  712. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_view_plan.py +0 -0
  713. {draftwright-0.4.30 → draftwright-0.4.31}/tests/test_witness_label_reconciliation.py +0 -0
@@ -4,6 +4,81 @@
4
4
 
5
5
  ### Added
6
6
 
7
+ - A hash-pinned AP242 CTC-01 canary now proves the full Pareto-first layout loop against
8
+ a reviewed 80-measurement denominator: read typed finding remedies, apply only two public
9
+ declaration-side overrides, replay once, and establish legibility-only dominance while 12
10
+ unresolved claims remain carried and certification remains unavailable (#1753). Detailed
11
+ diagnostic prose remains optional presentation derived from structured evidence, never a
12
+ comparison identity or decision input.
13
+ - Declared slot width and length dimensions now expose bounded, feature-relative lanes through
14
+ `DimensionIntent.place(lane=...)` and declaration-scoped
15
+ `layout_override(..., parameter=..., lane=...)`. Generated scripts and report-v8 evidence
16
+ retain the layout-only policy; the shared solver admits only wholly interior or exterior,
17
+ page-safe, ink-clear candidates and reports bounded blocker evidence when a requested lane is
18
+ infeasible. Automatic drawings and scripts without lane intent remain unchanged (#1757).
19
+ - Declared sheets now support append-only, build-scoped `layout_override(..., side=...)`
20
+ edits plus structured capability and validation queries. Overrides select only a semantic
21
+ corridor, retain declaration identity through generated-script replay, and appear as
22
+ layout-only resolution evidence in declared report v8; coordinates and engineering meaning
23
+ remain unchanged, and sheets without overrides preserve existing behaviour (#1757).
24
+ - Raw automatic report assessments now include a typed remediation projection that separates
25
+ contradictions, missing carriers, layout, importer/lowering, source ambiguity, and unavailable
26
+ evidence. It retains affected evidence identities, names preservation invariants, advertises
27
+ only bounded public actions, and leaves unknown findings unclassified without guessing (#1759).
28
+ - Raw automatic reports now lead agents with a vector-first `lint.assessment`: per-axis status,
29
+ affected counts, available denominators, unavailable reasons, and stable structured reasons
30
+ for every `needs-attention` verdict. Its human summary is rendered from the same reason rows,
31
+ while legacy lint scores remain compatibility-only diagnostics and cannot select status
32
+ (#1609, #1618).
33
+ - Replay comparison now matches unresolved measurement evidence by its serialized annotation,
34
+ table cell, or ownerless parameter identity and classifies it as carried, resolved,
35
+ introduced, changed, or ambiguous. Carried uncertainty keeps certification unavailable but
36
+ no longer erases an otherwise Pareto-dominant layout improvement; new, changed, or duplicate
37
+ identities fail closed (#1753).
38
+ - Assessment comparison v2 reports independently evidenced requirement, completeness,
39
+ fidelity, legibility, and restraint axes plus their Pareto relation. Dominance,
40
+ equivalence, domination, incomparability, and unavailable evidence are derived from concrete
41
+ transitions rather than any legacy diagnostic, component, or audited-completeness score
42
+ (#1609). The v1 `decision` remains temporarily as a deprecated compatibility policy result.
43
+ - Stadium through-slots now retain Quiddity 0.3.2's proved end radius through detection,
44
+ declared `Sheet` scripts, compiled measurement identity, placement, and completeness. A
45
+ normal-to-arc `2× R…` leader distinguishes an obround from an equal-sized rectangular slot
46
+ without introducing coordinate placement (#1752).
47
+ - The Quiddity 0.3.2 adoption also retains corrected overall extents for rounded-corner
48
+ rectangular slots. Hole-pattern records whose members differ only along the drilling axis
49
+ are explicitly refused at the drafting boundary, preserving their ordinary grouped-hole
50
+ requirements instead of emitting a coincident, undrawable pitch pattern.
51
+ - Feature-leader placement now has one coordinate-free drawing policy across
52
+ `build_drawing`, `make_drawing`, `Sheet`, generated scripts, and the CLI. The default
53
+ `auto` policy keeps the shared interior/exterior solve, `interior` requires proved
54
+ interior candidates for eligible unconstrained families, and `exterior` restores the
55
+ historical exterior-only layout for existing diagrams.
56
+ - The standard title block now states drawing `UNITS` (`mm`) and the effective sheet `FORMAT`
57
+ (for example `A2`). Dimension-specified A-series pages receive the standard designation;
58
+ non-standard pages state their actual `WIDTHxHEIGHT`. Its rows share a four-line column grid,
59
+ avoiding visually offset dividers between adjacent fields.
60
+ - A bounded real-part canary now proves the complete agent improvement loop on NIST CTC-01
61
+ (#1716): inspection-to-declaration joins, traced baseline, one sanctioned `Sheet` layout edit,
62
+ replay assessment, fixed-denominator comparison, and fail-closed deletion/owner/provenance
63
+ checks. It performs exactly two CAD builds in the existing single PR canary lane.
64
+ - Replay assessments v2 now retain exact confirmed compiled measurement meanings, and
65
+ `compare_assessments()` evaluates two same-source replays as separate semantic, lint,
66
+ completeness, fidelity, layout, and availability deltas (#1712). Caller-fixed requirements
67
+ expose shared omissions; authorised design changes remain separate; no composite score is
68
+ produced.
69
+ - Generated scripts now atomically write a versioned post-build replay assessment beside their
70
+ outputs (#1715). It binds the exact STEP and edited Python bytes, producer/run options, output
71
+ hashes, declaration/representation map, layout evidence, and lint from the same finalized
72
+ drawing. Failed replays clear only stale Draftwright-owned assessments; `--no-report` opts out.
73
+ - Declared drawing report schema v8 publishes page/view geometry, named annotation ink and
74
+ public line segments, raw-lint joins, semantic remedy choices, and explicit opt-in solver
75
+ evidence (#1711). Coordinates are review evidence only; editable links remain final-IR
76
+ declarations, and an untraced or partially traced build says so instead of appearing clear.
77
+ - STEP inspection schema v4 projects a deterministic report-local source-face roster and
78
+ Quiddity 0.3.1's closed graph rooted at rejected candidates (#1726). Accepted occurrences and
79
+ candidates carry exact defining/constituent face links; rejected roots and direct relationships
80
+ reconcile with aggregate lifecycle counts. The report still states that this is diagnostic
81
+ evidence, not precision, recall, missed-feature truth, or persistent topology identity.
7
82
  - Circular-seat recognition, declared features, and generated-script replay (#1613).
8
83
  Diameter, open run, arc sweep, and three datum-to-axis coordinates retain each physical
9
84
  seat's measurement identities, including counted coaxial callouts and shared axis marks.
@@ -13,6 +88,20 @@
13
88
 
14
89
  ### Fixed
15
90
 
91
+ - Assessment comparison now rejects an apparent resolution of measurement uncertainty when the
92
+ declaration carrying that unresolved annotation was removed. Deleting crossed GD&T ink can no
93
+ longer masquerade as evidence improvement; genuine resolution with the carrier retained still
94
+ compares normally (#1753).
95
+ - Imported upper/lower limit dimensions now retain their typed absolute interval through the
96
+ compiled evidence boundary. Both bounds together satisfy the owned nominal claim, while a
97
+ changed/missing bound or two coincidental numbers around the nominal still produces
98
+ `claimed_value_absent`; count and through requirements remain separate (#1759).
99
+ - Adopt Quiddity 0.3.1 and require its public rejected-candidate reference in the
100
+ evidence contract (#1726). The provider now suppresses rectangular recess candidates
101
+ that are not material-empty and restores passage discovery used during rotational
102
+ reconciliation; Draftwright's recognition and real-part regression corpora retain
103
+ their reviewed expectations.
104
+
16
105
  - Direct and generated builds use the same final IR step ladder for page layout (#1592).
17
106
  Raw face levels owned by another feature no longer reserve a phantom step corridor at
18
107
  the title-block clearance threshold.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.4.30
3
+ Version: 0.4.31
4
4
  Summary: Automated technical-drawing generation for build123d
5
5
  Project-URL: Homepage, https://github.com/pzfreo/draftwright
6
6
  Project-URL: Repository, https://github.com/pzfreo/draftwright
@@ -692,7 +692,7 @@ Requires-Dist: numpy>=1.24
692
692
  Requires-Dist: ocp-gordon<0.3
693
693
  Requires-Dist: pillow>=10
694
694
  Requires-Dist: pypdfium2>=4
695
- Requires-Dist: quiddity==0.2.9
695
+ Requires-Dist: quiddity==0.3.2
696
696
  Requires-Dist: reportlab>=4.0
697
697
  Requires-Dist: rich>=10.11
698
698
  Requires-Dist: steputils==0.1
@@ -757,14 +757,17 @@ draftwright my_part.step --format pdf,dxf # also: svg, all
757
757
  draftwright my_part.step --no-report # opt out of the JSON sidecar
758
758
  draftwright my_part.step --scale 2 --page A3 # override the auto scale / page
759
759
  draftwright my_part.step --scale 1 --page A4 --scale-policy strict
760
+ draftwright my_part.step --leader-region exterior # historical exterior-only callouts
760
761
  draftwright my_part.step --script # write an editable declarative Sheet script
761
762
  draftwright /parts/my_part.step --out-dir . # explicitly write into the working directory
762
763
  draftwright my_part.step --out-dir drawings # create/use a separate output directory
763
764
  ```
764
765
 
765
766
  CLI outputs default to the directory containing the STEP input, including an absolute or
766
- nested input path. `--script` writes its Python file and inspection sidecar there too; the
767
- script retains that output destination when run from another directory. Use `--out-dir DIR`
767
+ nested input path. `--script` writes its Python file and recognition-inspection sidecar there;
768
+ replaying the script writes the requested drawings and a distinct current-build assessment,
769
+ then prints that assessment path. The script retains that output destination when run from
770
+ another directory. Use `--out-dir DIR`
768
771
  to choose a directory, or `--out PREFIX` to choose a basename as well (these options are
769
772
  mutually exclusive). Relative overrides use the current working directory. Live object
770
773
  scripts (`module:part`) default to `drawing.py` in the working directory.
@@ -974,6 +977,10 @@ completeness = crit["quality"]["completeness"]
974
977
  # became a requirement. (Recognized nothing auditable at all? available is False, not 1.0.)
975
978
  audited = completeness["audited_score"]
976
979
  assert completeness["scope"] == "audited_recognized_requirements"
980
+ # An aggregate outcome whose physical count is unknown makes the denominator and score
981
+ # indeterminate rather than treating its placeholder row as one requirement.
982
+ completeness["known_requirement_count"]
983
+ completeness["unknown_cardinality_rows"], completeness["unknown_cardinality"]
977
984
  completeness["excludes"] # what the denominator cannot see
978
985
  completeness["unrecognised_geometry_reports"] # a floor on that gap, never a measure
979
986
  legibility = crit["quality"]["legibility"]
@@ -1002,6 +1009,9 @@ engineering-correct; plain deletion is not an accepted-waiver mechanism.
1002
1009
  can audit, how many were placed?" — so a part can score 1.0 with whole features missing from the
1003
1010
  drawing, if recognition never identified them. Gate on issue codes and severities, and read
1004
1011
  `excludes` and `unrecognised_geometry_reports` for what the denominator cannot account for.
1012
+ If any producer reports unknown physical cardinality, `requirements` and `audited_score` are
1013
+ `None`, `coverage` is `"indeterminate"`, and `unknown_cardinality` identifies the aggregate
1014
+ family/parameter outcomes requiring review.
1005
1015
 
1006
1016
  Each `LintIssue` carries a domain-meaningful `code` and, when computable, a
1007
1017
  ready-to-apply `suggestion`. See `docs/adr/` for the design (deterministic
@@ -54,14 +54,17 @@ draftwright my_part.step --format pdf,dxf # also: svg, all
54
54
  draftwright my_part.step --no-report # opt out of the JSON sidecar
55
55
  draftwright my_part.step --scale 2 --page A3 # override the auto scale / page
56
56
  draftwright my_part.step --scale 1 --page A4 --scale-policy strict
57
+ draftwright my_part.step --leader-region exterior # historical exterior-only callouts
57
58
  draftwright my_part.step --script # write an editable declarative Sheet script
58
59
  draftwright /parts/my_part.step --out-dir . # explicitly write into the working directory
59
60
  draftwright my_part.step --out-dir drawings # create/use a separate output directory
60
61
  ```
61
62
 
62
63
  CLI outputs default to the directory containing the STEP input, including an absolute or
63
- nested input path. `--script` writes its Python file and inspection sidecar there too; the
64
- script retains that output destination when run from another directory. Use `--out-dir DIR`
64
+ nested input path. `--script` writes its Python file and recognition-inspection sidecar there;
65
+ replaying the script writes the requested drawings and a distinct current-build assessment,
66
+ then prints that assessment path. The script retains that output destination when run from
67
+ another directory. Use `--out-dir DIR`
65
68
  to choose a directory, or `--out PREFIX` to choose a basename as well (these options are
66
69
  mutually exclusive). Relative overrides use the current working directory. Live object
67
70
  scripts (`module:part`) default to `drawing.py` in the working directory.
@@ -271,6 +274,10 @@ completeness = crit["quality"]["completeness"]
271
274
  # became a requirement. (Recognized nothing auditable at all? available is False, not 1.0.)
272
275
  audited = completeness["audited_score"]
273
276
  assert completeness["scope"] == "audited_recognized_requirements"
277
+ # An aggregate outcome whose physical count is unknown makes the denominator and score
278
+ # indeterminate rather than treating its placeholder row as one requirement.
279
+ completeness["known_requirement_count"]
280
+ completeness["unknown_cardinality_rows"], completeness["unknown_cardinality"]
274
281
  completeness["excludes"] # what the denominator cannot see
275
282
  completeness["unrecognised_geometry_reports"] # a floor on that gap, never a measure
276
283
  legibility = crit["quality"]["legibility"]
@@ -299,6 +306,9 @@ engineering-correct; plain deletion is not an accepted-waiver mechanism.
299
306
  can audit, how many were placed?" — so a part can score 1.0 with whole features missing from the
300
307
  drawing, if recognition never identified them. Gate on issue codes and severities, and read
301
308
  `excludes` and `unrecognised_geometry_reports` for what the denominator cannot account for.
309
+ If any producer reports unknown physical cardinality, `requirements` and `audited_score` are
310
+ `None`, `coverage` is `"indeterminate"`, and `unknown_cardinality` identifies the aggregate
311
+ family/parameter outcomes requiring review.
302
312
 
303
313
  Each `LintIssue` carries a domain-meaningful `code` and, when computable, a
304
314
  ready-to-apply `suggestion`. See `docs/adr/` for the design (deterministic
@@ -70,11 +70,25 @@ issue. The contract test derives package record outputs, converter registries, l
70
70
  and emitter branches independently, so copying a new name into the declaration alone cannot make CI
71
71
  pass.
72
72
 
73
- ### Quiddity 0.2.9 runtime contract
73
+ ### Quiddity 0.3.2 runtime contract
74
74
 
75
- The runtime pins the published `quiddity==0.2.9` package, following the 0.2.4 adoption in
75
+ The runtime pins the published `quiddity==0.3.2` package, following the 0.2.4 adoption in
76
76
  [#1486](https://github.com/pzfreo/draftwright/pull/1486) and the migration in
77
- [#1471](https://github.com/pzfreo/draftwright/issues/1471). 0.2.7 is a patch adoption: it requires
77
+ [#1471](https://github.com/pzfreo/draftwright/issues/1471). Version 0.3.2 advances the public
78
+ `Slot` record to schema 2: `end_radius` distinguishes two semicircular stadium ends and
79
+ `corner_radius` distinguishes rounded rectangular corners. Draftwright consumes
80
+ `end_radius` for through-slot radius requirements; rounded-corner rectangular slots remain a
81
+ separate drafting-policy decision, although their corrected overall extents feed the existing
82
+ width/length grammar. A published hole-pattern relation whose members differ only along their
83
+ drilling axis is retained as recognition evidence but refused as a drawing pattern: its axes
84
+ coincide in the required end view, so Draftwright keeps the ordinary grouped-hole owner instead.
85
+ Version 0.3.1 retained the same 29 families and record
86
+ schemas while tightening material-empty gating for rectangular recesses,
87
+ restoring passage discovery during rotational reconciliation, and adding the public opaque
88
+ `CandidateRef` evidence surface delivered by
89
+ [quiddity#688](https://github.com/pzfreo/quiddity/issues/688). Draftwright requires that symbol
90
+ in the released evidence manifest before consuming candidate-level evidence. 0.2.7 was a patch
91
+ adoption that required
78
92
  circumferential cylinder support to establish a turned-profile axis line, so rounded plate corners
79
93
  and parallel offset cylinders no longer form a false stepped shaft
80
94
  ([quiddity#586](https://github.com/pzfreo/quiddity/issues/586), [#1555](https://github.com/pzfreo/draftwright/issues/1555)).
@@ -102,7 +116,14 @@ and untested. Its public `quiddity`, `quiddity.evidence` and
102
116
  reads. There is one recognition aggregate per build; consumers project that result rather than
103
117
  calling the document builder to obtain another run.
104
118
 
105
- The manifest has 27 families. One `section-recesses` family replaces the former pockets, pocket
119
+ The manifest has 29 families. The `gusset-ribs` family proves rib thickness, support legs and
120
+ body occurrence, while `gusset-rib-patterns` relates accepted ribs as arrays or mirror pairs.
121
+ Draftwright preserves those exact member relations in dedicated `GussetRibFeature` IR, exposes
122
+ the same facts through `Sheet.gusset_rib(...)` and generated scripts, and places one correlated
123
+ solver-owned callout carrying thickness, both legs and the proven pitch or mirror spacing. The
124
+ completeness ledger follows each physical member and the group relation independently (#1705).
125
+
126
+ One `section-recesses` family replaces the former pockets, pocket
106
127
  patterns, channels, rectangular and round-bottom blind slots, passages and prismatic pockets.
107
128
  `RecognitionResult.section_recesses` contains the immutable occurrences;
108
129
  `section_recess_patterns` relates them by run-local occurrence indices; `section_recess_refusals`
@@ -56,6 +56,12 @@ beyond each centreline. Without an explicit width, the existing widths remain 12
56
56
  A4 and 150 mm on larger ISO sheets, with the existing extra 1 mm right/bottom clearance.
57
57
  Revision defaults also remain unchanged.
58
58
 
59
+ The standard title block derives two read-only fields from the settled drawing: `UNITS` is
60
+ `mm`, matching Draftwright's drawing and export coordinate convention, and `FORMAT` is the
61
+ effective A-series designation (for example `A2`). A non-standard page states its physical
62
+ `WIDTHxHEIGHT` instead. These are derived after automatic page selection, so they cannot drift
63
+ from the sheet that was actually rendered.
64
+
59
65
  CLI parameters carry the same options into rendered drawings and generated scripts:
60
66
 
61
67
  ```sh
@@ -145,6 +151,31 @@ SVG, PDF and DXF export the same resolved ink. Unsupported values raise `ValueEr
145
151
  The choices affect rendering and its placement footprint, not feature measurements
146
152
  or tolerances. These are explicit rendering choices, not a claim of standards conformity.
147
153
 
154
+ ## Feature-leader region policy
155
+
156
+ Feature callouts may use proved whitespace inside a projected view without exposing raw page
157
+ coordinates. The drawing-wide `leader_region` policy is accepted by `Sheet(...)`,
158
+ `build_drawing()`, `make_drawing()`, and generated scripts:
159
+
160
+ ```python
161
+ sheet = Sheet(part, leader_region="exterior")
162
+ # or: build_drawing(part, leader_region="interior")
163
+ ```
164
+
165
+ - `"auto"` is the default and preserves the normal solve: eligible feature families offer
166
+ interior candidates while retaining their established exterior fallback.
167
+ - `"interior"` requires an interior candidate for an eligible, unconstrained feature. It does
168
+ not invent interior geometry for unsupported families; those remain exterior. If no proved
169
+ interior candidate fits, the eligible callout drops and lint reports it.
170
+ - `"exterior"` removes all interior candidates and restores the historical exterior-only
171
+ feature-leader layout.
172
+
173
+ The CLI spelling is `--leader-region auto|interior|exterior`. Generated `--script` output
174
+ retains a non-default selection in its `Sheet(...)` constructor. A feature carrying an explicit
175
+ `side="left"|"right"|"above"|"below"` remains exterior because authored placement intent is
176
+ stronger than the drawing-wide preference. The policy affects feature leaders only—not linear
177
+ dimensions, free notes, tables, or view placement—and never supplies coordinates.
178
+
148
179
  ## Through-hole wording
149
180
 
150
181
  The optional argument to a hole handle's `through()` controls its printed indicator:
@@ -192,6 +223,76 @@ The token associates features; it does not specify an annotation position or add
192
223
  Generated scripts preserve this association using Draftwright-owned tokens instead of provider
193
224
  keys. A groove can still be declared when the authored set omits all of that body's steps.
194
225
 
226
+ ## Build-scoped declaration selectors
227
+
228
+ An editable script can give a feature a declaration identity and later address that intent
229
+ without a list position:
230
+
231
+ ```python
232
+ hole = sheet.hole(diameter=6, at=(0, 0, 0), axis="z").identify("declaration:1")
233
+ sheet.dimension(sheet.by_declaration("declaration:1"), "bore.diameter")
234
+ ```
235
+
236
+ The identity follows fluent replacements such as `.depth()` and identity-preserving list
237
+ reorders. Assigning another feature into its public `sheet.features` slot or deleting it
238
+ withdraws the identity; it never transfers to the new occupant. Live IDs must be unique.
239
+ Generated scripts use this build-scoped selector to join assessment evidence back to editable
240
+ intent. It is not a persistent feature, face or topology ID and makes no correspondence promise
241
+ across recognition runs. Recognition occurrence IDs, when present, remain local to the exact
242
+ generation run recorded by the declaration.
243
+
244
+ ### Declaration-scoped layout overrides
245
+
246
+ An agent editing a generated script can append a bounded layout override without changing the
247
+ original feature declaration or supplying page coordinates:
248
+
249
+ ```python
250
+ options = sheet.layout_options("declaration:57")
251
+ check = sheet.validate_layout_override("declaration:57", side="above")
252
+ if check["supported"]:
253
+ sheet.layout_override("declaration:57", side="above")
254
+
255
+ lane_options = sheet.layout_options(
256
+ "declaration:9", parameter="slot_width.length"
257
+ )
258
+ lane_check = sheet.validate_layout_override(
259
+ "declaration:9", parameter="slot_width.length", lane=3
260
+ )
261
+ if lane_check["supported"]:
262
+ sheet.layout_override(
263
+ "declaration:9", parameter="slot_width.length", lane=3
264
+ )
265
+ ```
266
+
267
+ Without `parameter=`, `layout_options()` reports the declaration's current side and supported
268
+ values. With an exact declared parameter it reports dimension-lane capability. A lane is an
269
+ integer from 1 through 8: a one-based drafting-spaced rank from that dimension's physical
270
+ witness, not a distance. The shared measured-candidate solve may resolve it into proven
271
+ whitespace inside or outside the view and records that candidate's region explicitly. The
272
+ current lane-capable slice is the linear width/length dimensions of slots. Capability is
273
+ declared in one compiler-owned registry so another dimension family is added deliberately, not
274
+ by teaching each renderer a private spelling.
275
+
276
+ The side surface accepts `above`, `below`, `left`, and `right`;
277
+ `validate_layout_override()` returns
278
+ structured `invalid_declaration`, `unsupported_declaration`, `unsupported_control`, or
279
+ `unsupported_value` refusals, plus `invalid_control_combination` when side and lane addressing
280
+ are mixed, without mutating the sheet. Both documents say
281
+ `requires_build_validation: true`: support means that the declaration and vocabulary are valid,
282
+ not that the final sheet has enough space. `build()` and `lint()` remain the authority for
283
+ feasibility and collision-free placement.
284
+
285
+ `layout_override()` accepts either keyword-only `side`, or an exact `parameter` plus `lane`, and
286
+ rejects duplicate overrides for the same target. Side chooses a feature corridor; lane ranks a
287
+ parallel position for one referential dimension. Neither is pinning or priority, and neither moves
288
+ an annotation to a caller-supplied coordinate or changes its measurement, tolerance, datum, or
289
+ other engineering semantics. Generated scripts
290
+ emit the override as a separate line after the identity-bearing declarations. A declared report
291
+ records the requested and resolved value under `layout.overrides` with
292
+ `intent_class: "layout-only"`; lane rows also retain `parameter_id`. An infeasible lane drops
293
+ honestly with the requested lane in the lint message. Omitting the override retains the existing
294
+ placement behaviour.
295
+
195
296
  ## Checking dimension placement rules
196
297
 
197
298
  Call `handle.dimension_ids()` to find the measurements a declared feature exposes, then
@@ -625,6 +726,23 @@ callout. More general ordered operation stacks remain tracked by issue #1360. Un
625
726
  requirement has a structured parameter, use a feature-linked `note(..., satisfies=(...))` only
626
727
  for parameter ids the handle actually exposes; free prose does not satisfy coverage.
627
728
 
729
+ Generated scripts and editing agents use `structured_note(...)` when the note declaration
730
+ itself needs a stable selector:
731
+
732
+ ```python
733
+ note = sheet.structured_note(
734
+ "BORE DIAMETER VERIFIED",
735
+ stack,
736
+ satisfies=("bore.diameter",),
737
+ ).identify("declaration:note", provenance="structured-note")
738
+ same_note = sheet.by_declaration("declaration:note")
739
+ ```
740
+
741
+ It declares the same solver-placed manufacturing note as `note(...)`, but returns the note's
742
+ own feature handle rather than returning the `Sheet` for chaining. The handle controls intent,
743
+ not page coordinates. Final reports can therefore link the declaration to its exact placed ink
744
+ while separately crediting the physical feature and parameter named by `satisfies`.
745
+
628
746
  ### Straight and circular Blend chains
629
747
 
630
748
  When recognition accepts a complete schema-v3 straight or circular rolling-ball Blend path that is
@@ -811,6 +929,15 @@ drop, or missing ink is not hidden by the ownership choice.
811
929
  options:
812
930
  filters: public
813
931
 
932
+ ### Axis-aligned through-slots
933
+
934
+ `Sheet.slot(...)` declares the independently addressable `slot_width.length` and
935
+ `slot_length.length` measurements. Pass `end_radius=` only for a stadium/obround slot; this adds
936
+ `slot_end_radius.radius`, rendered as a solver-placed `2× R…` leader whose arrow remains normal
937
+ to either end arc. Leaving it unset preserves the rectangular-slot grammar. The declared radius
938
+ must equal half the width, and generated Sheet scripts retain the field when recognition proved
939
+ semicircular ends.
940
+
814
941
  ## GD&T control builder
815
942
 
816
943
  ::: draftwright.sheet._Control
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "draftwright"
7
- version = "0.4.30"
7
+ version = "0.4.31"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -23,7 +23,7 @@ dependencies = [
23
23
  # published wheels, not only uv's development resolver constraints.
24
24
  "cadquery-ocp-novtk!=7.9.3.1.1 ; python_full_version >= '3.13'",
25
25
  "build123d-drafting-helpers>=0.15.4",
26
- "quiddity==0.2.9",
26
+ "quiddity==0.3.2",
27
27
  "numpy>=1.24",
28
28
  # PNG raster export (SVG→PDF→PNG). Both permissively licensed (Pillow HPND; pypdfium2
29
29
  # Apache-2.0 wrapping Google PDFium BSD-3) and ship pre-built wheels with NO native system
@@ -96,6 +96,7 @@ timeout = 300
96
96
  # across its compatibility matrix.
97
97
  markers = [
98
98
  "slow: end-to-end integration builds, including CTC fixtures (deselected by default)",
99
+ "ctc04: scheduled tests that construct the CPU-heavy NIST CTC-04 drawing",
99
100
  "scheduled: compatibility and broad-corpus contracts selected by the scheduled tier",
100
101
  "real_part_canary: bounded real STEP semantic/export gate, selected once in PR CI",
101
102
  "smoke: curated build-light subset for a fast local check (~30 s)",
@@ -37,6 +37,7 @@ _LAZY = {
37
37
  "InspectionUnavailableError": "draftwright.inspection",
38
38
  "inspect_step": "draftwright.inspection",
39
39
  "Sheet": "draftwright.sheet",
40
+ "LeaderRegionPolicy": "draftwright.leader_policy",
40
41
  "Document": "draftwright.document",
41
42
  "DocumentResult": "draftwright.document",
42
43
  "DocumentBuildError": "draftwright.document",
@@ -103,6 +104,7 @@ if TYPE_CHECKING: # static analysers / IDEs — no runtime import, no kernel co
103
104
  InspectionUnavailableError,
104
105
  inspect_step,
105
106
  )
107
+ from draftwright.leader_policy import LeaderRegionPolicy
106
108
  from draftwright.linting import lint_feature_coverage
107
109
  from draftwright.pmi import (
108
110
  PmiExtractionReport,
@@ -137,6 +139,7 @@ __all__ = [
137
139
  "SoftDeprecationWarning",
138
140
  "FeatureInfo",
139
141
  "InspectionUnavailableError",
142
+ "LeaderRegionPolicy",
140
143
  "PmiExtractionReport",
141
144
  "PmiRecord",
142
145
  "PmiSourceEntity",
@@ -45,7 +45,6 @@ from build123d import (
45
45
  Vector,
46
46
  )
47
47
  from build123d_drafting.helpers import (
48
- ISO7200_FIELD_CHARS,
49
48
  Dimension,
50
49
  TitleBlock,
51
50
  TitleBlockCell,
@@ -114,6 +113,7 @@ def place_annotation(
114
113
  measurement=None,
115
114
  satisfaction=None,
116
115
  cells=(),
116
+ declaration=None,
117
117
  ):
118
118
  """The annotation-placement primitive (#817): register *obj* under *name* — replacing any
119
119
  prior object of that name (dropped from the render list *items*) so a name maps to one
@@ -130,7 +130,16 @@ def place_annotation(
130
130
  items.remove(displaced)
131
131
  annotate(obj, name)
132
132
  items.append(obj)
133
- registry.add(obj, name, view, feature, measurement, satisfaction, cells=cells)
133
+ registry.add(
134
+ obj,
135
+ name,
136
+ view,
137
+ feature,
138
+ measurement,
139
+ satisfaction,
140
+ cells=cells,
141
+ declaration=declaration,
142
+ )
134
143
  return obj
135
144
 
136
145
 
@@ -1385,6 +1394,10 @@ class Analysis:
1385
1394
  projection_symbol: bool = True
1386
1395
  text_position: str = "inline"
1387
1396
  text_orientation: str = "aligned"
1397
+ # Document-level feature-leader region policy. ``auto`` is the ordinary shared
1398
+ # solve; ``exterior`` restores the historical exterior-only candidate inventory;
1399
+ # ``interior`` restricts only families that proved interior eligibility.
1400
+ leader_region: str = "auto"
1388
1401
  # Draw the ISO 5457 zone-grid border ruler (#768). Implies a frame (the ticks sit on it).
1389
1402
  zones: bool = False
1390
1403
  # The PartModel built by _analyse's pre-scale sizing pass (#584 WP1 A) — stored so
@@ -1468,19 +1481,36 @@ def _attribution_author(drawn_by: str | None) -> str:
1468
1481
  return f"{author} / draftwright" if author else "draftwright"
1469
1482
 
1470
1483
 
1484
+ def _sheet_format(page_w: float, page_h: float) -> str:
1485
+ """The title-block format for an effective page, independent of orientation.
1486
+
1487
+ Named and dimension-specified pages converge on the same physical sheet in
1488
+ :class:`Analysis`, so derive this from its settled dimensions rather than retaining
1489
+ the caller's spelling. Non-standard pages state their actual size; the neighbouring
1490
+ UNITS cell supplies the unit.
1491
+ """
1492
+ for name, (width, height) in _PAGE_SIZES.items():
1493
+ if (page_w, page_h) in ((width, height), (height, width)):
1494
+ return name
1495
+ return f"{_fmt(page_w)}x{_fmt(page_h)}"
1496
+
1497
+
1471
1498
  def draftwright_title_block_layout() -> TitleBlockLayout:
1472
1499
  """The sheet's title-block arrangement: ISO 7200 complete, plus what practice needs.
1473
1500
 
1474
1501
  Every ISO 7200:2004 **mandatory** data field has a cell — legal owner (5.1.2),
1475
1502
  identification number (5.1.3), date of issue (5.1.5), segment/sheet number
1476
1503
  (5.1.6), title (5.2.2), approval person (5.3.4), creator (5.3.5) and document
1477
- type (5.3.6) — at the capacities the standard recommends, so the widths follow
1478
- from ISO 7200 and the font rather than from a chosen proportion.
1504
+ type (5.3.6). All rows use one proportional grid, tuned around the standard's
1505
+ recommended capacities on the narrowest block. Its four internal lines sit at
1506
+ 35%, 70%, 88% and 94%: each row spans those columns as needed, so adjacent
1507
+ dividers align instead of ending in near-miss seams.
1479
1508
 
1480
- Two cells are not ISO 7200 title-block fields and are here anyway: ``material``
1481
- and ``general_tolerance`` are on every real engineering drawing, and dropping
1482
- them to reach conformance would make the sheet worse. ``revision`` (5.1.4) is
1483
- optional in the standard and kept because it is near-universal.
1509
+ Four cells are not ISO 7200 title-block fields and are here anyway: ``material``,
1510
+ ``general_tolerance``, drawing ``units`` and sheet ``format`` are ordinary
1511
+ manufacturing/drawing-control information, and dropping them to reach conformance
1512
+ would make the sheet worse. ``revision`` (5.1.4) is optional in the standard and
1513
+ kept because it is near-universal.
1484
1514
 
1485
1515
  ``scale`` is deliberately absent. ISO 7200 §4 keeps the block to a minimum and
1486
1516
  presents scale and the projection symbol "outside the title block only when
@@ -1488,27 +1518,28 @@ def draftwright_title_block_layout() -> TitleBlockLayout:
1488
1518
  ``scale_not_stated`` lint makes its presence a checked guarantee rather than an
1489
1519
  assumption.
1490
1520
  """
1491
- iso = ISO7200_FIELD_CHARS
1492
1521
  return TitleBlockLayout(
1493
1522
  (
1494
1523
  (
1495
- TitleBlockCell("legal_owner", flex=True, label="LEGAL OWNER"),
1496
- TitleBlockCell("document_type", chars=iso["document_type"], label="DOC. TYPE"),
1524
+ TitleBlockCell("legal_owner", width=0.70, label="LEGAL OWNER"),
1525
+ TitleBlockCell("document_type", width=0.30, label="DOC. TYPE"),
1497
1526
  ),
1498
1527
  (
1499
- TitleBlockCell("title", flex=True, label="TITLE"),
1500
- TitleBlockCell("drawing_number", chars=iso["drawing_number"], label="DWG NO."),
1528
+ TitleBlockCell("title", width=0.70, label="TITLE"),
1529
+ TitleBlockCell("drawing_number", width=0.30, label="DWG NO."),
1501
1530
  ),
1502
1531
  (
1503
- TitleBlockCell("material", flex=True, label="MATERIAL"),
1504
- TitleBlockCell("general_tolerance", chars=22, label="GEN. TOL."),
1532
+ TitleBlockCell("material", width=0.35, label="MATERIAL"),
1533
+ TitleBlockCell("general_tolerance", width=0.35, label="GEN. TOL."),
1534
+ TitleBlockCell("units", width=0.18, label="UNITS"),
1535
+ TitleBlockCell("format", width=0.12, label="FORMAT"),
1505
1536
  ),
1506
1537
  (
1507
- TitleBlockCell("designed_by", chars=iso["creator"], label="DRAWN BY"),
1508
- TitleBlockCell("approved_by", chars=iso["approved_by"], label="APPROVED BY"),
1509
- TitleBlockCell("date", chars=iso["date"], label="DATE"),
1510
- TitleBlockCell("revision", chars=iso["revision"], label="REV"),
1511
- TitleBlockCell("sheet", chars=iso["sheet"], label="SHEET"),
1538
+ TitleBlockCell("designed_by", width=0.35, label="DRAWN BY"),
1539
+ TitleBlockCell("approved_by", width=0.35, label="APPROVED BY"),
1540
+ TitleBlockCell("date", width=0.18, label="DATE"),
1541
+ TitleBlockCell("revision", width=0.06, label="REV"),
1542
+ TitleBlockCell("sheet", width=0.06, label="SHEET"),
1512
1543
  ),
1513
1544
  )
1514
1545
  )
@@ -1541,6 +1572,8 @@ def _make_title_block(dwg, a: Analysis):
1541
1572
  approved_by = _font_safe_text(a.approved_by).strip()
1542
1573
  document_type = _font_safe_text(a.document_type).strip()
1543
1574
  sheet = _font_safe_text(a.sheet).strip()
1575
+ units = "mm"
1576
+ sheet_format = _font_safe_text(_sheet_format(a.PAGE_W, a.PAGE_H))
1544
1577
  layout = draftwright_title_block_layout()
1545
1578
  tb = TitleBlock(
1546
1579
  title,
@@ -1558,6 +1591,8 @@ def _make_title_block(dwg, a: Analysis):
1558
1591
  "approved_by": approved_by,
1559
1592
  "document_type": document_type,
1560
1593
  "sheet": sheet,
1594
+ "units": units,
1595
+ "format": sheet_format,
1561
1596
  },
1562
1597
  width=a.TB_W,
1563
1598
  # Title block renders in condensed sans (the tight ISO 7200 cells), a
@@ -1591,6 +1626,8 @@ def _make_title_block(dwg, a: Analysis):
1591
1626
  # the block, where `_add_scale_note` draws it and the
1592
1627
  # `scale_not_stated` lint guarantees it.
1593
1628
  ("material", material),
1629
+ ("units", units),
1630
+ ("format", sheet_format),
1594
1631
  ("approved_by", approved_by),
1595
1632
  ("document_type", document_type),
1596
1633
  ("sheet", sheet),
@@ -797,6 +797,7 @@ def _analyse(
797
797
  projection_symbol: bool = True,
798
798
  text_position: str = "inline",
799
799
  text_orientation: str = "aligned",
800
+ leader_region: str = "auto",
800
801
  zones: bool = False,
801
802
  _reuse: Analysis | None = None,
802
803
  _required_tables=(),
@@ -1509,6 +1510,7 @@ def _analyse(
1509
1510
  projection_symbol=projection_symbol,
1510
1511
  text_position=text_position,
1511
1512
  text_orientation=text_orientation,
1513
+ leader_region=leader_region,
1512
1514
  projection_convention=convention,
1513
1515
  zones=zones,
1514
1516
  out=out,