You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit fe85bb3
Browse filesBrowse the repository at this point in the historyBrowse files
Split T4: the written shape of an initial is T5; fix S10's README example (#756)
* Split rules/T4: the written shape of an initial is T5; fix S10's README example
T4 (the bare letter as an initial) read two signals: the shape a
one-letter word is written in, and a bare lower-case letter's case
against the name's own words. T5 (the written shape of an initial)
takes the shape: a one-letter word with its period, in a script that
writes initials, or a bare unaccented Latin capital. Its examples are
five maiden-marker names whose given-name reading shows the initial
(J./J/Ж. initials, Ж and É name words). T4 keeps the case contrast,
which every decisions/T4 entry decided. C9, O5 and S10 cite T5 where
they mean the shape, and _vocab.is_initial quotes it.
rules/README.md's example of a cited condition said "S10's count is
S4's", which is not so: S4 states its count for ambiguous acronyms, and
the two part in a maiden clause ('Jane Doe nee Smith V' takes the
numeral, '... Smith Ma' keeps the acronym). The example is now S10's
citation of T4, and S10's one-letter count is named on its Signal line
as the size gate it is. No rule now names two signals.
The five new example names join corpus_rules.jsonl and the snapshot.
No reading moves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix the design-docs review findings on the T5 split
- M4, S10, O5, H2 and P7 name T5 in interacts:, since each leans on the
initial's shape (M4's exception is what every T5 example runs on);
T4 drops P7, whose interaction is with the shape
- P7 cites T5 for the period rather than restating the shape as its own
- T5 records as Accepted that the period test reads one word character,
as v1's did, so a digit with its period is an initial too ('1. née
Smith' → given '1.'); the example joins the corpus and the snapshot
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* P7's Signal line names what it decides, citing T5 for the period
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/design/decisions/T4-bare-letter-as-an-initial.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,3 +15,4 @@
15
15
Declined, measured: passing the whole name's fact to the view as well. It closes both (0 field and 0 report differences on a grid with one-word, two-word and titled heads) but the view also asks S6's credential lean, which P8 says is asked of the own words P3's span holds, and moving it there fails `test_a_maiden_clause_does_not_change_how_a_trailing_word_reads` (tests/v2/test_properties.py) on 270 of its 20,412 pairs (with it, `J. nee Smith BA` would read the credential where `J. BA` reads a name). Closing the gap needs the peel to take the numeral's case fact apart from the lean's — a design change beyond this fix.
16
16
Measured: the one-case grid gains `{a} {b} nee {n} {n}` and `{a} {b} nee j {n}`. ad486f66 disagreed on 36 of its 4,752 pairs, all in those shapes; this tree on none, and the fourth recorded control is that 36. 2.2.0 through 2.4.2 gave the lowercase reading above, and 2.0.0 and 2.1.0 the reading this restores (maiden 'x x'), so the release bullet for #723 carries this too. No corpus name moved.
17
17
- 2026-10-18 (Derek), #731 reverted — A MAIDEN CLAUSE'S NUMERAL IS NOT HELD TO ITS CAPITALS. The #731 entry above is superseded and its change reverted. Derek: this rule and maiden names do not really interact, because nobody writes a maiden marker followed by an initial, or two. Asked whether settling the gap that entry left open would simplify the parser, the answer was the opposite: it needs the peel to carry two case facts, one for S6's lean and one for the numeral. And #731 itself had bought `john smith nee x x` and `john smith nee j x` — both that unwritten shape — a case argument on `trailing_candidates`, a whole-name case test in the take, a stated exception to the candidates' superset contract (decisions/M2's #731 entry), two grid shapes and a second invariant with their controls, all reverted. The readings go back to 2.2.0 through 2.4.2's (`john smith nee x x` suffix 'x', maiden 'x', reported), stated as an Accepted clause of this rule with both spellings as examples. Kept from that PR: M2 naming S10 among the trailing rules its take asks, which was true before #731 and stays true. What this rule still says of a clause's letters — classify reads one by the whole name's case (the #723 code-review entry) — stands: the shape that guards is a connective inside a clause (`MARIA GARCIA NEE LOPEZ y FERNANDEZ`), which names do take.
18
+
- 2026-10-19 — RULE SPLIT: the written shape of an initial (its period, or a bare unaccented Latin capital) left rules/T4 for rules/T5, and T4 keeps the case contrast every entry here decided. Record: decisions/T5's entry of this date.
- 2026-10-19 — SPLIT FROM rules/T4, one rule per piece of evidence (docs/design/AGENTS.md): T4 read two signals, the shape a one-letter word is written in and a bare lower-case letter's case against the name's own words, and its `Signal:` line named both. The shape moved here and T4 keeps the case contrast, since every entry under decisions/T4 (#723, #727, #731) decided the case half. The shape itself is older than both rules and is recorded where it was decided: v1's `is_an_initial` (`_vocab._INITIAL`, a period after one word character or a bare A to Z capital), narrowed to scripts that write initials by #320 (decisions/initials-repertoire), and asked of the composed spelling since #665 (decisions/nfd-shapes). P7 (a one-letter particle against the initial it spells) is this shape against particle vocabulary.
Copy file name to clipboardExpand all lines: docs/design/rules/README.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,7 +13,7 @@ Every example line is EXECUTABLE. The grammar (its executable definition is `tes
13
13
14
14
An `annotation` names a policy, locale (`[ru]`), or extras gate (`[ja+segmenter]`) in the registry beside the test. `· boundary` marks the non-firing example every rule must carry: an input shaped like the rule's subject where its effect does NOT occur. That is usually the rule's OWN stated exception — H1's given-name title, P3's single-letter carve-out — not an input the rule never reaches, so the exception is executable rather than merely asserted. Or the rule declares `no-boundary: <reason>` instead, so skipping the boundary is a recorded decision. `deviates:` states the INTENDED output on the example line while the marker records TODAY's output and the tracking issue; the runner asserts today's output strictly, so a parser change that closes the gap fails the suite until the marker is removed in the same PR. `grep -r deviates: docs/design/rules/` is the deviation backlog (deviations from statable rules — coverage gaps are a separate, larger category no grep can see, and contested vocabulary memberships a third, tracked as Open blocks keyed to the vocabulary set in decisions/).
15
15
16
-
Every rule also states its `Signal:` — what in the written name it reads, for example a count, a case contrast, a shape, a neighbor, a position or a script, or `none in the name: <what it reads instead>` for a rule that reads configuration or the parsed words. The line is one line, never wrapped, standing directly above the rule's pointer line, and the parser refuses one anywhere else, since a continuation line would be read as statement prose. It is metadata, not statement: a citation cannot quote it. A hub — a decision weighing several signals, each stated by a rule of its own — ends its line `hub of C3, C4, …`, after any signal it reads itself (`Signal: <its own>; hub of C3, C4`), and every rule a hub names must be in its `interacts:` and named in one sentence of its statement, the one-line map, which the doc tests check. A line naming two signals joins them with ` + `: that rule is a split candidate under docs/design/AGENTS.md's one rule per piece of evidence, and `grep -l '^ Signal:.* + ' docs/design/rules/*.md` lists them. A condition the rule cites to the rule stating it stays off the line — S10's count is S4's — and a gate on the name's size (exactly three name words, a word to spare) is part of the signal it gates rather than a second one.
16
+
Every rule also states its `Signal:` — what in the written name it reads, for example a count, a case contrast, a shape, a neighbor, a position or a script, or `none in the name: <what it reads instead>` for a rule that reads configuration or the parsed words. The line is one line, never wrapped, standing directly above the rule's pointer line, and the parser refuses one anywhere else, since a continuation line would be read as statement prose. It is metadata, not statement: a citation cannot quote it. A hub — a decision weighing several signals, each stated by a rule of its own — ends its line `hub of C3, C4, …`, after any signal it reads itself (`Signal: <its own>; hub of C3, C4`), and every rule a hub names must be in its `interacts:` and named in one sentence of its statement, the one-line map, which the doc tests check. A line naming two signals joins them with ` + `: that rule is a split candidate under docs/design/AGENTS.md's one rule per piece of evidence, and `grep -l '^ Signal:.* + ' docs/design/rules/*.md` lists them. A condition the rule cites to the rule stating it stays off the line — S10 cites T4 for the lower-case numeral that is no initial — and a gate on the name's size (exactly three name words, a word to spare, as S10's one-letter numeral needs) is part of the signal it gates rather than a second one.
17
17
18
18
Each rule's size is recorded, as a guard rather than a cap (mechanisms.md#RECORDED-ROSTERS). `tests/v2/rules_budget.json` holds each rule's statement word count (the Rationale counted, the Accepted clauses not), the statement's `except` and `unless` (a proxy for the clauses that carve out a case), its count of Accepted clauses (a line opening `Accepted:` or `Accepted,` — the rules write `Accepted, and …:`) and their words; `tests/v2/test_rules_budget.py` fails when a rule moves against its record, shrinking included, so the record follows a rule down. A rule that has to grow re-records with `uv run python -m tests.v2.rules_budget --record`, and the PR says so: the record's diff is where a reviewer sees the growth and asks what the new words read.
19
19
@@ -117,6 +117,7 @@ The marker's unit is the whole rule, so a clause that reaches past the tolerated
117
117
-[T2 — the katakana middle dot divides like a space](T2-katakana-middle-dot-divides-like-a-space.md)
118
118
-[T3 — the interpunct's flank guard](T3-interpuncts-flank-guard.md)
119
119
-[T4 — the bare letter as an initial](T4-bare-letter-as-an-initial.md)
120
+
-[T5 — the written shape of an initial](T5-written-shape-of-an-initial.md)
Signal: a shape: a roman numeral ending the name, a one-letter one gated on a word to spare, an initial in front of it being where the shape stops deciding
0 commit comments