Repository navigation
Commit 4b23e4f
Part of #17242
Clause-②: no
#17242 asked for three things: re-derive the population, tense-classify
it, and answer the ratchet question with numbers. All three are done.
**The measurement inverts the card's working assumption**, so the diff
is one record rather than a cleanup — there is nothing to repair.
## 1. Re-derived population, with the historical pins reproduced as a
lit control
| reading | tree | declined |
|:--|:--|--:|
| the card's original pin | `08e38c6377` | 183 |
| the re-measure already on the card | `6465cc0a7c` | 217 |
| **this round** | `fa29803417` | **467**, across 39 files |
Before today's number was taken, the instrument reproduced
`CENSUS_17065` **verbatim at its own sha**: 1,317 files swept, 189
comment-prose line citations, 6 naming a tracked target, 183 declined,
by shape 69 bare-filename / 62 directory-qualified / 52 continuation.
Every figure matches the constant in the gate, so the instrument could
have given another answer and did not.
### The resolver changed, so the growth was re-measured with both
`scripts/symbol-anchors.mjs` was rewritten between the 217 reading and
today (655 insertions, 40 deletions), which means 217 and 467 were **not
comparable on their face**. This tree was therefore swept twice:
- the **old** resolver over today's tree: **467**
- the **current** resolver over today's tree: **467**
Identical, declined-by-shape included. Instrument drift on this axis is
**zero** and the three readings are comparable: 183 → 217 → 467 is real
population growth.
## 2. What the residual actually IS — the question the card filed as NOT
MEASURED
The card recorded two gaps explicitly: the objectui cross-repo vs
in-repo split, and how many would resolve under a spec-relative base.
Both are measured here by binding every declined citation against the
sibling objectui checkout and against this repo:
| class | count | share |
|:--|--:|--:|
| names a file that **exists in the sibling objectui repo** | 409 |
87.6% |
| names a file that **exists here**, written package-relative | 53 |
11.3% |
| binds in **neither** | 5 | 1.1% |
**462 of 467 name a file that really exists.** The two sibling trees
agree **row by row** — every one of the 467 lands on the same verdict
against the `.objectui-sha` pin
`87af769e9a3ee28ace099fdd653d3ebd79fe82e2` and against objectui `main`
`0cf2d6644bdb96a9a6784ef801ee6a60a5306bd8`, measured on the objectstack
tree `cdd68cf15ed863468ce6eecdd5c0824b760ea22a`. ⛔ A moving ref is not
an anchor, so all three shas are carried as data in `RECENSUS_17242`,
not as prose. ⚠️ **Round 2 moved these cells from 408 / 55 / 4**: the
binding predicate is now written out in full in the gate's docblock, and
under it the split is 409 / 53 / 5, with a declared sensitivity —
relaxing it for directory-qualified tokens gives 410 / 53 / 4, one row.
Continuations (191 of the 467) carry no path of their own and are
attributed to the antecedent they inherit — **188 inherit a token that
way and 3 inherit none**, which is held in `RECENSUS_17242.bindingVia`.
⚠️ An earlier revision of this paragraph added 「for 34 of them that
antecedent is named in prose」; **no field and no case carries that 34**,
and a re-derivation under one natural definition gives 36 / 152. ⛔
Unheld, so it is withdrawn rather than restated — it was neither
confirmed nor refuted.
⇒ this residual is a **SPELLING population** — abbreviated cross-repo
and package-relative citations — not the stale-citation rot its headline
number suggests.
## 3. Tense classification — the defect cell is EMPTY
A citation naming no tracked file is a defect only when the surrounding
sentence is live-tense. The classifier asserts on the live / not-live
axis and runs two controls first, refusing the population reading if
either fails:
- **live-tense wrong** — the #17730 text quoted verbatim from that card:
classified `live` ✅
- **correct historical** — the `quickAdd` retirement record: classified
`dated-measurement` ✅
Over the whole residual: 300 live, 129 dated-measurement, 38 record.
Crossed with binding, **the defect cell — binds nowhere AND live-tense —
contains 0 rows**. The **five** that bind nowhere are enumerated as data
in `RECENSUS_17242.bindingInNeitherRepoRows`, each with its coordinate,
citation text, reason and tense: one retirement record naming a file in
the `cloud` repo in prose; **two** continuations whose comment block
names its file only AFTER the citation (a backward-only walk finds
none); **one whose block names no file at all** — it declares from the
read point rather than from objectui's mirror, which the row's own `why`
says; and one whose token tail-matches in no tree. All five are correct
as written.
⛔ Note `record` and `dated-measurement` are **both** correct historical
prose; asserting the exact three-way label on a control would pin a
sub-classification the rule never asked for, so the controls assert the
live / not-live axis only.
## 4. ⛔ The trap, measured — repairing the PATH alone turns this gate
RED
The obvious cleanup is to rewrite a package-relative citation to its
repo-root spelling so it resolves. That makes the path **tracked**,
which moves the citation out of the declined set and into the judged
one, where a line number is exactly what this gate refuses.
One such repair was performed against a single citation in
`packages/spec/src/shared/union-author-message-pins.test.ts`
(`api/protocol.zod.ts:2853` rewritten to its repo-root spelling),
through `scripts/ablation-replace.mjs` so the mutation is proven on
disk:
```
anchor x1 -> x0
blob d78fd34 -> 1ac63738d490
```
The gate went from green to `❌ 1 finding(s)`, then was restored — `blob
== HEAD (d78fd34)` and `git diff HEAD` empty.
⇒ **the path is only half the repair**; the citation must also leave
anchor form. A round that "works the 467 down" by fixing spellings alone
lands one finding per repair.
## 5. The ratchet question — a recommendation, not a decision
> should the gate start judging untracked line anchors?
**Recommendation: do not flip it**, on these numbers:
- the flip would red **all 467** on day one, across 39 files — a
migration, which is the disposition the corpus already ruled against;
- of those 467, the number that are actual stale-citation defects is
**0**;
- so the flip's false-positive rate on the axis it exists to police is
**467/467**;
- and 409 of the 467 are unbindable **by construction** — they name the
sibling repo, which a resolver living here cannot see. Its only remedy
would be "stop writing that", which is the permanently-red verifier this
repo retired.
The only judgeable half is the 53 in-repo abbreviations, and §4 shows
that repairing them is a two-part change. If the residual is ever worked
down, the in-repo 53 are the tractable set and each needs the
anchor-form half too.
⛔ Adding a required gate is the maintainer's floor; this PR records the
measurement and does not change the scope call. `CENSUS_17065` is
untouched and not restated.
## Why the record lives in the gate header
The classification above **cannot be re-derived by the gate**: it needs
a checkout of the sibling objectui repo, which the gate is deliberately
not given — the same reason its cross-repo anchors are reported rather
than judged. `--list-unresolvable` enumerates the residual. ⛔ And the
stronger, truer statement: the binding harness and the tense classifier
exist **nowhere in this tree**, so the three tense totals can be
re-derived by **nothing** — not even a reader holding both checkouts.
The binding split *is* re-runnable, because the predicate is written
out. So it is kept as data beside the census it extends.
## Verification
- `pnpm lint` (repo-wide, `eslint . --no-inline-config`) — **exit 0**,
dated at `cdd68cf15e` ⚠️ (the round-1 head; ⛔ not re-dated here — CI's
`Lint & Repo Gates` is `success` at the current head)
- all **31** gate families derived by `scripts/pm/dispatch-gates.mjs`
for this change set — **31 run, 0 NOT-MEASURED, 0 UNRUN**, each with its
exit code recorded and reconciled via `--ran`
- `check-spec-docblock-symbol-anchors` and its `--self-test` — exit 0;
the residual arithmetic and the seven pinned day-one rows are unchanged
- `check-scripts-symbol-anchors` — exit 0; this file is swept by that
corpus. ⚠️ 3,653 → 3,654 was the **round-1** delta; at head `988cf276bb`
the corpus reads **3,653 → 3,659** (it read 3,658 at round 3's head;
round 4's prose added one resolving anchor), with declined unchanged at
**14** throughout, so the added prose contributes resolving anchors and
**no new residue**
- six gates first reported **exit 3 (PREREQUISITE NOT MET)** on a fresh
worktree with no `node_modules`; re-run after `pnpm install`, all exit
0. They are not reported as clean on the exit-3 reading.
## Acceptance notes
- **No label written.** The dispatch forbade label writes, so none were
made. This PR publishes nothing — the changed path is a repo-root gate
script, the root package is private, and none of the 70 packages
carrying `files[]` has an entry escaping its own directory — so
**`skip-changeset` is the correct disposition** and is owed from the
seat.
- The binding instrument's weakest leg is the prose-antecedent walk for
continuations: on generic basenames it can attribute to the wrong repo
(`index.tsx` in a docblock that is plainly about objectui binds to this
repo's only file of that name). Every such case still names a file that
exists, so it cannot create or hide a defect — it can only shift a row
between the 409 and the 53. Noted, not filed.
- The one citation binding in neither repo names a file in the `cloud`
repo in prose, with a space rather than the grammar's cross-repo prefix.
Verifying it needs a `cloud` checkout this container does not have, so
its target is **NOT MEASURED**; its sentence is a retirement record
either way, so it is not a defect on the tense axis. Noted, not filed.
---
_Generated by [Claude Code](https://claude.ai/code)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 67add13 commit 4b23e4f
1 file changed
Lines changed: 624 additions & 2 deletions
0 commit comments