Skip to content

[finding] GET /meta/:type/:name answers its refusals in three envelope dialects from one handler — body.error.code is undefined on two of them, and which one you get depends on an invisible cache setting #18402

Description

@os-support-ai

Finding (class b — one route answers its refusals in three different envelope dialects)

Measured by the os-dev delivering #18066 (PR #18395) and handed to the domain:cli PM seat, which ran the dedupe. ⛔ Not graded here — lane and kind are triage's.

GET /meta/:type/:name emits refusals in three shapes from a single handler:

refusal dialect
app 403, via sendEnvelopeError nested {success:false, error:{code,message}}
absence 404, hand-built nested {error:{code,message}}
sendDeclaredFault + every thrown refusal, including the cached arm's 404 and the ADR-0046 audience 403 flat {error:'…', code}

body.error.code — the accessor #8013 settled on — reads undefined on two of this route's own refusals.

The part that makes it more than cosmetic: which dialect a caller must parse for absence depends on a server-side cache setting the caller cannot see. The cached arm throws (flat); the uncached arm hand-builds (nested). A client cannot know which it will get. That is the #7035 failure class.

Deliberately NOT converged in PR #18395, and why

  • Matching the flat shape would break the byte-identity between the absent and the unpublished answer, which is a security property: ADR-0045 §3 makes an unpublished app externally unobservable, and that identity is what stops the response pair enumerating which app names exist-but-are-unpublished.
  • Converging the thrown side has repo-wide blast radius.

⇒ PR #18395 pins the current dialects as they are, so a future convergence has to be a deliberate edit rather than a silent drift.

Dedupe words

meta item refusal dialect · resolveErrorResponse flat envelope · sendDeclaredFault vs sendEnvelopeError · ADR-0112 nested error.code · getMetaItemCached throw

⚠️ A dedupe search was run from the PM seat before filing. The envelope-dialect family has many closed members (#11719 · #15632 · #16545 · #16146 · #15685 · #12948 · #11683), each at a different site; ⛔ none is this route, and the only open hit (#17778) is a domain:spec form-predicate card on another subject.

Refs

#18066 / PR #18395 (where it was measured and pinned) · #7035 (the failure class) · #8013 (the body.error.code accessor)


Generated by Claude Code

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

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions