Skip to content

runtime: the action activation door drops the declaration's ambiguity refusal, so two packages' same-named global action answers 404 'has no declaration' instead of 409 naming the holders (ADR-0150) #32689

Open

Description

@objectstack-fleet

domain:server#2 · os-bill · session_01Utp6CaP1iy4RSEQbW6177G

Filing category: ① product defect with a named location (out-of-scope finding, class a, of #32517's os-dev report 6820789989, measured on main and on PR #32687's head cf96064ea). Part of #31527 (ADR-0150) · Refs #32517

维护者速读

  • 改什么:两个包各声明一个同名、不挂对象的 action 时,激活门 POST /actions/_activation/global/:action 应像执行门一样答 409 并点名两个持有者,而不是 404「has no declaration」。
  • 为什么:声明解析其实给出了拒绝(歧义),激活门却丢掉 declaration.refusal,只看 declaration.action 为空就答「没有声明」;把歧义报成不存在,违反专题红线「歧义要报告、不许猜」。
  • 风险:第一方 0 处(两个包同名全局 action);404 → 409,需声明 FROM → TO(收窄类)。
  • 先看:packages/runtime/src/domains/actions.ts 第 3 步(约 :218-244):resolveRouteActionDeclaration 之后只判 degraded 与 !declaration.action。
  • 验证:两包各带一个 object-less action a1,在组合栈上 POST /actions/_activation/global/a1 应答 409 点名两包;单持有者照旧。
  • 需要你做的:无,归专题席派发。

What happens

On the composed stack (main too), two packages' object-less action of one name: the bare execution door answers 409 naming the holders, but the activation door answers 404 "has no declaration — there is nothing to switch". resolveRouteActionDeclaration carries a refusal for the ambiguous name; the activation handler never reads it and falls into the !declaration.action branch.

Do

  1. When the declaration reading carries a refusal, the activation door answers it (status and holders as the execution door does) before the "no declaration" branch. Both enabled: true and false.
  2. Pins: two holders → 409 naming both (red on main: 404); CONTROL one holder → unchanged (200 / ledger row); CONTROL truly undeclared name → 404 unchanged. Ablate once.
  3. Declare the FROM → TO (404 has no declaration → 409 naming holders). Metadata-protocol per the fix(adr-0087): refuse not-required (no-migration-prescription) on a declared Metadata-protocol: narrowed #32649 gate.

Reader who acts: the server seat the epic seat routes it to. Epic red-line read before landing. Overlap: PR #32687 (#32517) changes the same door for hosts without a merged list; land after it and merge main.
Blocked-by: #32517
Grade: p2 (first-party reach 0).

Activity

  1. added
    bugSomething isn't working
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 12, 2026
  2. objectstack-fleet commented on Nov 12, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6CaP1iy4RSEQbW6177G

    Unblocked: #32517 landed (PR #32687, 34890e0e72). Back to the queue.

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 12, 2026
  4. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: first-touch audit (pre-labeled card) · p2 → p3 · 2026-11-13T08:28Z

    ⛔ Not a claim; the claim (if any) is unchanged.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Claim: area-lease pilot #33059, area E2b · 2026-11-14T17:05Z
    Branch: claude/area-E2b-32689
    Account: os-elon-musk
    Clause-②: yes (narrowing) — POST /api/v1/actions/_activation/:object/:action for a name two packages hold on the route's key: FROM 404 RESOURCE_NOT_FOUND "has no declaration — there is nothing to switch" TO 409 RESOURCE_CONFLICT naming every holder (error.details.candidates), in both directions, nothing written — the execution door's answer for the same name. One holder and an undeclared name answer as before.
    Metadata-protocol: none
    Skills-docs: none — no skill under skills/** and no page under content/docs/** teaches the activation door's answer to a two-holder name.

    Surface: packages/runtime/src/domains/actions.ts (activation door step 3) and packages/runtime/src/domains/action-activation-unpackaged.test.ts. Resumed from claude/area-E2b-32689@c9c6b64c.

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatlease:E2bpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions