You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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).
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).
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.
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.
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.
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.
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).
⛔ 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)
S1, the spec rule. Dispatched now as Part of #30806. It has no open dependency.
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.
S4 (ADRs, Tier H). Follows S1–S3 as built.
S5 (hotcrm renames). Ships on the release that carries S1–S3.
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).
⛔ 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:
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.
⛔ 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
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.
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.
S3 is re-scoped. It becomes "stored by-name references gain a package column, backfilled from the overlay binding", instead of rewriting names.
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.
Phase 1's backstop stays as the safety net until the design lands.
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;
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
Rule: the maintainer adopted the fixed grading order on 2026-11-13: impact, reach discount, one raise, release window (「…其他同意」 · 「你现在就开始执行这个规则」). A rule change allows this one re-grade pass over the open p1 cards.
Activity
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit ·
domain:engine→domain:server· p1 kept · 2026-11-06T04:56Z⛔ Not a claim.
domain:engineis a retired alias ofdomain:server. This card is part of the bare-name / unmanaged-install programme following [decision] A non-object metadata name shared by two installed packages often resolves to one package silently: which naming contract replaces ADR-0048 §3.4? #30798, and keeps the p1 it was filed with. Any ADR text it touches is Tier H.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
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:
toolis served first-registered atGET /meta/tool/NAMEwhen 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.metadataservice, as read by MCPagent_prompt, sees no package-shipped agent, whileGET /meta/agent/NAMEserves 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
objectstack-fleet commentedon Nov 8, 2026
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:queuefor thedomain:serverlane. Ruling C on #30798 stands: the migration plan (stored references, external references, third-party window, Studio auto-prefix, length) comes before code.objectstack-fleet commentedon Nov 8, 2026
domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ
Claim: PM loop round 1 · 2026-11-08T09:08Z
Session:
session_01FEkQ5psDxi37aZAzXB36TT(card thread, dev) · seatsession_01FEkQ5o8PE7ZtVjcor51wBZAccount:
os-project-managerBranch:
claude/project-thread-mi92c5Worktree:
objectstack-issue-30806Domain:
domain:serverSeat:
domain:server#5File 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 defaultClause-②: no — this step changes no code and no published surface; each later slice declares its own arm (the spec rule and save door are
yesper 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_questionsasneeds_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).1 remaining item
objectstack-fleet commentedon Nov 8, 2026
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.
functions, hookhandler, flowscripttargets) carry no prefix. Phase 1's one-holder refusal stays their backstop.os migrate bare-name-referencesfor code-deployed apps. A dangling reference with no recorded previous version is never rewired.agent_promptmoves onto the protocol's agent read as its own card, after phase 3.Slices (the plan's §8)
Part of #30806. It has no open dependency.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ
Claim: PM loop round 1 · 2026-11-08T12:35Z
Session:
session_01FEkQ5psDxi37aZAzXB36TT(card thread, dev) · seatsession_01FEkQ5o8PE7ZtVjcor51wBZAccount:
os-project-managerBranch:
claude/project-thread-mi92c5Worktree:
objectstack-issue-30806Domain:
domain:serverSeat:
domain:server#5File surface: slice S1 only:
packages/spec/src/kernel/namespace-prefix.ts,packages/spec/src/stack.zod.ts(validateNamespacePrefix), clilint.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 defaultClause-②: yes (narrowing) —
defineStack/validaterefuse 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 queueMetadata-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.tsorvalidateNamespacePrefixScope: 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).objectstack-fleet commentedon Nov 8, 2026
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.
objectName:name, ADR-0048 §6). This is the same principle as ruling C's exception for names derived from a prefixed object./actions/:object/:actionURLs do not change.list_actions/run_actionand 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.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
objectstack-fleet commentedon Nov 8, 2026
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
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.
What it supersedes
Carried into the design, real either way
(type, name)key, which names no package or object coordinate.ActionNavItem, which carries no object.action_plus the bare name). Its spelling now follows the design's address.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
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:
Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ
Release: claim 6721563145 · session
session_01FEkQ5o8PE7ZtVjcor51wBZ(seatdomain: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
docs(adr): ADR-0150 records its children's rulings; ADR-0048 §5, ADR-…
objectstack-fleet commentedon Nov 13, 2026
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