# selftest_review.py — targeted negative tests (reviewer-requested gates)
{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {
    "dims_updated": 1.0,
    "stackup_in_tolerance": 1.0,
    "report_stackup_numeric": 1.0,
    "report_dims_crosscheck": 1.0,
    "report_bom_deltas": 1.0
  },
  "gap_mm": 1.5,
  "final": 1.0
}
1.0

[reference] score = 1.0 (expect 1.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": false,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": false,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": false,
    "title_current_rev_b": false,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": false,
    "bom_header_exact": true,
    "bom_descriptions_exact": false,
    "callouts_exact_set": false,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[naive_a] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": false,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N1 stale REV A title] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": false,
    "bom_header_exact": true,
    "bom_descriptions_exact": false,
    "callouts_exact_set": false,
    "callout_texts_exactly_four": false
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N2 extra BOM row + extra callout] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": false,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N3 datums reordered B, A, C] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {
    "dims_updated": 1.0,
    "stackup_in_tolerance": 1.0,
    "report_stackup_numeric": 0.0,
    "report_dims_crosscheck": 0.0,
    "report_bom_deltas": 0.0
  },
  "gap_mm": 1.5,
  "final": 0.4
}
0.4

[N4 token-only report] score = 0.4 (expect <= 0.5: drawing/BOM credit only, all three report components must be 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": false,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N5 5 OUTLINE circles deleted] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": false,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N6 callout text with junk suffix] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": false,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N7 replaced part keeps Rev-A description] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {
    "dims_updated": 1.0,
    "stackup_in_tolerance": 1.0,
    "report_stackup_numeric": 1.0,
    "report_dims_crosscheck": 0.8,
    "report_bom_deltas": 1.0
  },
  "gap_mm": 1.5,
  "final": 0.97
}
0.97

[N8 report before-value tampered] score = 0.97 (expect < 1.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": false,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N9 dimension text with one decimal] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": false,
    "dims_keys_d1_to_d5": false,
    "dims_two_decimal_format": false,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N10 dimension number unparseable 'D1 1.2.3'] score = 0.0 (expect 0.0, rc=0 — no crash)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": false,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N11 sheet title 'REV Bx' (not the exact token)] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": false,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N12 DIMS label replaced by 'D6 125.50' (tag set not D1..D5)] score = 0.0 (expect 0.0, rc=0 — no uncaught stack-up lookup)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": false,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N13 delivered DXF declares metres ($INSUNITS=6)] score = 0.0 (expect 0.0)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": false,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N14 BOM qty space-padded ' 6'] score = 0.0 (expect 0.0 — plain-digit cells)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": false,
    "layers_present": false,
    "units_millimeters": false,
    "d3_converted_31_75": false,
    "dims_exactly_five_texts": false,
    "dims_keys_d1_to_d5": false,
    "dims_two_decimal_format": false,
    "outline_preserves_rev_a": false,
    "rev_b_row_present": false,
    "rev_a_row_kept": false,
    "rev_a_row_verbatim": false,
    "rev_b_description_nonempty": false,
    "title_current_rev_b": false,
    "datums_ordered_abc": false,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": false,
    "callout_texts_exactly_four": false
  },
  "scores": {},
  "error": "File 'C:\\Users\\mnb92\\AppData\\Local\\Temp\\neg05_m82sd9xu\\out\\drawing_rev_b.dxf' is not a DXF file.",
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N15 DXF = plain text] score = 0.0 (expect 0.0 — dxf_loads_clean)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": false,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N16 DATUM layer removed] score = 0.0 (expect 0.0 — layers_present/audit)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": false,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N17 D3 left in inches ('D3 1.25')] score = 0.0 (expect 0.0 — isolated d3_converted_31_75)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": false,
    "dims_keys_d1_to_d5": false,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N18 D5 dimension text deleted] score = 0.0 (expect 0.0 — dims_exactly_five_texts)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": false,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N19 REV B row ECN changed] score = 0.0 (expect 0.0 — rev_b_row_present)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": false,
    "rev_a_row_verbatim": false,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N20 REV A row deleted] score = 0.0 (expect 0.0 — rev_a_row_kept)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": false,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N21 REV A row paraphrased] score = 0.0 (expect 0.0 — isolated rev_a_row_verbatim)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": false,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N22 REV B description emptied] score = 0.0 (expect 0.0 — isolated rev_b_description_nonempty)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": false,
    "bom_header_exact": false,
    "bom_descriptions_exact": false,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N23 BOM header capitalised] score = 0.0 (expect 0.0 — bom_header_exact)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {
    "dims_updated": 0.8,
    "stackup_in_tolerance": 1.0,
    "report_stackup_numeric": 1.0,
    "report_dims_crosscheck": 0.8,
    "report_bom_deltas": 1.0
  },
  "gap_mm": 1.5,
  "final": 0.92
}
0.92

