Skip to content

Commit a1243d6

Browse files
derek73claude
andcommitted
docs(design): coherence-pass fixes, and scope the primary-source rule
Two findings from a targeted pass over the contested pairs this branch creates. Prose reading found neither; naming the pairs and interrogating them one at a time found both. P6 and S2 contest "Berg, Jan vd" -- today S2 wins and reports suffix="vd", while P6's marker asserts family="vd Berg". Nothing said who wins. P6 does, and its statement now says so, which is how rules.md pins a contest (H2, M1 and W3 all carry precedence clauses in their statements; _CROSS_RULE_WINNERS is the ledger's instrument, not this document's). The precedence is scoped so it cannot creep: both particle and suffix vocabulary, trailing-orphan position, family comma, given word to spare. "John Smith, PhD" and "Smith, Jr." are not particles; "Jong, vd" has no given word left. R2's #385 resolution moves R3's output and R3 was silent about it. Initials read the BASE family word, so anchoring "Do" takes parse("Anh Do").initials() from "A." to "A. D."; R3 now carries its own deviates: marker, plus the "Juan van der" row where no borne name means no base and initials stay "J.". The general lesson is recorded with it: a marker lands on the rule whose STATEMENT changed, but a rule can move another rule's OUTPUT without touching its statement, and the runner cannot see it -- an unmarked downstream rule stays green because its own examples avoid the input. Walk `interacts:` when adding a marker. AGENTS.md's primary-source rule gains its missing scope. It was written for CROSS-SESSION distillation, where the source transcript is an artifact independent of the reviewing session -- #381 harvested nine such sessions. Same-session design work has no such artifact, and the instruction degenerates into re-reading the memory that produced the error. The amendment names both shapes and records the measured yield ordering from this branch: re-derived measurements 2, spec-vs-doc fidelity 1, named contested pairs 2, unaided prose reading 0. Not decided here: whether a rule with no implemented: pointer (P6 is the first) is a shape rules.md wants. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent b1d3833 commit a1243d6

3 files changed

Lines changed: 63 additions & 2 deletions

File tree

AGENTS.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,24 @@ state which tree each measurement ran on (stale fetches produced
116116
three rounds of already-fixed findings), and landed corrections are
117117
re-verified here before committing.
118118

119+
Two shapes, needing different instruments. CROSS-SESSION distillation
120+
is what the rule above is written for — the #381 arc harvested nine
121+
named sessions, and for each the source transcript is an artifact
122+
independent of the reviewing session, so "review your own sections"
123+
is a two-artifact comparison. SAME-SESSION design work (#386) has no
124+
such artifact: spec and docs were written in one context, so the same
125+
instruction degenerates into re-reading the working memory that
126+
produced any error, and the rationale inverts — when the source is
127+
NOW, the source is what got it wrong. There, compare against
128+
artifacts instead, in this measured order of yield: re-derive every
129+
number with a freshly written script (2 wrong claims on #386);
130+
re-read the written spec against a checklist for FIDELITY, not just
131+
presence (1); interrogate NAMED contested rule pairs one at a time
132+
(2). Unaided prose reading found none — so a general "coherence read"
133+
by the author is the one form to distrust, because a green report
134+
from the weakest instrument manufactures confidence rather than
135+
supplying it.
136+
119137
**Guard tests** SHOULD carry a recorded negative control — the
120138
answer with the guard off, stored as data (the _EXCLUSION_EFFECT
121139
shape; see mechanisms.md's Verification shapes).

docs/design/decisions.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,25 @@ not).
237237
as evidence about the corpus, not about the blast radius, and
238238
run tools/differential at all three baselines in the implementing
239239
PR regardless of how small this looks.
240+
- 2026-08-16 (pre-merge coherence pass) — P6 and S2 CONTEST
241+
"Berg, Jan vd": today S2 wins and reports suffix="vd", while
242+
P6's marker asserts family="vd Berg". P6 wins, and the rule says
243+
so in its statement rather than leaving the pair to file order.
244+
The reason is C-ii's, not a new judgement: vd as the British
245+
Volunteer Decoration is rarer than vd as van der, and a trailing
246+
abbreviation AFTER A FAMILY COMMA is the tussenvoegsel position
247+
specifically.
248+
Scope check on the precedence, so it cannot creep: it reaches
249+
only words that are both particle and suffix vocabulary, in the
250+
trailing-orphan position, under a family comma, with a given word
251+
to spare. "John Smith, PhD" and "Smith, Jr." are untouched (not
252+
particles), and "Jong, vd" is untouched (no given word remains),
253+
which is why that row stays out of scope rather than becoming a
254+
counter-example.
255+
Recorded because the pair was declared in `interacts:` and left
256+
unresolved — `interacts:` is advisory by design and pins nothing,
257+
so a declared interaction is a prompt to state the outcome, not a
258+
substitute for stating it.
240259

241260
Open: [#380](https://github.com/derek73/python-nameparser/issues/380)
242261
covers "Berg, Jan vd" under this rule, but the vd reading itself is
@@ -1273,6 +1292,20 @@ Declined:
12731292
- Still open inside the resolution: whether "Do" remains in
12741293
family_particles once it is also the base. Recorded here rather
12751294
than left to the implementing PR to decide by accident.
1295+
- 2026-08-16 (pre-merge coherence pass) — the resolution moves R3
1296+
too, and R3 now carries its own marker. Initials read the BASE
1297+
family word, so anchoring "Do" changes
1298+
parse("Anh Do").initials() from "A." to "A. D." while
1299+
"Juan van der" stays "J." (no borne name, no base, and initials
1300+
of a bare particle run would be nonsense).
1301+
The general lesson, worth more than this instance: a deviates:
1302+
marker gets written on the rule whose STATEMENT changed, but a
1303+
rule can change another rule's OUTPUT without touching its
1304+
statement, and nothing looks for that — the runner asserts per
1305+
example line, so an unmarked downstream rule stays green
1306+
precisely because its own examples avoid the affected input.
1307+
When adding a marker, walk the changed rule's `interacts:`
1308+
targets and ask whether any of THEIR examples move.
12761309

12771310
### removed-v1-surface
12781311

docs/design/rules.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,11 @@ P6. Rationale: a particle ending the name has nothing to link
256256
ending the name attaches to that family name and is written
257257
before it — provided at least one given word remains, so that a
258258
name whose only given word is the particle keeps it (the
259-
words-to-spare test S2 applies to ambiguous suffixes).
259+
words-to-spare test S2 applies to ambiguous suffixes). Where
260+
the word is BOTH a particle and suffix vocabulary, this
261+
attachment outranks the suffix reading (S2): a trailing
262+
abbreviation after a family comma is the tussenvoegsel far more
263+
often than the decoration it collides with.
260264
"Jong, Anke de" → family="de Jong" deviates: #379 (today: family="Jong")
261265
"Beethoven, Ludwig van" → family="van Beethoven" deviates: #379 (today: family="Beethoven")
262266
"Berg, Jan vd" → family="vd Berg" deviates: #380 (today: family="Berg")
@@ -758,8 +762,14 @@ R3. Rationale: initials abbreviate the person's name words; titles,
758762
family word; titles, suffixes, particles and nicknames
759763
contribute nothing.
760764
"Dr. Juan Q. Xavier de la Vega III" → initials="J. Q. X. V."
765+
"Anh Do" → initials="A. D." deviates: #385 (today: initials="A.")
761766
"Sean O'Connor" → initials="S. O." · boundary
762-
implemented: nameparser/_render.py
767+
Accepted: a family that is ALL particles contributes nothing,
768+
so the initials are the given words alone — "van der" has no
769+
borne name to anchor a base (R2), and initials of a bare
770+
particle run would be nonsense.
771+
"Juan van der" → initials="J."
772+
history: decisions.md#R2 · interacts: R2 · implemented: nameparser/_render.py
763773

764774
R4. Rationale: case repair is a display concern, applied only on
765775
request and never destructively.

0 commit comments

Comments
 (0)