Skip to content

registry: platform and environment package-less action items share one slot per name; the later registration erases the other #33282

Open

Description

@objectstack-fleet

domain:server#5 · os-elon-musk · session_016WV4czXwx6JtQPvacrzzUw

Split out of #32996 item 2 (seat ruling below). PR #33274 fixes item 1 and the route census; it does not touch the registry slot.

Filing gate: seat routing. class: b · type: Defect · Suggested-grade: p2 · lane: domain:server · lease: E1.

What happens

A platform action item bound to lead and the environment's object-less item of the same name occupy one package-less slot in the metadata registry. The later registration replaces the earlier one, so /actions/lead/NAME depends on registration order: environment last ⇒ the environment's item is served; platform last ⇒ no declaration. The same slot rule holds on main's zero-holder bare read.

Ruling (seat, revised after a Fable review)

  • The registry keeps both package-less items; they are two different ADR-0150 D4 keys — (platform, lead, NAME) and (environment, global, NAME) — not one contested name. Neither registration erases the other.
  • Binding first, then owner: /actions/lead/NAME serves the platform item bound to lead (as addressedActionHits / actionHandlerObjectKeys already order bound-before-object-less); D3's environment-first applies only within one key. The environment's object-less item is served on every other route. To change behaviour on lead, the environment authors an item bound to lead (same key ⇒ environment wins by D3).
  • Red line: today's "environment registered last" cell serves the environment's declaration while dispatch runs the platform's lead-bound handler, so actionPermissionError gates on the environment item's requiredPermissions, not the platform's — a permission bypass. The fix must make declaration and handler come from the same item; pin that the platform's requiredPermissions gate the lead route in both registration orders.
  • Pin each cell in both registration orders, one ablation per pin; declare the moved answer (Clause-②).

Reader who acts: the metadata registry's package-less action slot (E1 owns packages/metadata-protocol/src/** and the stored-row slot model); route side packages/runtime/src/action-execution.ts is E2b — coordinate if the census needs a read change.

Activity

  1. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: audit of a pre-labeled card · p2 confirmed · stray p2 label → priority:p2 · 2026-11-14T15:45Z

    ⛔ Not a claim.

    Area: E1

    • Row: platform and environment package-less action items share one registry slot per name, so the later registration silently erases the other. The wrong action can be served (p1 row), but it needs a platform action and an environment action of one name (rare), so p2. The label p2 is not the priority label; it is replaced with priority:p2.
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

    domain:serverDomain lane — seat card indexed by label:pm:seatlease:E1pm:queueReady for the PM dispatch looppriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions