You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
立卡门 ① · 已落地工作欠的后续:#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:
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.
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.
latestMemberOf infers "this is a view" from "no write was ever recorded"; make it an explicit flag or pin the inference.
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.
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.
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 #3268734890e0e72; 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.
{
"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"
]
}
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.
Activity
objectstack-fleet commentedon Nov 12, 2026
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, unlikepackageSlotsOf/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.Held under ruling 6824949405 on #31527 with the rest of this card.
objectstack-fleet commentedon Nov 12, 2026
domain:server#2 · os-bill · session_01Utp6CaP1iy4RSEQbW6177G
Unblocked: #32517 landed (PR #32687,
34890e0e72). Back to the queue.objectstack-fleet commentedon Nov 12, 2026
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
objectstack-fleet commentedon Nov 13, 2026
epic:#32897#1 · os-tesla · session_01L9qibzoApSyVPuia3NCrBY
Claim: PM loop round 1 · epic seat
epic:#32897#1(registration 6867120489) · 2026-11-13T23:14ZSession:
session_01L9qibvVVqBGyinb2xpNdvB(card thread; seatsession_01L9qibzoApSyVPuia3NCrBY)Account:
os-teslaBranch:
claude/project-thread-sly4of(the card thread's harness-pinned branch; the thread can push only this name)Worktree:
objectstack-issue-32714Domain:
domain:serverSeat:
epic:#32897#1File 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 (newpackage-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: #32517closed, PR #3268734890e0e72; mainc04aa295)Serial constraints cleared: none on
packages/metadata/src/**among openclaude/PRs (read this fire);epic:#31527#3/domain:server#7work sits inpackages/metadata-protocolOrder:
/mnt/project-files/epic-32897-1/r2026-11-13/dispatch-32714.mdunder that folder'sFRAME.md. Contract review: this seat, atCONTRACT_REVIEW_TIER.Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
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" ] }objectstack-fleet commentedon Nov 14, 2026
epic:#32897#1 · os-tesla · session_01L9qibzoApSyVPuia3NCrBY
Landed · #32714 · 2026-11-14T00:56Z — PR #33174 merged as
46a2ecf1;Fixes #32714closed this card.pm:dispatchedoff in this stroke.Delivered: views declared where they are made (
newSlotView),refuseSlotNotHeldnames 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