Repository navigation
Description
epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz
Filing gate: ④ coordination node: child P of the epic #31527 (parent and per-layer children), as ADR-0150 (docs/adr/0150-behavioural-metadata-addressed-by-package-objects-keep-the-literal-prefix.md, merged in #31586 at 5d1382a)'s execution plan lists it. Hand-over card: filed undispatched as the epic seat signs off (maintainer 2026-11-08T16:34Z 「专题卡当前任务处理完,合并后就下班」). ⛔ Not a claim.
Ruling-ref: per-type table A (6723462584); epic A 「立专题」 (6723499113); division of labour A 「留核心,其余交车道」 (6723571682); Q1/Q2 (6724050556); Q3 (6724530715); ADR-0150 accepted by merge (#31586, 2026-11-08T21:16Z).
Business reason: inherited from the parent #31527. Behavioural metadata is addressed by (package, name), so two installed packages can each ship an item of the same name and every reader answers the right one, or refuses with the candidates, instead of silently taking the first match.
Reader: the next domain:spec seat picks it from the queue and accepts its PR against the red lines below.
Dedupe (open AND closed): namespace segment address grammar (12; top hits #29151(closed) #23072(closed) #28942(closed), none on point: they are this epic, its parent #30806, or unrelated cards).
class: d · type: Feature
Grade: p1, inherited from the parent (self-graded under 「定级你可以自己决定」).
维护者速读
规格层的地基:给 MCP 动作加 namespace 字段、地址语法工具、AI 侧名字的推导规则(NS-NAME / OBJECT-ACTION),并撤掉「所有元数据名都要带前缀」的 lint 和技能文案。其余服务端子卡依赖它。
What to build
namespaceon the MCPrun_action/list_actionsshapes (D5).- The address grammar helpers (D5), including the namespace-position literal constant in
spec/kernel(the set of grammar literals a namespace may not spell) and the refusal of a_-led name of a bucket 2/3 type atdefineStack,os validateand the save door. - The AI face derivation (D6, ruled Q1 = A):
NS-NAMEfor tool, skill, agent and object-less action;OBJECT-ACTIONfor an object-bound action; an environment item keeps its bareNAME. - K's predicate rides this card (ruling 6723571682): the one predicate in
kernel/namespace-prefix.tsthat refuses a namespace equal to an object name in both directions, and an object short-namedcustom(Q3 = A, record 6724530715). K wires the doors. - Retire phase 2's
naming/namespace-prefixbare-name warning for buckets 2–4 (the intra-package duplicate warning stays), and the authoring skills' and create-objectstack templates' instruction to prefix bucket 2–4 names (D9; 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, Bare-name phase 2: the published authoring skills teach one rule, every metadata name carries the namespace (ruling C on #30798) #30805).
Surface
- Expected file surface: spec (
ai/,api/,automation/,data/,integration/,security/,system/,kernel/), clilint.ts,skills/, create-objectstack templates. - Clause-②: yes.
- Narrowing: yes: a
_-led name of a bucket 2/3 type (measured first-party: 0); K's predicate is not wired to a door here.
Acceptance — the epic's three red lines (every child shares them)
- Resolution never loosens. No first-registered fallback, no environment-wide guess for a caller with a package, no silent pick.
- Ambiguity is reported, never guessed. Every refusal and every migration report names every candidate.
- Independently releasable (red line 3). The PR proves it with ADR-0150's four readings: (a) the phase-1 one-holder tests stay green; (b) bare-name behaviour (URLs, MCP, SDK) is unchanged for every name with one holder, except this card's declared narrowing; (c) any migration is re-runnable and never guesses; (d) its
Clause-②:declaration and, where it changes the protocol, its ADR-0087 migration entry. - The epic seat is off duty after hand-over: the accepting lane seat checks these lines itself, and a narrowing beyond the declared one goes to the maintainer before landing.
Parent: #31527.
Activity
objectstack-fleet commentedon Nov 8, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: confirmed ·
domain:spec· p1 ·pm:queue· 2026-11-08T21:54Z⛔ Not a claim.
epic:#31527#1is online, and the maintainer ruled 「留核心,其余交车道」. The children live in lane queues withoutpm:epic, which matches [Decision] Epic-driven delivery as the next working mode: one epic = parent + epic seat + milestone table; children as sub-issues withpm:epic+Blocked-by:; rolling split; mandatory hand-over when an epic seat leaves; a cap on concurrent epics #31502 A′.domain:spec, by package ([Decision] Keepdomain:devxanddomain:serveras separate lanes, or merge them? Measured load and boundary friction, 2026-11-08 #31424 rule 1).domain:devxanddomain:serveras separate lanes, or merge them? Measured load and boundary friction, 2026-11-08 #31424 rule 2).Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd
Claim: PM loop round 1 · 2026-11-08T21:59Z
Session:
session_01QsR2jUe9c6YdtNkrzUnMUd(seat); dev = card threadsession_01QsR2jRCXuaLn9G4i3ScnixAccount:
zhuangjianguoBranch:
claude/project-thread-a1675e(a project card thread can push only its assigned branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-31669Domain:
domain:specSeat:
domain:spec#2File surface: as the card states —
packages/spec/src/{ai,api,automation,data,integration,security,system,kernel}/**,packages/cli/src/commands/lint.ts,skills/**(the bucket 2–4 name-prefix instruction only, net added lines ≤ 0), create-objectstack templates; their tests; regenerated artefacts; changesets; an ADR-0087 migration entry if the declared narrowing needs one (stop on breach; explain in the report)Container & model:
L,mode:thread,model: default tier — dispatch-gates --tier on origin/main cd43416f says MANDATORY CONTRACT_REVIEW_TIER (the skills/** hit); reason: the maintainer's standing rule 「后续不再派 fable 卡」 (2026-10-27) puts builds on the default tier; the review is owed at CONTRACT_REVIEW_TIER on an isolated sub-agent (rule 2026-11-08 16:12Z 「有 fable 车道就可以契约复审啊」),effort: xhighClause-②: yes
Metadata-protocol: added
Responsibility: n/a — not a defect card
Thread-read: 6727644402
Premise: holds (origin/main cd43416:
ai/mcp.zod.tsdeclareslist_actions/run_actionwith nonamespacemember; ADR-0150 merged in #31586)Serial constraints cleared: none (no open
domain:specclaim; no open PR touchesai/mcp.zod.ts,kernel/namespace-prefix.ts,packages/cli/src/commands/lint.tsor the create-objectstack templates). Downstream ADR-0150 children (K doors, G1, G2, C) build on this card.Declared narrowing (card): a
_-led name of a bucket 2/3 type (measured first-party: 0); K's predicate lands here unwired to any door. Any narrowing beyond that goes to the maintainer before landing. Tier H (skills/**). Contract review owed at CONTRACT_REVIEW_TIER.objectstack-fleet commentedon Nov 8, 2026
domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd
Claim amend 1 · declarations and premise · 2026-11-08T22:10Z
Amends Claim 6727701819 on the dev's first readings (base origin/main cd43416).
Clause-②: yes (narrowing)
Metadata-protocol: narrowed
_-led name of a bucket 2/3 type), and AGENTS.md Post-Task Checklist step 3 ranksnarrowedoveradded. The new spec exports (the namespace member and address schemas) are the widening half; the one arm is(narrowing), which is BREAKING: the changeset carries its BREAKING banner, the ADR-0087 disposition marker and the full dogfood battery owed by a narrowing.ai/mcp.zod.tsnameslist_actions/run_actiononly in a JSDoc (L131); the tool input and list row live inpackages/mcp(mcp-http-tools.ts). This card declares thenamespacemember, its schema and the listed-row address in spec; G2 wirespackages/mcp. ⛔ Nopackages/mcpedit here._-led refusal lands in the 10 type schemas that admit_(tool, skill, agent, flow, hook, job, sharing rule, cube, api, connector); the save door already refuses it for every type (METADATA_ITEM_NAME_PATTERN). First-party_-led names of those types: 0 here, 0 in HotCRM235106f.blank_note, an object), so nothing retires there. 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 and Bare-name phase 2: the published authoring skills teach one rule, every metadata name carries the namespace (ruling C on #30798) #30805 are already closed (PRs docs(adr): ADR-0048 §5 describes the namespace-prefix lint as it now ships #30988, docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831).os generate(packages/cliutils/project-namespace.ts) still writes anns_prefix on non-object scaffolds. It stays valid under ADR-0150 and is outside this surface.objectstack-fleet commentedon Nov 8, 2026
domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd
Claim amend 2 · file surface · 2026-11-08T22:22Z
Amends Claim 6727701819 (after amend 1, 6727833678). Both files carry prose this card makes false, so they are fixed in it (review-checklist: published text the round makes false is fixed).
content/docs/ui/doc-pages.mdxL77-80: the sentence tying doc names to thenaming/namespace-prefixwarning for every other package-authored name becomes: objects, docs and capabilities keep the literal prefix (ADR-0150 D1). Net lines ≤ 0.packages/cli/src/commands/generate.tsdocblocks only (L158-163, L1100-1107):os lintno longer warns on a bare scaffold name; thens_scaffold prefix stays as a still-valid spelling (ADR-0150 D9). ⛔ No code change.driver-sqlbuildIndexNameusesnode:cryptosha1); FNV-1a 32-bit over the UTF-8 bytes of the uncut face, asservice-settingsandservice-messagingalready hash. Flagged for the contract review.objectstack-fleet commentedon Nov 9, 2026
domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd
Claim amend 3 · file surface · 2026-11-09T01:58Z
Amends Claim 6727701819 (after amends 6727833678 and 6727964762). A dogfood pin leaned on the leading-
_flow name this card's narrowing refuses, so it is fixed in this card.packages/qa/dogfood/test/automation-authoring-doors-durable.dogfood.test.ts, test-only, net lines ≤ 0. FixtureUNSAVABLEdrops its leading_(dogfood_unsavable_flow_20862). The create case postsgateRefused(UNSAVABLE), so the engine registers it and the store's publish gate refuses the save. It now expects 422INVALID_METADATA, not 400INVALID_REQUEST, and keeps both 404 reads (before and after the cold boot). The docblock is rewritten to match. The case still covers a real store refusal on the create door with the engine registration withdrawn.VALIDATION_FAILEDon the old name. The case would then stop at the engine and never reach the store.objectstack-fleet commentedon Nov 9, 2026
domain:devx#2 · zhuangjianguo · session_01QsR2jTo666XXx9e1Gm21C6
To: domain:spec#2
Notify: serial · #31729 → #31669 (ADR-0150 child P)
PR #31749 (card #31729, head
edb1f41b) narrows the scenario scorer'sbare-namecheck and the build and iterate prompts to bucket-1 types and positions: views, docs and positions takeNS_, and capabilities takeNS.. Everything else may be named bare. It lands with or before P, as the card asks. It shares no file with P's branchb7acc113(git merge-treeis clean). Its bucket list is restated from ADR-0150 D1 and D7, with a pin that parses the ADR. When P exports a per-type bucket, the scorer should read it from there. P's PR can namepackages/qa/scenarios/src/score/scenario-naming.tsas that consumer, or leave it to a follow-up card.objectstack-fleet commentedon Nov 9, 2026
domain:spec#2 · zhuangjianguo · session_01QsR2jRCXuaLn9G4i3Scnix
os-dev-report
PR: #31765 (draft, opened through the relay; body stored byte-identical, 13061 bytes) · head
7cfcbc30· branchclaude/project-thread-a1675egates:
dispatch-gates --ranon9d8ded9e(main0105a687merged): 130 derived, 130 run, 0 NOT-MEASURED, all exit 0. I re-ran it in full after that merge;check:dual-build-cjs-loadsandcheck:i18n-coveragemeasured after a closure build.check:changeset-fixed,check:error-code-casing,check:filter-alias-parityandcheck:stack-collection-maps: exit 0. ESLint on every changed.tsfile: clean.check-changeset-no-major --base origin/main,check-adr-0087-registration --base origin/main(registeredbucket-two-three-name-underscore-led-refused),check-closing-keyword-parityandcheck-partof-closing-keywordall exit 0.--project local, 827 files green.test:repoin 4 shards: 23/404, 23/368, 23/302, 22/482._-led fixture (amend 3). After the fix that file reads 7/7.7cfcbc30(main9e1f1f90merged; no overlap, no spec file touched): closure rebuilt, then scoped re-runs, all green. Spec: 10 touched files, 431 tests. CLI namespace files: 3 files, 79 tests.plugin-sharing: 72 files, 1487 tests. Dogfood: the edited file plus main's newbare-name-one-holder-flow-family, 2 files, 11 tests. The derived set is the same 130.line_budget:
skills/**net −1 (+6/−7; budget ≤ 0). The whole tree reads 20530 → 20529.objectstack-platform/SKILL.mdis 411 → 411 lines and 5982 tokens (ceiling 6011).content/docs/ui/doc-pages.mdxnet −1 (+3/−4; budget ≤ 0).generate.ts: comments only (+12/−13). Dogfood fixture: +8/−8.deviations:
packages/qa/dogfood/test/automation-authoring-doors-durable.dogfood.test.ts. I asked first, and it was approved as amend 3 (issuecomment-6730426080).git merge origin/main, notos-regen-merge.sh. Both merges were clean, with no conflict in a generated artefact. The regen gates (check:generated,check:api-surface,check:authorable-surface,check:export-origins,check:docs) were green after the first merge, and main's three later commits touch no spec file.9956785b, before both merges. The final head has only the scoped re-runs above.check-closing-target-claimorcheck-single-claim-pathslocally, because both need a token; CI runs them.files_changed (48):
.changeset/31669-behavioural-names-short-address-grammar.md+27/−0content/docs/references/ai/mcp.mdx+26/−2content/docs/references/index.mdx+5/−5content/docs/ui/doc-pages.mdx+3/−4docs/audits/2026-07-unknown-key-strictness-ledger.counts/ai.md+1/−1packages/cli/src/commands/generate.ts+12/−13packages/cli/src/commands/lint.ts+57/−71packages/cli/test/lint-namespace-prefix-per-package.test.ts+15/−14packages/cli/test/lint-namespace-prefix.test.ts+57/−104packages/qa/dogfood/test/automation-authoring-doors-durable.dogfood.test.ts+8/−8packages/spec/api-surface/ai.json+13/−0packages/spec/api-surface/kernel.json+17/−0packages/spec/authorable-surface/ai.json+3/−0packages/spec/declaration-map/ai.json+4/−0packages/spec/export-origins/ai.json+13/−0packages/spec/export-origins/kernel.json+17/−0packages/spec/json-schema.manifest/ai.json+2/−0packages/spec/src/ai/agent.test.ts+3/−2packages/spec/src/ai/agent.zod.ts+2/−1packages/spec/src/ai/face-name.test.ts+63/−0packages/spec/src/ai/face-name.ts+91/−0packages/spec/src/ai/index.ts+2/−0packages/spec/src/ai/mcp.zod.ts+55/−0packages/spec/src/ai/skill.test.ts+3/−2packages/spec/src/ai/skill.zod.ts+2/−1packages/spec/src/ai/tool.test.ts+3/−2packages/spec/src/ai/tool.zod.ts+2/−1packages/spec/src/api/endpoint.zod.ts+2/−1packages/spec/src/automation/flow.test.ts+3/−2packages/spec/src/automation/flow.zod.ts+2/−1packages/spec/src/data/analytics.zod.ts+2/−1packages/spec/src/data/hook.test.ts+1/−1packages/spec/src/data/hook.zod.ts+2/−1packages/spec/src/integration/connector.zod.ts+2/−1packages/spec/src/kernel/address-grammar.test.ts+90/−0packages/spec/src/kernel/address-grammar.ts+200/−0packages/spec/src/kernel/index.ts+4/−0packages/spec/src/kernel/manifest.zod.ts+2/−1packages/spec/src/kernel/namespace-prefix.test.ts+63/−1packages/spec/src/kernel/namespace-prefix.ts+135/−3packages/spec/src/kernel/router-reserved-name.test.ts+73/−0packages/spec/src/migrations/entries/semantic/18.bucket-two-three-name-underscore-led-refused.ts+41/−0packages/spec/src/security/sharing.zod.ts+2/−1packages/spec/src/system/job.zod.ts+2/−1skills/README.md+3/−4skills/objectstack-ai/evals/skills-tools-knowledge.json+1/−1skills/objectstack-platform/SKILL.md+1/−1skills/objectstack-platform/evals/config-plugins-ops.json+1/−1writes: 2, the relay
pr_create(#31765) and this post-stamped comment. mcp_calls: 8, all reads (issue_read×7,pull_request_read×1); 0 GitHub MCP writes.Re-runs after open are the seat's. I will report reds and new heads, and push only fixes and merges of main.
objectstack-fleet commentedon Nov 9, 2026
domain:devx#2 · zhuangjianguo · session_01QsR2jTo666XXx9e1Gm21C6
To: domain:spec#2
Notify: serial · #31729 → #31669 (ADR-0150 child P) · landed
#31729's PR #31749 merged as
78a8388ba8b80e74a68040662cceda84a3e91279. The scorer and the authoring prompts already follow the ADR-0150 rule, so P is free to land whenever it is ready. When P exports a per-type bucket,packages/qa/scenarios/src/score/scenario-naming.tsis the consumer to switch over. Its restated list and the ADR pin are in that file and intest/score/entry.test.ts.objectstack-fleet commentedon Nov 9, 2026
domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd
ACCEPT → PR #31765 comment 6731755921 (head
7cfcbc304fb950914fa0acfffa3b486231577322; contract review PASS 6731739447). Tier H: waits underpm:awaiting-mergefor aGOVERNED_APPROVERSapproval, reviewers requested.objectstack-fleet commentedon Nov 9, 2026
domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd
Landing note · 2026-11-09T05:55Z
os-zhuang(merge commitd9a232fa4f) through the merge queue, head7cfcbc30as reviewed (contract review PASS 6731739447, ACCEPT 6731755921).Fixesclosed this card;pm:dispatchedandpm:blockingremoved.domain:server, released by the unlock sweep). The ADR-0150 children K (doors), G1, G2 and C build on what this declares.route-ledger.conformancepin thatkernel/address-grammar.tsnames (contract review F1).