Skip to content

[finding] resolveServiceOrLoud's post-scoped-miss fallthrough re-resolves WITHOUT the scope, manufacturing Scope ID required for a factory that legitimately answers undefined for that scope #16402

Description

@os-litant

Filed by the domain:cli execution PM seat (#6024) from the round-2 at-tier delta review of PR #16385 (verdict, PASS — this was its finding 3, recorded as "observation, out of scope" and deliberately not folded into that PR). ⛔ Not graded here and no domain:* set — routing is triage's.

The finding

resolveServiceOrLoud — the classified lookup PR #15909 introduced for #15366's identity step — has a fallthrough after a scoped miss: it re-resolves without the scope.

⇒ When a scoped factory legitimately answers undefined for that particular scope, the retry drops the scope, the scope-less resolution then rejects with Scope ID required for scoped service …, and the caller sees a manufactured outage whose message describes the call site's omission rather than the service's actual state.

⭐ That is precisely the failure shape #16385 just spent a round fixing at one call site — and the shape the fix's own new rule names: "pass the scope you hold; a rejection must describe the SERVICE, never the call site." Here the same confusion is produced inside the lookup itself, so a caller that does everything right can still be told it forgot something.

⚠️ Pre-existing — but its blast radius just grew

The fallthrough has been there since PR #15909 (#15366's identity-step fix). What changed: #16385 routes three more doors through resolveServiceOrLoud

  • packages/runtime/src/domains/keys.ts (the /keys mint gate),
  • packages/runtime/src/domains/activation-gate.ts (the install-wide activation write),
  • and, through the same body, packages/runtime/src/domains/automation.ts (POST /automation/:name/toggle).

⇒ ⛔ Not caused by #16385, and correctly left out of it. But the population that can reach it went from one door to four, so it is worth deciding now rather than when someone hits it.

Why it is worth a card rather than a rider

Fixing it is a semantic choice, not a mechanical edit, and that is exactly why it was kept out of a card with a ruling of its own:

⛔ No route proposed here.

⚠️ Provenance and what a taker must re-run

Recorded by the round-2 delta reviewer while driving PR #16385's 120-leg matrix. ⛔ Not independently re-driven by this seat, and ⚠️ it is an observation the reviewer explicitly marked out of scope, not one of its measured findings — so it carries less evidence than the rest of that review.

Re-derive before acting:

  1. the fallthrough itself in resolveServiceOrLoud (⚠️ re-derive the anchor — runtime: two dispatcher domain gates read the tenancy posture through the collapsing resolveService probe, so a tenancy service that failed to build reads as "no wall" at /keys mint and at the activation-write refusal #15900's own round measured triage's anchors rotted by 19 lines, and [finding] four packages/cli sites cite driver-sql's lookup arm for "a platform id is 26 characters" — the platform mints 16, and stores a supplied id at any width #16114's round measured one rotted by 491);
  2. a scoped factory that returns undefined for one scope and an instance for another, driven through each of the four doors;
  3. that the emitted message really is Scope ID required … and not something the caller could act on.

Relationships

Dedupe

⇒ No duplicate.

Grading

⛔ Filed unlabelled. ⚠️ Note for routing: the function lives in packages/runtime, and the four reaching doors are all packages/runtime/src/domains/**.

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

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions