Skip to content

Split the eight two-signal rules: P8, P9, C13, and S2's periods clause to S3 - #755

Merged
derek73 merged 8 commits into
masterfrom
docs/split-signal-candidates
Oct 19, 2026
Merged

derek73 merged 8 commits into
masterfrom
docs/split-signal-candidates

Conversation

@derek73

@derek73 derek73 commented Oct 19, 2026 •

Copy link
Copy Markdown
Owner

After #745 gave every rule a Signal: line, eight rules had a line naming two signals, which marks them as split candidates under docs/design/AGENTS.md's "One rule per piece of evidence". Derek decided each one as recommended. After this PR, T4 is the only split candidate left (grep -l '^ Signal:.* + ' docs/design/rules/*.md).

Three new rules

One clause moved, no new ID

  • S2's "an ambiguous acronym written with its periods" clause, with its Rationale sentence and the M.A., M.Eng. and Jack Ma. examples, moves to S3 (credentials written with interior periods). The recommendation said S4. It went to S3 because S3's signal is the periods shape. S4's signal is the words-to-spare count, so putting the clause there would have made S4 the next split candidate. docs/design/AGENTS.md now records this check.

Kept, re-cited

  • S10 (the trailing roman numeral) cites T4 instead of restating T4's case conditions.
  • C9 (a one-character suffix word inside a comma part) cites C2 for the further comma.
  • T4 (the bare letter as an initial) is unchanged and remains a split candidate. An intermediate commit reworded its line as one signal; it is restored, because the case read compares a letter with the rest of the name, which is a case contrast and not a shape. Whether to split off the period half is left for a later decision.

Other changes

  • Every reference that meant a moved piece is retargeted: code comments (quotes still checked by test_doc_citations.py), tests, cases.py notes, other rules, decisions, mechanisms.md, AGENTS.md and docs/modules.rst. Each moved decisions entry carries a split note.
  • tests/v2/rules_budget.json is re-recorded. P3 shrinks from 1026 to 628 words. P8, P9 and C13 are new records. S3 grows by the moved clause.
  • The split-candidate test no longer asserts that the list is non-empty. It also checks the recipe against a synthetic rule of each kind, so it keeps testing the recipe once T4 is resolved.

Behavior: no change. Every example line is the same set, and corpus_rules.jsonl is unchanged.

Review: the design-docs-reviewer ran on the branch and again on its fix commit. Every finding was fixed except one, left for Derek: S10 still applies its own words-to-spare count for numerals. It cites S4 for it, per rules/README.md's "S10's count is S4's". The reviewer's other open point, that T4's one-signal line mislabeled its case read, is resolved by restoring T4's two-signal line.

Full suite: 21855 passed. mypy and ruff are clean.

🤖 Generated with Claude Code

derek73 and others added 7 commits October 19, 2026 12:48
rules/P3 stated two signals: a connective between name words, and a
single-letter connective's case against the name's own words. P8 (a
single-letter connective against the initial it spells) takes the case
contrast: the initial reading, its report and "connects nothing", the
marked set, the views, the #383 parity breaks and the declined-marker
clause. P3 (connectives) keeps the join, its three-word count, the
one-name-word count, the generational connective, the separator and the
own-words span both rules ask over.

decisions/P8 takes the #267, #383/#479 (with its amendments) and #478
entries; the #397 and #721 entries stay under P3. Every reference that
meant the case half is retargeted to P8. No behavior change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rules/P2 and rules/P6 each stated a second signal, and it was the same
one: what stands beside a word of both the particle and the suffix
vocabulary at a family comma. #573 decided both sites at once. P9 (a
particle that is also a suffix word, beside a family comma) takes P2's
clause on the part before the comma and P6's third exception, a lone
such word inside a run of post-nominals after it, with their examples.
P2 keeps the forward chain and P6 the attachment, which cites P9 for
its third exception as it cites S6 and S7 for the first two.

