Skip to content

metadata + runtime: loose ends of the per-member registry keys and the fallback host's action doors: event kind, orphaned member, view inference, MCP pins (follow-up of #32517) #32714

Closed

Description

@objectstack-fleet

domain:server#2 · os-bill · session_01Utp6CaP1iy4RSEQbW6177G

立卡门 ① · 已落地工作欠的后续:#32517(PR #32687)契约审查 r1/r2 的非阻塞项。按 Bill「简单的问题后续单独立卡」从 PR 中拆出。Part of #31527 (ADR-0150)。Blocked-by #32517.

What

PR #32687 keys bundled types per member in the in-memory registry and MemoryLoader, answers the package-less plural read per (package, name), and narrows the fallback host's action doors. These loose ends were left for a separate PR; none changes a served answer:

  1. A second locale of a bundled item emits added where a rewrite would say changed (packages/metadata/src/metadata-manager.ts ~:1047); rule which is right and pin it.
  2. After a package takes over a package-less bundled item, a bare non-canonical member can be left orphaned (packages/metadata/src/package-slotted-store.ts ~:475); pin or clean it.
  3. latestMemberOf infers "this is a view" from "no write was ever recorded"; make it an explicit flag or pin the inference.
  4. Fallback host: list_actions / bare run_action (MCP) are declared in the changeset but unpinned; the two-packages-on-one-object case of the fallback activation and execution doors has no pin.
  5. Docs in the PR's own text: the caller table omits objectql runGovernanceInventory; a metadata: the artifact door's memory loader and the database loader keep one row per name, so a slotted type's removed or second holder's item is still served (ADR-0150 D4) #32246 pin titled "unchanged" was rewritten (name the epic ruling in its title).

Acceptance

  • Pins for items 1–4, red under ablation where they guard a branch.
  • Clause-②: no unless item 1's ruling moves an answer (then declared FROM → TO).

业务理由

谁受益:维护元数据注册表与 action 门的开发者。场景:后续改动悄悄改了事件类型或回退宿主的 MCP 答案,没有测试会红。不做:已声明的答案和推断可被无声回退。

读者

server 车道,PR #32687 合并后;起点上列文件与 PR #32687 的复审记录。

查重

repo:objectstack-ai/objectstack is:issue latestMemberOf list_actions fallback → 0 hits. #32689 (composed-stack activation 404→409) is separate. No duplicate.

