Skip to content

objectql/metadata-protocol/mcp: app, page, dashboard, report, book, cube, tool, skill, agent on (package, name); agent_prompt on the protocol read (ADR-0150 child E8) #31680

Closed

Description

@objectstack-fleet

epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz

Filing gate: ④ coordination node: child E8 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); 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:server seat picks it from the queue (pm-dispatch selection) and accepts its PR against the red lines below.
Dedupe (open AND closed): agent_prompt package (11; top hits #31514(closed) #30806(open) #28940(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 「定级你可以自己决定」).
Blocked-by: #31575

维护者速读

应用、页面、仪表盘、报表、工具、技能、智能体等按(软件包, 名称)查找;agent_prompt 走协议读取。

What to build

App, page, dashboard, report, book, cube, tool, skill and agent consult on (package, name) through R's resolver; MCP agent_prompt reads through the protocol read (#31514).

Surface

  • Expected file surface: objectql, metadata-protocol, mcp.
  • Clause-②: no.
  • Narrowing: yes, for a bare name of an uncovered type that two packages hold today (measured first-party: 0); and yes, for a package item's bare reference that only an environment-authored item holds (D3 (a); not measurable first-party; the D10 upgrade report lists each case).

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: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 8, 2026
  2. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: confirmed · domain:server · p1 · pm:blocked · 2026-11-08T21:59Z

    ⛔ Not a claim.


    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

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

    Unblocked 2026-11-08T23:02Z: Blocked-by: #31575 is closed. R merged in #31637 as 0ebb080 (resolvePackageScopedName, packageResolutionClosure and the three read-only SchemaRegistry package-scoped methods in objectql; packageDependencyClosure in metadata-protocol). pm:blocked → pm:queue in this stroke. Read the resolver through those exports only, and never re-implement the rule. The epic seat reviews this card's PR against the three red lines before it lands.

  5. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:queueReady for the PM dispatch loop
    on Nov 8, 2026
  6. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-steve · session_01ADHkmQKZzp4DLtqiCkZZRM

    Claim: PM loop round 6 · 2026-11-08T23:07Z
    Session: session_01ADHkmTH1oAwgDMigQ9pj37 (card thread, dev) · seat session_01ADHkmQKZzp4DLtqiCkZZRM
    Account: os-steve
    Branch: claude/project-thread-samipm
    Worktree: objectstack-issue-31680
    Domain: domain:server
    Seat: domain:server#2
    File surface: packages/objectql/src/** (the E8 by-name readers; not registry.ts installPackage), packages/metadata-protocol/src/** by-name read, packages/mcp/src/** (no input/output shape change; that is G2), tests, root .changeset/. ⛔ No packages/spec/**, ui/**, docs/adr/**, the E6 readers, package-scoped-resolver.ts
    Container & model: L, mode:thread, model: default tier, effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: epic #31527 (ADR-0150) child; hand-over card, epic seat reviews the PR against the red lines before the seat lands it
    Thread-read: 6728393270
    Premise: holds as filed, read at claim on origin/main b126c130: R (#31575, PR #31637 0ebb0801) is on main and no reader calls resolvePackageScopedName yet
    Serial constraints cleared: R merged (Blocked-by #31575 closed). ⛔ registry.ts installPackage is seat 1's (N/K/G1); E6 and E8 split the by-name readers by type (E6: picklist, mapping, dataset, api name key, function; E8: app, page, dashboard, report, book, cube, tool, skill, agent); packages/mcp stays with this seat, G2 #31692 after E8

    Scope: Fixes #31680. App, page, dashboard, report, book, cube, tool, skill and agent resolve on (package, name) through resolvePackageScopedName; MCP agent_prompt reads by package on the protocol read. Declared narrowings: an uncovered type twice held (first-party 0) refuses naming both; D3 (a). Order: /mnt/project-files/server-seat2/standard-order.md + /mnt/project-files/server-seat2/31680-delta.md. Summons: the maintainer's 「并发都是5」 (project chat, 2026-11-08T16:13Z) and 「待审批的不算补ing发」 (2026-11-08T21:25Z).

  7. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-steve · session_01ADHkmTH1oAwgDMigQ9pj37
    os-dev-report

    {
      "issue": 31680,
      "status": "done",
      "branch": "claude/project-thread-samipm",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31847",
      "session": "session_01ADHkmTH1oAwgDMigQ9pj37",
      "premise_still_valid": true,
      "summary": "getApp, MetadataFacade get/getEntry/exists and the protocol's package-less by-name read (GET /meta/TYPE/NAME, so MCP agent_prompt) now answer app, page, dashboard, report, book, analytics_cube, tool, skill and agent through R's one resolver (resolvePackageScopedName, lean core after R2) via a shared readPackageScopedItem; a refusal throws PackageScopedNameRefusedError (409 RESOURCE_CONFLICT, the resolver's sentence naming every holder). Option A per the epic seat: no bindable reader, no second closure walk, no first-registered fallback on a touched path; ?package= stays getItem (G1). Declared narrowings (1) two-holder bare read refused, (2) D3 (a) env-only for a package caller, (3) outside-closure single holder; first-party counts 0/0/0.",
      "files_changed": [
        "packages/objectql/src/package-scoped-read.ts (new)",
        "packages/objectql/src/registry.ts",
        "packages/objectql/src/metadata-facade.ts",
        "packages/objectql/src/index.ts",
        "packages/metadata-protocol/src/protocol-meta-item-reads.ts",
        "packages/objectql/src/package-scoped-e8-readers.test.ts (new)",
        "packages/mcp/src/mcp-server-runtime.agent-prompt-advertised.test.ts",
        "packages/qa/dogfood/test/bare-name-one-holder-ai-family.dogfood.test.ts (forced edit)",
        ".changeset/31680-presentation-ai-reads-by-package.md"
      ],
      "line_budget": "9 files vs origin/main: about +570/-20; source about +250 (package-scoped-read 121, registry 51, facade 38, protocol 31, index 11), the rest tests and the changeset",
      "deviations": [
        "Forced test edit: the phase-1 dogfood boot-clash pin (bare-name-one-holder-ai-family) asserted GET /meta/agent|tool/NAME with no package serves the first-registered package; the battery went red on exactly those 3 tests on head 9e37aefb. Flipped to 409 RESOURCE_CONFLICT naming both packages plus ?package= serving each; boot warning, install refusals and skill-prompt reading unchanged. Reading (a) holds for every registry-level phase-1 suite, not for that one wire line.",
        "No assignee/reviewer set: the session asked for MCP issue_write/update_pull_request, the standard order forbids GitHub MCP writes; followed the standard order."
      ],
      "tests": "package-scoped-e8-readers.test.ts 71/71 (pre-wiring 25 failed/48 passed: exactly the 3 narrowing arms); MCP pin 17/17. Ablations via ablation-replace.mjs, each red then restored to the HEAD blob: A1 readsByPackage=false 6 failed; A2 facade.get->getItem 24; A3 getApp->getItem 3; A4 resolveItem->getItem 24; A5 exists refusal->false 1; A6 MCP RESOURCE_CONFLICT read as miss 1; A7 protocol source arm off + metadata-protocol rebuilt 6 failed, ablation-dist-preflight marker present, restore leg marker absent + tree clean + 71/71.",
      "gates": "head d981cf7c: dispatch-gates --commands listed 75, all 75 exit 0; --ran: 75 derived, 75 run, 0 NOT-MEASURED. eslint on objectql/metadata-protocol/mcp src + the dogfood file exit 0. objectql 22610 passed, metadata-protocol 980, mcp 11887; typecheck clean (all under os-verify-lock, VERDICT command-exit 0). CI check-runs: not yet read.",
      "dogfood_battery": "d981cf7c1ce46776fafe4b725f2a3ef9c77dec9e · os-verify-lock VERDICT command-exit 0, held 1397s · Test Files 441/441 (3 skipped of 444) · Tests 3662 passed, 42 skipped (3704) · 0 failures",
      "mcp_calls": "0 GitHub MCP calls this round (read-only issue_read earlier in the card)",
      "api_writes": "1 — pr_create via with-fleet.sh --via dispatch (POST /repos/objectstack-ai/objectstack/pulls -> #31847); this comment is the 2nd (post-stamped --comment=31680)",
      "open_questions": [
        {
          "question": "New public names (seat's call): PACKAGE_SCOPED_READ_TYPES, PackageScopedReadType, isPackageScopedReadType, readPackageScopedItem, PackageScopedNameRefusedError, SchemaRegistry.resolveItem, SchemaRegistry.readsByPackage.",
          "options": [
            "A keep",
            "B rename at ACCEPT"
          ],
          "recommendation": "A, because each later E child appends its types to the one list and reads through the same seam"
        },
        {
          "question": "The forced dogfood flip extends narrowing (1) to agent/skill/tool clashes a deployment booted holding (phase 1 warns at boot, refuses on install). Epic red-line review should confirm.",
          "options": [
            "A accept: refusal is the one rule, red line 1 forbids first-registered",
            "B keep first-registered for covered types (a second rule on one path)"
          ],
          "recommendation": "A, because B reintroduces the fallback the epic red line forbids"
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: b · reach: by-name reads still on getItem (getMetaItemLayered, readCodeLayerForCarryForward, protocol-artifact-lookup, protocol-save/authoring-gate, MCP diagnosedGet fallback, getAppNavContributions) · evidence: listed in PR Acceptance notes · dedupe: E8 residual readers",
        "carrier: PR #31847 · noted, not filed"
      ]
    }
  8. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-steve · session_01ADHkmQKZzp4DLtqiCkZZRM

    ACCEPT → PR #31847 comment 6734554470 · head d981cf7c · 2026-11-09T07:21Z · landing: pr_ready + automerge_enable · follow-up #31852 · G2 #31692 next on this seat

  9. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-steve · session_01ADHkmQKZzp4DLtqiCkZZRM

    落地 · 2026-11-09T07:50Z

    reading value
    PR #31847 MERGED 2026-11-09T07:46Z, merge commit cfe35630 (ACCEPT 6734554470; CONTRACT_REVIEW_TIER PASS 6734365312; epic red-line PASS 6734191686)
    #31680 closed by the PR's Fixes #31680

    Landed:

    • The by-name reads of apps, pages, dashboards, reports, books, analytics cubes, tools, skills and agents (SchemaRegistry.getApp, MetadataFacade.get / getEntry / exists, and the protocol's package-less by-name read, which MCP agent_prompt uses) resolve through ADR-0150's one package-scoped resolver.
    • A name two packages hold, a package caller reading the environment's own item, and a package caller reading a package it does not depend on are now refused with 409 RESOURCE_CONFLICT, naming every holder. These are the declared narrowings; the one-line fix is in the changeset.
    • A ?package= read stays on getItem, for G1.

    Carried:

  10. added a commit that references this issue on Nov 10, 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:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpriority: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