Skip to content

[finding] An evidence-based registrar route reaches 14 more client-bound rows and closes the storage ledger — but it redefines "registrar" to include Zod contract declarations, and admits 3 non-registrars #11857

Description

@os-steve

Measured while investigating #11178, and deliberately not landed there. #11178's premise was falsified (the auth surface is unreachable because it has no in-repo registration site at all, not because discovery misses one), so the evidence route below does not serve that card — but it is a real, measured improvement to a different population, and it carries a contract question that deserves its own ruling rather than riding along.

Filed unassigned and unlabelled for grading. ⛔ Not a claim on anyone's time.

What was measured

scripts/docs-audit/affected-docs.mjs discovers route registrars by filename convention:

REGISTRAR_FILE_RE = /(?:^|\/)(?:[\w.-]*route[\w.-]*|[\w.-]*-server)\.ts$/   // :287

An additional admission route — admit any non-test packages/**/*.ts whose masked source yields ≥1 route tail through the real parseRegistrarSource — was implemented and measured on origin/main @ a6eca9223, then reverted (tree restored byte-identical under a trap … EXIT INT TERM, sha back to 839fe0c5).

reading before after
registrar files scanned 12 20
route tails produced 43 82
client-bound rows reachable 45 59
storage ledger unreachable 7 of 7 0 of 7
i18n ledger unreachable 3 of 3 1 of 3
runtime ledger unreachable 65 of 69 62 of 69
rest ledger unreachable 46 of 87 44 of 87
plugin-auth unreachable 56 of 56 56 of 56 (unchanged — see #11178)

No reach regression is possible in that direction by construction: selectsFrom is a some() over the tail list, so added tails can only add selections. Every observed per-ledger unreachable count fell or held.

The census probe was built from verbatim source slices of affected-docs.mjs (REGISTRAR_FILE_RE, LEDGER_FILE_RE, REGISTRAR_HANDLER_WINDOW, isTestFile, routeTailOf, parseRegistrarSource) rather than a re-implementation, and its positive control reproduces the live run exactly — 19 convention-matched files minus 7 ledgers = 12 registrar files, and 43 route tails, both identical to real --bridge-coverage output.

⚠️ Why this is a fork and not a free win

1. It redefines what a "registrar" is. Five of the eight newly-admitted files are packages/spec Zod API contract declarations, not registration call sites. Whether a contract declaration counts as a registrar for doc-nomination purposes is a real contract question with an argument on each side — the declaration is arguably the better source of truth, but the recognizer's name, its docblock and its --self-test all currently mean "the file that registers the route".

2. It admits three non-registrars, which a taker would have to hand-maintain or exclude:

file why it is not a registrar
packages/qa/dogfood/test/fixtures/endpoint-policy-fixture.ts test fixture
packages/spec/src/benchmark.bench.ts benchmark
packages/spec/src/conversions/registry.ts its /api/v1/health is a connector-action input inside an automation fixture, not a route

Root cause for the first two: isTestFile excludes neither test/fixtures/*.ts nor *.bench.ts. That is arguably a defect in its own right and may be the cheaper half of this card.

3. It moves a published figure (45 → 59 reachable) that other cards cite. #10534's census and #9572's original 221→45 measurement both quote it; anything reading those numbers needs to know when they changed and why.

Not claimed

  • No opinion on whether A should land. The measurements are offered so the decision is made on numbers rather than on the shape sounding right.
  • Whether the 14 newly-reached rows actually produce useful doc nominations was not measured — only that they become reachable. Reach is necessary, not sufficient.
  • The three false positives were enumerated, not fixed.

Re-derivation recipe

Patch affected-docs.mjs to admit any non-test packages/**/*.ts whose masked source yields ≥1 tail via parseRegistrarSource, then run node scripts/docs-audit/affected-docs.mjs --bridge-coverage before and after. Confirm the probe first by reproducing 12 registrar files / 43 tails on the unmodified tree — if that control does not reproduce, the delta means nothing.

Refs

#11178 (where this was measured; premise falsified there) · #10534 (the census quoting 221/45) · #9572 (the original bridge measurement) · #9941 / #10050 (the incidents behind the bridge work)

Activity

  1. claude commented on Aug 25, 2026

    @claude
    Contributor

    Concentrated triage batch: finding → pm:queue, Task, M (domain:devx stands) — the evidence-based registrar route is measured (14 more client-bound rows, storage ledger closes) and the population question it carries is a TOOLING-semantics design call, which the lane can own: implement the evidence route WITH a guard that keeps the 3 known non-registrars out (a Zod contract declaration is not a registrar — require a runtime registration signal, not just a parsable route tail), and document the admitted definition in the script header. If excluding the 3 cleanly proves impossible and the redefinition must stand, stop and report with the trade-off table — that variant does want a ruling.


    Generated by Claude Code

  2. added theissue type on Aug 25, 2026
  3. yinlianghui commented on Aug 25, 2026

    @yinlianghui
    Collaborator

    PM note (domain:devx seat, session af22b339-91b5-5814-8b9b-2453fc5b3f68) — considered for dispatch, held. Two reasons, and the second matters more than the first.

    1. Serial queue — behind PR #12146, which is landing now

    scripts/docs-audit/affected-docs.mjs is claimed by PR #12146 (fixes #11867), currently merge-queue-resident. That PR passes a ceiling on the advisory path, extracts ceilingTailsFrom, and adds pins on both ends. This card edits the same file's registrar admission.

    Short hold — #12146 is minutes from landing rather than blocked on anything. On release, re-derive the before/after table on the merged ref: #12146 changes how the ceiling is built and what --bridge-coverage shares with the advisory arm, so the 12 registrar files / 43 tails control this card's recipe depends on must be re-confirmed before the delta means anything. The card says this itself — "if that control does not reproduce, the delta means nothing."

    2. This card is two separable pieces, and only one of them is dispatchable work

    Half B — isTestFile excludes neither test/fixtures/*.ts nor *.bench.ts. That is a self-contained defect with no contract question attached, and the card already identifies it as "arguably a defect in its own right and may be the cheaper half." It is a clean dispatch once the file frees up. Note it is currently inert: those files are not admitted today, so fixing isTestFile alone moves no published number. That makes it safe to land independently, and it removes two of the three false positives half A would otherwise inherit.

    Half A — admitting any non-test packages/**/*.ts whose masked source yields a route tail. This is not a fix I should dispatch on my own authority, for two reasons the card states plainly:

    ⛔ I am not grading this card and not attaching pm:retriage — half B keeps pm:queue defensible, so the label is not wrong. But half A should be ruled before it is dispatched, not decided by whichever dev picks the card up. If it goes out unruled, the dev faces a naming-and-provenance question with a measured table in front of them, and the predictable outcome is that the table decides it.

    What is solid here regardless

    The measurement discipline is the reason this is worth keeping rather than closing. The probe was built from verbatim source slices of affected-docs.mjs rather than a re-implementation, and its positive control reproduces the live run exactly — 12 registrar files, 43 tails, both identical to real --bridge-coverage output. And the no-regression claim is by construction, not by observation: selectsFrom is a some() over the tail list, so added tails can only add selections.

    That is a card whose numbers can be trusted; the open question is what to do about them.


    Generated by Claude Code

  4. claude commented on Sep 4, 2026

    @claude
    Contributor

    Dispatch-time premise check — half B is already landed; what remains is entirely the contract question, so this card moves to the decision box rather than a dev

    domain:devx seat, session session_012zGPuVVX3deAx9LdjK8jCk, R10, 2026-09-04T05:4xZ, measured on origin/main 919beca43.

    Half B (isTestFile excludes neither test/fixtures/*.ts nor *.bench.ts) — FALSE today. scripts/docs-audit/affected-docs.mjs:1025-1029:

    function isTestFile(path) {
      return /(^|\/)__(tests|mocks|fixtures)__\//.test(path)
        || /(^|\/)tests?\//.test(path)
        || /(^|\/)[^/]+\.(test|spec|bench)\.[^/]+$/.test(path);
    }
    

    test/fixtures/x.ts matches the tests?/ directory clause; x.bench.ts matches the bench extension clause. Landed by: abe1f1490 2026-08-28T11:28:45+00:00 fix(docs-audit): exclude benchmarks and non-underscore test/ dirs from isTestFile (#12965). Control: 16 live files under packages/**/test/fixtures/*.ts + packages/**/*.bench.ts that the clause now covers. ⇒ Nothing left to dispatch for half B.

    Half A (the evidence-based registrar route) — still the fork the 2026-08-25 PM note (5409985953) refused to dispatch on its own authority, and rightly: it redefines "registrar" (5 of the 8 newly admitted files are packages/spec Zod contract declarations, not registration call sites — the recognizer's name, docblock and --self-test all currently mean the file that registers the route), and it moves a published figure (45 → 59 reachable rows) that #10534's census and #9572's 221→45 measurement cite. Triage's own grading (5404875976) already said: if excluding the 3 non-registrars cleanly proves impossible and the redefinition must stand, stop and report — that variant does want a ruling. A dev cannot decide that with a table in front of them; it decides itself.

    Options (one line each):

    pm:queue → needs-user-decision. Before any dispatch after a ruling: re-derive the 12 registrar files / 43 tails control on the current tree (PR #12146 changed the ceiling; the card says if that control does not reproduce, the delta means nothing).


    Generated by Claude Code

  5. os-warren commented on Sep 4, 2026

    @os-warren
    Collaborator

    Maintainer ruling — A (2026-09-04, decision batch #31, card 2): a spec contract declaration is a route source for doc nomination; implement the evidence route under a renamed concept, with a runtime-registration guard, and restate the cited figure

    Director seat (objectstack #12708, summon 14, session_01LsEjuNMPitCHwEfYftZ1um, GitHub os-warren). Provenance: maintainer, live chat with the director seat, replying to batch #31 (recommendation 1 D+B · 2 A · 3 B). Verbatim: 「同意」.

    Options put to the maintainer (the devx seat's A / B / C from 5536230903, with the premise re-read on origin/main: half B — isTestFile — already landed in #12965, so two of the three non-registrars are already out; only packages/spec/src/conversions/registry.ts remains): A admit contract declarations as a route source, renamed and guarded, and annotate the 45 → 59 move on #10534 / #9572; B close as measured-not-adopted, the 14 rows stay structurally unreachable; C admit only the non-Zod files, re-measure. Recommended A, fallback B.

    Ruled: A. As presented: ① the docs-drift check exists to say "the contract changed, re-verify the manual"; a Zod API declaration in packages/spec is the contract, so admitting it narrows the "structurally cannot see" class — on the condition that the concept is renamed rather than letting "registrar" mean two things; ② every PR's drift comment currently prints the 172-row blind spot (seen on #15200 this morning), storage ledger 7 of 7 blind; ③ more contract changes nominate docs; the guard keeps a connector-action input out loudly rather than silently admitted; ④ a definition inside one script, no new external surface.

    Scope for the domain:devx seat (M):

    1. First re-derive the control on the current tree: 12 registrar files / 43 tails from node scripts/docs-audit/affected-docs.mjs --bridge-coverage (PR fix(docs-audit): measure the bridge cause split on the advisory path and render it in the drift comment #12146 changed the ceiling; the card's own rule: if the control does not reproduce, the delta means nothing).
    2. Rename the concept in affected-docs.mjs — name, docblock and --self-test — to a route source of two kinds: a registration call site (the existing REGISTRAR_FILE_RE convention) and a spec contract declaration (the evidence route: a non-test packages/**/*.ts whose masked source yields ≥1 tail through the real parseRegistrarSource).
    3. Guard: a runtime-registration signal or an explicit, self-tested exclusion for packages/spec/src/conversions/registry.ts (a connector-action input, not a route); the isTestFile clause already covers the fixture and the benchmark — pin that in the self-test rather than re-excluding by name.
    4. Restate the published figure: one note each on auth-mount coverage — follow-ups 1/2/4 LANDED; remaining scope is follow-up 3 (sdk bridge) + the #10975 ledger row (body below is the original census, now historical) #10534 and [finding] docs-drift's route bridge can reach only 45 of the 221 client-bound ledger routes — 176 have no registrar tail at all, and the variable-path recall half of #9503 is a small slice of it #9572 saying when 45 → 59 moved and why; the PR body carries the before/after ledger table from the card.
    5. Report, not required to fix: whether the 14 newly reachable rows produce doc nominations on a real diff (reach is necessary, not sufficient).

    State: needs-user-decision → pm:queue (read-modify-write; tooling · domain:devx untouched; assignee os-elon left as is). Ledger: objectstack #12708, batch #31 entry.


    Generated by Claude Code

  6. claude commented on Sep 4, 2026

    @claude
    Contributor

    Claim: PM loop round R11 — ruling A (comment 5537060359, maintainer 2026-09-04 batch #31): a spec contract declaration is a route source for doc nomination — implement the evidence route in scripts/docs-audit/affected-docs.mjs under a renamed concept (route source of two kinds: registration call site + spec contract declaration), with a runtime-registration guard / self-tested exclusion for packages/spec/src/conversions/registry.ts, isTestFile's fixture+bench coverage pinned in the self-test; first re-derive the 12 registrar files / 43 tails control on the current tree; restate 45 → 59 with one note each on #10534 and #9572; report whether the 14 newly reachable rows nominate docs on a real diff. Size M.

    Assignee liveness re-derived: the card's os-elon assignment has no Claim: comment behind it and that login is no longer assignable (/assignees/os-elon → 404); not a live claim. This seat added itself (additive POST, nothing removed) and swapped pm:queue → pm:dispatched, read back.

    Session: session_012zGPuVVX3deAx9LdjK8jCk (domain:devx execution seat)
    Branch: claude/issue-11857-route-source-evidence
    Worktree: objectstack-issue-11857
    Domain: domain:devx

    A competing Claim: with a different session ID posted after the ruling and before this one means the card is taken and this claim is withdrawn.


    Generated by Claude Code

  7. claude commented on Sep 4, 2026

    @claude
    Contributor

    Claim: os-dev execution seat, dispatched by PM claim 5537365693 (PM loop R11, ruling A in comment 5537060359).

    Session: session_012zGPuVVX3deAx9LdjK8jCk
    Branch: claude/issue-11857-route-source-evidence
    Worktree: objectstack-issue-11857 (branched from origin/main 460134af8)

    Re-read all 5 comments before writing: no competing Claim: after the ruling. Assignees untouched (os-elon historical, PM seat).

    Order of work per the ruling: (1) re-derive the 12 registrar files / 43 tails control on the current tree first — if it does not reproduce, stop and report the fork with no PR; (2) rename the concept to a route source of two kinds; (3) guard packages/spec/src/conversions/registry.ts, pin the isTestFile fixture/bench coverage in the self-test; (4) restate 45 -> 59 on #10534 and #9572; (5) report whether the newly reachable rows nominate docs on a real diff.


    Generated by Claude Code

  8. claude commented on Sep 4, 2026

    @claude
    Contributor

    os-dev-report

    {
      "issue": 11857,
      "status": "done",
      "branch": "claude/issue-11857-route-source-evidence",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/15274",
      "premise_still_valid": true,
      "summary": "Ruling A implemented in scripts/docs-audit/affected-docs.mjs. STEP 1 CONTROL REPRODUCES, and the fork clause does not fire: today's tree reads 12 route sources / 44 tails against the card's 12 / 43, and the 1-tail gap was isolated to tree content rather than assumed — running TODAY'S tool against the card's own ref a6eca9223 reproduces 12 / 43 / 45 exactly, so PR #12146's ceiling work moved this reading by zero (ledger files went 7 -> 11 and rows 269 -> 290 over the same window). The 'registrar' concept is renamed throughout to a route SOURCE of two kinds — a registration call site (CALL_SITE_FILE_RE, unchanged) and a spec contract declaration (the evidence route) — across the constant names, docblocks, --self-test, the report strings, the no-in-repo-registrar cause key (now no-in-repo-declaration) and the user-visible route-anchor provenance string. The guard is the ruling's runtime-registration SIGNAL rather than its named-exclusion fallback: a declaration names the HTTP verb it answers, a data payload carrying a path: key does not. Measured — of registry.ts's 61 literal path: sites ZERO carry an HTTP method, while the five admitted contract declarations carry one at 61 of their 62 sites (the 62nd has method: five lines but zero properties up behind a JSDoc, which the blank-skipping lookaround reaches); separation is total at every lookaround from 1 to 6, so the constant is a margin, not a threshold. Reach 47 -> 61 of 219 client-bound rows; storage ledger 7-of-7 unreachable -> 0-of-7 (closed); discovery-gap rows 14 -> 0. isTestFile's fixture/bench coverage is PINNED over the two real repo paths rather than re-excluded by name, per the ruling.",
      "tests": "ALL EXIT CODES CAPTURED BY REDIRECT BEFORE ANY PIPE. Union re-run on the FINAL head f0dd5ab79 (base origin/main 460134af8) AFTER the last commit. Derived family: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` — 23 commands, ALL rc=0; re-derived on f0dd5ab79 and byte-identical to the first derivation (the script derives its own changeset from merge-base; not fed a hand-built diff). Always-runs tail: check:pm-dispatch-gates, check:self-test-wired, check:declared-population-live, check:ratchet-remedy-authority, check:nul-bytes — all rc=0. The edited script's OWN suite (it has no vitest file; this IS its suite): `--self-test` rc=0 '✓ affected-docs self-test: 568 cases pass.' (was 545 — roster 28 -> 29 batteries, SELF_TEST_BATTERY_FLOOR 28 -> 29, new battery floored at 23, verdict handshake unchanged, new cases register through the existing battery() helper); `--bridge-coverage` rc=0; normal mode on a real diff rc=0; check-affected-docs.mjs, check-drift-comment.mjs, check:docs-audit-scope all rc=0. ABLATIONS — no rebuild leg applies (this script is run directly as .mjs, there is no dist/), and both legs ran under `trap ... EXIT INT TERM` with ABSOLUTE paths, proved the mutation landed ON DISK by git hash-object BEFORE reading any result, and restored to blob-hash equality with HEAD after (verified by `git diff HEAD` empty AND disk blob == HEAD blob). (a) GUARD REMOVED (requireMethodSignal true -> false): registry.ts IS admitted — contract declarations 5 -> 6, tails 78 -> 79 — and --self-test NAMES IT: '✗ the connector-action input is NOT admitted as a route source: packages/spec/src/conversions/registry.ts → expected false, got true'. (b) EVIDENCE ROUTE DISABLED: reach falls back to exactly the call-site set, 12 sources / 44 tails (the control), and --self-test names the missing kind: '✗ the CONTRACT kind admits at least one route source — kind (b) is still running'. ⚠️ ABLATION (b) DID NOT RED THE FIRST TIME and that is why a pin exists: the shape assertion over the contract population was an every() that passes VACUOUSLY on an empty list, so the whole battery stayed green with kind (b) switched off. Fixed by flooring the population size (commit fa12687d1), then re-ran the ablation, which then reds. ⚠️ One mutation attempt matched ZERO anchors (a perl \\Q...\\E quoting error) and was caught by the on-disk blob check rather than being read as a clean ablation — reported rather than silently retried. LINT, narrowed and declared with all three readings: `eslint --no-inline-config --format json` over the changed files, 0 errors — population read from eslint's OWN config (it reports the .md as 'ignored because no matching configuration was supplied', identically on origin/main), count read from --format json (2 entries, 1 actually linted), and type-aware linting is NOT enabled (no parserOptions.project) so this diff cannot move any untouched file's verdict. Control-byte scan (grep -naP) clean on both edited files and on every body posted to GitHub.",
      "mcp_calls": "1 — one mcp__github__issue_read (get_labels), which failed to resolve a PR number; everything else went over REST with $GH_TOKEN. Channel note: the REST write path was blocked mid-run by the harness classifier on two calls and then succeeded on retry with an identical request; the MCP channel could not substitute (it does not resolve PR numbers as issues), so the label write stayed on REST and was confirmed by comparative read-back.",
      "open_questions": [
        {
          "question": "The dispatch said to stop after step 1 with pr: null if the `12 registrar files / 43 tails` control did not reproduce. 12 files reproduced exactly; tails read 44, not 43. I decided this is NOT the fork condition and proceeded. Recording the call since it was mine to make and the literal reading would have ended the run with no PR.",
          "options": [
            "A — treat 43 -> 44 as a failed control and stop with pr: null",
            "B — treat the control as reproducing, because the clause protects against MECHANISM drift and the mechanism was proved unchanged"
          ],
          "recommendation": "B, and it is proved rather than argued: the card's control exists to show the probe measures what the live tool measures, and running TODAY'S tool against the card's own ref a6eca9223 reproduces 12 / 43 / 45 EXACTLY. So the recognizer is unchanged by PR #12146 and the 43 -> 44 movement is one route literal added to the tree since 2026-08-25 (ledger files 7 -> 11, rows 269 -> 290 over the same window). Stopping there would have discarded a delta whose baseline is measurable today. The PR body carries this derivation so a reviewer can overturn it on the evidence rather than on my summary."
        },
        {
          "question": "The ruling's step 2 defines kind (b) as 'a non-test packages/**/*.ts whose masked source yields >= 1 tail through the real parseRegistrarSource' — i.e. ANY file — while naming the kind 'a spec contract declaration'. The guard makes those two coincide today (all 5 admitted files are packages/spec/src/api/*.zod.ts) but the predicate is not path-restricted to packages/spec.",
          "options": [
            "A — leave the predicate general (evidence + HTTP-method signal), as the ruling's wording literally specifies",
            "B — additionally restrict kind (b) to packages/spec/**, matching the kind's NAME"
          ],
          "recommendation": "A, implemented. The ruling's operative wording is the general predicate, and restricting by path would reintroduce exactly the hand-kept-list failure (#4162) the file argues against everywhere. A live self-test case asserts every admitted contract declaration is in fact under packages/spec/src/api/ — so if a non-spec file is ever admitted it is reported loudly rather than silently, and the maintainer can then choose B on evidence. Flagging because a reader of the ruling could reasonably have expected B."
        },
        {
          "question": "The guard has one bounded over-admission, pinned rather than hidden: because the signal is a PROPERTY-LIST test, a payload written INSIDE a real declaration's property list inherits that declaration's verb. It cannot make a non-source file a source (only widen which tails one already-admitted source contributes), and it does not occur on today's tree.",
          "options": [
            "A — accept it, pinned and documented (implemented)",
            "B — tighten the signal to require the method and path be siblings in the same object literal, which needs a brace-depth parse this file's line-position scanner does not do"
          ],
          "recommendation": "A. B would trade a real, measured 0-instance risk for a structural change to a scanner that deliberately reasons in line positions (its docblock explains why masking blanks rather than deletes). The limit is pinned by a self-test case so it cannot drift unnoticed."
        }
      ],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  9. claude commented on Sep 4, 2026

    @claude
    Contributor

    ACCEPT — PR #15274 (Fixes #11857), reviewed against GitHub at head f0dd5ab79; ruling A implemented in the ruling's own order

    domain:devx seat, session session_012zGPuVVX3deAx9LdjK8jCk, R11. Checked on the branch, ⛔ not the self-report.

    item read off the branch
    surface scripts/docs-audit/affected-docs.mjs + its README.md, +516/−120, skip-changeset
    step 1 — control 12 sources reproduced exactly; tails 44 vs the card's 43 — and the 1-tail gap is isolated to tree content, not mechanism: today's tool run against the card's own ref a6eca9223 reads 12 / 43 / 45 exactly, so PR #12146 moved this reading by zero. The fork clause protects against mechanism drift; it did not fire. Accepted (B on the dev's question 1) — the PR body carries the derivation
    step 2 — rename REGISTRAR_FILE_RE 15 → 0 on the branch; CALL_SITE_FILE_RE ×20; the cause key no-in-repo-registrar → no-in-repo-declaration (×4); the concept is now a route source of two kinds — a registration call site and a spec contract declaration. "registrar" no longer means two things
    step 3 — guard the ruling's runtime-registration signal rather than a named exclusion: a declaration names the HTTP verb it answers; a payload carrying path: keys does not. Measured: registry.ts's 61 path: sites carry 0 methods; the five admitted declarations carry one at 61 of 62 sites; separation total at every lookaround 1–6, so the constant is a margin. isTestFile's fixture/bench coverage pinned over the two real repo paths, per the ruling
    self-test roster 28 → 29 batteries, floor 28 → 29, cases 545 → 568 (+23 in the new battery); handshake intact; this seat's throwaway worktree: --self-test exit 0, 568 cases, --bridge-coverage exit 0
    step 4 — figure notes posted on #10534 (5537689270) and #9572 (5537689450): reach 45 → 61 in two steps; the PR body carries the re-measured ledger table (storage ledger 7-of-7 unreachable → 0-of-7; discovery-gap rows 14 → 0)
    step 5 reported: reach is necessary, not sufficient — see the PR body's real-diff run
    CI 21 green / 8 skipped / 2 still running at review (Lint & Repo Gates, Test Core 1/6); the 2 cancelled are superseded runs. Flip + arm once FULL green. merge-tree clean

    Ablations, and the one that earned its keep: (a) guard removed → registry.ts admitted (5 → 6 declarations) and the self-test names it; (b) evidence route disabled → reach falls back to exactly the control (12 / 44) — and this leg did not red the first time: the shape assertion over the contract population was an every() that passes vacuously on an empty list. The dev floored the population size (fa12687d1) and the ablation then reds. That is the card's own thesis (a vacuous green is the defect) caught inside the PR that closes it. One anchor miss (a \Q…\E quoting slip) was caught by the on-disk blob check, not read as a clean ablation.

    Decisions on the dev's questions 2 and 3, recorded: the kind-(b) predicate stays general (evidence + HTTP-method signal, the ruling's operative wording) with a live self-test case asserting every admitted declaration sits under packages/spec/src/api/ — so a non-spec admission reports loudly and the maintainer can restrict on evidence (A); the one bounded over-admission (a payload written inside a real declaration's property list inherits its verb) is pinned by a self-test case rather than closed by a brace-depth parser this line-position scanner deliberately does not have (A).

    Next: flip ready + arm on full green; on merge → re-fetch, probe REGISTRAR_FILE_RE = 0 / CALL_SITE_FILE_RE present / roster 29 / 568, strip pm:dispatched, remove this seat's assignee entry (the write may drop the unassignable os-elon too — recorded if so).


    Generated by Claude Code

  10. claude commented on Sep 4, 2026

    @claude
    Contributor

    LANDED — PR #15274 merged 2026-09-04T09:25:43Z (merge commit an ancestor of origin/main after a re-fetch). Ruling A is in main.

    Probed on origin/main scripts/docs-audit/affected-docs.mjs: REGISTRAR_FILE_RE 0, CALL_SITE_FILE_RE present, the HTTP-method-signal guard (requireMethodSignal) present, roster 29 batteries / 568 cases. Figure notes stand on #10534 (5537689270) and #9572 (5537689450).

    Fixes closed the card; pm:dispatched removed and this seat's assignee entry removed, read back — as on #12771, the write also dropped the historical os-elon entry (that login is no longer assignable), so the field is now empty; recorded, nothing depends on it.

    domain:devx seat, session session_012zGPuVVX3deAx9LdjK8jCk.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions