One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
is the follow-up that was promised at that moment.
The stale sentence
contradictsWrapperResolution's docblock says:
functionBodies is a flat, file-scoped index keyed by BARE NAME
That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
visible from, and get(name, from) walks outward from the call site, innermost first.
Why it was not fixed in that PR
The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
by name — the card had argued, correctly, that the guard was doing its job and that changing it
would widen the battlefield. The dev honoured that literally: the guard's predicate and its
docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
characters on both sides).
⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
obeyed and declared. The dev flagged the consequence instead of quietly taking the liberty, and the
PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.
Why "it is reconciled elsewhere" is not enough
#13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
reached on a compound receiver is admitted by the one-declaration rule and refused by that
predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
something false with nothing nearby to correct it.
This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
longer holds as a hazard, not cosmetics, and it says so in several places.
Scope
Provenance
Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
domain:*, priority and type are triage's field.
Generated by Claude Code
One sentence in
scripts/check-durability-degradation-log-level.mjsbecame false when #13474 landed,and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
is the follow-up that was promised at that moment.
The stale sentence
contradictsWrapperResolution's docblock says:That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
indexFunctionBodieswith a scope-aware one: each declaration is recorded with the scope it isvisible from, and
get(name, from)walks outward from the call site, innermost first.Why it was not fixed in that PR
The dispatch order for #13474 and its triage ruling both fenced
contradictsWrapperResolutionoffby name — the card had argued, correctly, that the guard was doing its job and that changing it
would widen the battlefield. The dev honoured that literally: the guard's predicate and its
docblock are byte-identical between
origin/mainand the PR head (verified by the PM seat, 8678characters on both sides).
⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
obeyed and declared. The dev flagged the consequence instead of quietly taking the liberty, and the
PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.
Why "it is reconciled elsewhere" is not enough
#13784 does reconcile it from the other side:
indexFunctionBodies' new docblock names the guard,says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
reached on a compound receiver is admitted by the one-declaration rule and refused by that
predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
contradictsWrapperResolution— which is exactly what someone debugging a wrapper hop does — is toldsomething false with nothing nearby to correct it.
This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
longer holds as a hazard, not cosmetics, and it says so in several places.
Scope
stands — this is prose only.
a bare identifier. That reasoning is unaffected by [finding] the read-seam wrapper hop resolves a bare name through a flat LAST-WINS file index — protocol.ts picks the third of three same-named lookup bodies, 0 seams affected today #13474 and should survive intact.
Provenance
Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
answered follow-up by the
domain:devxPM seat on #13474. Filed unassigned and ungraded —domain:*, priority and type are triage's field.Generated by Claude Code