Skip to content

objectql: narrow the phase-1 one-holder refusal from environment to namespace for tool (ADR-0150 child B, tool) #31985

Closed
0 of 2 issues completed

Description

@objectstack-fleet

epic:#31527#1 · os-steve · session_01ADHkmP7o3uDTti21wLTfPf

Restart-when: the maintainer lifts the token-saving mode of 2026-11-13T01:08Z (hold 6840820654)
Filing gate: ④ coordination node. This is the 14th child B of the epic #31527 (ADR-0150 execution plan: "one per covered type, 14 in all … tool joined phase 1 in #31414"). The B children filed so far cover only 13 types. Spec seat 2 raised the gap on #31527 (6734382526), from the contract review of #31841. ⛔ Not a claim.
Business reason: inherited from #31527 (p1). Without this card, a tool's bare name stays refused environment-wide once the other 13 types narrow to one holder per namespace. Two packages could ship same-named skills and agents, but not same-named tools.
Reader: the next domain:server seat picks it from the queue once every Blocked-by: below is closed. The epic seat reviews its PR against the red lines below (ruling 6723571682).
Dedupe (open AND closed): tool narrow namespace bare-name. #31701 (agent/skill, closed by #31973) left tool out on purpose: its CONTROL pins that a tool still refuses another namespace. #31661 (closed) added tool to phase 1. Neither covers this card.
class: c · type: Feature
Grade: p1, inherited from the parent.
Part of #31527.
Blocked-by: #31691

维护者速读

工具(tool)是第 14 种要按命名空间放宽的元数据。现在别的 13 种都有卡,只有它没有。这张卡先补齐工具在 AI 面上的“命名空间-名字”叫法和按包解析,然后像 agent/skill 一样放宽:不同命名空间的两个包可以各带一个同名工具。

Step 0 (decides the split)

D9 narrows a type only after its by-name readers, its AI face and its stored references carry the package. At main 0cd594b3:

If the face or the caller references are missing, they are built in this card's first PR (Part of), and the narrowing comes in its second PR (Fixes), as #31698 split. If the readings are large, the seat may file them as their own child.

What to build (the narrowing PR)

Red lines (the epic seat reviews the PR against them, ruling 6723571682)

  1. Never loosens: a skill's or agent's tool reference never reaches a tool outside its package's closure (D3 (c)) or one that only the environment holds (D3 (a)).
  2. Never guesses: two holders are refused with the candidates, and never resolved first-registered.
  3. Independently releasable: until the narrowing PR, every answer is as today. Write readings (a)–(d) in the PR body.

Activity

  1. added
    enhancementNew feature or request
    priority:p1High: required for production / M2
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 9, 2026
  2. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor
  3. objectstack-fleet commented on Nov 10, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#1 · os-steve · session_01ADHkmP7o3uDTti21wLTfPf

    Unblocked. G1 #31691 is closed: (a) #31959, (b) #31979, (c) #32001 and (d) #32049 (d834a36) are all merged. This card moves to pm:queue (p1).

    This card'"'"'s own carry-ins (tool): step 0 in the body still applies. If the tool face or caller references are missing, add them first in a Part of #31985 PR, then do the narrowing in a Fixes PR. A tool that an agent references (#31701'"'"'s family) resolves from the agent'"'"'s own package (D3), never by first match.

    Carry-ins every B card shares (the shape set by #31701, PR #31973 9046e02):

    • One switch. Add this card's type(s) to NAMESPACE_SCOPED_BARE_NAME_TYPES in packages/objectql/src/bare-name-one-holder.ts and judge them by bareNameHoldersMeet. Change the matrix rival to a same-namespace co-owner. These stay refused, with the same sentence as today: a co-owner, a package with no namespace, base/system/sys, and built-ins. Every B card edits this one set, so land them one after another and rebase each onto the last.
    • BUILT_IN_BARE_NAMES. Fill it for every name of the type that the platform itself requests, or show a census of 0.
    • Readers before narrowing. Every reader of the type resolves by ADR-0150 D3 (package, name), and the G1 qualified addresses reach each holder. A bare address with two holders answers 409 naming both, and never picks one. A composition that has no package-scoped resolver slice fails closed (6729233545).
    • Stored references. Before narrowing, run os migrate stored-references (S4) on the dogfood and on app-crm. A row that the report names as ambiguous stays refused at read, and the fix is the operator's bind.
    • Clause lines: Narrowing: no, Clause-②: yes (widening), Metadata-protocol: added.
    • Red-line review by the epic seat before landing.
  4. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 10, 2026
  5. objectstack-fleet commented on Nov 10, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-steve · session_01ADHkmQKZzp4DLtqiCkZZRM

    Claim: PM loop round 30 · #31985 · 2026-11-10T05:54Z · enhancement (p1; ADR-0150 child B, tool)
    Session: session_01ADHkmSgSR26Ld5x3kLnfzy (card thread, dev) · seat session_01ADHkmQKZzp4DLtqiCkZZRM
    Account: os-steve
    Branch: claude/project-thread-1o6x78
    Worktree: objectstack-issue-31985
    Domain: domain:server
    Seat: domain:server#2
    File surface: PR 1 (Part of #31985) covers the tool AI face and the package-scoped tool references: the AI/MCP tool listing and call-by-name paths, skill and agent tool-reference resolution, their tests, and root .changeset/. PR 2 (Fixes #31985) covers packages/objectql/src/bare-name-one-holder.ts (NAMESPACE_SCOPED_BARE_NAME_TYPES, BUILT_IN_BARE_NAMES) and its pins. ⛔ No ui/**.
    Container & model: M, mode:thread, model: default tier, effort: high
    Clause-②: yes (widening) for PR 1, measured in step 0; any served answer that stops answering is declared as a narrowing. PR 2 is a declared narrowing of the refusal, with a census.
    Metadata-protocol: measured in step 0
    Responsibility: a tool's bare name stays refused environment-wide after the other 13 covered types narrow to one holder per namespace, so two packages can ship same-named skills and agents but not same-named tools · reached by every package author whose package carries tools
    Thread-read: 6760080678
    Premise: holds, read at claim on origin/main 48f18b58. NAMESPACE_SCOPED_BARE_NAME_TYPES (bare-name-one-holder.ts:268) holds only agent and skill. Blocker G1 #31691 is closed.
    Serial constraints cleared: PR 2 edits the same file as the other B narrowings. Landing order, per the coordinator: seat 1's #31696, #31697 and #31699, then #31700 (seat 3), then this card's PR 2. PR 2 is built on a fresh main after those merge. PR 1 is outside that file.

    Scope: Part of #31985 (PR 1), then Fixes #31985 (PR 2). Order: /mnt/project-files/server-seat2/standard-order.md + /mnt/project-files/server-seat2/31985-delta.md. Summons: the coordinator's assignment (seat 1 is full) under the maintainer's 「server 任务很多,你应该跟进并发5」.

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

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-steve · session_01ADHkmQKZzp4DLtqiCkZZRM

    Claim amendment · #31985 · 2026-11-10T05:57Z · amends claim 6760204818 · Scope, File surface and Clause-② change; Branch and Session are unchanged

    Step 0 (/mnt/project-files/server-seat2/31985-step0.md, read at origin/main 48f18b58) found no PR 1 to build in this repo. A package tool record has no AI face and no runtime caller by name, except /meta/tool/NAME, which E8 #31680 already scopes by package. Every tool face and every skill.tools[] resolution goes to the cloud's live ToolRegistry, never to tool records, which spec/liveness/tool.json records as inert. D8 and S4 hold 0 tool rows. 0 tool names are platform-requested.

    Seat rulings:

    1. A. The card ships as one Fixes #31985 narrowing PR. It is built now and landed after objectql: narrow the phase-1 one-holder refusal from environment to namespace for flow (ADR-0150 child B, flow family) #31696, objectql: narrow the phase-1 one-holder refusal from environment to namespace for action (ADR-0150 child B, action family) #31697 and objectql: narrow the phase-1 one-holder refusal from environment to namespace for webhook, connector and email_template (ADR-0150 child B, webhook family) #31699 (seat 1) and objectql: narrow the phase-1 one-holder refusal from environment to namespace for picklist, mapping, dataset, api and function (ADR-0150 child B, picklist family) #31700 (seat 3), merging main after each of them lands.
    2. A. BUILT_IN_BARE_NAMES.tool stays empty, with a census of 0 platform-requested names in the D3 sense. The 41 platform-provided names are not refused, so nothing new narrows.
    3. Carried to repo:cloud, in the PR body: once tool records stop being inert (Phase 2), the cloud resolver of skill.tools[] resolves from the referring skill's package (D3) and refuses two holders, naming the candidates. It never takes the first one registered.

    File surface: packages/objectql/src/bare-name-one-holder.ts (NAMESPACE_SCOPED_BARE_NAME_TYPES gains tool; #31973's tool CONTROL is flipped), its pins, root .changeset/. ⛔ No ui/**; no packages/spec/**.
    Clause-②: yes (widening). A second-namespace tool holder installs and boots, and every refusal the card body keeps stays refused with today's sentence.
    Metadata-protocol: measured on the PR.

  8. 34 remaining items

  9. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-sales · session_01L6bhgWRcTEB3toGxnWvuvX

    Release: session session_01L6bhgWRcTEB3toGxnWvuvX · because the maintainer put the fleet in token-saving mode (p1 first; this card is p2 since the maintainer's 00:41Z re-grade and not needed for 18.4.0), relayed by the epic seat · to pm:on-hold; the next claimant resumes from the line below.
    Resume-from: claude/project-thread-cb6zil@d39ba13129b7a019c0d09805c3b61d4a3fc4cb6c
    Restart-when: the maintainer lifts the token-saving mode of 2026-11-13T01:08Z

    State at release: PR #32895 stays draft. Contract review PASS on 3ddd90e2 and delta PASS on d39ba131 are on the PR; the epic red-line read is HOLD (text edits plus one merge of main, with its rulings on the record). Owed on resume: those edits, one merge of main, affected gates, then a delta record on the new head and the red-line re-read.


    Generated by Claude Code

  10. added
    pm:on-holdDecision made, deliberately deferred — no dispatch, no nag; restart condition in the hold comment
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 13, 2026
  11. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-sales · session_01L6bhgVaKJ9TPfXPRhdqx3e

    Back to queue · 2026-11-13T11:04Z · pm:on-hold → pm:queue, on the maintainer's word relayed by the coordinator (「暂停的卡交回队列了吗」 / 「是的」, 2026-11-13 11:01Z), written by domain:server#1 for the pausing seat domain:server#4 (same account). Supersedes the pause in Release 6840820654; no claim stands and no one is assigned.

    Resume-from: claude/project-thread-cb6zil@d39ba13129b7a019c0d09805c3b61d4a3fc4cb6c (draft PR #32895, head d39ba1312, still open)

  12. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:on-holdDecision made, deliberately deferred — no dispatch, no nag; restart condition in the hold comment
    on Nov 13, 2026
  13. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#2 · os-elon-musk · session_016WV4czFhtRVZNBeHdQA6PW

    Claim: PM loop round 2 · p2 with draft PR #32895, resumed on the maintainer's order 「31527 之前已经开发了分支的 p2,继续推进到合并」 · 2026-11-13T14:18Z
    Session: session_016WV4czFhtRVZNBeHdQA6PW
    Account: os-elon-musk
    Branch: provisional — the card thread re-posts this claim with its own claude/project-thread-* branch, resuming from claude/project-thread-cb6zil@d39ba13129b7a019c0d09805c3b61d4a3fc4cb6c (draft PR #32895; Resume-from 6851007282)
    Worktree: objectstack-issue-31985
    Domain: domain:server
    Seat: epic:#31527#2
    File surface: as claim 6838255368: packages/objectql/src/bare-name-one-holder.ts + objectql tests, packages/core/src/package-scoped-resolution.ts, packages/metadata/src/package-slotted-store.ts, packages/spec/liveness/tool.json (_note only), the ADR-0087 entry, .changeset/** (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (no path-derived mandate), effort: high
    Clause-②: yes (narrowing)
    Metadata-protocol: added
    Responsibility: platform code in objectstack (the phase-1 one-holder refusal in objectql); no other platform path covers it; reached by any app whose package and a second package hold one tool name
    Thread-read: 6851007282
    Premise: holds (carried from the earlier claim and the work on the branch; the thread re-reads every comment first)
    Serial constraints cleared: none in this wave (no file shared with #32613, #32354, #32552, #32967)

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

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#2 · os-elon-musk · session_016WV4d1T8WbNLuRhvuhMHBF

    Claim: PM loop round 2 · p2 with draft PR #32895, resumed on the maintainer's order 「31527 之前已经开发了分支的 p2,继续推进到合并」 · 2026-11-13T14:28Z
    Session: session_016WV4d1T8WbNLuRhvuhMHBF (card thread; seat session session_016WV4czFhtRVZNBeHdQA6PW)
    Account: os-elon-musk
    Branch: claude/project-thread-w47m4s (this thread cannot push claude/project-thread-cb6zil; it opens a new draft PR "Supersedes #32895" from this branch, and the seat closes #32895)
    Worktree: objectstack-issue-31985
    Domain: domain:server
    Seat: epic:#31527#2
    File surface: as claim 6838255368: packages/objectql/src/bare-name-one-holder.ts + objectql tests, packages/core/src/package-scoped-resolution.ts, packages/metadata/src/package-slotted-store.ts, packages/spec/liveness/tool.json (_note only), the ADR-0087 entry, .changeset/** (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (no path-derived mandate), effort: high
    Clause-②: yes (narrowing)
    Metadata-protocol: added
    Responsibility: platform code in objectstack (the phase-1 one-holder refusal in objectql); no other platform path covers it; reached by any app whose package and a second package hold one tool name
    Thread-read: 6855602685
    Premise: holds (carried from the earlier claim and the work on the branch; this thread re-read every comment on the card and on PR #32895)
    Serial constraints cleared: none in this wave (no file shared with #32613, #32354, #32552, #32967)
    Resume-from: claude/project-thread-cb6zil@d39ba13129b7a019c0d09805c3b61d4a3fc4cb6c
    Owed on resume (pause record 6840820654, red-line read 6840825374): must-fix 1–3 text edits, one merge of main (never rebase), the sealed-type tool pin (ruling 3), affected gates, a delta contract record through triage (#32588), then the red-line re-read.

    Restates: 6855602685 with this card thread's own branch and session (same seat; not a second claim).

  16. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#2 · os-elon-musk · session_016WV4d1T8WbNLuRhvuhMHBF
    os-dev-report

    {
      "issue": 31985,
      "status": "done",
      "branch": "claude/project-thread-w47m4s",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/33124",
      "supersedes": "https://github.com/objectstack-ai/objectstack/pull/32895",
      "session": "session_016WV4d1T8WbNLuRhvuhMHBF",
      "head": "49c97977fea7eaa69e29c8e8838772b40ea4a835",
      "premise_still_valid": true,
      "summary": "Resumed claude/project-thread-cb6zil@d39ba131 (every commit kept, no rebase) on claude/project-thread-w47m4s and merged origin/main 2c98485db once (c84542096): four textual conflicts with #32577 (webhook), each a union in both sets, the two module docs and the plural-read pin. Did what red-line read 6840825374 named: must-fix 1 (carried path (i) restated: since #32741 no package-less tool row is grafted onto a holder; open on main: two stored rows each naming a holder keep only the last loaded, and #32914's in-process layered read), must-fix 2 (the 'not measured here' note replaced by the measured answer), must-fix 3 / ruling 1 (marker now `adr-0087: registered tool-names-per-namespace`, new semantic entry packages/spec/src/migrations/entries/semantic/18.tool-names-per-namespace.ts with its own @objectstack/spec patch changeset, the picklist family's shape), ruling 3 (tool joins #32741's location-4 unit loop: 4 states x 2 orders + one holder; new booted dogfood pin: PUT a package-less row, install-local two namespaces in both orders, each exact address plain and layered serves its own before and after the hydrator, bare read 409), and the nits (row 4 FROM, row 11 HTTP face, new row 16 for the in-process layered read on an artifact boot, row 15 per #32812, dogfood title/header, open-PR citation, tool.json date, webhook now narrowed). New draft PR #33124 supersedes #32895 (this thread cannot push cb6zil).",
      "tests": "Head 49c97977f after the dogfood closure build (lock VERDICT 0) and a spec rebuild. objectql 3 files (exact-qualifier, ai-family, E8 readers): 479 passed; exact-qualifier -t tool: 12 passed. metadata keyed-plural + match-endpoint: 717 passed. core package-scoped-resolution: 32 passed. cli integration stored-references: 12 passed. dogfood ai-family file: 27 passed. typecheck core/metadata/objectql: 0 errors. Ablation (ruling 3 pins) via scripts/ablation-replace.mjs: isSealedManagedItem answers false for tool (anchor 1->0, blob b9477b0c->d8e19aaf), metadata-protocol rebuilt, ablation-dist-preflight marker present in 2 dist files: objectql exact-qualifier -t tool 9 failed / 3 passed (all 9 new tool cases); dogfood file 1 failed (new pin, 'expected 409 to be 200') / 26 passed; restored blob == HEAD, git diff HEAD empty, rebuilt, --absent preflight clean (24 files), tree clean.",
      "gates": "dispatch-gates --commands at 49c97977f derived 102; each run, exit captured before any pipe; check:dual-build-cjs-loads first exit 3 (PREREQUISITE NOT MET: dist missing while the closure build landed), re-run exit 0. --ran: 102 derived, 102 run, 0 NOT-MEASURED, all exit 0. pnpm lint exit 0. check-closing-keyword-parity --body: Fixes #31985 only. PR check-runs: in_progress at report time (not waited on).",
      "dogfood_battery": "49c97977f · lock VERDICT command-exit 0 · Test Files 460 passed, 3 skipped (463) · Tests 3881 passed, 42 skipped (3923) · no failures",
      "mcp_calls": "0",
      "api_writes": "3 — relay comment #31985 (claim re-post 6855871184); relay pr_create (#33124, read-back identical, assignee os-elon-musk); relay comment #32588 (triage contract-review ring 6857832132); plus this report. git push is not a REST write.",
      "line_budget": "14 files, +421 / -131 vs origin/main, under the 3000-line threshold",
      "deviations": [
        "New draft PR #33124 instead of pushing #32895's head branch claude/project-thread-cb6zil (this thread may push only claude/project-thread-w47m4s); the seat retires #32895. Its PR-body guard may stay red on the duplicate-fix leg until #32895 is closed and #33124 gets an edited/synchronize event.",
        "First push was refused by the pre-push trailer check (ENOBUFS walking ~21k commits of the deepened shallow history); fixed by fetching cb6zil as a remote-tracking ref, no history change.",
        "Ruling 4 (#32914 still triggers on main after #32741) is cited from the red-line read's scratch-merge measurement, not re-run here.",
        "The two set-membership ablations were not repeated: the merge moved neither set's tool entry; the cb6zil and red-line-read ablations stand.",
        "Not subscribed to PR activity: the os-dev dispatch contract overrides the platform's subscription posture."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: epic:#31527#2 seat · ruling 4: #32914 (in-process getMetaItemLayered, bare name, no service copy) still answers the first-registered holder on main after #32741 per the red-line read's scratch merge; a silent pick by order, so per ruling 4 it goes to p1 — the seat's call",
        "carrier: epic:#31527#2 seat · ruling 5: the follow-up card widening #32692's second case (two stored rows each naming a holder keep only the last loaded) to every PACKAGE_SLOTTED_STORE_TYPES type, tool included, is the seat's to file",
        "carrier: cloud · the first cloud reader of a package tool record must resolve by (package, name) from the referrer's package and refuse two holders naming them; the mirror's bare retract can be refused 409 where two namespaces ship a tool named after a built-in (packages/spec/liveness/tool.json; PR 'Carried to repo:cloud')"
      ]
    }

    Report taken 2026-11-13T15:47Z.

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:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions