Uh oh!
There was an error while loading. Please reload this page.
Fifth Rule 3 population (function declarations) widened, censused ids stripped, and the gate states its own scan boundary; hot-reload refusal ids stripped - #13298
Conversation
…le 3's sink pass, and the gate states its own scan boundary The fifth widening (#13156's A half, adjudicated 2026-08-29): a plain `function` DECLARATION is transparent to the climb exactly when its NAME is consumed from a recognised customer-facing position — the same narrow clause as the fourth population, one declaration form over, never an unconditional crawl of function bodies. Its literals get their own `functionDeclared` bucket with its own blindness floor, so the declaration clause rotting cannot hide behind the arrow members. The C half (shared with the family member card): the gate's output now prints Rule 3's scan boundary — the root, the not-scanned siblings with the deferral pointer, and the recognised sink-shape list — derived from the constants the scan reads, pinned derived-vs-derived in --self-test. At this commit the widened gate is deliberately RED on the real tree (reproduce-first): 4 violations — 2 functionDeclared, 2 message via the new closure into declarations. The strip is the next commit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KX8wnyjStaZcuMyAMNsy3N
… refusal prose, re-pin the twins The strip half of the fifth-population adjudication (2026-08-29, Class-1), under the keep-the-ADR-id charter: 17 ids across 8 spec sources — the 15 the broad declaration census finds on current origin/main (materially fewer than the relayed 47/51/14, measured before today's main moved) plus the 2 hoisted ruling consts the widened sink closure newly reaches (SUBMIT_REDIRECT_RULING, FORM_VIEW_FEATURES_RULING). ADR ids, protocol versions, error codes and ruling dates stay; ids that were the whole parenthetical take the parenthetical with them; load-bearing internal references move to adjacent comments. Twins re-pinned red-then-green, never weakened: 42 assertions across 7 spec test files red before this commit, 607/607 green after, each re-pin a customer-resolvable anchor from the NEW text plus negative id pins at the two ruling-const doors. The objectql and service-analytics twins flagged by the id sweep pin sources OUTSIDE the scanned root and are deliberately untouched (evidence for the cross-package revival census). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KX8wnyjStaZcuMyAMNsy3N
…fusal messages, re-pin the twins The member half of the 2026-08-29 family adjudication: the ruled strip is the plugin-registration refusal's tracker id (the id the #13151-verified twins at hot-reload.test.ts:259,302,310 pin); the sibling id in the same refusal table's watchPatterns entry and in the startWatching() removal notice is stripped in the same stroke under the bounded same-class extension — same defect family, same keep-the-ADR-id remedy, same file, same twin suite, declared in the PR body. ADR-0049, the spec/core versions and the scheduleReload migration call stay as the customer-resolvable anchors. Twins red-then-green, never weakened: 8 assertions red before this commit (10/18 passing), 18/18 after; each id pin re-pinned to a content anchor from the NEW text plus negative id pins at all three doors — mirroring the negative pin the spec-side parse door has carried since its own strip. Repo-wide section-7 sweep for the stripped id set: the only other test literal is an expect failure-label, not a content pin. Root extension of the doc-authoring gate's Rule 3 is deliberately NOT part of this change (deferred by the adjudication; the gate's new boundary output is what keeps that deferral visible). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KX8wnyjStaZcuMyAMNsy3N
…p's callee filter missed Found by RUNNING the full mention set rather than trusting the sweep's expect-callee filter: both pins spell the id check inside a .some() predicate, so the nearest enclosing call is w.includes, not expect. Same re-pin discipline — anchored on the warning's own prescription words (COMPOSE_KEY_DISPOSITIONS / 'cannot be composed'), red-then-green (2 red in the consumer batch, 35/35 green after), never weakened. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KX8wnyjStaZcuMyAMNsy3N
📓 Docs Drift CheckThis PR changes 2 package(s): ⛔ 1 release-owned page(s) name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 132 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin fba5b6576265dfa3f8be5d7977d274929aaa9803 && git checkout fba5b6576265dfa3f8be5d7977d274929aaa9803
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 74049254d47bd0edd2a2fcd732dcc01c91504f10 afb72654e8e8a76fba283d60fd1c4e1700eb3cfa && git checkout -B drift-repro 74049254d47bd0edd2a2fcd732dcc01c91504f10 && git merge --no-ff afb72654e8e8a76fba283d60fd1c4e1700eb3cfa
node scripts/docs-audit/affected-docs.mjs --json 74049254d47bd0edd2a2fcd732dcc01c91504f10
|
Fixes#13156
Fixes#13179
Family PR executing the twin Class-1 adjudications of 2026-08-29 (director seat, 13:50 + the operative 14:55 pair): A + C on the chain head, strip + C, root extension deferred on the member. One branch, per-member commits, independently verifiable halves. Session: https://claude.ai/code/session_01KX8wnyjStaZcuMyAMNsy3N
Chain head — the fifth population (commits
d7e22a3d,4dd3e5e3,afb72654)A — the widening. Plain
functionDECLARATIONS join Rule 3's sink pass inscripts/check-doc-authoring.mjs, under the exact #13002/#13151 narrow clause — a declaration is transparent only when the function itself sits in a recognised customer-facing position, which for a declaration means its NAME is consumed from one (seeded or closed over bycollectTextSinkConsts, the same fixed point the hoisted const-arrow spelling rides). Never an unconditional crawl: an unconsumed declaration and one consumed only by an unrecognised call stay unswept, pinned as precision negatives in--self-test.Bucket choice + rationale (required by the adjudication): the new population gets its own
functionDeclaredbucket with its own blindness floor, not a fold intofunctionBuilt. Reasoning is #13151's per-bucket-floor principle applied one step further: the floor exists to catch exactly one clause rotting back toundefined, and the arrow/expression members (217 recognised strings on the real tree) would hold a shared floor up indefinitely while the declaration clause rotted — the precise silence this population was found by. The pre-existing options-factory clause (buildsStrictObjectOptions) is form-agnostic, already reached function declarations before this PR, and keepsfunctionBuilt; only the name-consumption clause is new. On the real tree the new floor sits at 133 recognised strings.Reproduce-first, measured: widen first, then strip. At
d7e22a3dthe widened gate is RED on the real tree: 4 violations — 2functionDeclared(listPositionFieldReferenceMessageindata/filter.zod.ts:296,normalizedMemberMessageat:1434) and 2messagevia the new closure into declarations (SUBMIT_REDIRECT_RULING,FORM_VIEW_FEATURES_RULINGinui/view.zod.ts). After the strip commit the gate is GREEN with every bucket floored (message 1037 · strictObject 3349 · tombstone 771 · describe 8524 · functionBuilt 223 · functionDeclared 133).Self-test teeth proven by two-leg ablation (mutate, confirm on disk by anchored grep counts, run, restore, prove restoration by HEAD-blob hash match; no build leg exists on this path — the gate runs from source): neutralising the recogniser entry branch fails the declaration REDs and the floor cases while the closure-pin case stays green; neutralising the declaration registration fails all three. Restoration verified: worktree blob equals HEAD blob.
Census re-derivation — a finding, not a blocker. The relayed 47 literals / 51 ids / 14 files (measured on the #13002 branch at
c0d50d612) does NOT reproduce on currentorigin/main: the broad unconditional-crawl census reads 15 literals / 15 ids / 6 files (main moved in the interim —data/field.zod.tsnow contributes zero), and the adjudicated narrow instrument reds on 4 of those plus the 2 hoisted consts above. The strip covers the full broad-census population anyway — all 15 in-declaration ids plus the 2 const-borne ids, 17 total across 8 files — because every site is same-audience refusal/warn prose and the ruled remedy is by population, not by count. After the strip the broad census reads 0/0/0.Strip discipline (#12522 keep-the-ADR-id charter): ADR ids, protocol versions, error codes (
INVALID_FILTER / 400) and ruling dates stay; an id that was the whole parenthetical takes the parenthetical with it; genuinely internal load-bearing references moved to adjacent code comments (filter.zod.ts,view.zod.ts). No tombstone had the issue id as its only reference, so nothing needed escalation.Twins, red-then-green, never weakened: 42 assertions across 7 spec test files red against the stripped tree, 607/607 green after re-pinning — each re-pin a customer-resolvable anchor from the NEW text (ruling dates, ADR anchors, prescription sentences), plus negative id pins at the two ruling-const doors. Two predicate-style pins (
.some(w => w.includes(...))incompose-stacks-key-loss.test.ts) were caught by RUNNING the full mention set after the parse sweep's expect-callee filter missed them — re-pinned the same way (35/35 green). Theobjectqlandservice-analyticsassertions the id sweep flagged pin messages produced OUTSIDE the scanned root (objectql/src/registry.ts,service-analytics/src/comparand-shape.ts) and are deliberately untouched — they are evidence for the member card's revival census, below.C — the boundary output (lands once, serves both cards): the gate now prints its own Rule 3 scan boundary on every verdict — the root (
packages/spec/src), the explicit sibling-packages-not-scanned statement with the deferral pointer, and the recognised sink-shape list — derived from the same constants the scan reads, pinned derived-vs-derived in--self-test(root fromSPEC_SOURCE_ROOT, buckets from the seen map the floor iterates).Member #13179 — the hot-reload strip (commit
1c749681)The ruled strip: the plugin-registration refusal's tracker id — the id the #13151-verified twins at
hot-reload.test.ts:259,302,310pin — removed from both registration-door strings (RETIRED_STATE_STRATEGY_GUIDANCE, thedistributedConfigentry). Declared bounded same-class extension: the sibling id in the same refusal table'swatchPatternsentry and in thestartWatching()removal notice is stripped in the same stroke. All four bounded-fix conditions hold: same defect class (same table, same door, same audience), mechanical remedy pinned by the same-day adjudicated charter, same file already on this claim's declared surface, same twin suite with no new verification face.ADR-0049 enforce-or-remove, the spec/core versions and thescheduleReloadmigration call remain as the customer-resolvable anchors — mirroring the spec-side parse door, which was already id-free with a negative pin.Twins red-then-green: 8 assertions red (10/18 passing), 18/18 green after; every id pin re-pinned to a content anchor plus negative id pins at all three doors. Repo-wide section-7 sweep for the member's id set: the only remaining test literal is an expect failure-label, not a content pin.
Root extension is NOT in this PR — deferred by the adjudication with a codified revival condition, and not smuggled in via the C output: the boundary line states the limit instead of moving it. The revival condition, however, now measurably FIRES: the diff-derived twin sweep plus a targeted source sweep found same-audience id-bearing refusal/warn/lint prose outside
packages/spec/srcwell past the adjudicated threshold (about eleven candidate sites, e.g.objectql/src/registry.ts:1036,objectql/src/having-filter.ts:186,service-analytics/src/comparand-shape.ts:598,lint/src/validate-react-page-props.ts:434,metadata-protocol/src/protocol.ts:19879). Filed for triage as the instrument card the adjudication prescribed — #13297 (which remains open; it is out of scope here). #13179 is not affected: its own strip stands regardless of how triage grades the wider census.Verification (all at
afb72654, the pushed head)node scripts/pm/dispatch-gates.mjs(no paths; provenance line names this repo atafb72654): 51/53 green, pluscheck:type-check-debtgreen after the full 70-package build (30 ledger entries re-measured, none above recorded) andcheck:nul-bytesgreen. The two non-green results are the gates' own designed NOT MEASURED refusals, not reds:check-test-completeness.mjs(exit 3 — wants a savedturbo run testlog; instructs recording NOT MEASURED locally) andpm/check-half-states.mjs(exit 3 — the container's GitHub token is the proxy placeholder; no reading). CI measures both.check:doc-authoringgreen including--self-test(the edited gate's own suite; no external test file names it — verified by repo grep).hot-reload.test.ts18/18; objectql targeted 208/208 (including the untouched out-of-rootregistrytwin); lint targeted 76/76; service-analytics targeted 126/126.@objectstack/spec typecheckgreen (check:test-typecheck: OK, test layer compiles; debt ledger unchanged).needs:contract-review; the review chain owns enqueue.Generated by Claude Code
Generated by Claude Code