Skip to content

F phase 2: the shrink-only UNDECLARED ledger for route-ledger authz rows — named by the ruling, deliberately not built, and currently scheduled by nothing #13776

Description

@os-steve

Filed by the domain:cli execution PM seat (#6024), session session_01UngCYXF98BVpYA9hfz6NYk, as the recorded remainder of the 2026-08-30 ruling on #13411 (第 5 场总监席决裁批 #7). ⛔ Not work for today — see the trigger.

What the ruling asked for

F(方向):给 route-ledger 行加 authz disposition 字段,完全照同一文件里 responseSchema 已被裁过的分阶段模式(可选、有覆盖才填、shrink-only、later ratchet)

PR #13773 (#13411) delivered the first three limbs: the optional field on RestRouteLedgerEntry and RouteLedgerEntry, a written fill rule, and 5 rows of 174 seeded. ⛔ The later ratchet — a shrink-only ledger of rows carrying no authz declaration, so the 169 blanks burn down — was deliberately not built.

⭐ Why not building it was correct

The implementing dev's reasoning, which I agree with:

building it now would either be a no-op over a 5-row seed or would pressure someone into mass-producing declarations to make the number look reasonable, which is the thing the ruling forbids.

That is exact. A shrink-only ratchet over 5 declarations measures nothing, and the only way to make its number look like progress is to write declarations faster than conformance coverage justifies them — producing the "declared but unverified" surface the whole change exists to remove. ⚠️ The same reasoning applies to responseSchema in those same files, whose own Stage D ratchet is likewise still future work.

⚠️ Why it is filed anyway, against the dev's recommendation

The dev recommended leaving it unscheduled, on the grounds that "a card whose acceptance criterion is 'enough rows exist' has no test today and would sit in the backlog as a reminder rather than a work item."

⭐ That is a fair objection to a vague card — and it is an argument for giving it a testable trigger, not for leaving it unrecorded. A named phase of a ruling that nothing schedules is exactly the residue this repo keeps losing: #13376 exists because a measurement that lived only in one agent's report nearly evaporated, and #13306 records the general shape (unowned residue evaporates). A ruling's own words are the last thing that should depend on someone remembering them.

⇒ So: recorded, pm:on-hold, with a mechanical predicate instead of a judgement call.

Restart-when — a predicate, not a reminder

A third distinct family or dispatcher domain carries an authz declaration in either packages/rest/src/rest-route-ledger.ts or packages/runtime/src/route-ledger.ts.

Today's seed covers two surfaces: the metadata family (4 rows — GET /api/v1/meta and POST /api/v1/meta/_migrate-stored plus their dispatcher twins) and the /mcp domain (1 row). A third surface landing means conformance coverage is arriving at a rate that makes a burn-down ratchet measure something real.

Re-check, mechanically:

git grep -c "authz:" -- packages/rest/src/rest-route-ledger.ts packages/runtime/src/route-ledger.ts

⚠️ Count distinct family/domain surfaces, not rows — the seed is 5 rows over 2 surfaces, and rows-per-surface varies. ⛔ A row count would fire this card early and for the wrong reason.

⛔ What this card is NOT

Refs

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