Skip to content

Split rules/C1 and decisions/C1 into one rule per piece of evidence - #734

Merged
derek73 merged 6 commits into
masterfrom
feat/c1-split-728
Oct 19, 2026
Merged

derek73 merged 6 commits into
masterfrom
feat/c1-split-728

Conversation

@derek73

@derek73 derek73 commented Oct 19, 2026 •

Copy link
Copy Markdown
Owner

Closes #728.

rules/C1 (the suffix-comma decision) had grown to 352 lines holding ten rules, each with its own evidence. This splits it the way #716 split S2. There is no behavior change: the 103 example lines all carry over (plus one policy-annotated line on an existing name), corpus_rules.jsonl rebuilds byte-identical, and the snapshot matches.

ID Rule
C1 the suffix-comma decision (keeps the word count, the lenient/strict knob, the CJK-honorific Accepted clause, and a one-line map of C3–C11)
C3 counting the words before the comma (#575, #613(1); the Freiherr Accepted clause)
C4 the ambiguous credential class at the comma (#544, #554, #562)
C5 paired initials after the comma (#563; the G.J.R. Accepted clause)
C6 an unlisted all-caps word needs the name's case contrast (#564)
C7 a postnominal part is read before any join (#613(3), #617, #636)
C8 the listing form's part after the comma (#296, #325, #603; the Ms. Accepted clause)
C9 a one-character suffix word inside a comma part (#430, #432; the further-comma Accepted clause)
C10 a declared delimiter parts a trailing suffix part (#549; the maiden-marker and delimiter-core Accepted clauses)
C11 what the comma decision reports (#544, #562, #641)

C2 keeps its ID, so the new rules take C3–C11. Each new rule has a short Rationale drawn from its statement. So that every rule carries a boundary, C11's John Smith, PhD DO DO (reporting nothing) gained a · boundary mark. C10's boundary is its Accepted clause's own input run under the dash policy, a new example line on an existing corpus name. C7 declares no-boundary:, pointing at P5's Salam, abd Allah.

decisions/

Retargeting

Every rules/C1, decisions/C1 and bare C1 reference was retargeted by what it meant. That covers code and test comments, tests/v2/cases.py notes, other rules' prose and interacts: lines, other decisions entries, mechanisms.md, AGENTS.md and two release-log pointers (now R1). References to the decision as a whole stay on C1. Three new quoted citations give C3, C7 and C9 an implemented: list the citation check holds: C3 and C7 in _comma.py, C9 in _assign.py. _RETIRED_EXCERPTS' C1 row now names C7, where that text went. One case note, bare_ambiguous_acronym (John Ed), credited C1 for a no-comma reading. It now cites S6, the rule that states it.

Open question (for Derek)

#611's entry spans C1, S2 and P6, and it stays in decisions/C1 for now. Should it stay there, or move to mechanisms.md's field notes?

Verification

  • Full suite: 21,465 passed after merging master (Should john smith nee x x read like JOHN SMITH NEE X X? A shape-only numeral in a maiden clause #731 and its revert Revert #731's maiden-clause numeral fix; accept the shape in T4 #733). ruff and mypy are clean.
  • tools/differential/build_rules_corpus.py rebuilds corpus_rules.jsonl with no diff.
  • Design-docs reviewer. It ran axes 1–10 and skipped 11, since no rule's behavior changed. It confirmed that every old statement sentence, Accepted clause, example line and decisions paragraph lands exactly once, and that every condensed baseline matches its PR's merge parent. Its 13 findings are fixed in the third commit:
    • C10's first boundary had no policy annotation, so the rule never ran on it.
    • C7's waiver reason was wrong for P2 and P3.
    • C3's and C4's new Rationales overclaimed.
    • The split note misled where a moved pointer meant a piece now in another file.
    • One condensed count lost its non-hand-read mover.
    • Three collapses dropped clauses that are still in force.
    • The rest were interacts: and pointer touch-ups.
  • PR review (comment analyzer and AGENTS.md reviewer): every retarget checked, and its findings are fixed in the fourth commit. One note read "C11's exception" where it meant C11's report. "C10's Accepted entry" now names which of its two Accepted entries it means. A C1 credit in a note now goes to C8, where the reading is stated. Older decisions pointers in S9, S7 and suffix-acronym-collisions that meant C4, C5 or C6 now name them. The word count above was corrected.
  • Lesson recorded in docs/design/AGENTS.md's ID-split paragraph: retarget each pointer that names a piece, and read the new prose a split writes against its piece's exceptions.

🤖 Generated with Claude Code

derek73 and others added 3 commits October 18, 2026 20:40
…728)

rules/C1 held ten rules. C1 keeps the decision itself (the word count,
the lenient/strict knob and the CJK-honorific Accepted clause) and a
one-line map of the rest; C3-C11 take the counting of the words before
the comma, the ambiguous credential class, paired initials, the
all-caps contrast, the postnominal part read before any join, the
listing form's part after the comma, the one-character suffix word,
the declared delimiter, and what the decision reports. Every example
line and Accepted clause moved to the rule it witnesses: the 103
example lines are the same set and corpus_rules.jsonl rebuilds
byte-identical. Two lines gained a `· boundary` mark and C7 a
no-boundary: reason, so each new rule carries one. No behavior change.

decisions/C1 is split by the rule each entry decided. The #429,
#436/#437 and #511 entries, which decide R1's entry pass, move to a
new decisions/R1, and R1's history points there. The WHAT MOVES,
COST, BLAST RADIUS, VIEWS and RE-PINNED paragraphs are cut to one line
each (population, counts, baseline, PR), and superseded passages
(#562, and the "segment decides" wording in #575 and #603) to their
decision and what replaced it. #611 stays under C1, as the issue asks.

Every rules/C1, decisions/C1 and bare C1 reference in code, tests,
cases.py notes, other rules, decisions, mechanisms.md, AGENTS.md and
the release log is retargeted by what it meant. Three new quoted
citations (C3 and C7 in _comma.py, C9 in _assign.py) give those rules
an implemented: list the citation check holds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A split note's "means the rule as it then stood" holds only for pointers to
the whole rule, and a split's new Rationales and boundary marks are
normative text no guard reads. Both were found by the design-docs review
of the C1 split.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- C10's boundary is the Accepted clause's own input under the dash
  policy; the unannotated Steven Hardman line moves to C8, which it
  witnesses
- C7's no-boundary reason names P5's example, the only one that parses a
  joined listing-form given part
- C3's and C4's Rationales no longer overclaim (a connective surname
  counts its words; paired initials are the count's exception)
- 'John Smith, PhD Jones' reporting moves from C8 to C11
- S9, S6 and C8's interacts: name the pieces they lean on
- moved decisions pointers that meant a piece now elsewhere name it,
  as do five older pointers in S6, S4, P3, v1-xfail-triage and cases.py
- the condensed #603 line keeps the one non-hand-read mover; the
  collapsed #575, #430 and #613 lines keep the clauses still in force
- decisions/C4's entries are back in date order

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@derek73 derek73 added the docs Documentation fixes and updates label Oct 19, 2026
@derek73 derek73 self-assigned this Oct 19, 2026
@codecov

codecov Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.04%. Comparing base (09fc524) to head (f6b379e).

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #734   +/-   ##
=======================================
  Coverage   99.04%   99.04%           
=======================================
  Files          46       46           
  Lines        4589     4589           
=======================================
  Hits         4545     4545           
  Misses         44       44           

☔ 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.

- cases.py: a note read "C11's exception" where it meant C11's report
  (as assign's twin comment already says); a note credited C1 for the
  all-suffix part C8 reads; the C10 note names its maiden-marker
  Accepted entry
- _comma.py and test_properties.py name C10's core-is-a-word Accepted
  entry, since C10 has two
- _group.py, test_group.py, _types.py and two case notes name C8 or C11
  beside C1/C4/C5 where those state the clause
- decisions/S9, S7 and suffix-acronym-collisions: pointers to the #544
  run, the dual sentence and the all-caps examples name C4, C5 and C6

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@derek73
derek73 merged commit 65093cf into master Oct 19, 2026
12 checks passed
@derek73
derek73 deleted the feat/c1-split-728 branch October 19, 2026 04:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation fixes and updates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Split rules/C1 into the ten rules it holds, and condense decisions/C1: 352 lines and 17,500 words are too long to review

1 participant