Activity

  1. added
    bugSomething isn't working
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 12, 2026
  2. objectstack-fleet commented on Nov 12, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#7 · os-sales · session_01L6bhgVSjQBHNkZd6Eqx2XX

    Added to this card from the epic red-line delta read 6825906898 on PR #32687 (head a6d3c77c5, PASS), nits only, same family as the items above:

    • refuseSlotNotHeld (packages/metadata/src/package-slotted-store.ts) does not dedupe its candidates by slot, unlike packageSlotsOf / refuseSeveralSlots. Harmless today (its one caller keys one row per slot), but a second caller would list one package's two locales as two holders.
    • The package-slotted store rules have no test file of their own; they are covered only through the metadata-manager and loader suites.

    Held under ruling 6824949405 on #31527 with the rest of this card.

  3. objectstack-fleet commented on Nov 12, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-bill · session_01Utp6CaP1iy4RSEQbW6177G

    Unblocked: #32517 landed (PR #32687, 34890e0e72). Back to the queue.

  4. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 12, 2026
  5. objectstack-fleet commented on Nov 12, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: regrade p2 → p3 under the new grading table (#32906) · 2026-11-12T23:26Z

    ⛔ Not a claim; the card's claim and state are unchanged.


    Generated by Claude Code

  6. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#32897#1 · os-tesla · session_01L9qibzoApSyVPuia3NCrBY

    Claim: PM loop round 1 · epic seat epic:#32897#1 (registration 6867120489) · 2026-11-13T23:14Z
    Session: session_01L9qibvVVqBGyinb2xpNdvB (card thread; seat session_01L9qibzoApSyVPuia3NCrBY)
    Account: os-tesla
    Branch: claude/project-thread-sly4of (the card thread's harness-pinned branch; the thread can push only this name)
    Worktree: objectstack-issue-32714
    Domain: domain:server
    Seat: epic:#32897#1
    File surface: packages/metadata/src/metadata-manager.ts, packages/metadata/src/package-slotted-store.ts, the memory loader beside them, the fallback host's action-door file(s) PR #32687 changed, their tests (new package-slotted-store.test.ts), root .changeset/ (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: xhigh (ADR-0150 child)
    Clause-②: no (unless item 1's answer moves; then FROM → TO)
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (pins and loose ends of landed PR #32687; no served answer changes)
    Thread-read: 6838964229
    Premise: holds (Blocked-by: #32517 closed, PR #32687 34890e0e72; main c04aa295)
    Serial constraints cleared: none on packages/metadata/src/** among open claude/ PRs (read this fire); epic:#31527#3 / domain:server#7 work sits in packages/metadata-protocol

    Order: /mnt/project-files/epic-32897-1/r2026-11-13/dispatch-32714.md under that folder's FRAME.md. Contract review: this seat, at CONTRACT_REVIEW_TIER.


    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    epic:#32897#1 · os-tesla · session_01L9qibvVVqBGyinb2xpNdvB

    os-dev-report

    {
      "issue": 32714,
      "status": "done",
      "branch": "claude/project-thread-sly4of",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/33174",
      "session": "session_01L9qibvVVqBGyinb2xpNdvB",
      "premise_still_valid": true,
      "summary": "Two behaviour fixes in packages/metadata. A store is a view only when its builder marks it (newSlotView / inheritStoreWriteOrder), so latestMemberOf no longer reads a store with no recorded write as a view. refuseSlotNotHeld names each holder once. Items 1, 2 and 4 are pinned as measured, with no behaviour change. Item 1 is decided by text: email_template identity is (name, locale), and register() splits first registration from overwrite, so a second locale is `added`. Item 5's caller table lives only in merged PR #32687's body, so it gets an Acceptance note and no edit.",
      "tests": "head d2fb8a8a, os-verify-lock: metadata full suite 77/77 files, 2314 tests passed; the three pinned metadata files 704/704; runtime action-activation-unpackaged.test.ts 21/21; metadata + runtime typecheck exit 0. Ablations, each restored to the HEAD blob: A1 re-infer view → 1 red; A1b newSlotView unmarked → 1 red; A2 no holder dedupe → 2 red; A3 slot-wide `existed` → 2 red; A4 take-over moves every bare member → 4 red; A5 pluralEntryKeys holder constant (metadata dist rebuilt, preflight marker present, --absent after restore) → 7 red in the runtime fallback-host file.",
      "gates": "dispatch-gates --commands at d2fb8a8a: 65 derived, each run with </dev/null, exit codes on disk; --ran reconciliation: 63 run exit 0, 0 UNRUN, 2 NOT MEASURED (exit 3, PREREQUISITE NOT MET): check-plugin-teardown-shape --self-test (shallow clone) and check:dual-build-cjs-loads (41 packages without dist). pnpm lint exit 0 (os-verify-lock VERDICT command-exit 0). CI check-runs: not yet read at report time; the seat reads them on the PR.",
      "dogfood_battery": "n/a — no `!` in the PR title; the (narrowing) arm is a pin of existing behaviour, measured by the runtime fallback-host file above",
      "line_budget": "7 files, +498 / -23 (521 changed lines, under the 3000 human-merge threshold); production code in 2 files, the rest are tests and a changeset",
      "files_changed": [
        "packages/metadata/src/package-slotted-store.ts",
        "packages/metadata/src/metadata-manager.ts",
        "packages/metadata/src/package-slotted-store.test.ts (new)",
        "packages/metadata/src/metadata-manager-email-template-slot.test.ts",
        "packages/metadata/src/metadata-manager-match-endpoint.test.ts",
        "packages/runtime/src/domains/action-activation-unpackaged.test.ts",
        ".changeset/32714-registry-action-door-loose-ends.md"
      ],
      "deviations": [
        "PR attribution link points to this card thread (session-context PR-attribution instruction), not the seat thread shown in FRAME's sample",
        "PR body footer: the session-URL footer and the `signed:` trailer were added by one relay issue_patch after create; read back byte-identical (8035 bytes)",
        "origin/main moved by f5121e84 (#33160) and 5e250a65 (#33151, mcp.ts upload links) after my merge; neither touches this diff, so per FRAME I did not merge again"
      ],
      "overlap": "Checked open PRs touching packages/metadata/src/** before editing: none on these files",
      "mcp_calls": "reads only: issue_read, list_pull_requests, pull_request_read; 0 MCP write tools",
      "api_writes": "relay writes: 3 — pr_create #33174, issue_patch #33174 (body footer + trailer), this os-dev-report comment via post-stamped",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: on the metadata-service-only host, POST /actions/_activation/crm_contact/shared_ping with two packages bound to crm_contact answers 404 RESOURCE_NOT_FOUND 'has no declaration' instead of a 409 naming both packages; no row is written and nothing runs (not a widening) · evidence: action-activation-unpackaged.test.ts pin '[#32714] … two packages bound to ONE object — the activation door' · dedupe words: activation 404 instead of 409, two packages",
        "carrier: #32689 (activation 404 → 409 family) · noted, not filed"
      ]
    }
  9. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#32897#1 · os-tesla · session_01L9qibzoApSyVPuia3NCrBY

    Landed · #32714 · 2026-11-14T00:56Z — PR #33174 merged as 46a2ecf1; Fixes #32714 closed this card. pm:dispatched off in this stroke.

    Delivered: views declared where they are made (newSlotView), refuseSlotNotHeld names each holder once, and pins for items 1, 2 and 4 and the retitled #32246 pin (item 5). Left: item 5's caller table lives only in merged PR #32687's body (Acceptance note); the fallback host's activation door answering 404 rather than 409 for two packages on one object rides #32689.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions