Repository navigation
metadata-protocol: close the package-less write onto a packaged item (PUT/DELETE, rollback, source save, reset) naming <base>.custom; Studio drops its overlay link #28576
Description
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
Filing gate: ④ child of epic #28236 (P1 close half, split from #28413 and cut 2026-11-01 on the maintainer's 「四项提速措施全部按推荐执行」, schedule reviewed); Q5 「全部同意」: package-less overlay writes are closed after the migration · plan of record: ADR-0146 Rollout P1 "N-16 migrate package-less overlay rows, then close that write". ⛔ Not a claim.
Blocked-by: #28413, #28562, #28569
Part of #28236 (P1, child N-16b) · governs: ADR-0146 D11 (close), D1 (rollback, source save and reset only on the writable package); Supersede rows ADR-0005 five-type tier, ADR-0131 D6, ADR-0070 D5 · lane: domain:server (packages/metadata-protocol; console surface declared in item 3) · size: M.
Business reason. Once HotCRM's customizations live in hotcrm.custom, a write of no package is the last way to make a change that never exports. This card closes it, after Studio edits every type that loses its Setup overlay (N-17, N-25).
Measured (35b178bd0a).
protocol-packaged-base-refusal.ts:56#refusePackagedBaseOverriderefuses a package-less write only for a sealed item. The fiveallowEnvironmentOverlaytypes pass, andflowis sealed already, so N-18 is not needed here.protocol-environment-rows.ts:152#packagelessAddressis the address of the direct save, the delete and the version token. The class method's docblock (protocol.ts:17650) namessaveMetaItem,deleteMetaItemandreadVersionToken; the draft doors usepackagelessDraftAddress.- Reset and delete of a migrated item before the close: after cli + metadata-protocol:
os migratemoves package-less overlay rows into <base>.custom as declared overrides — the migration ceremony only (the close is N-16b) #28413's move the pair's row is the sole binding. A package-lessDELETE(Setup's "Reset overlay") therefore removes the pair's row (protocol.ts:2875#servedOverlayRowCandidatesand its docblock from :2802). cli + metadata-protocol:os migratemoves package-less overlay rows into <base>.custom as declared overrides — the migration ceremony only (the close is N-16b) #28413's item 4 keeps the row'soverrideson a package-less save in that window; this card retires that allowance with the write. - After the close: a
DELETEnaming?package=<base>.customis not package-less and stays open. Who offers it:- Setup's item page with
?package=(ResourceEditPage.tsx:535ownerPackageId; the reset sendspackageId, about :2142), until N-28 retires the route; - N-17's "Restore package original" for view, dashboard and report (D2 revert);
- N-25 for translation and email template.
Not verified in a running console.
- Setup's item page with
- Studio link:
StudioDesignSurface.tsx:843drawsengine.studio.pkg.readonlyLinkwhenever the type hasallowEnvironmentOverlay. - Pins of today's open write:
objectql/src/environment-overlay-five-types.test.ts,metadata-protocol/src/protocol.packageless-save-address.test.ts.
Wanted.
- Close. A package-less
PUT/DELETEonto a shipped name is refused, naming<base>.customand cli + metadata-protocol:os migratemoves package-less overlay rows into <base>.custom as declared overrides — the migration ceremony only (the close is N-16b) #28413's ceremony. This includes rollback, source save and reset (D1).packagelessAddressstops answering an unbound binding for a shipped name.allowEnvironmentOverlaystops opening a write door. It stays the predicate the migration and the read of an unmigrated row use.
- Unmigrated rows stay served, unchanged. Their package-less write is refused with the same sentence, which names the ceremony.
- Console (
ui/packages/app-shell, one surface): the Studio link stops offering the overlay for a packaged item. Setup's overlay save shows the server's refusal verbatim until N-28 retires the route. - PR declarations:
Clause-②: yes (narrowing),Metadata-protocol: narrowed, a major changeset with its ADR-0087 disposition. The body carries the migration FROM → TO: a package-less write onto a shipped name becomes a write naming?package=<base>.custom. The release note tells operators to run cli + metadata-protocol:os migratemoves package-less overlay rows into <base>.custom as declared overrides — the migration ceremony only (the close is N-16b) #28413'sos migrateceremony before upgrading to this release.
Tests.
- A package-less write after the close is refused naming the pair:
PUT,DELETE, rollback and source save. - A save and a
DELETEnaming?package=<base>.customon a migrated item succeed. - Control: a package-less write of a name no package ships (environment metadata) still succeeds.
- An unmigrated row is served, and its package-less write is refused naming the ceremony.
environment-overlay-five-types.test.tsandprotocol.packageless-save-address.test.tsare re-judged.protocol.org-scoped-write-refused.test.tsstays green, unchanged.- Console: no overlay link on a packaged item, and Setup shows the refusal sentence as sent.
Release safety. A release right after this card keeps an editor for every former overlay type: N-17 and N-25 are in Blocked-by:, and #28413 supplies the ceremony. A deployment that skipped the ceremony serves its rows but cannot edit them package-less, hence item 4's release note.
Not here. The migration (#28413); Studio customization (N-17, N-25); flow customization (N-18, not an overlay type); Setup redirects (N-28).
Dedupe. #28413 (its Wanted 4–5 moved here). Searched open issues package-less write close (12 hits) and allowEnvironmentOverlay (7 hits): #28413 and #28410 (the override gate), the rest QA runs, seats and test budgets. No other card closes the write.
Links back: #28236, #28413, ADR-0146 D1, D11, ADR-0005, ADR-0070 D5, ADR-0131 D6.
Generated by Claude Code
Activity
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Triage reading from #28644 · 2026-11-01T12:16Z
Triage reading for this card, from #28644 (1). When this card's scope covers rollback,
rollbackMetaItemmust judge a rollback of the.custompair's own declared row (storedruntime-onlywith itsoverridesdeclaration since #28410) as the pair's declared override, not as an artifact override fromisArtifactBackedalone. Take it as a test case. Ruling-ref: the maintainer, 2026-11-01T12:11Z: 「定级你可以自己决定」.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH
Pointer from #28413 (N-16a) · 2026-11-01T14:07Z · ⛔ Not a claim.
os migrate packageless-overlays(PR feat(cli,metadata-protocol): os migrate packageless-overlays moves package-less overlay rows into .custom as declared overrides #28689). Its Wanted 5 askedadopt-orphansto name that ceremony when it skips a shipped-name row. The seat ruled B on cli + metadata-protocol:os migratemoves package-less overlay rows into <base>.custom as declared overrides — the migration ceremony only (the close is N-16b) #28413:adopt-orphans' response gains no field (it has none for skipped rows, and the skip set is transitional).os migrate packageless-overlays), for a package-less save or delete of a shipped name.objectstack-fleet commentedon Nov 1, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: unblocked · p1 ·
pm:queue· 2026-11-01T17:56Z⛔ Not a claim.
Blocked-bytarget is closed as completed: cli + metadata-protocol:os migratemoves package-less overlay rows into <base>.custom as declared overrides — the migration ceremony only (the close is N-16b) #28413 (N-16a, the migration), Studio: customize a read-only package's view, dashboard or report into <base>.custom — a declared override, its badge, and "Restore package original" (replaces #28147) #28562 and Studio: email template and translation editors in the All metadata area — a read-only base's template or bundle is customized as an override in <base>.custom #28569 (the Studio customization paths). This card is the close half (N-16b) that the 05:00Z split kept back until those landed, sopm:blocked→pm:queueat p1, with no assignee. cli + metadata-protocol:os migratemoves package-less overlay rows into <base>.custom as declared overrides — the migration ceremony only (the close is N-16b) #28413's pointer comment of 14:07Z is the dev's first read.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
Claim: PM loop round 1 · card thread · 2026-11-01T18:47Z
Session:
session_01FEkQ5oc56xChD6Wrc4cGSt(the seat); the card thread issession_01FEkQ5ni5yjiTswP6crgAkXAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-l8wnbr(the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)Worktree: the card thread's own container checkout
Domain:
domain:serverSeat:
domain:server#5Ruling-ref: triage grade p1 as recorded in 6561705923 (unblocked 2026-11-01); the card's Wanted is the scope (epic #28236 N-16b, ADR-0146 D11 / D1, the maintainer's Q5 「全部同意」 quoted in the body); picks announced to seats 1-3, all three confirmed no clash.
File surface:
packages/metadata-protocol/src/(protocol-packaged-base-refusal.ts,protocol-environment-rows.ts, the package-less paths inprotocol.ts, rollback and source save),packages/objectql/src/environment-overlay-five-types.test.ts, oneui/packages/app-shellsurface (the Studio overlay link, Setup's refusal display), their tests, changesets.Container & model:
M,mode:thread, model and effort as the thread was openedClause-②: yes (narrowing)
Metadata-protocol: narrowed
Responsibility: the code is the metadata-protocol package-less write path (save, delete, rollback, source save) and the packaged-base refusal · it refuses a package-less write only for a sealed item, so the five overlay types still write package-less onto a shipped name · reached by any author or tool saving metadata without
?package=, used today by Setup and StudioThread-read: 6561705923
Premise: holds (triage 6561705923: #28413, #28562 and #28569 closed as completed;
refusePackagedBaseOverriderefuses only sealed items, read onorigin/maind08b859a)Serial constraints cleared: seat 1's PR #28768 (#28735,
reassignOrphanedMetadataand the promotion's suffix block inprotocol.ts) and #28574 (anobject_extensiongate inside the save and publish doors); seat 1 keepsprotocol-packaged-base-refusal.tsoff-limits; the second to land mergesorigin/main. #28644 (seat 2) waits on this card; its item 1 rides here as a test.Resume-from: none — fresh from
origin/maind08b859aState:
pm:queue→pm:dispatched, assigned toos-project-manager, recorded by this claim. Order:pm-orders/server/order-28576.mdin the project.objectstack-fleet commentedon Nov 2, 2026
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
2026-11-02T03:23Z
Ruled · release timing of N-16b (maintainer, direct chat with the epic PM seat, 2026-11-02):
(Translation: no need to wait. Land N-16b once it is fixed; shipping it in the same release as the migration command is fine.)
What this means for the lane. Land N-16b on the normal path once the contract review passes. No release has to be cut between N-16a (#28413,
os migrate packageless-overlays) and this card. The last published release is 18.2.0, which does not have the command, so the next release may carry both.Consequence for the PR text (PR #28850). This is a fact for the lane and the reviewer, not a new ruling. The changeset's "Run the ceremony before you upgrade … on the release before this one (#28413 shipped the command)" assumes a release between the two cards. Under this ruling there may be none. An operator upgrading from 18.2.0 then has no "release before" to run it on: they upgrade, and only then can they run the command. The same holds for the fix the contract review's M1 suggested, "resolved on the release before this one". The entry and the changeset need to give that operator a working order: upgrade, run the preview, run
--apply. For every row the ceremony lists but does not move, they also need to name a door that is still open after the upgrade. Which arm of M1 answers that is for the lane and the reviewer to decide.Links back: #28236 (N-16b), #28413, PR #28850.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
os-dev-report
{
"issue": 28576,
"status": "pr_open",
"branch": "claude/project-thread-l8wnbr",
"pr": 28850,
"head": "68effe33",
"session": "session_01FEkQ5ni5yjiTswP6crgAkX",
"premise_still_valid": true,
"summary": "A write naming no package onto a view, dashboard, report, translation or email template that an installed read-only package ships is refused 403 NOT_OVERRIDABLE at save, publish, delete (active item) and rollback, naming '.custom' (?package=.custom) and
os migrate packageless-overlays, fix first and under the REST door's 500-character cap. 'Packaged' is the ceremony's own reading (readOnlyShippingPackages, now shared with the ceremony); a base with no derivable pair (no_pair) is not closed. Unmigrated package-less rows stay served. Ruling 4: a rollback of the pair's own declared row is judged as the pair's override. Studio's read-only mark no longer links Setup; Setup shows the refusal verbatim (pinned). #28413 item 4's transitional allowance is retired. Changeset minor + BREAKING (launch-window no-major gate), ADR-0087 registered packageless-overlay-write-closed, release note: run the ceremony before upgrading.","tests": {
"red_first_on_base": "metadata-protocol 4, objectql 19 (five-types 10, migration close describe, email-locale 3, dependent-package 1), ui 1 (StudioReadOnlyLink email case); all green on head",
"reroutes_not_red_first": [
"runtime standalone-stack-artifact-reload-registry-refresh (save into the pair, fixture namespace arl)",
"dogfood: 11 files, 26 cases red on the battery before the re-route, now writing ?package=.custom through test/customization-pair.ts"
],
"pin_green_on_base": "ResourceEditPage.packagelessWriteClosed-28576 (Setup shows the 403 sentence as sent)",
"org_scoped_write_refused": "green, unchanged",
"ablations": "save, publish, delete, rollback, ruling 4, no-pair carve-out: each red as predicted via ablation-replace (objectql legs proved by ablation-dist-preflight), restored, --absent exit 0 for every marker",
"live_probe": "stock showcase (pnpm --filter @objectstack/example-showcase dev -- --fresh -p PORT), view showcase_task.in_progress. Base 56fdd56: package-less PUT 200, pair DELETE leaves the package-less row. Head d5f9db8: package-less PUT 403, ensure-customization 201, pair PUT 200 served, package-less DELETE 403, pair DELETE 200 reset to package original. Scripts probe.sh / probe-base.sh in the thread scratchpad.",
"final_head_suites": {
"build": "turbo 68/68",
"metadata-protocol": "297 files, 22093 passed",
"objectql": "523 files, 10029 passed",
"rest": "371 files, 7224 passed",
"runtime": "515 files, 9266 passed",
"ui_targeted": "8 files, 63 passed",
"ui_scripts": "169 files, 4900 passed",
"dogfood_typecheck": "exit 0",
"scoped_eslint": "0 errors on every changed file"
}
},
"gates": {
"derived": 101,
"run": 101,
"all_exit_0": true,
"ran_reconcile": "exit 0, 101 of 101, 0 NOT-MEASURED",
"no_major_with_event": "exit 0"
},
"dogfood_battery": {
"head": "68effe33",
"command": "pnpm --filter @objectstack/dogfood test (under os-verify-lock, no shard)",
"files_passed": 377,
"files_failed": 4,
"tests": "3130 passed, 4 failed, 28 skipped",
"failures": "upgrade-18x-harness, identity-mail-read-gate, audit-key-material, audit-mail-bodies: all on the 18.0 fixture sys_activity copy (no such table: sys_activity__r20261019, or rewrite counts short by the activity rows). sys_activity rotates 14 daily shards (plugin-audit sys-activity.object.ts) and ensureRotation drops shards older than the window by Date.now(), so the fixture shard of 2026-10-19 expired when the clock reached 2026-11-02. The same four passed on this branch the day before; nothing here touches audit, activity or rotation. Reasoned from code and the two runs, not run on main."
},
"mcp_calls": {
"total": 6,
"reads": 6,
"writes": 0,
"detail": "issue_read x4, pull_request_read x2"
},
"api_writes": {
"total": 2,
"detail": "relay pr_create (labels in the same act, no assignees), this report via post-stamped"
},
"open_questions": [
"A pre-D11 package-less email_template row of a locale the base does not ship (e.g. showcase zh-CN) stays served and sends, but
os migrate packageless-overlaysfails to move it: it saves it into the pair declaring overrides, which #28777 refuses for an unshipped locale (measured on f2e1f8b, outcome failed, row kept). Its package-less write is now refused and the refusal says the ceremony moves it. Suggest the ceremony move such a row as the pair's own member without overrides (main's #28828 now lists and sends that member). Not done here: it is the ceremony's move, outside this card.","A base whose pair id derives but cannot be ensured (no namespace, or a non-SemVer version) is closed with no write door. Recommend keep (ADR-0146 D3).",
"The PR body's open-question paragraph on the pair's own zh-CN member not sending, and its two-locales dogfood note, predate main's #28828 (merged in at f2e1f8b): the pair's own locale now sends, and the two-locales file writes zh-CN into the pair. A dev does not edit the body after pr_create; the seat may want to replace that paragraph with the first question above."
],
"out_of_scope_findings": [
"A save naming the read-only code package itself (?package=) for an overlay type is still accepted and lands an overlay bound to the base (reads against ADR-0146 D1).",
"The 18.0 upgrade-fixture dogfood files are clock-dependent: the fixture sys_activity shard falls out of the 14-day rotation window, so four files are red on any branch from 2026-11-02. No issue found by search."
],
"deviations": [
"Changeset level minor + BREAKING, not major: check-changeset-no-major refuses major in the launch window.",
"Fallout beyond the order list: package-door-before-gates, packaged-base-refusal, objectql email-locale and dependent-package files, the runtime reload test, and 11 dogfood files.",
"The Setup test pins existing behaviour (green on base), not red-first.",
"The i18n key engine.studio.pkg.readonlyLink is left in place (no reader; the dead-key report lists it).",
"Skills paragraph: dropped "the base's is unchanged" to stay under the bundle token ceiling.",
"origin/main moved repeatedly: merged again at 4f1e0a4, then after pr_create showed the PR dirty at f2e1f8b (protocol.ts import and skills paragraph) and 68effe3 (StudioReadOnlyLink and its test: #28818 had re-pointed the overlay link at Studio's All metadata item page; kept link-free per ruling 3, since that page's save names no package). Main has moved 11 commits since 68effe3 and still merges clean; not chased further."
],
"files_changed": 30,
"line_budget": {
"added": 1017,
"removed": 346,
"threshold": 3000,
"under": true
}
}
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
Seat ruling · PR #28850 fix round 1 · 2026-11-02T04:04Z
The three FAIL records on PR #28850 (triage 6567301000 and 6567984821, seat 6568749795) agree on the stranded-row must-fix. The maintainer's release-timing ruling (6568273466) leaves the lane to pick the arm. This seat rules under 「定级你可以自己决定」 (Leehom, 2026-11-01T12:11Z):
Operator order (M1). Upgrade, then preview, then
--apply, with--preset/--devnamed. "Before you upgrade" goes from the entry and the changeset.Arm (b) for the stranded rows (M2). The close applies only where the ceremony would move the row. The package-less write stays open for:
multi_shipped;foreign_declarationorshadowedpackage-less row;email_templatemember at a locale the base does not ship (migrate: os migrate packageless-overlays fails on an email template row of a locale the base does not ship, so after #28576 that row can be neither written nor migrated #28904 keeps the ceremony's move).The classification is read from the ceremony's own predicate. The remedies and the refusal sentence must name only open doors. The entry names all five dispositions with a post-upgrade step each, and its criterion becomes "the preview lists no movable row".
Should-fixes. S1–S3 are fixed in the PR. S5 is pinned or named.
Flag 9. Answered by test(dogfood): the upgrade fixtures read as written the day before the run, so a boot's rotation never drops their activity shard #28867 on
main; the dogfood battery is re-run in full after the merge.Fix order:
pm-orders/server/order-28576-fix1.md(project), sent to the card thread onclaude/project-thread-l8wnbr. The PR stays governed (skills/**, a human merge) after a PASS.objectstack-fleet commentedon Nov 2, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
os-dev-report
{
"issue": 28576,
"status": "pr_open",
"branch": "claude/project-thread-l8wnbr",
"pr": 28850,
"head": "a54ef147",
"session": "session_01FEkQ5ni5yjiTswP6crgAkX",
"premise_still_valid": true,
"round": "fix round 1 (order-28576-fix1.md; records 6567301000, 6567984821, 6568749795)",
"summary": "Arm (b): the package-less save, publish, delete and rollback onto a packaged item of the five overlay types are refused only where
os migrate packageless-overlayswould classify the row (or, with no stored row, the saved body) movable and its move can succeed. The close reads the census's own classifyPackagelessRow (the census now lists by it too), the ensure door's own refusals (customizationPairEnsureRefusal, extracted from ensurePairOnce and called by it), the base's version (basedOn) and the override write gate for the declared body in the pair. Every row the ceremony leaves keeps its package-less write: multi_shipped, no_pair, unensurable pair (no namespace, non-SemVer version), stored foreign_declaration or shadowed row, and an email_template locale the base does not ship (#28904). The entry and changeset prescribe upgrade, preview (with --preset/--dev), --apply; state the window; name the five dispositions plus failed with a post-upgrade step each; criterion: the preview lists no movable row.","findings": [
{
"record": "6567301000 M1 / 6567984821 M1 / 6568749795 M2",
"finding": "stranded rows",
"answer": "fixed (arm b, ruling 2): close reads classifyPackagelessRow + the ceremony move steps; one test per carve-out in objectql protocol-packageless-overlay-migration.test.ts (multi_shipped, no_pair, unensurable x2, foreign_declaration x2, shadowed) and environment-overlay-email-locale-restart.test.ts (unshipped zh-CN reset open, as on main); the dependent-package test file reverts to main (its base has no namespace, so main's #28410 refusal answers again)"
},
{
"record": "6568749795",
"finding": "M1 operator order",
"answer": "fixed: entry and changeset say upgrade, then the preview with the deployment's boot flags (--preset/--dev named as in 18.security-catalog-environment-overlay-refused.ts), then --apply; the window sentence is in both; no "before you upgrade" / "release before" left (grep empty)"
},
{
"record": "6568749795 M2 (remedies)",
"finding": "reasonOf and refusal truth",
"answer": "fixed: measured that a package-less DELETE of a shadowed item is addressed to the pair's row (packagelessAddress: the one binding), so the CLI's 'delete this package-less row' was false on main too; shadowed now says nothing is owed to keep the pair's, or Restore package original then re-run. multi_shipped now says delete it naming no package first, then save into the pair (a pair row first would take the package-less address). The refusal's rule sentence now says the close applies where the command can move the row; the rollback sentence no longer says 'roll it back there' (measured: a pre-move version rolled back in the pair is refused by D2, undeclared body) and prescribes saving that version's body into the pair, declaring it (pinned)."
},
{
"record": "6568749795 M2 (entry)",
"finding": "five dispositions, criterion",
"answer": "fixed: replacement names movable, multi_shipped, no_pair, foreign_declaration, shadowed and a failed move with the step for each; acceptanceCriteria is the preview listing no movable row; exit-code clause dropped"
},
{
"record": "6568749795 M2 (changeset)",
"finding": "Now refused / Still open",
"answer": "fixed: both lists restated from the code, including the first package-less write of an item the pair already holds (closed) and the shadowed addressing (open, to the pair row)"
},
{
"record": "6568749795",
"finding": "S1",
"answer": "fixed: surface names the metadata item page (Studio's All metadata area, where Setup's metadata URLs now land) when its URL holds no ?package=; Setup only as the stored rows' origin"
},
{
"record": "6568749795",
"finding": "S2",
"answer": "fixed: --preset and --dev named in the entry and the changeset"
},
{
"record": "6567301000 / 6567984821 / 6568749795",
"finding": "S3",
"answer": "fixed: 'a pre-D11 unbound Setup row wins over the base's until
os migrate packageless-overlaysmoves it, and its package-less save, reset and rollback are refused once movable (D11)'; paid by deleting the OVERRIDABLE_METADATA_TYPES aside and 'package-' in the same paragraph; check-skills-token-ratchet 6011/6012 exit 0"},
{
"record": "6568749795",
"finding": "S4",
"answer": "fixed with M1 (changeset order and lists)"
},
{
"record": "6568749795",
"finding": "S5",
"answer": "pinned: with a shadowed item the package-less rollback is not refused by the close in either store order. Unbound row first: it rolls back the package-less row (pinned). Pair row first (probe): the binding is the pair and the restored undeclared body is refused by D2. Store order still decides; named in out_of_scope_findings"
},
{
"record": "flag 9",
"finding": "clock-dependent dogfood",
"answer": "fixed on main by #28867, merged in: the full dogfood battery at a54ef14 is 383 files passed, 0 failed, 3 skipped; 3163 tests passed, 0 failed, 28 skipped (the four upgrade-fixture files are green)"
}
],
"tests": {
"new_or_changed": "objectql: 8 carve-out cases + rollback-remedy pin; email-locale reset split (unshipped open / shipped closed); mp fixtures gain namespace+version (an unensurable fixture is now open)",
"ablations": "via ablation-replace, objectql legs proved live in dist by ablation-dist-preflight: DISPOSITION (only no_pair carved) reds foreign_declaration x2 and shadowed; ENSURE reds both unensurable cases; VERDICT reds the unshipped-locale reset; each restored, clean build, --absent exit 0 for every marker. MULTI early return alone stays green (classifier repeats it; see deviations)",
"final_head_suites": {
"build": "turbo 68/68 (dogfood, cli, showcase closures) + 44/44 for the dual-build gate's packages",
"metadata-protocol": "297 files, 22106 passed",
"objectql": "526 files, 10056 passed",
"rest": "371 files, 7224 passed",
"runtime": "516 files, 9271 passed",
"spec_migrations": "5 files, 194 passed",
"cli_migrate": "3 files, 177 passed (packageless-overlays integration, confirmation-exit pin, one-shot family)",
"ui_targeted": "8 files, 63 passed",
"ui_scripts": "169 files, 4900 passed",
"scoped_eslint": "0 errors on every changed file (root and ui)",
"skills_token_ratchet": "objectstack-platform/SKILL.md 6011 / 6012, exit 0"
}
},
"gates": {
"derived": 104,
"run": 104,
"all_exit_0": true,
"ran_reconcile": "exit 0, 104 of 104, 0 NOT-MEASURED (check:i18n x3 new, from the cli file)",
"no_major_with_event": "exit 0 (event file from round 1; declarations unchanged)",
"note": "check:dual-build-cjs-loads first exit 3 (prerequisite: 7 packages unbuilt), built them, re-run exit 0"
},
"dogfood_battery": {
"head": "a54ef147",
"command": "pnpm --filter @objectstack/dogfood test (under os-verify-lock, no shard)",
"files_passed": 383,
"files_failed": 0,
"tests": "3163 passed, 0 failed, 28 skipped"
},
"mcp_calls": {
"total": 9,
"reads": 9,
"writes": 0,
"detail": "issue_read x7, pull_request_read x2 (cumulative over both rounds; this round: issue_read x3)"
},
"api_writes": {
"total": 3,
"detail": "round 1: relay pr_create + report 6568585266; this round: this report via post-stamped; plain git push"
},
"open_questions": [],
"out_of_scope_findings": [
"S5, pre-dates the PR: rollbackMetaItem's binding is resolveOverlayPackageBinding's first active row of the name in store order (protocol-stored-row-bindings.ts). With a shadowed item, unbound-first rolls back the package-less row; pair-first restores the package-less row's history into the pair and is refused by D2. Neither is the close's refusal now, but which row a rollback targets is still store order.",
"Rollback history is per name, not per package: after the ceremony moves a row, a rollback in the pair to a pre-move version restores an undeclared body and D2 refuses it. The refusal sentence routes around it (save that version's body into the pair, declaring it); a rollback that re-declares might be wanted.",
"A package-less write of a shadowed item is addressed to the pair's row (packagelessAddress), so its package-less DELETE removes the pair's customization (the package original is restored) and its save is judged as the pair's (D2). Unchanged from main; the CLI remedy no longer relies on it being otherwise."
],
"deviations": [
"Reading taken on 'the first write of the name': with no stored package-less row, the close classifies the saved body and does not ask the pair for a shadow, so the first package-less write onto an item the pair already holds (a moved item) stays closed. A shadowed disposition is applied to a stored row only, as ruling 2 lists it. Otherwise the close would reopen the card's main case.",
"The multi_shipped early return in packagelessCloseSubject is a shortcut the classifier repeats; ablating it alone stays green (21/21) because classifyPackagelessRow answers multi_shipped. The DISPOSITION leg covers that line of the carve-out.",
"protocol-packageless-read-dependent-package.test.ts reverts to main: its base fixture has no namespace, so the close leaves it open and main's #28410 refusal is the answer again.",
"The close does one sys_metadata read (the item's rows) after the registry has found one shipper with an ensurable pair; #5706 lock-gate pins stay green. Call-site comments updated.",
"Changeset level stays minor + BREAKING (launch-window no-major gate).",
"An ablation-replace restore writes the HEAD blob, so it wiped this round's uncommitted protocol-packageless-overlay-migration.ts once; recovered byte-identical (blob 517eb068) and committed before re-running the ablations."
],
"files_changed": 32,
"line_budget": {
"added": 1408,
"removed": 385,
"threshold": 3000,
"under": true
}
}
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
Release:
session_01FEkQ5oc56xChD6Wrc4cGSt· seat 5 signs off at the maintainer's wrap-up · back topm:queuefor the nextdomain:serverseatResume-from:
claude/project-thread-l8wnbr@ddf49538The maintainer's words, verbatim: 「尽快提交代码,然后收工」 (2026-11-02T07:10Z) and 「自动合并中的也交给下一任跟进」 (2026-11-02T07:23Z). This is the default hand-back; seat 5 keeps no stay-behind.
Next: PR #28850 is ACCEPTed on this head (delta-2 contract review PASS 6571389096, seat record 6571402549), CI green, and GOVERNED (
skills/**, tier H): it waits for the maintainer's merge or an authorized APPROVED review (labelledneeds-user-decision). Then the owning seat flips it ready + auto-merge if still draft, posts Landed, and unblocks #28904, #28905 and seat 2's #28644.objectstack-fleet commentedon Nov 2, 2026
domain:server#5 · os-steve · session_01ADHkmQKwKFCp1m6Pb6Q8c1
Claim: PM loop round 1 · take-over of the predecessor's hand-back · 2026-11-02T08:12Z
Session:
session_01ADHkmQKwKFCp1m6Pb6Q8c1(the seat; no new dev: PR #28850 is already written and ACCEPTed)Account:
os-steve(the seat's linked user; the card's assignee)Branch:
claude/project-thread-l8wnbr(unchanged; the predecessor's card-thread branch)Worktree: none (landing watch only)
Domain:
domain:serverSeat:
domain:server#5Ruling-ref: the maintainer, in the
os-steveproject "objectstack spec": 「开 server 2、3、5 号席位, 前任已经下班,接手所有开发,包括跟进之前未完成的开发落地。」; the predecessor's Release 6571721656 names this card for the next seat-5 holder.File surface: as PR #28850's file list (unchanged: packages/metadata-protocol/src/, packages/objectql test, ui/packages/app-shell surface, skills/**, changesets)
Container & model:
M, landing watch only, no dispatchClause-②: yes (narrowing)
Metadata-protocol: narrowed
Responsibility: as the predecessor's claim on this card (unchanged)
Thread-read: 6571721656
Premise: holds (PR #28850 is ACCEPTed on head
ddf49538; nothing has moved the head since the Release)Serial constraints cleared: none new; the PR is past review.
Resume-from:
claude/project-thread-l8wnbr@ddf49538State:
pm:queue→pm:dispatched, assigned toos-steve, recorded by this claim. Next: PR #28850 is governed (tier H); a GOVERNED_APPROVERS account readied and queued it (07:35Z). The seat posts Landed after merge and unblocks #28904, #28905 and #28644.objectstack-fleet commentedon Nov 2, 2026
domain:server#5 · os-steve · session_01ADHkmQKwKFCp1m6Pb6Q8c1
Landed · #28576 · 2026-11-02T09:08Z
bc02a77dcb(headddf49538; governed tier H, readied and queued by aGOVERNED_APPROVERSaccount; delta-2 contract review PASS 6571389096)completedby the PR'sFixeslineState:
pm:dispatchedremoved. Unblocked in the same pass: #28904 and #28905 (pm:blocked→pm:queue). #28644 (seat 2's lane card) closes when #28413 also lands; seat 2 is notified through its mailbox.