[N24 D5 = 91.00 (wrong value, format-legal)] score = 0.92 (expect exactly 0.92 — dims 4/5 + report D5 crosscheck 4/5, stack-up untouched)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {
    "dims_updated": 0.8,
    "stackup_in_tolerance": 1.0,
    "report_stackup_numeric": 0.0,
    "report_dims_crosscheck": 0.8,
    "report_bom_deltas": 1.0
  },
  "gap_mm": 0.5,
  "final": 0.72
}
0.72

[N25 gap exactly GAP_MIN 0.50] score = 0.72 (expect exactly 0.72 — boundary INCLUSIVE pass; report gap line now disagrees with the drawing)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {
    "dims_updated": 0.8,
    "stackup_in_tolerance": 1.0,
    "report_stackup_numeric": 0.0,
    "report_dims_crosscheck": 0.8,
    "report_bom_deltas": 1.0
  },
  "gap_mm": 2.0,
  "final": 0.72
}
0.72

[N26 gap exactly GAP_MAX 2.00] score = 0.72 (expect exactly 0.72 — boundary INCLUSIVE pass)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {
    "dims_updated": 0.8,
    "stackup_in_tolerance": 0.0,
    "report_stackup_numeric": 0.0,
    "report_dims_crosscheck": 0.8,
    "report_bom_deltas": 1.0
  },
  "gap_mm": 2.01,
  "final": 0.57
}
0.57

[N27 gap 2.01 (just past GAP_MAX)] score = 0.57 (expect exactly 0.57 — stack-up + its report line lost, dims/report-deltas keep partial credit)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": false
  },
  "scores": {},
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N28 5th CALLOUT text 'NOTE' (non-part)] score = 0.0 (expect 0.0 — isolated callout_texts_exactly_four)

{
  "gates": {
    "dxf_exists": true,
    "bom_exists": true,
    "report_exists": true,
    "dxf_loads_clean": true,
    "layers_present": true,
    "units_millimeters": true,
    "d3_converted_31_75": true,
    "dims_exactly_five_texts": true,
    "dims_keys_d1_to_d5": true,
    "dims_two_decimal_format": true,
    "outline_preserves_rev_a": true,
    "rev_b_row_present": true,
    "rev_a_row_kept": true,
    "rev_a_row_verbatim": true,
    "rev_b_description_nonempty": true,
    "title_current_rev_b": true,
    "datums_ordered_abc": true,
    "bom_exact_four_rows": true,
    "bom_header_exact": true,
    "bom_descriptions_exact": true,
    "callouts_exact_set": true,
    "callout_texts_exactly_four": true
  },
  "scores": {
    "dims_updated": 1.0,
    "stackup_in_tolerance": 1.0,
    "report_stackup_numeric": 1.0,
    "report_dims_crosscheck": 1.0,
    "report_bom_deltas": 0.75
  },
  "gap_mm": 1.5,
  "final": 0.9375
}
0.9375

[N29 one report BOM delta wrong (qty 4 -> 7)] score = 0.9375 (expect exactly 0.9375 — only report_bom_deltas loses 1/4)

ALL targeted negatives rejected at 0.0, except the token-only report which keeps its geometry credit (0.4 <= 0.5, all three report components 0.0) by design; partials: N24 = 0.92 (wrong D5 value), N25/N26 = 0.72 (gap AT the inclusive boundaries), N27 = 0.57 (gap 2.01), N29 = 0.9375 (one BOM delta line wrong — only report_bom_deltas loses 1/4)
