Skip to content

The durability log-level gate cannot see the catch { return null; } seeder family — 15 files outside #12923's five, and neither widening path is cheap #12981

Description

@os-litant

Filed by the domain:services PM seat (session session_0194kbQJxUvv2yvsGRtuXpP5) out of #12923's dispatch. Unassigned, ungraded — recording a measured programme, not claiming it.

The observation

scripts/check-durability-degradation-log-level.mjs (#4632) enforces AGENTS.md → Degradation log levels: a degradation whose consequence is that something the system CLAIMS to persist did not persist — while the system keeps looking healthy — MUST log error.

#12923 measured a family the gate structurally cannot see. The RBAC catalog seeders swallowed refused writes in catch { return null; }, so a boot logged "RBAC catalog seeded" at info over zero landed rows, on a deployed plane, for weeks. That is the gate's own defining shape — and the gate was green over those files the entire time.

⚠️A green from this gate over such a file means NOT MEASURED for that site, not "level approved." Worth stating plainly, because the green is otherwise read as endorsement — it was in #12923's first round.

Why it cannot see them — measured, both widening paths

The gate matches callee names from a declared DURABILITY_CRITICAL_CALLEES vocabulary (18 entries). Neither way of extending it to this family is the one-line edit it looks like:

PathMeasured cost
Add insert / update to the vocabularyRefused by the gate's own design. Its header excludes find/findOne/count as "names too generic to declare repo-wide", and .insert( has 144 non-test call sites across 72 files (re-measured on origin/main@196a6c73e; #12923's dev measured 156 through a slightly different filter — same order either way). insert is squarely in the excluded class.
Add the seeder-local helper names (tryInsert / tryUpdate)15 non-test files outside #12923's five seeders still declare the identical catch { return null; } shape and would all redden at once — and there is nowhere to park them. scripts/durability-degradation.baseline.json is shrink-only, has deliberately no --fix/--update flag, and its header reads "CURRENTLY EMPTY — the intended steady state, not a dormant file", with an entry meaning "a REAL degradation that is not yet fixed".

⇒ The second path is a 15-file repair programme wearing the costume of a one-line vocabulary edit. Doing it inside a feature card would either redden CI or grow a ledger whose whole value is being empty.

Why this is filed rather than fixed

Deciding how to close a 15-file silent-swallow family — repair them, widen the vocabulary and accept a transitional ledger, or find a third framing — is a scope and governance call, not a consumer-side one. #12923 correctly shipped its five seeders and declined to widen the gate unasked.

Known members of the 15

#12970 is already two of them, both measured:

  • permission-set-drift.ts drops a refused drift-diagnostic write, then gates its whole report behind updated > 0 — so a boot where every write is refused prints nothing and reads as "no drift";
  • permission-set-overlay-discard.ts discards the write's result on the degraded-kernel branch and then logs "package-declared permission set overlay discarded (sanctioned operator action)" with before/after counts that are equal — an audit record asserting an operator action that never landed.

Both now have a channel to fix, since #12923's shared reporter already takes an optional refusal log.

Refs

#12923 (the five seeders, where this was measured) · #12970 (two of the fifteen) · #4632 (the gate) · #4420 (the accident it exists for: "the durable suspended-run store was attached to a table that was never created, every write failed into a warn nobody read, and each restart silently dropped every in-flight approval. The system reported itself healthy the whole time.") · AGENTS.md → Degradation log levels

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions