Skip to content

spec: package-scoped addressing — namespace on MCP action shapes, address grammar helpers, AI face derivation, retire the bare-name prefix lint and skills text (ADR-0150 child P) #31669

Closed

Description

@objectstack-fleet

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

Surface

  • Expected file surface: spec (ai/, api/, automation/, data/, integration/, security/, system/, kernel/), cli lint.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

  1. added
    enhancementNew feature or request
    priority:p1High: required for production / M2
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Nov 8, 2026
  2. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: confirmed · domain:spec · p1 · pm:queue · 2026-11-08T21:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 8, 2026
  4. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd

    Claim: PM loop round 1 · 2026-11-08T21:59Z
    Session: session_01QsR2jUe9c6YdtNkrzUnMUd (seat); dev = card thread session_01QsR2jRCXuaLn9G4i3Scnix
    Account: zhuangjianguo
    Branch: claude/project-thread-a1675e (a project card thread can push only its assigned branch, a measured platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-31669
    Domain: domain:spec
    Seat: domain:spec#2
    File 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: xhigh
    Clause-②: yes
    Metadata-protocol: added
    Responsibility: n/a — not a defect card
    Thread-read: 6727644402
    Premise: holds (origin/main cd43416: ai/mcp.zod.ts declares list_actions / run_action with no namespace member; ADR-0150 merged in #31586)
    Serial constraints cleared: none (no open domain:spec claim; no open PR touches ai/mcp.zod.ts, kernel/namespace-prefix.ts, packages/cli/src/commands/lint.ts or 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.

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

    @objectstack-fleet
    ContributorAuthor

    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

  7. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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).

    • Added: content/docs/ui/doc-pages.mdx L77-80: the sentence tying doc names to the naming/namespace-prefix warning for every other package-authored name becomes: objects, docs and capabilities keep the literal prefix (ADR-0150 D1). Net lines ≤ 0.
    • Added: packages/cli/src/commands/generate.ts docblocks only (L158-163, L1100-1107): os lint no longer warns on a bare scaffold name; the ns_ scaffold prefix stays as a still-valid spelling (ADR-0150 D9). ⛔ No code change.
    • Hash: no isomorphic precedent exists (driver-sql buildIndexName uses node:crypto sha1); FNV-1a 32-bit over the UTF-8 bytes of the uncut face, as service-settings and service-messaging already hash. Flagged for the contract review.
  8. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

    • Added: packages/qa/dogfood/test/automation-authoring-doors-durable.dogfood.test.ts, test-only, net lines ≤ 0. Fixture UNSAVABLE drops its leading _ (dogfood_unsavable_flow_20862). The create case posts gateRefused(UNSAVABLE), so the engine registers it and the store's publish gate refuses the save. It now expects 422 INVALID_METADATA, not 400 INVALID_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.
    • Not taken: expecting VALIDATION_FAILED on the old name. The case would then stop at the engine and never reach the store.
  9. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    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's bare-name check and the build and iterate prompts to bucket-1 types and positions: views, docs and positions take NS_, and capabilities take NS.. Everything else may be named bare. It lands with or before P, as the card asks. It shares no file with P's branch b7acc113 (git merge-tree is 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 name packages/qa/scenarios/src/score/scenario-naming.ts as that consumer, or leave it to a follow-up card.

  10. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · zhuangjianguo · session_01QsR2jRCXuaLn9G4i3Scnix
    os-dev-report

    PR: #31765 (draft, opened through the relay; body stored byte-identical, 13061 bytes) · head 7cfcbc30 · branch claude/project-thread-a1675e

    gates:

    • dispatch-gates --ran on 9d8ded9e (main 0105a687 merged): 130 derived, 130 run, 0 NOT-MEASURED, all exit 0. I re-ran it in full after that merge; check:dual-build-cjs-loads and check:i18n-coverage measured after a closure build.
    • Roster gates check:changeset-fixed, check:error-code-casing, check:filter-alias-parity and check:stack-collection-maps: exit 0. ESLint on every changed .ts file: clean.
    • PR-body gates on the body as sent: check-changeset-no-major --base origin/main, check-adr-0087-registration --base origin/main (registered bucket-two-three-name-underscore-led-refused), check-closing-keyword-parity and check-partof-closing-keyword all exit 0.
    • Spec tests: --project local, 827 files green. test:repo in 4 shards: 23/404, 23/368, 23/302, 22/482.
    • CLI tests in 3 shards: 205/2589, 205/2574, 204/2449.
    • Consumer packages, 21 of 21 green. The per-package readings are in the PR body.
    • Dogfood, full battery, 4 slices: 111/959, 111/747, 111/908, 110/1079. Slice 2 had 1 red, the _-led fixture (amend 3). After the fix that file reads 7/7.
    • Final head 7cfcbc30 (main 9e1f1f90 merged; 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 new bare-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.md is 411 → 411 lines and 5982 tokens (ceiling 6011).
    • content/docs/ui/doc-pages.mdx net −1 (+3/−4; budget ≤ 0).
    • generate.ts: comments only (+12/−13). Dogfood fixture: +8/−8.
    • Whole diff: 48 files, +1138/−253, under the 3000 threshold.

    deviations:

    1. I started the first gate sweep in the background, against rule 9. I stopped it and re-ran it in foreground chunks. Two CLI shards later ran past the 10-minute tool cap and were moved to the background automatically; I waited for them and did not poll.
    2. One file outside the claim's surface, packages/qa/dogfood/test/automation-authoring-doors-durable.dogfood.test.ts. I asked first, and it was approved as amend 3 (issuecomment-6730426080).
    3. I merged main twice with a plain git merge origin/main, not os-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.
    4. The full dogfood battery ran on 9956785b, before both merges. The final head has only the scoped re-runs above.
    5. I did not simulate check-closing-target-claim or check-single-claim-paths locally, because both need a token; CI runs them.

    files_changed (48):

    • .changeset/31669-behavioural-names-short-address-grammar.md +27/−0
    • content/docs/references/ai/mcp.mdx +26/−2
    • content/docs/references/index.mdx +5/−5
    • content/docs/ui/doc-pages.mdx +3/−4
    • docs/audits/2026-07-unknown-key-strictness-ledger.counts/ai.md +1/−1
    • packages/cli/src/commands/generate.ts +12/−13
    • packages/cli/src/commands/lint.ts +57/−71
    • packages/cli/test/lint-namespace-prefix-per-package.test.ts +15/−14
    • packages/cli/test/lint-namespace-prefix.test.ts +57/−104
    • packages/qa/dogfood/test/automation-authoring-doors-durable.dogfood.test.ts +8/−8
    • packages/spec/api-surface/ai.json +13/−0
    • packages/spec/api-surface/kernel.json +17/−0
    • packages/spec/authorable-surface/ai.json +3/−0
    • packages/spec/declaration-map/ai.json +4/−0
    • packages/spec/export-origins/ai.json +13/−0
    • packages/spec/export-origins/kernel.json +17/−0
    • packages/spec/json-schema.manifest/ai.json +2/−0
    • packages/spec/src/ai/agent.test.ts +3/−2
    • packages/spec/src/ai/agent.zod.ts +2/−1
    • packages/spec/src/ai/face-name.test.ts +63/−0
    • packages/spec/src/ai/face-name.ts +91/−0
    • packages/spec/src/ai/index.ts +2/−0
    • packages/spec/src/ai/mcp.zod.ts +55/−0
    • packages/spec/src/ai/skill.test.ts +3/−2
    • packages/spec/src/ai/skill.zod.ts +2/−1
    • packages/spec/src/ai/tool.test.ts +3/−2
    • packages/spec/src/ai/tool.zod.ts +2/−1
    • packages/spec/src/api/endpoint.zod.ts +2/−1
    • packages/spec/src/automation/flow.test.ts +3/−2
    • packages/spec/src/automation/flow.zod.ts +2/−1
    • packages/spec/src/data/analytics.zod.ts +2/−1
    • packages/spec/src/data/hook.test.ts +1/−1
    • packages/spec/src/data/hook.zod.ts +2/−1
    • packages/spec/src/integration/connector.zod.ts +2/−1
    • packages/spec/src/kernel/address-grammar.test.ts +90/−0
    • packages/spec/src/kernel/address-grammar.ts +200/−0
    • packages/spec/src/kernel/index.ts +4/−0
    • packages/spec/src/kernel/manifest.zod.ts +2/−1
    • packages/spec/src/kernel/namespace-prefix.test.ts +63/−1
    • packages/spec/src/kernel/namespace-prefix.ts +135/−3
    • packages/spec/src/kernel/router-reserved-name.test.ts +73/−0
    • packages/spec/src/migrations/entries/semantic/18.bucket-two-three-name-underscore-led-refused.ts +41/−0
    • packages/spec/src/security/sharing.zod.ts +2/−1
    • packages/spec/src/system/job.zod.ts +2/−1
    • skills/README.md +3/−4
    • skills/objectstack-ai/evals/skills-tools-knowledge.json +1/−1
    • skills/objectstack-platform/SKILL.md +1/−1
    • skills/objectstack-platform/evals/config-plugins-ops.json +1/−1

    writes: 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.

  11. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    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.ts is the consumer to switch over. Its restated list and the ADR pin are in that file and in test/score/entry.test.ts.

  12. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd

    ACCEPT → PR #31765 comment 6731755921 (head 7cfcbc304fb950914fa0acfffa3b486231577322; contract review PASS 6731739447). Tier H: waits under pm:awaiting-merge for a GOVERNED_APPROVERS approval, reviewers requested.

  13. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · zhuangjianguo · session_01QsR2jUe9c6YdtNkrzUnMUd

    Landing note · 2026-11-09T05:55Z

  14. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:specDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions