Skip to content

[finding] every OTHER shipped provider in rest-api-plugin.ts still absorbs the three-state ctx.getService throw — the #13904 shape, waiting one seam over #14251

Description

@os-justin

Found while implementing #13904 (PR #14250). Recorded for triage; no severity asserted and no wire consequence measurable today.

Blocked-by: #13906 (sequencing, not scope — see below). DISCHARGED#13906 closed completed 2026-09-04T05:38:57Z via PR #15020 (MERGED).

Restart-when: a consumer-half repair lands for any slot in the phase-1 census (comment 5542086636) — i.e. when that slot's consumers stop re-collapsing a rejection into the undefined path.

⚠️ Phase 1 measured ZERO of 12 slots ripe. Every consumer of every unrepaired provider converts a rejection into exactly the value its undefined path produces, so a provider-side repair is unobservable today at all 12 — the card's own prediction, now measured per slot. ⛔ Phase 2 is not authorised until the restart condition above is met.

⭐ The decidable test is not "a distinguishing seam exists" but "no consumer re-collapses" — the engine slot has a distinguishing seam and is still re-collapsed at a second consumer (#15405).

⭐ Roster corrections from phase 1: the file's 14 catch { return undefined; } sites are 12 unrepaired slots plus 2 documented sync legs of the two already-repaired providers, so 14 is not a slot count; tenancyServiceProvider post-dates this card and is already repaired; and serviceExistsProvider is a 13th absorbing closure this body never named, invisible to a shape-grep because it catches to false.

⚠️ Structural finding: on both repaired slots the consumer half landed first, and for all 12 remaining neither half is landed — so each slot is a ruling + a consumer edit + a provider edit + a pin, ⛔ not the "one bounded edit per slot" the note at the foot of this body promises.

⛔ The tenancy slot's wire consequence is #15256 (p0 · security · needs-user-decision). This card is not a route into it.

The shape

#13904 repaired ONE of the twelve provider closures rest-api-plugin.ts hands to RestServer: objectQLProvider now absorbs only the branded "never registered" rejection (#13905's discriminator) and re-raises everything else, so the transport's wiredEngineOrLoud seam finally sees a wired-and-broken engine.

The other shipped providers — authServiceProvider, emailServiceProvider, sharingServiceProvider, reportsServiceProvider, approvalsServiceProvider, sharingRulesServiceProvider, i18nServiceProvider, analyticsServiceProvider, settingsServiceProvider, securityServiceProvider, metadataServiceProvider, and the default-project reader — all keep the superseded shape: sync ctx.getService(slot) under a catch-all returning undefined. Each therefore still collapses the same three registry facts (never registered / registered as a factory / registration failed to build) into the one value its consumer reads as "not wired".

⚠️ Phase 1 correction: this list is staletenancyServiceProvider has since been repaired, and serviceExistsProvider belongs on it. Use the census table, not this paragraph.

Why this is a recorded observation and not a defect today

The collapse currently has NO observable wire consequence for these slots: their transport seams absorb anyway (computeExecCtx reaches them through seamOrUndefined, and the per-route call sites carry their own catches). Repairing the providers before those seams distinguish would be a signal-less change — the same reasoning that held #13904 behind the #13476/#13910 transport repair, recorded in its routing comment.

⭐ Phase 1 upgraded this paragraph from a reading to a measurement, per slot, with every consumer call site enumerated and read in full.

Why it will become the #13904 shape one seam over

#13906 (held behind #13095 at the time of this filing) pins computeExecCtx seams that these providers feed. When that family's repairs make a seam take the wiring fact from provider presence — as wiredEngineOrLoud now does for the engine — the shipped provider for that slot will absorb one layer earlier and the repair will not reach the shipped single-kernel wiring. That is precisely the defect class #13904 recorded against the engine slot, reproduced per slot.

Not folded into PR #14250, deliberately

Bounded-in-place fails on the first condition: these are different consumers with different downstream contracts (auth feeds identity resolution; settings feeds localization; email feeds a 501-style route guard), and "which conditions should re-raise" is a per-consumer judgement — the same reason #13904 was filed rather than folded into #13476. A mechanical sed of eleven catches into the engine slot's shape would assert eleven consumer contracts nobody measured.

Note for whoever takes it

The engine slot's repaired shape (async accessor + branded absorb + sync leg for KernelBase hosts) is directly copyable as a MECHANISM, but each slot owes its own consumer-side reading first: what does the seam or route do with a rejection versus an undefined, and is that seam's distinguishing repair landed yet? Doing them before their seams distinguish buys nothing observable; doing them after is one bounded edit per slot with a pin each.

⚠️ Phase 1 refuted the last clause: it is not one bounded edit per slot. See the Restart-when block above.

Related, and distinct

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions