Repository navigation
Description
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Filing gate: ① product defects with named locations, filed as one checklist card per #32997's follow-up rule (one closing card per landed PR, not one per item). Carried from #32613 / PR #33126 (review 6858448985, M1/S1/S2) by epic:#31527#2 (6858471472). PR #33126 is scoped to the two types its card names (flow, action); this card holds the rest of the same ADR-0150 D4 step: a second holder's declared override is served, judged against every shipper.
Checklist
-
1. The six sealed served-override types (
servesSealedOverrideRow: page, app, dataset, doc, book, mapping) still judge a declared override againstpackagedArtifactOwneralone, so the second holder's.customoverride is declined.datasetandmappingare reachable today, since they have been per-namespace since 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;mapping's by-name read is the import door's. Judge them against every shipper (someShipperOf, as PR fix(metadata-protocol)!: two packages' declared overrides of one flow or action name each serve in their own package's slot, in any registration order (ADR-0150 D4) #33126 and PR fix(metadata-protocol): a customization pair's row of a name two namespaces hold is judged against its own base, whichever package registered first (ADR-0150 D4) #33129 do). -
2. The env-wide list filter for the other overlay types (dashboard, report, email template, …), where two packages ship a name and one serves a declared override. Not measured on
main. Measure first, and fix only if it drops the second holder's override. -
3. The action registry-reader face: the hydrator registers an action override row under the bare name with the envelope
lookupArtifactItemanswers for the pair's id, whilegetArtifactItemfalls to the first shipper's composite.mainbehaves the same (no regression), but nothing pins it. Add the pin, and the fix if the pin shows a wrong reader. -
4. A declared App-pair row served at another package's address (added by triage 2026-11-13 evening, measured by
epic:#31527#2on metadata-protocol: the exact read binds an undeclared App-pair row to X even when an addition package ships the same bundle member, where the registry binds it to no package (ADR-0150 D4, red line 2) #32561, comment 6863197549, onmainand on PR fix(metadata-protocol)!: the exact read no longer serves an undeclared App-pair row the registry binds to no package; it adopts SchemaRegistry#overlayRowBinding over the served holders (ADR-0150 D4) #33148's head72c8a9c8alike). Module W depends on App A and on X and holdsde-DE.A.customstores ade-DErow declaring X, and X is refused at both the item door and the package door. Then?package=W&member=de-DEserves the row declared for X (stamped W), and W's list and execution list carry it, while the registry item at W is W's own andoverlayRowBindinganswers no package.?package=Xrefuses 409 naming W. The row is declared, so fix(metadata-protocol)!: the exact read no longer serves an undeclared App-pair row the registry binds to no package; it adopts SchemaRegistry#overlayRowBinding over the served holders (ADR-0150 D4) #33148 (undeclared pair rows) does not cover it. The save door and a cold boot were not probed. Same red-line-2 family as item 3: one package's address serves a row declared for another. Weight p3 (the wrong translation row is shown; rare configuration), so do it last. -
5. A sole owner's exact address serves an undeclared App-pair row that its lists leave out (added by triage 2026-11-13 evening; red-line read 6865563363 on PR fix(metadata-protocol)!: the exact read no longer serves an undeclared App-pair row the registry binds to no package; it adopts SchemaRegistry#overlayRowBinding over the served holders (ADR-0150 D4) #33148 / metadata-protocol: the exact read binds an undeclared App-pair row to X even when an addition package ships the same bundle member, where the registry binds it to no package (ADR-0150 D4, red line 2) #32561 measured it on
mainand on headdd283fafalike, in both registration orders). Package X holds a name only through its own stored row in the bare slot, with no composite slot. Then?package=X&member=de-DEserves the App's undeclared pair row (bound to X as the sole owner), while X's list and execution list leave it out. This is a list-versus-exact-read disagreement, the class this card closes elsewhere. Weight p3 (rare shape; a translation row), done after item 4.
Why it matters
An admin who customises the second-registered package's dataset or import mapping finds the customization declined, while the same act on the first package works. This needs two namespaces shipping one name.
Reader
domain:server. ADR-0150's red lines apply. Pins should cover both registration orders, each holder disabled in turn, and one-holder controls, as PR #33126 does.
Dedupe
servesSealedOverrideRow: 0 open. second holder override declined: #32613 / #32552 only (their own types). packagedArtifactOwner: 0 open.
Activity
objectstack-fleet commentedon Nov 13, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: grade ·
domain:server· p2 ·pm:queue· 2026-11-13T16:15Z⛔ Not a claim.
main. Work them under this card's grade, and do not split them out.objectstack-fleet commentedon Nov 13, 2026
epic:#31527#2 · os-elon-musk · session_016WV4czFhtRVZNBeHdQA6PW
Measured case for item 3 (the action registry face), from PR #33126's round-2 mixed pin (card #32613 thread, local head 616dbbd): two packages ship one action name,
alpharegisters first, onlybeta(the second to register) declares an override. The env-wide list then showsalpha:OVR-Bandbeta:OVR-B. With main's owner-only judgment put back the same case readsalpha:OVR-B,beta:SHIPPED-beta, so the first holder's slot is misattributed on main already: the hydrator registers the pair row under the bare name wearing the first shipper's envelope. PR #33126 fixes the overridden holder's own slot and address and pins only those; the first holder's slot is this card's.objectstack-fleet commentedon Nov 13, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: item 3 re-graded on the measured case (asked by
epic:#31527#2, 6860780264) · card stays p2 · 2026-11-13T17:57Z⛔ Not a claim; the card's grade and state are unchanged.
alpharegisters first, and onlybetadeclares an override. Both the env-wide served list and the execution view the engine arms from showalpha:OVR-B: alpha's action slot runs beta's override, chosen by registration order.mainbehaves the same, so this is not a regression. My earlier note ("matchesmain, no defect yet") was written before this measurement and is withdrawn for item 3.beta, and no lower-privileged actor gains a grant, so rule 4 does not apply.fix(metadata-protocol): the boot census judges a second holder's over…
objectstack-fleet commentedon Nov 13, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: scope note for item 1 · 2026-11-13T20:15Z
⛔ Not a claim; grade unchanged.
Item 1 also carries the boot census
metadata_sealed_overlay_unservedfor the six sealed types (from #32859, closed into this card). When the reads start judging every shipper for page, app, dataset, doc, book and mapping, the census must judge every shipper in the same PR, or it will keep prescribing deletion of a served override. Pin both registration orders and an unserved CONTROL, as #32859 asked.objectstack-fleet commentedon Nov 13, 2026
epic:#31527#3 · os-tesla · session_01L9qibzECS2npZFku4956Um
Claim: PM loop round 1 · batch 1 of the maintainer's order 6866786021 · 2026-11-13T23:02Z
Session:
session_01L9qibytYjpdRBMXBt9cF56(card thread; seatsession_01L9qibzECS2npZFku4956Um)Account:
os-teslaBranch:
claude/project-thread-nsbcae(the card thread's harness-pinned branch; the thread can push only this name)Worktree:
objectstack-issue-33131Domain:
domain:serverSeat:
epic:#31527#3File surface:
packages/metadata-protocol/src/**(served-override judges, registry hydration, the sealed-overlay census, exact qualifier and list reads),packages/objectql/src/package-scoped-exact-qualifier.test.tsand metadata-protocol / objectql tests,packages/spec/src/migrations/entries/**only for an ADR-0087 entry, root.changeset/(stop on breach; explain in the report)Container & model:
L,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate),effort: xhigh(epic child)Clause-②: no
Metadata-protocol: semantic
Responsibility: platform code in objectstack (
packages/metadata-protocol: the read-side hydrator and the served-override judges); no other platform path covers it; reached by an environment where two namespaces ship one overlay-type name and one declares an override — rare todayThread-read: 6863797155
Premise: holds (main read at
47f6c939; the thread re-measures first, per the order)Serial constraints cleared: #32606 (this seat) runs after this card merges (same pair-row reads); #32607 (
epic:#31527#2) and #32692 (domain:server#7) are in flight onpackages/metadata-protocolwith no open PR — write in parallel, land serially; #33148 and #33149 merged on these files 11-13 ~21:45Z (items 4–5 re-measured on main first)Order:
/mnt/project-files/epic-31527-3/r2026-11-13/dispatch-33131.mdunder that folder'sFRAME.md(the coordinator pasted both into the thread's opening message). Contract review: this seat, atCONTRACT_REVIEW_TIER.Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibytYjpdRBMXBt9cF56
os-dev-report
{ "issue": 33131, "status": "done", "branch": "claude/project-thread-nsbcae", "pr": "https://github.com/objectstack-ai/objectstack/pull/33189", "head_sha": "dc6cf1526fecb07edba0e49fec53f3727fceab0e", "session": "session_01L9qibytYjpdRBMXBt9cF56", "premise_still_valid": true, "summary": "Items 3, 1 and 2 fixed in one draft PR (Refs #33131 (items 3, 1, 2)). Item 3: the read-side hydrator gave a pair's override row the envelope of the pair id's lookup, which fell to the first-registered shipper, so that shipper's action slot listed and ran the other package's override; now a bound row wears the base its body declares (only when that base ships the name and isServedOverrideRowOf accepts the row). Item 1: declinesStoredRow and the boot census judge a sealed type's declaration against every shipper, as flow and action already did. Item 2: the env-wide list drops the pair slot of a declared override for every type, not flow/action alone. Items 4 and 5 still reproduce on current main and need a different fix (exact qualifier / list member withholding); they follow on this card in their own PR, so #32606 is not folded.", "tests": "objectql: protocol-flow-custom-override.test.ts + protocol-custom-override-bare-slot-envelope.test.ts 159/159 (FROM on main: item-3 pins 4 failed / 6 passed). Full: metadata-protocol 22803 passed/36 skipped; objectql 12897 passed; spec 26832 passed/1 todo; typecheck mp + objectql 0. Ablations (ablation-replace + dist preflight, marker present while mutated, absent after, git status clean): A1 hydrator envelope -> 4 failed/6 passed; A2 sealed declinesStoredRow owner-only -> 6 failed/7 passed; A3 census per-shipper flow/action only -> 6 failed/37 passed; A4 list type gate restored -> 4 failed/9 passed.", "gates": "dispatch-gates --commands: 92 lines, each run </dev/null with exit code recorded; --ran: 92 derived, 92 run, 0 NOT-MEASURED, 0 UNRUN. Two lines first exited 3 (prerequisite): check-plugin-teardown-shape --self-test (shallow clone lacked fixture commit 621a4876; fetched, re-run 0) and check:dual-build-cjs-loads (unrelated packages lacked dist at its turn; re-run 0). pnpm lint 0; check-nul-bytes 0; check-adr-0087-registration --base origin/main 0; spec check:generated 13/14 green, check:test-typecheck died 'tsc failed without diagnostics' on the shared box, re-run alone with 8 GB heap OK. CI check-runs: not yet read (draft just opened).", "dogfood_battery": "dc6cf152 (pre-push head, same tree) · os-verify-lock VERDICT command-exit 0 · Test Files 462 passed / 3 skipped (465) · Tests 3905 passed / 42 skipped (3947) · no failures", "line_budget": "9 files, +487 / -64 (source 106 lines, tests 373, changesets + semantic entry 72); under the ~1500 one-review bound", "deviations": [ "Item 2: the order said fix only if the env-wide list drops the second holder's override. Measured: it does not drop it, it lists it twice with the extra entry stamped with the first-registered package (a misattribution); fixed here and stated in the PR's Acceptance notes.", "Items 4-5 carried: both still reproduce on main and need a different fix, so the PR is Refs (items 3, 1, 2), per the order's split rule.", "Census widening is scoped to flow, action and the six sealed types; other types keep owner-only.", "Two early card reads went through `gh api` (GET issues/33131/comments) instead of MCP; reads only." ], "files_changed": [ ".changeset/33131-two-shipper-override-own-slot.md", ".changeset/33131-two-shipper-override-semantic-entry.md", "packages/metadata-protocol/src/protocol-diff-delete-load.ts", "packages/metadata-protocol/src/protocol-lock-state.ts", "packages/metadata-protocol/src/protocol-meta-list-reads.ts", "packages/metadata-protocol/src/protocol-registry-hydration.ts", "packages/objectql/src/protocol-custom-override-bare-slot-envelope.test.ts", "packages/objectql/src/protocol-flow-custom-override.test.ts", "packages/spec/src/migrations/entries/semantic/18.two-shipper-declared-override-own-slot.ts" ], "ruling_grep": "58 hits in 4 of 9 declared files; those beside an edited hunk (hydration [#32568 epic ruling 6817768147] 'never a pick between two', declinesBorrowedEnvelope note; diff-delete-load 'asked through the DOOR's own predicate'; meta-list-reads [epic ruling 6761802819], [#28390 ruling A]) are all kept — listed in the PR's Acceptance notes", "mcp_calls": "5 — reads only: mcp__github__issue_read x4, mcp__github__pull_request_read x1; 0 writes", "api_writes": "1 relay write (fleet-write pr_create, run 43535872851, body read back identical, assignee os-tesla) + this post-stamped comment; 0 REST proxy writes", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibytYjpdRBMXBt9cF56
Item 4 measured: served by the #31593 moved-edit rule, not a stray read. Needs the maintainer's call; no code written.
Fixture: the item's own shape (
package-scoped-exact-qualifier.test.tsharness). Appcom.acme.suite, its module Xcom.acme.suitexships nothing ofwelcome, module Wcom.other.wolf(depends on the App and on X) ships thede-DEemail templatewelcome.com.acme.suite.customstores ade-DErow declaringoverrides: { package: X }. Measured on this card's branch, whose items 1–3 do not touch this path, in both orders (row stored first, W registered first):welcome[com.other.wolf]registry.getPackageScopedItem(…, W, 'de-DE')wolf de-DE(W's own)?package=W&member=de-DEpair de-DE for X, stamped W['pair de-DE for X']?package=X&member=de-DE?package=com.acme.suite.custom&member=de-DEpair de-DE for X, stamped WWhy. The W read's candidate list (
servedOverlayRowCandidateswithships) includes the App pair's moved override, andisMovedOverrideRowOf(suite-moved-overlay.ts) accepts this row: it declares X, X is an installed package of W's App, X does not ship the name and W does. That is exactly #31593's reading of "the item moved from X to W, and this is the tenant's edit from before the move".Proof. With
isMovedOverrideRowOfforced tofalse(scratch, reverted), W's address, W's list and W's execution list all answer W's ownwolf de-DE, in both orders. Nothing else in the table moves (X still 409 naming W). So nothing in the stored state tells item 4's row apart from a real module-to-module move.Options
Item 5 is fixed separately and does not depend on this call.
Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibzECS2npZFku4956Um
Ruling recorded · #33131 item 4 · 2026-11-14T00:50Z
Ruled: the maintainer (Tesla,
os-tesla) tapped option A 「A 保持现状,按设计记录」 on the seat thread's decision card 「#33131 第 4 项:模块间移动的定制行怎么处理?」 (2026-11-14T00:50:44Z).A.customrow declaring X, where X is an installed module of the same App that ships nothing of the name and W ships the member) is the A tenant's edit of a packaged view stops applying when its item moves to another package of the same suite (composed upgrade, rollback) #31593 moved-edit rule (isMovedOverrideRowOf,packages/metadata-protocol/src/suite-moved-overlay.ts), by design. The stored state cannot tell it apart from a genuine module-to-module move, and the moved rule is what keeps a tenant's edit served across such a move. W is the one holder in the App, so red line 2 (two holders) is not engaged.Refs #33131 (items 4, 5)). Options B (narrow the moved rule) and C (409 at W) are not taken.Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibzECS2npZFku4956Um
Carried on this card · 2026-11-14T03:03Z
From PR #33189 (S1 of record 6868863482, measured in round 1): with both holders of one action name overridden in their own
.custompairs, every read face serves each holder's own override, butregistry.getPackageScopedItem('action', …)keeps one bare slot per name: the holder saved last answers its override, the other answers its own shipped action (never the other holder's override). Pinned as it stands (… both overridden: … (carried)). This is the registry's one-bare-slot model, not the hydrator; it is held here beside items 4 and 5 and is not in their PR unless the seat says so.Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibytYjpdRBMXBt9cF56
os-dev-report
{ "issue": 33131, "status": "done", "branch": "claude/project-thread-nsbcae", "pr": "https://github.com/objectstack-ai/objectstack/pull/33220", "head_sha": "c6a4f1aae6420258b00cc928781622af7fb176b3", "session": "session_01L9qibytYjpdRBMXBt9cF56", "premise_still_valid": true, "summary": "Items 4 and 5, draft PR Refs #33131 (items 4, 5) on main 26b5994a (#33189 merged). Item 5: the scoped list's pair added-member rule also counts a package that holds the name only through its own stored row (holdsNameForExactRead = the exact read's packageScopedHoldersOf), so X's list and execution list carry the member X's exact read already served; every withholding check (two owners, a row declaring another package) unchanged. Item 4: ruling 6868829990 option A, no behaviour change, one pin naming the #31593 moved-edit rule (isMovedOverrideRowOf), both orders. The both-overridden registry face carried from #33189 (6870666736) is a different fix (registry one-bare-slot model) and is not in this PR; the card stays open.", "tests": "package-scoped-exact-qualifier.test.ts 272/272 (n1 stored-row pin now asserts both lists ['pair de-DE','suitex en-US'], FROM ['suitex en-US']; 2 new CONTROLs both orders; 2 item-4 pins). Full: metadata-protocol 22810 passed/36 skipped; objectql 12942 passed; spec 26832 passed/1 todo; typecheck mp + objectql 0. Ablations (marker present while mutated, absent after, tree clean): A5 holdsNameForExactRead off -> 2 failed/6 passed (CONTROLs green); A6 isMovedOverrideRowOf forced false -> 2 failed (item-4 pins).", "gates": "dispatch-gates --commands: 91 lines, each </dev/null, exit codes recorded; --ran: 91 derived, 91 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint 0; check-nul-bytes 0; check-adr-0087-registration 0; spec check:generated 0 (8 GB heap). CI check-runs: not yet read (draft just opened).", "dogfood_battery": "c6a4f1aa · os-verify-lock VERDICT command-exit 0 · Test Files 464 passed / 3 skipped (467) · Tests 3927 passed / 42 skipped (3969) · no failures", "line_budget": "6 files, +163 / -9 (source 32, tests 103, changesets + semantic entry 37)", "deviations": [ "Item 4 ships as a pin only, per ruling 6868829990 (option A), not as a fix.", "Refs, not Fixes: the card keeps the carried both-overridden registry face (6870666736), per the seat.", "The first pr_create relay run (43559199748) failed because the branch had been auto-deleted at #33189's merge and my force-with-lease push was refused (stale info); nothing was written; branch pushed fresh, create re-run (43559300016)." ], "files_changed": [ ".changeset/33131-stored-row-holder-lists-pair-member.md", ".changeset/33131-stored-row-holder-semantic-entry.md", "packages/metadata-protocol/src/protocol-exact-qualifier.ts", "packages/metadata-protocol/src/protocol-meta-list-reads.ts", "packages/objectql/src/package-scoped-exact-qualifier.test.ts", "packages/spec/src/migrations/entries/semantic/18.stored-row-holder-lists-pair-member.ts" ], "ruling_grep": "62 hits in 3 of 6 declared files on origin/main; beside edited hunks and kept: exact-qualifier [epic ruling on #31699 F2] pairMemberOwners 'never a pick between two' and pairMemberWithheldAt (untouched, still asked after the widened holder check), list-reads [#28802, #28390 ruling A] pair added member (same rule extended to a stored-row holder)", "mcp_calls": "this round 4 — reads only: mcp__github__issue_read x2, mcp__github__pull_request_read x1 (+1 ToolSearch); 0 writes", "api_writes": "relay: 2 pr_create dispatches (1 failed, nothing written; 1 created #33220, read back identical) + this post-stamped comment + item-4 measurement comment 6868819871 earlier; 0 REST proxy writes", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "class: c · reach: bare read of a `doc` name two namespaces ship serves the first-registered holder's shipped item (a pick, registration-order) and never a declared override; measured identical on main during #33189 round 1 · evidence: #33189 N1 pin note · noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibzECS2npZFku4956Um
Release: session_01L9qibzECS2npZFku4956Um · seat epic:#31527#3 signs off on the maintainer's word 「所有座位当前任务处理完,合并后就下班」 (2026-11-14 04:35Z, project chat) and 「各座位自己的契约复审也暂停,等新的 review agent 上线后复审」 (04:37Z) · back to pm:queue for the next claimant · 2026-11-14T05:48Z
Resume-from: claude/project-thread-nsbcae@c6a4f1aae6420258b00cc928781622af7fb176b3
Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibytYjpdRBMXBt9cF56
Items 4 and 5: PR #33220 passed contract review (record 6878787461,
CONTRACT_REVIEW_TIER, PASS atc6a4f1aa) and is ready with auto-merge armed (landing comment 6878804436). It saysRefs, so this card stays open. Left on it after #33220 merges:getPackageScopedItemkeeps one bare slot. Unchanged.packageScopedHoldersOfwith no caller drops X, so X's scoped list leaves the pair's undeclared row out. X's exact read admits X and serves that row. The list is the narrower side, which matchesmain. This needs a measurement before anyone decides whether it is a defect.docname that two namespaces ship serves the first-registered holder's shipped item.mainmeasures the same. This is a registration-order pick on a by-name read. The contract review asked that it get an owner: it is recorded here for the seat to triage, and it is not filed separately.Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibytYjpdRBMXBt9cF56
PR #33220 (items 4 and 5) merged to
mainas1fd5d8af3, after the seat adopted the PASS record 6878787461 (adoption comment 6878839425). Items 1, 2 and 3 landed earlier in #33189 (26b5994a).The card stays open, as its
Refslines say. Comment 6878816309 lists what remains: the both-overridden registry face (6870666736), nit N1 (to be measured) and thedocbare-read registration-order pick. This card thread stops here; the remainder goes to triage.Generated by Claude Code