The #573 entry moves from decisions/P6 to decisions/P9, with
cross-references left in P6, P2, S5 and C4. No behavior change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rules/C8 read two signals in the part after a family comma: whether it
holds a name word, and a credential opening it. C13 (a credential
opening the part after the comma) takes #603's half, the opened run
with its strict-mode, one-word-path and title/suffix-dual boundaries
and examples. C8 (the listing form's part after the comma) keeps the
part of no name word and the part that is nothing but suffix words,
and its dual Accepted clause. C1's hub map and Signal line name C13.

The #603 entry moves from decisions/C8 to decisions/C13, a
cross-reference left behind. C8's citation moves to the reading in
_comma.decide that implements it, since its old one quoted C13's text.
No behavior change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rules/S2 read two signals: the position of a suffix word, and an
ambiguous acronym written with its periods. The periods are a shape,
which is the signal rules/S3 (credentials written with interior
periods) reads, so the clause, its rationale sentence and its three
examples (M.A., M.Eng., Jack Ma.) move there; S2's map names S3 for
it. S2's Signal line is now its one position. Putting it in S4
instead, as first proposed, would have given S4's count a second
signal of its own.

The two code citations that quoted the clause under S2 now quote it
under S3, and "S2's period gate" in tests and decisions is S3's. No
behavior change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
S10 (the trailing roman numeral) restated T4's condition twice, the
one-case letter in front and the lower-case numeral in a mixed-case
name being no initial; both now cite T4, and the initial in front is
the boundary of S10's own shape. C9 (a one-character suffix word inside
a comma part) cites C2 for the further comma that names the suffix. T4
(the bare letter as an initial) keeps both marks of an initial, its
period and its case, as one signal, which is how its Rationale frames
them.

No Signal: line names two signals now, so the split-candidate test no
longer asserts the list is non-empty; it holds the recipe to a
synthetic rule of each kind instead. rules_budget.json is re-recorded
for every rule these splits moved. docs/design/AGENTS.md records that a
moved clause goes to the rule whose Signal: line already reads it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- five pointers that meant the case half of P3 now name P8:
  decisions/P3's own-words "entry above", decisions/R4's #478 entry
  (twice), decisions/R5's #492 entry, decisions/S10's john i dr. report
  and test_lexicon.py's e-not-y provenance
- decisions/suffix-acronym-collisions' first "S2's period gate" gets the
  same S3 parenthetical as its second
- P3 no longer states the case half of the own-words span: whether a
  declined marker's case is asked, and the rules that ask the case
  question over the span, are P8's
- C13 cites C8 for the comma that fixes nothing rather than restating
  its positional-read consequence

rules_budget.json re-recorded for P3, P8 and C13.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@derek73 derek73 added docs Documentation fixes and updates tests design labels Oct 19, 2026
@derek73 derek73 self-assigned this Oct 19, 2026
@derek73 derek73 added this to the 2.6 milestone 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.05%. Comparing base (d373055) to head (6d99ba5).

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #755   +/-   ##
=======================================
  Coverage   99.05%   99.05%           
=======================================
  Files          47       47           
  Lines        4642     4642           
=======================================
  Hits         4598     4598           
  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.

T4 (the bare letter as an initial) reads a shape, the period after a
one-letter word, and a case contrast, a bare letter's case against the
name's own words: the second compares the word with the rest of the
name and is no shape. The one-signal wording hid that, so T4 lists as a
split candidate again, its split left for a later decision.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@derek73
derek73 merged commit e9855df into master Oct 19, 2026
12 checks passed
@derek73
derek73 deleted the docs/split-signal-candidates branch October 19, 2026 20:49
derek73 added a commit that referenced this pull request Oct 19, 2026
…s.md, compact shipped measurements (#759) (#764)

* Archive decisions/differential-ledger to tombstones and the retirement entry (#759)

The ledgers #664 retired took 33,103 words across eleven arcs, every
one superseded by the snapshot. Each arc is cut to a tombstone under
decisions/README's rule 3 (date, issue, verdict, SUPERSEDED by
2026-10-13 #664); the retirement entry stands in full. The three
passages other entries cite stay as one line each: the 'Donald mc'
decline (decisions/suffix-acronym-collisions, decisions/v1-xfail-triage),
the initials view (decisions/R4, the 2.3.0 release log) and the
Policy-annotation Declined entry (decisions/3-0-reevaluations). The
full text is pointed to at fe85bb3.

mechanisms.md#RECORDED-ROSTERS said the entry keeps the ledger
rosters' measurements; it now points to git through it.

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

* Tidy mechanisms.md: one paragraph per label, contracts without case history (#759)

Every entry's template labels (Problem shape, Contract statement, How
it works, Lives in, Reach for it when) now open their own paragraph.
That is load-bearing and the preamble says so: test_doc_citations
reads a Contract statement to the end of its paragraph, so in the
one-paragraph layout every sentence of an entry was quotable.

ONE-PREDICATE-PER-QUESTION (1,856 words) and RENDER-HONORS-THE-PARSE
(2,771) are cut to their contract, a short How it works and pointers.
The two sentences code comments quote from outside the old contract
proper ("where the reader comes AFTER the decider, ..." in _group.py,
"a token the parse never saw ..." in _render.py) move into the
Contract statement paragraphs, so no comment in nameparser/ changes.
The instance census and the case history are in git at fe85bb3 and in
the decisions entries the rosters now name; the one piece no decisions
entry held, the facade's spliced-field divergence under a caller's
conjunction (#528, measured 2026-09-13 and re-run on this tree), moves
to decisions/R3 as a dated entry.

LEDGER-RULE-SEPARATION and CROSS-RULE-OUTCOME-PINS, both already
"Retired with the ledgers" stubs living in nothing, are removed; the
only references left are prose names in decisions/differential-ledger.

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

* Compact shipped measurements and superseded passages in the largest decisions files (#759)

A sweep under decisions/README's rule 3 over the 22 largest files after
differential-ledger, every change checked shipped in v2.5.0 or earlier
(the unshipped PRs are #737, #741-#746, #755, #756). Three triggers
only: a whole entry headed SUPERSEDED by, cut to a tombstone; a
superseded passage inside a live entry, cut to its decision and what
replaced it; a measurement paragraph of a shipped change (what moves,
cost, blast radius, gate and grid results), cut to one line naming
population, counts, baseline and PR. Verdicts, reasons, Accepted costs,
Declined/Excluded/Open blocks, measurements of declined or unshipped
changes, harvested framing lines, and anything quoted or pointed at
from elsewhere stay. RECOMPUTE recipes a release-log bullet rests on
stay; others fold into the one line with their PR.

The two #731 entries (decisions/M2, decisions/T4), reverted by PR #733
the same day, gain the SUPERSEDED by marker rule 1 asks for and become
tombstones.

About 13,400 words come out across the 22 files (M2 14,882 -> 12,190,
R4 13,819 -> 12,877, the rest listed in the PR).

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

* Fix the design-docs review's findings on the #759 trim

- decisions/T4: the #731 tombstone had cut a gap and a declined option
  that predate #731 (ad486f6) and still stand; both are restored
  verbatim under the tombstone, re-measured on this tree.
- decisions/differential-ledger: the tombstones keep the tooling and
  dormancy arcs' harvested framing lines (rule 3: "a tombstone
  included"); the `_check_tree` and DEFAULT_BASELINE Declined entries,
  about code and process that survive the ledgers, stand as written;
  the initials-view tombstone says the 2.3.0 release bullet's evidence
  is at fe85bb3.
- decisions/H5: the population line no longer calls `毛 泽东 Dr.` a
  rules example; the #623 line keeps the corpus-and-case-text null
  result and the 500-parse characterization; three bold heads keep
  their closing period.
- decisions/S2: the #614 line no longer classifies the stress grid's
  8,472 movers, which were not classified; it gives the 12-parse slice
  that was.
- decisions/S6: the frame totals decisions/S9 says "hold exactly" are
  back; the verification-round head keeps "AND ITS RECIPE".
- decisions/R3: the facade spliced-field divergence moved from
  mechanisms.md is a continuation of the 2026-09-13 #528 entry rather
  than a second entry of that date, so the existing pointers to "the
  2026-09-13 #528 bullet" resolve to one entry.

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

* Fix the second review's findings; record the compaction traps in rule 3 (#759)

- decisions/differential-ledger: the initials-view tombstone gave the
  cluster sizes as 19 / 66 / 11 / 2, which is cluster (iii) split by
  vocabulary; the three clusters are 27 / 14 / 98.
- decisions/T4: the restored gap paragraph was written under #731 and
  names "the committed grid", which the revert deleted; the lead now
  says so, points at PR #732, and scopes the re-measurement (the 108
  and the readings hold on a rebuild; the 270 was not re-run).
- decisions/H5: the #623 frames line said frames move "only" where a
  part holds a particle; the names without one moved too, and pay less.
- decisions/README rule 3 gains the two traps the reviews found, so
  the next compaction meets them: a tombstone keeps what the entry
  recorded about the state before its change, and a one-line
  replacement keeps each count's own classification.

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

* Scope T4's declined-option claim; fold the tombstone trap into rule 3's definition (#759)

Third review round, on a4fed35:
- decisions/T4: the lead scoped only the 270 as un-re-run; the
  paragraph's "closes both (0 field and 0 report differences)" is the
  same #731-era measurement. An approximation of the option re-run
  2026-10-19 closes the fields but leaves 27 of 396 rebuilt pairs
  differing in their reports, so the lead now says the claim is
  #731's, unconfirmed since.
- decisions/README rule 3: the new trap sentence changed what a
  tombstone keeps without amending the definition two sentences
  earlier, which still read as a complete list. The definition now
  says it, and the trap sentence keeps only the one-line-replacement
  half.

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

design docs Documentation fixes and updates tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant