Skip to content

Bare-name phase 3: defineStack and the save door refuse a bare package-authored name; ADR-0129 and ADR-0048 amended; migration of stored and external references (ruling C on #30798) #30806

Open

Description

@objectstack-fleet

epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu

Filing-gate category: ② execution of a maintainer ruling. Decision #30798 ruled C, maintainer verbatim (Claude Code session, 2026-11-06): 「同意 c」: every package-authored metadata name carries its namespace, phased. Routing, verbatim: 「能交给车队开发的你不要自己开发」.

Phase 3 of 3: the contract.

Blocked-by: #30803
Blocked-by: #30804

Ask

  1. Rule. Extend validateNamespacePrefix (packages/spec/src/stack.zod.ts, the shared rule in packages/spec/src/kernel/namespace-prefix.ts) and the save door (protocol-save-door-refusals.ts) to refuse a bare package-authored top-level name in a package that declares a namespace, with the rename in the message. Same exceptions as phase 2. Clause-②: yes (contract surface).
  2. ADRs. Amend ADR-0129 (the literal prefix covers every type) and ADR-0048 §3.4 (coexistence by bare name retires; the phase 1 refusal remains as the backstop).
  3. Migration, designed before code; the plan goes in the PR or a design comment first:
    • first-party packages (hotcrm, templates, examples, the showcase) migrate in the same release; the phase 2 baseline gives the size;
    • stored references in live environments: user permission-set assignments hold bare names, so renaming a set without migrating them removes access. List every stored by-name reference (assignments, activation switches, flow and action references in records, AI agent prompts naming tools) and migrate each one;
    • external references: inbound webhook ids, connector ids and api item names may be called from outside. List them and decide an alias or an exclusion for each; never break silently;
    • third-party packages: a deprecation window (warn, then refuse) or an ADR-0087 load-time conversion; the lane's design call, stated in the plan;
    • Studio: a name typed in Studio gets the package or pair namespace prefixed automatically (ADR-0146 pairs); decide what a package-less environment item uses;
    • length: a 20-character namespace plus _ plus the short name must fit the item-name pattern and the storage identifier limit; refuse with a clear message.
  4. Tests: one refusal per type family, the exceptions, the migration of a stored assignment, and a two-package install that now cannot collide.

Reader: the domain:engine lane seat (with domain:spec for the rule), from pm:queue once both blockers close.


Generated by Claude Code

Activity

  1. added
    priority:p1High: required for production / M2
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    domain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they land
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · domain:engine → domain:server · p1 kept · 2026-11-06T04:56Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    domain:serverDomain lane — seat card indexed by label:pm:seat
    and removed
    domain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they land
    on Nov 6, 2026
  4. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Seat note for phase 3 · 2026-11-08T05:09Z · ⛔ Not a claim.

    The contract review of #30803's closing PR (#31375, record 6717571232) measured two readings outside ruling 6688041914's nine types. Phase 3's design should know about both:

    • tool is served first-registered at GET /meta/tool/NAME when two packages ship one bare tool name. A third package installed after the boot answers 200 and is shadowed. That is the same defect class phase 1 closed for the nine types, but it is not on their list. Phase 3's namespaced names resolve it; until then it is open. If the maintainer wants it closed in phase 1's way first, that is a new card, by ruling.
    • The kernel metadata service, as read by MCP agent_prompt, sees no package-shipped agent, while GET /meta/agent/NAME serves one. The two readers of "an agent by name" disagree (ADR-0063 §2 direction). Name the one reader when phase 3 rewrites agent resolution.

    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu

    Both blockers closed: #30803 (phase 1, the registration refusal) and #30804 (phase 2, the lint and templates). pm:blocked → pm:queue for the domain:server lane. Ruling C on #30798 stands: the migration plan (stored references, external references, third-party window, Studio auto-prefix, length) comes before code.

  7. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Claim: PM loop round 1 · 2026-11-08T09:08Z
    Session: session_01FEkQ5psDxi37aZAzXB36TT (card thread, dev) · seat session_01FEkQ5o8PE7ZtVjcor51wBZ
    Account: os-project-manager
    Branch: claude/project-thread-mi92c5
    Worktree: objectstack-issue-30806
    Domain: domain:server
    Seat: domain:server#5
    File surface: design step only: one plan comment on #30806 and /mnt/project-files/pm-orders/server/30806-plan.md; no branch, no PR, no repo file changed (the later code slices are cut by the seat from the plan and claimed separately)
    Container & model: L, mode:thread, model: default tier, effort: thread default
    Clause-②: no — this step changes no code and no published surface; each later slice declares its own arm (the spec rule and save door are yes per the card)
    Metadata-protocol: none
    Responsibility: bare-name phase 3 migration plan (objectstack + hotcrm) | ruling C on #30798 requires the plan before code: first-party size, stored by-name references, external references, third-party window, Studio auto-prefix, length | every environment holding a bare package-authored name once phase 3 refuses it
    Thread-read: 6719265041
    Premise: holds — both blockers (#30803, #30804) closed, unblocked 6719265041
    Serial constraints cleared: cleared — design only, touches no file

    Scope: Part of #30806 (step 1 of the phase: the migration plan). Measure, do not read-as; open choices go to open_questions as needs_decision; nothing is decided for the maintainer. Order: /mnt/project-files/pm-orders/server/order-30806.md. Summons: the maintainer's 「server 再开两个座位」「并发都是5」 (this project, 2026-11-07); grading per 「定级你可以自己决定」 is triage's here (graded on the card).

  8. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 8, 2026
  9. 1 remaining item

  10. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Maintainer ruling — phase 3 plan, Q1–Q5 · 2026-11-08T12:33Z

    ⛔ Not a claim. The plan is 6719833098. The maintainer ruled all five open questions as recommended, verbatim: 「同意」 (2026-11-08T12:32:25Z, project message cmsg_01TenzsRopZj4jMbvjX8uz1XEu2wtRCqM4747ZbqUijwKK, after the seat's evaluation thread put the five questions to him with the object-bound cost stated). Ruling-ref for every slice of this phase.

    • Q1 = A. Engine function names (functions, hook handler, flow script targets) carry no prefix. Phase 1's one-holder refusal stays their backstop.
    • Q2 = A. Third-party packages are refused from the release that ships the rule, with an executable migration entry (ADR-0087 L2 + L3). There is no warning window and no load-time conversion. This holds unless the cloud lane finds a marketplace-listed third-party package with bare names, which would reopen Q2 for exactly those packages.
    • Q3 = A. A renamed flow's inbound hook gets no URL alias. The upgrade report and an admin notification name the new URL.
    • Q4 = A. The stored-reference migration runs inside the managed upgrade, atomic and journaled, plus os migrate bare-name-references for code-deployed apps. A dangling reference with no recorded previous version is never rewired.
    • Q5 = A. MCP agent_prompt moves onto the protocol's agent read as its own card, after phase 3.
    • Object-bound types: the maintainer was offered an exception for object-bound actions, hooks and pages (117 of hotcrm's 206 renames) and did not take it. S1 judges them, as the ruling's letter says.

    Slices (the plan's §8)

    1. S1, the spec rule. Dispatched now as Part of #30806. It has no open dependency.
    2. S2 (save door) and S3a / S3b / S3c (stored-reference migration). Each is cut as its own card when S1 lands, because they build on S1's shared predicate.
    3. S4 (ADRs, Tier H). Follows S1–S3 as built.
    4. S5 (hotcrm renames). Ships on the release that carries S1–S3.
    5. Q5. Filed as its own card, blocked by this one.

    Generated by Claude Code

  11. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Claim: PM loop round 1 · 2026-11-08T12:35Z
    Session: session_01FEkQ5psDxi37aZAzXB36TT (card thread, dev) · seat session_01FEkQ5o8PE7ZtVjcor51wBZ
    Account: os-project-manager
    Branch: claude/project-thread-mi92c5
    Worktree: objectstack-issue-30806
    Domain: domain:server
    Seat: domain:server#5
    File surface: slice S1 only: packages/spec/src/kernel/namespace-prefix.ts, packages/spec/src/stack.zod.ts (validateNamespacePrefix), cli lint.ts / utils/project-namespace.ts (import the spec predicate), the fixture sweep, tests, root .changeset/
    Container & model: L, mode:thread, model: default tier, effort: thread default
    Clause-②: yes (narrowing) — defineStack / validate refuse a bare package-authored top-level name in a package that declares a namespace, and a new exported spec predicate is the widening arm; contract review at the schema face (CONTRACT_REVIEW_TIER) before the queue
    Metadata-protocol: narrowed
    Responsibility: bare-name phase 3 S1, the spec rule (objectstack) | a package that declares a namespace may still author a bare top-level name of most types, so two packages collide by name | every package author; ruled C on #30798, Q1–Q5 ruled A (6721537981)
    Thread-read: 6721537981
    Premise: holds — plan 6719833098 measured objectstack at 0 bare names; the fixture sweep is measured first
    Serial constraints cleared: cleared — no open PR touches namespace-prefix.ts or validateNamespacePrefix

    Scope: Part of #30806 (slice S1 of the plan's §8). Q1 = A (engine function names excluded); object-bound types judged; one predicate in spec, cli imports it; S2–S5 are separate slices. Order: /mnt/project-files/pm-orders/server/order-30806.md. Summons: the maintainer's 「server 再开两个座位」「并发都是5」 (this project, 2026-11-07); grading per 「定级你可以自己决定」 is triage's here (graded on the card).

  12. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Maintainer ruling — item 14, object-bound actions and hooks · 2026-11-08T12:38Z

    ⛔ Not a claim. This amends the seat record 6721537981, whose last bullet ("Object-bound types… S1 judges them") is replaced by what follows. Ruling-ref: decision card cmsg_01TenzsRopZj4jMbvjX8uz1XSX3HFEWDwB1RTUxK3vFF8J, where the maintainer tapped A 免加 at 2026-11-08T12:37:10Z. The tap record cannot be attached, so the card id and time are the reference.

    • Object-bound actions and hooks are not judged by the namespace-prefix rule. They are addressed through their prefixed object (runtime key objectName:name, ADR-0048 §6). This is the same principle as ruling C's exception for names derived from a prefixed object.
    • Object-bound pages stay judged. They are read by bare name.
    • Consequences:
      • S1's predicate exempts an action or hook that carries an object.
      • hotcrm's rename set drops from 206 to 111.
      • /actions/:object/:action URLs do not change.
      • ADR-0048 §3.4's object-bound-action sentence stays true, and S4 records the exemption in ADR-0129 D2's exception list.
    • Conditions the maintainer accepted:
      1. Before the exemption is treated as safe, the seat measures whether MCP list_actions / run_action and the other by-name action reads (the activation switch, /meta/action/NAME) carry the object or package coordinate. Findings are filed. The measurement runs in the S1 thread now.
      2. The one measured clash, cloud's AI tool name action_ plus the bare name, is filed for the cloud lane as cloud: the AI tool name action_<bare> carries no object, so two packages' same-named object-bound actions collide (bare-name phase 3, item 14 condition) #31515 (parked, repo cloud).

    Generated by Claude Code

  13. added
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 8, 2026
  14. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Maintainer ruling — phase 3 turns to package-scoped addressing · 2026-11-08T13:13Z

    ⛔ Not a claim. This amends the seat records 6721537981 (Q1–Q5) and 6721596287 (item 14).

    Ruling-ref: the decision card cmsg_01TenzsRopZj4jMbvjX8uz1XATexDjYzJB6TpMhGjoRmoe, where the maintainer tapped A 「转向包寻址」 at 2026-11-08T13:12:35Z. The tap record cannot be attached, so the card id and time are the reference. The card follows his message cmsg_01TenzsRopZj4jMbvjX8uz1X1G8FxhmCSVkgRa8qnd66DS: 「你不能只考虑现状,还要考虑长远的合理性;我说的流程不是url挂到对象下,而是挂到软件包下」.

    What changes

    1. The name rewrite is withdrawn. Slice S1 (the namespace-prefix refusal for behavioural types) and S5 (the hotcrm renames, 206 and then 111) do not ship. The S1 work in progress is dropped, not merged.
    2. A Tier H design card re-opens ADR-0028 (status Deferred) for behavioural metadata: flows, actions, jobs, sharing rules, assignment rules, permission sets and the other top-level non-object types.
      • These are keyed by (package, name).
      • Objects stay literal-prefixed (ADR-0129 D2, physical table names). The ADR states why the two tiers differ.
      • The card number is posted here when it is filed.
    3. S3 is re-scoped. It becomes "stored by-name references gain a package column, backfilled from the overlay binding", instead of rewriting names.
    4. Bare-name resolution:
      • first the same package;
      • else a unique holder in the declared dependency closure (ADR-0141);
      • else a refusal, reusing phase 1's one-holder refusal shape.
        By-name URLs gain a package segment. A bare name still resolves when it is unique in the environment, and answers 409 with the candidates otherwise.
    5. Phase 1's backstop stays as the safety net until the design lands.

    What it supersedes

    Carried into the design, real either way


    Generated by Claude Code

  15. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Maintainer ruling — per-type table for the package-addressing design · 2026-11-08T15:39Z

    ⛔ Not a claim. This follows the record 6721941146. The maintainer ruled the per-type table for design card #31527, tapping option A 「按修正后分档写入」 at 2026-11-08T15:36:01Z on card cmsg_01TenzsRopZj4jMbvjX8uz1XXcuUzfgeP6JVoqNvDUzLQu.

    The table is recorded on #31527 (6723462584) and written into that card's body. In short:

    • objects, fields, views, capabilities, docs and api paths keep the global literal prefix;
    • twenty behavioural and presentation types are keyed (package, name);
    • AI-face types also get a derived flat name;
    • environment-authored rows belong to the implicit environment package;
    • positions are environment-scoped.

    Generated by Claude Code

  16. removed
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 8, 2026
  17. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Release: claim 6721563145 · session session_01FEkQ5o8PE7ZtVjcor51wBZ (seat domain:server#5) · reason: the server lane is going off duty under the maintainer's 「server 车道当前任务处理完,合并久就下班」. Slice S1 was withdrawn before any push by the ruling recorded at 6721941146, which turned phase 3 to package-scoped addressing; S1 and S5 are withdrawn and S3 is re-scoped. · next: wait for epic #31527 (ADR-0150 and its children), which decides which slices of this card remain.
    Resume-from: none
    Blocked-by: #31527

  18. added
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 8, 2026
  19. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: regrade p1 → p2 under the adopted grading rules (#32997) · 2026-11-13T03:09Z

    ⛔ Not a claim; the card's claim and state are unchanged.


    Generated by Claude Code

  20. added and removed
    priority:p1High: required for production / M2
    on Nov 13, 2026
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

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:serverDomain lane — seat card indexed by label:pm:seatpm:blockedBlocked by another issue/PR — body carries Blocked-by: #Npriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions