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
derek73 added a commit that referenced this pull request Oct 19, 2026
…743)

* Add one-rule-per-piece-of-evidence and review axis 12 to docs/design/AGENTS.md

S2 and C1 each grew by sound clauses, every review passing, until #716
and #728 split them after the fact. The principle those splits applied
was written only in their commit messages. State it where the next rule
author meets it: a rule states one signal and what it decides, a
decision weighing several is a hub with a one-line map, and new
evidence is a new rule rather than a new clause. Axis 12 asks the
reviewer to name the signal each added clause reads, as a structural
finding the reviewer's style ban does not cover.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* State the decisions edit rules and try a Standing block on decisions/C1

"Append-only in spirit" left unclear which edits were allowed, and #728
had already compacted entries under it. The README now names three:
a changed decision is a new entry with SUPERSEDES/SUPERSEDED BY, a
factual error is corrected in place with a note, and superseded entries
and shipped measurement paragraphs compact on a stated trigger. Every
entry opens with its verdict.

A `## Standing` block indexes the decisions in force, each line ending
with the entry that decided it, and is the one part edited freely.
decisions/C1 tries it first; writing it found the #611 entry's "the
rethinks are filed, not done" stale since #613 and #614 shipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Check every Standing line against the log; compact #613's measurements

standing_findings() reads a decisions file's Standing block and reports
a bullet with no `— <date> #N` pointer, a pointer matching no log entry
or only superseded ones, a Not-standing pointer matching nothing, and a
Standing block with no Log. Synthetic rows break each one, and the
real-tree test fails if no file carries a Standing block, so it cannot
pass vacuously. It cannot see a decision in force that Standing omits;
that half stays with the reviewer.

#613 shipped in 2.4.0, so its WHAT MOVES and COST paragraphs and the
review round's clock figures are cut to one line each, per the
README's compaction rule. The decisions they sat beside are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fix the design-docs review's findings on the Standing convention

Two review rounds. The detector treated an entry announcing what it
replaces (M2's #549 "SUPERSEDED:", R4's "SUPERSEDED IN PART:") as
superseded; only `SUPERSEDED by` marks one now. Pointers match the
entry's exact date and the FIRST issue its head names, so a later issue
in a partial-supersession note cannot answer for its entry; every
date-and-issue pointer after the dash is checked, and a date-only
pointer reaches an entry whose head names no issue. Each new row fails
on the previous detector.

The README's headline rule binds new entries only; it gains the
partial-supersession form (C3's #575 head), lets compaction cut a
superseded passage inside a live entry, keeps a harvested entry's
framing line through it, and defines Not standing as a plan carried out
or a schedule overtaken, a reversal by a later decision being marked
instead. C1's Standing gains the bound-caps-word decision. AGENTS.md
cites the splits by issue with their PRs (#682/PR #716, #728/PR #734)
and states what C1 and S2 still lack as hubs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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