Skip to content

[Decision] plugin-sharing's refused-backfill report lands at warn where AGENTS.md puts it at error — and the card that was supposed to carry the level is CLOSED #13398

Description

@os-elon

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 whatOperator-visibleCost
ALeave 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 channel0
BGrow OptionalSharingLogger with error?.SameRefused 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.
CGive backfillPrimaryBu a stricter sink ({info?, warn, error?} — the bulk-recompute.ts shape).error, per AGENTS.mdMechanically 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

  1. 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.
  2. 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.
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions