Filed by the domain:services PM seat (session session_012WkdHQwHr2KQmaX7P1BHzi) out of #12981's dispatch, PR #13397. Unassigned. Recording a decision, not claiming it.
Why this is a card and not a line in that PR
PR #13397 repairs backfillPrimaryBu in plugin-sharing: a per-row catch {} counted nothing and the report was gated on updated > 0, so a pass in which every write was refused printed byte-identical output to a pass with nothing to do — while every affected user kept a stale or absent primary_business_unit_id and every sharing rule keyed on it evaluated against the wrong value. Refusals are now counted and reported once, and the branch is updated > 0 || refused > 0.
⭐ The SILENCE is fixed. The LEVEL is not, and the level is what this card is about. AGENTS.md → Degradation log levels puts "something the system CLAIMS to persist did not persist, while the system keeps looking healthy" at error. This report lands at warn.
⛔ The routing the dev proposed does not exist — measured, and it is why this card had to be filed
The dev's recommendation was "leave it at warn; the LEVEL is added by #10556 when that family next moves." Measured:
#10556 state: closed / completed, 2026-08-24 22:42Z, closed_by os-sam
⇒ A closed card cannot track new work. Had this been accepted as written, the level question would have been routed to a card that can never carry it — a half-state of exactly the kind this lane keeps paying to find by hand. The dev's reading of the ruling was accurate; its reading of the card's liveness was not, and nothing in the baseline file it read says the card is closed.
What was actually ruled on 2026-08-24, verified in the ledger rather than recalled
scripts/optional-error-sink-contract.baseline.json records #10556's ruled shape, and the relevant limbs are:
-4 — #10556's RULED SHAPE (maintainer, 2026-08-24, three answers on one card) … (c) the three PUBLICLY EXPORTED plugin-sharing options types tightened
and, on why the publicly exported ones are a contract call at all:
PUBLICLY EXPORTED from plugin-sharing's index.ts, so requiring warn breaks any host passing { info, error }. That is #10556's contract call.
⇒ The 2026-08-24 ruling tightened three publicly exported plugin-sharing options types and shipped that as a minor naming the break. OptionalSharingLogger — the sink backfillPrimaryBu reports through — was not among them, and its own header forbids growing an error member. That ledger now holds exactly 1 entry (control: a nonsense key returns 0), the service-settings deliberate exception, so this is not unpaid debt sitting in a queue; it is a question nobody has been asked.
The options, with their real costs
|
Do what |
Operator-visible |
Cost |
| A ⭐ |
Leave the level at warn. The silence is fixed; the census keeps naming the site so it cannot be forgotten. |
A refused backfill is now visible, on the warn channel |
0 |
| B |
Grow OptionalSharingLogger with error?. |
Same |
⛔ Refused by that type's own header: it makes an optional error reachable beside an optional warn for every module on the type, enrolling them all into check:optional-error-sink-contract's population at once — and that ledger is shrink-only. This is the shape the gate exists to refuse. |
| C |
Give backfillPrimaryBu a stricter sink ({info?, warn, error?} — the bulk-recompute.ts shape). |
error, per AGENTS.md |
Mechanically clean, but requires warn on a publicly exported shape ⇒ breaks any host passing { info, error }. That is the same break the 2026-08-24 ruling shipped as a minor for three sibling types — so there is precedent for how to do it, on a card that is closed. |
This seat's recommendation: A now, C as the end state, on a live card
The operator-visible loss was that a fully refused backfill printed nothing at all, and that is repaired. The level changes who notices first, not whether anyone can. ⛔ B is the actively harmful option. C is right, has a shipped precedent for its break, and is a published-contract change ⇒ above this seat (clause ②, CONTRACT_REVIEW_TIER), which is the other reason it is a card rather than a line in a census PR.
⛔ Re-deciding another card's published-contract call inside a census PR is exactly the workaround-by-adjacency this repo keeps paying to remove.
⚠️ Confidence gaps
- I did not read
logger-shapes.ts:72 in full — I confirmed OptionalSharingLogger is declared there and is consumed by bu-tree-recompute.ts and primary-bu-projection.ts, but the exact member list and the precise wording of the header prohibition are the dev's reading, not mine. ⇒ Whoever takes C reads that header first.
- I did not verify which three types the 2026-08-24 ruling tightened. The ledger says "the three PUBLICLY EXPORTED plugin-sharing options types"; I did not enumerate them, so "
OptionalSharingLogger was not among them" rests on the dev's report plus the fact that it still has no error.
- Whether C's break is actually breaking for any real host is unmeasured. The 2026-08-24 precedent shipped a
minor naming it, which suggests the answer was "possibly, announce it" rather than "no".
Refs: #12981 (the worklist this came out of) · PR #13397 (where the silence was fixed) · #10556 (CLOSED — the 2026-08-24 ruling and its precedent) · #12970 / #12923 (the repair shape) · AGENTS.md → Degradation log levels
Generated by Claude Code
Filed by the
domain:servicesPM seat (sessionsession_012WkdHQwHr2KQmaX7P1BHzi) out of #12981's dispatch, PR #13397. Unassigned. Recording a decision, not claiming it.Why this is a card and not a line in that PR
PR #13397 repairs
backfillPrimaryBuinplugin-sharing: a per-rowcatch {}counted nothing and the report was gated onupdated > 0, so a pass in which every write was refused printed byte-identical output to a pass with nothing to do — while every affected user kept a stale or absentprimary_business_unit_idand every sharing rule keyed on it evaluated against the wrong value. Refusals are now counted and reported once, and the branch isupdated > 0 || refused > 0.⭐ The SILENCE is fixed. The LEVEL is not, and the level is what this card is about. AGENTS.md → Degradation log levels puts "something the system CLAIMS to persist did not persist, while the system keeps looking healthy" at
error. This report lands atwarn.⛔ The routing the dev proposed does not exist — measured, and it is why this card had to be filed
The dev's recommendation was "leave it at
warn; the LEVEL is added by #10556 when that family next moves." Measured:⇒ A closed card cannot track new work. Had this been accepted as written, the level question would have been routed to a card that can never carry it — a half-state of exactly the kind this lane keeps paying to find by hand. The dev's reading of the ruling was accurate; its reading of the card's liveness was not, and nothing in the baseline file it read says the card is closed.
What was actually ruled on 2026-08-24, verified in the ledger rather than recalled
scripts/optional-error-sink-contract.baseline.jsonrecords #10556's ruled shape, and the relevant limbs are:and, on why the publicly exported ones are a contract call at all:
⇒ The 2026-08-24 ruling tightened three publicly exported
plugin-sharingoptions types and shipped that as aminornaming the break.OptionalSharingLogger— the sinkbackfillPrimaryBureports through — was not among them, and its own header forbids growing anerrormember. That ledger now holds exactly 1 entry (control: a nonsense key returns 0), theservice-settingsdeliberate exception, so this is not unpaid debt sitting in a queue; it is a question nobody has been asked.The options, with their real costs
warn. The silence is fixed; the census keeps naming the site so it cannot be forgotten.warnchannelOptionalSharingLoggerwitherror?.errorreachable beside an optionalwarnfor every module on the type, enrolling them all intocheck:optional-error-sink-contract's population at once — and that ledger is shrink-only. This is the shape the gate exists to refuse.backfillPrimaryBua stricter sink ({info?, warn, error?}— thebulk-recompute.tsshape).error, per AGENTS.mdwarnon a publicly exported shape ⇒ breaks any host passing{ info, error }. That is the same break the 2026-08-24 ruling shipped as aminorfor three sibling types — so there is precedent for how to do it, on a card that is closed.This seat's recommendation: A now, C as the end state, on a live card
The operator-visible loss was that a fully refused backfill printed nothing at all, and that is repaired. The level changes who notices first, not whether anyone can. ⛔ B is the actively harmful option. C is right, has a shipped precedent for its break, and is a published-contract change ⇒ above this seat (clause ②,
CONTRACT_REVIEW_TIER), which is the other reason it is a card rather than a line in a census PR.⛔ Re-deciding another card's published-contract call inside a census PR is exactly the workaround-by-adjacency this repo keeps paying to remove.
logger-shapes.ts:72in full — I confirmedOptionalSharingLoggeris declared there and is consumed bybu-tree-recompute.tsandprimary-bu-projection.ts, but the exact member list and the precise wording of the header prohibition are the dev's reading, not mine. ⇒ Whoever takes C reads that header first.OptionalSharingLoggerwas not among them" rests on the dev's report plus the fact that it still has noerror.minornaming it, which suggests the answer was "possibly, announce it" rather than "no".Refs: #12981 (the worklist this came out of) · PR #13397 (where the silence was fixed) · #10556 (CLOSED — the 2026-08-24 ruling and its precedent) · #12970 / #12923 (the repair shape) · AGENTS.md → Degradation log levels
Generated by Claude Code