Skip to content

Record the #495 decline, and correct a tier figure that shipped in #499 - #500

Merged
derek73 merged 1 commit into
masterfrom
claude/decisions-radar-only-rules
Sep 3, 2026
Merged

Record the #495 decline, and correct a tier figure that shipped in #499#500
derek73 merged 1 commit into
masterfrom
claude/decisions-radar-only-rules

Conversation

@derek73

@derek73 derek73 commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Records the #495 decline, and corrects a figure that shipped in #499.

Why #495 closed as not planned

It asked whether ledger rules that only explain radar-tier names still earn
their place. Measured at baseline 1.4.0, 19 of the 72 explaining rules explain
only radar names
— 48 of the 352 intentional diffs. That is not the five the
issue named; it is a SUPERSET of them, containing all three rules #495's own
option 2 proposed deleting.

What kills the criterion is what deletion actually does. Driving classify()
over each of the 48 diffs with its own rule removed: 25 report UNCLASSIFIED
and 23 are claimed by a DIFFERENT rule
— nine of fix(cjk-comma-compound)'s
eleven land on fix(cjk-glued-honorific-peel), all seven of
fix(cjk-comma-honorific-peel)'s land on the compound rule, 'Carod i' lands on
the roman-numeral fix(suffix-routing). So for nearly half the population
deleting is not merely wasteful, it is a MISLABEL — the rule-broader-than-the-diff
absorption this file already names twice.

The criterion that does justify deleting a rule is that it explains NOTHING,
which dormant already names and the dormancy check already enforces.

The five precedes_narrower exemptions citing #495 described it as a live
question in the present tense; all five now read as decided. The #496 decline
that leaned on it still stands on its own reasoning — nothing can demand the twin
rule, which is not what #495 settled.

The corrected figure

expected_since_1.4.0.toml has said since #499 that the routing rule "explains
eight of which six are contract". At baseline 1.4.0 it is five.

Not a mis-map: six is what tiering by FILE MEMBERSHIP gives from a correct
_CORPUS_TIERS. 'John Smith, Dr.' sits in corpus_issues.jsonl (radar, no
shape) and corpus_shapes.jsonl (contract, shape 4, FAMILY_FIRST,
min_baseline 2.0.0). The dedup key is (name, order), so the shape-4 copy is a
SECOND entry rather than the dedup winner — verified at baseline 2.0.0, where the
run compares both — and at 1.4.0 it is among the seven the baseline-minimum skip
drops. The only entry a 1.4.0 run compares for that string is the radar one.

Tier, in any claim scoped to a baseline, is a property of the ENTRY that run
compared — not of the files the string appears in.
Measured: 24 of the 352
explained names sit in files of both tiers, 2 of those carry a shape tag, and
exactly 1 bites at 1.4.0. File-membership tiering gets 1 of 352 wrong;
entry["tier"] gets it right for free. The radar-only count of 19 is identical
under either tiering.

Three traps in one measurement, all recorded in the RECOMPUTE recipe

Two of them produced wrong answers during this work:

  1. Report truncation (names[:10], no "and N more" line) — harmless for this
    predicate, because contract files load first so contract names occupy the
    prefix; first-ten-only still gives 19. Recorded because it looks dangerous.
  2. Naive repr parsing — gives 20. "'Smitty' Dr. Jones" renders with double
    quotes because the name contains single ones, so strip-the-quotes drops
    fix(#410)'s only contract name. ast.literal_eval is the fix.
  3. File-membership vs compared-entry tier — the one above, and the only one of
    the three that changes an answer on this tree.

Verification

Full suite 6467 passed, 156 skipped, 5 xfailed; ruff clean; mypy clean on 111
source files. Gate at all four baselines, exit 0 each: 352 / 247 / 155 / 14
intentional, 0 unexplained, 0 radar-unclassified.

Prose only — no rule, name_regex, fields, orders or file order changed.
design-docs-reviewer ran the eleven axes over the first draft and returned seven
confirmed findings; this is the rebuild, plus the shape-tag correction found while
fixing one of them.

🤖 Generated with Claude Code

…deletion measures

The Declined bullet on #495 reached the right conclusion through
seven wrong claims. Rewritten on the measurement that actually
refuses the criterion, and the five ledger exemptions citing #495
now record its answer instead of posing it.

CORRECTS A FIGURE THAT SHIPPED IN #499: the fix(comma-family)
routing-rule exemption in expected_since_1.4.0.toml said it
explains "eight of which six are contract". It is FIVE. Six is
what tiering by file membership gives from a correct
_CORPUS_TIERS -- it counts 'John Smith, Dr.' contract because
corpus_shapes.jsonl holds a copy, but that copy carries shape 4,
whose FAMILY_FIRST order makes it a second (name, order) entry
rather than the dedup winner, and shape 4's min_baseline of 2.0.0
skips it at this baseline. The only entry a 1.4.0 run compares for
that string is the radar one. Tier in a baseline-scoped claim is a
property of the ENTRY the run compared; the general trap is now
recorded in the bullet's RECOMPUTE line, where 2 of the 24
both-tier names carry a shape tag and exactly 1 bites at 1.4.0.

Measured at baseline 1.4.0 by driving classify() over each of the
48 diffs with its own rule removed: 25 report UNCLASSIFIED and 23
are claimed by ANOTHER rule (26 and 22 with all 19 deleted at
once). So for nearly half the population deleting mislabels rather
than merely loses -- the rule-broader-than-the-diff absorption
decisions.md#H1 and the fields-only arc already name.

Also corrected in the bullet: UNEXPLAINED cannot happen on a radar
tier (both NOT WANTED names are radar; measured, removing both
rules gives unexplained 0, radar unclassified 1); the 19 is a
SUPERSET of what #495 proposed deleting, not a different set; the
wrong count of 20 came from a repr-parsing bug, not from the
report's ten-name truncation, which cannot flip the predicate;
feat(#269) and fix(#360) name families, so the rules are named;
and the WATCH quote belongs to decisions.md#cjk-comma-demotion.

The RECOMPUTE recipe is replaced by one that was run: wrap
_run_worker and classify() around an unchanged compare.main() and
read tier off entry["tier"], rather than joining names to files by
hand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@derek73 derek73 added this to the v2.3 milestone Sep 3, 2026
@derek73 derek73 added docs Documentation fixes and updates tooling labels Sep 3, 2026
@derek73 derek73 self-assigned this Sep 3, 2026
@codecov

codecov Bot commented Sep 3, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.66%. Comparing base (777c1ec) to head (f736563).

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #500   +/-   ##
=======================================
  Coverage   98.66%   98.66%           
=======================================
  Files          45       45           
  Lines        3219     3219           
=======================================
  Hits         3176     3176           
  Misses         43       43           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@derek73
derek73 merged commit 514a2a1 into master Sep 3, 2026
11 checks passed
@derek73
derek73 deleted the claude/decisions-radar-only-rules branch September 5, 2026 23:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation fixes and updates tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant