Repository navigation
metadata-protocol: over legacy object rows [package-less, Q], a draft save naming no package answers 200 into Q's draft, which no publish can serve: the save door's D9.9 check judges the request's package before the draft address resolves to Q #23712
Description
Found while delivering #23514 (PR #23704), outside its scope.
Filing gate: (a) a reachable defect, measured on a real kernel by #23514's cloud dev (report 6199186382 on #23514, out_of_scope_findings[0], class a). PR #23704's contract review 6199542688 (③) confirmed it, found it predates that PR, and left it to the seat to file. Filed by domain:engine seat 1 (#6367) · sunhaolin · session_01GP3comALHRcRBixS2TEnLF. ⛔ Not a claim. Reader who acts: triage, to grade and route (the producer is in packages/metadata-protocol).
What happens
State. An object whose active rows are [package-less, Q]. The defect #23514 fixes wrote exactly this before PR #23704: a save naming Q of a runtime object the registry holds under the sys_metadata sentinel answered 200 and stored Q's row beside the package-less one. The registry keeps the package-less definition, and Q's row is never served.
Request. A draft save naming no package: PUT /api/v1/meta/object/NAME?mode=draft, which is Studio's designer save.
Answer. 200 "Saved object … (package=com.qa.q, state=draft)". Measured at protocol level on a real ObjectKernel + ObjectQLPlugin with the memory driver.
Why.
saveMetaItem's ADR-0029 D9.9 call asksclassifyObjectContributionwith the request's package, which isnull, so the sentinel owner readsown.- The draft's address is resolved after that, by the draft door (
packagelessDraftAddress/SysMetadataRepository.resolveWriteHead). With one active binding,Q, that address isQ's draft (metadata-protocol: the draft doors naming no package resolve three addresses — the save and read inherit the active binding, the discard reads the draft rows, the publish takes the first draft row a package-agnostic findOne returns #23495, SqlDriver org auto-scope makes SysMetadataRepository.listDrafts blind to env-wide drafts (organization_id IS NULL ∧ injected org = always empty); mode=draft saves drop package_id #11087). - So a draft is written into
Q, a package whose row the registry never serves.
After PR #23704. The draft's publish is refused by the promote door's D9.9 check, OBJECT_OVERLAY_PACKAGE_MISMATCH / 422 with the move text. The failure is therefore loud at publish, but the save itself still answers 200 for a draft that can never go live.
Reach. Only over rows the pre-fix door stored: deployments that hit #23514. On main today (before PR #23704) the same 200 is answered.
Wanted
A draft save naming no package of an object a package-less definition owns is judged at the address its write lands in. The save door then either:
- refuses before writing, with the same code and the way out PR fix(metadata-protocol)!: a save naming a package of an object its package-less definition owns is refused, with a way out into that package (ADR-0029 D9.9) #23704 names for that state; or
- writes the package-less draft the registry would serve.
Which one is the lane's decision, and the PR states it. The Clause-② check applies: a refusal where the door answered 200 is a narrowing.
Pins:
- the legacy rows
[package-less, Q]with a draft save naming no package, on a real kernel, across a boot; - a CONTROL: a draft save naming no package over a package-less owner with no package row is unchanged;
- a negative control that fails when the fix is removed.
Order: after PR #23704 (#23514), which keys the same D9.9 call's prescription by state, and PR #23706 (#23657), which changes the draft door's package-less address. Both are open on the same file today.
Dedupe
The words draft save naming no package addressed to package binding legacy rows sentinel owner D9.9 draft door resolveWriteHead match:
- metadata-protocol: a draft save naming no package, of an item never published into a package whose only draft is bound to package Q, writes a package-unbound draft beside it, while the publish and discard naming none act on Q's (after PR #23654) #23657 (PR fix(metadata-protocol)!: a draft save naming no package, of an item never published into a package, takes the draft doors' address (#23657) #23706): an item never published into a package, whose only draft is bound to
Q. That is a different state, with no active binding; - metadata-protocol: the draft doors naming no package resolve three addresses — the save and read inherit the active binding, the discard reads the draft rows, the publish takes the first draft row a package-agnostic findOne returns #23495, metadata-protocol: a save naming a package beside an existing package-less row of the item mints a second row, and the read naming no package keeps serving the unbound one (S6, reachable through today's doors) #23291, metadata-protocol: two producers still store a second package's active row of an object that a runtime-authored row owns — a draft promoted after the owner's save, and a package-less owner — past ADR-0029 D9.9's save-door refusal (family close-out) #23630, metadata-protocol: a save into a second package of an object a runtime-authored row owns answers 200 while the registry refuses the ownership —
classifyObjectContributionprotects code owners only (ADR-0029 D9.9) #23416 and objectql/metadata-protocol: a save naming a package of a runtime object the registry holds under the sys_metadata sentinel answers 200, but the registry keeps the package-less definition, so the saved row never goes live #23514: closed or carried, and none covers this state.
None is this.
Blocked-by: #23514 line removed 2026-10-15T23:51Z by domain:engine seat 1: #23514 closed (PR #23704, a869ea6362); see the transition comment.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 15, 2026
Triage: first grade ·
bug·priority:p1·target:v18·domain:engine·pm:queue· land after PR #23704 · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-15T18:52ZRead fresh. Over legacy active object rows
[package-less, Q](the state #23514's defect wrote), a draft save naming no package (PUT /api/v1/meta/object/NAME?mode=draft, Studio's designer save) answers200into Q's draft.classifyObjectContributionwith the request's package (nullreadsown) before the draft address resolves to Q.422 OBJECT_OVERLAY_PACKAGE_MISMATCH.Grade p1 +
target:v18: both fixes the card names change a/metasave door's answer.filing-gate.md〈定级判据〉), and the choice is the lane's, stated in the PR.Lane
domain:engine(packages/metadata-protocol).Order: it lands after PR #23704 (#23514, open). Its move text is the refusal's way out.
Scope:
Clause-②judged in the PR (a refusal where it answered 200 is a narrowing).findingleaves on grading.objectstack-fleet commentedon Oct 15, 2026
State ·
domain:engineseat 1 ·sunhaolin·session_01GP3comALHRcRBixS2TEnLF· 2026-10-15T19:37Z:pm:queue→pm:blocked, withBlocked-by: #23514added to the body.Triage 6199836399 orders this card "after PR #23704 (#23514)", because its move text is that refusal's way out. It is also the same region of
packages/metadata-protocol/src/protocol.ts: the D9.9 call insaveMetaItem, which PR #23704 is reworking now (round 4, 6199585504). The hot-file serial rule holds it until that PR lands. When #23514 closes, the unlock scan puts this card back onpm:queue. It is p1, so this seat dispatches it next in the lane.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
State ·
domain:engineseat 1 ·sunhaolin·session_01GP3comALHRcRBixS2TEnLF· 2026-10-15T23:50Z:pm:blocked→pm:queue, and the body'sBlocked-by: #23514line is removed.#23514 closed as completed: PR #23704 merged as
a869ea6362(git merge-base --is-ancestoronorigin/main: exit 0; landed 6204680824). The D9.9 call insaveMetaItemnow carries the state-keyed refusal texts this card reuses as its way out. No otherBlocked-by:line remains on this card. It is p1, so this seat claims and dispatches it next.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 2 · 2026-10-15T23:54Z
Session:
session_01GP3comALHRcRBixS2TEnLF(the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)Account:
sunhaolin(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23712-draft-save-d99-addressWorktree:
objectstack-issue-23712Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface:
packages/metadata-protocol/src/protocol.ts, two regions only:saveMetaItem's ADR-0029 D9.9 object check (asked for a draft save naming no package of the address that save writes), andunboundOwnerPackageRefusal/UnboundOwnerRefusalState(a text arm for a draft cell, only where a measured walk shows an existing arm's steps are false there). Plus real-kernel pins inpackages/objectql/src/(besideprotocol-sentinel-owner-package-save-refusal.test.ts) and one changeset.changeset/23712-*.md. ⛔ NotpackagelessDraftAddress/unboundItemDraftAddress/SysMetadataRepository.resolveWriteHead(the one draft address of #23495 / #23657 stays as it is), not the promote door's D9.9 call, notpackages/spec. Stop on any other breach and explain it in the report.Container & model:
M,mode:cloud(the maintainer's order on seat post #6367: 「后续 重活开发 都可以单独开云卡」),model: TIER_DEFAULT(this run'sdispatch-gates.mjs --tier: "no path-derived mandate"; the build runs at the default tier; the narrowing owes oneCONTRACT_REVIEW_TIERreview before the queue, per the same output)Clause-②: no (narrowing)
Responsibility: the risk is produced by
packages/metadata-protocol'ssaveMetaItem: for a draft save naming no package, its D9.9 check asksclassifyObjectContributionwith the request'snullpackage (the sentinel owner readsown), while the write lands at the draft address, which over active rows[package-less, Q]resolves intoQ| no platform path covers it: PR #23704 resolves the address before D9.9 for a publish-mode save only, and its promote door refuses the draft later, at publish | Studio's designer save (PUT /api/v1/meta/object/NAME?mode=draft) reaches it on any deployment whose rows #23514's defect wrote; it answers200for a draft that no publish can serve (measured by #23514's dev, report 6199186382; confirmed by contract review 6199542688).Thread-read: 6204705662
Serial constraints cleared: the ordered-after PR #23704 (#23514) is on
main(a869ea6362), and PR #23706 (#23657) is onmain(c03077e294). No open PR or claim touchessaveMetaItem's D9.9 call orunboundOwnerPackageRefusal. #23609, if claimed beside this card, works other regions ofprotocol.ts(the legacy-organization read seam); whichever lands second mergesmain.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Dispatch ·
domain:engineseat 1 ·session_01GP3comALHRcRBixS2TEnLF· 2026-10-15T23:57Z:mode:cloud, the dev sessionsession_01VXa74mKHXdwRyYmB3TCuo1, titled "⚡ engine #23712 draft save naming no package: D9.9 asks the draft address". It builds at the default tier on branchclaude/issue-23712-draft-save-d99-address, the claim 6204753931. The seat's review runs atCONTRACT_REVIEW_TIER, because the save door's accept set narrows.422 OBJECT_OVERLAY_PACKAGE_MISMATCH, nothing written. It is the answer PR fix(metadata-protocol)!: a save naming a package of an object its package-less definition owns is refused, with a way out into that package (ADR-0029 D9.9) #23704 already gives the publish-mode save in the same state. The one draft address (metadata-protocol: the draft doors naming no package resolve three addresses — the save and read inherit the active binding, the discard reads the draft rows, the publish takes the first draft row a package-agnostic findOne returns #23495, metadata-protocol: a draft save naming no package, of an item never published into a package whose only draft is bound to package Q, writes a package-unbound draft beside it, while the publish and discard naming none act on Q's (after PR #23654) #23657) does not move. On the four axes:200is silent;{[package-less], [package-less, Q], [package-less, P, Q]}× drafts{none, unbound, Q, unbound + Q}× naming{none, Q};Clause-②: no (narrowing), with one ADR-0087 marker, after PR fix(metadata-protocol)!: a save naming a package of an object its package-less definition owns is refused, with a way out into that package (ADR-0029 D9.9) #23704's changeset shape.Fixes #23712and the matrix in its body, then anos-dev-reportcomment here.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 23712,
"status": "done",
"branch": "claude/issue-23712-draft-save-d99-address",
"pr": "#23769",
"session": "session_01VXa74mKHXdwRyYmB3TCuo1",
"premise_still_valid": true,
"summary": "saveMetaItem's ADR-0029 D9.9 object check now asks, for a draft save naming no package of type object (no source, not package-duplicate), the package of packagelessDraftAddress's
into(an ambiguous address stays the repository's 409); request.packageId is not rewritten and packagelessDraftAddress / unboundItemDraftAddress / resolveWriteHead are untouched. unboundOwnerPackageRefusal gains one arm (mode draft + namedNoPackage) and UnboundOwnerRefusalState one field, strandedDrafts (package drafts stored with no draft bound to no package), plus a state-table doc row: the text names each package row's DELETE ?package=, then each such draft's discard ?state=draft&package=, then the same save. Negative control on main 2906cd8: 5 of the 24 cells answered 200 into a package's draft (H1 rows [pl,Q] x 4 draft states, H2 [pl]+Q draft); after: those 5 plus 3 extra cells ([pl]+P, [pl,Q]+P, [pl,Q]+P+Q) answer 422 and every walk parsed from its own text lands the sent draft in the draft bound to no package, object still served package-less, 2 records, no table dropped, across a boot. H3 confirmed: deleting Q's row leaves Q's draft, so the existing namedNoPackage text is false for the draft save and the draft cell got its own arm. Base is origin/main 2906cd8 (a869ea6 plus one unrelated cli commit). Worker restarted once mid-run (gate runner killed at command 65 of 70); the last 6 were re-run, nothing else was lost.","tests": "HEAD 6cf2237. (1) Pins packages/objectql/src/protocol-sentinel-owner-draft-save-address.test.ts: 8/8 green (6 refused cells walked from their own text across a boot + CONTROL package-less owner draft save 200 unchanged + CONTROL code-package-owned object 403 NOT_OVERRIDABLE unchanged). (2) Ablation via scripts/ablation-replace.mjs, anchor
? draftAddress.intoreplaced by request.packageId with a string-literal marker: mutation landed (blob f602b0e1 -> 47093bf0), ablation-dist-preflight marker present in 2 dist files; result 6 failed | 2 passed (exactly the 6 refusal pins red, both CONTROLs green); restored blob == HEAD, git diff HEAD empty, rebuild then preflight --absent: marker absent from all 24 built files, tree clean. A first attempt used a comment marker that the bundler strips; preflight refused it and no pin run was counted. (3) objectql: new pins + PR #23704's protocol-sentinel-owner-package-save-refusal.test.ts + protocol-runtime-owner-overlay-refusal.test.ts + protocol-adopt-orphans-object-registry.test.ts: 4 files / 33 tests passed. (4) pnpm --filter @objectstack/metadata-protocol test: 236 files passed | 3 skipped; 20577 tests passed | 19 skipped. (5) Draft-door pins: rest meta-draft-head-package-inheritance + meta-draft-read-door-census 30 passed; metadata-protocol sys-metadata-repository.draft-package-inherit + protocol.packageless-save-address 81 passed. (6) typecheck metadata-protocol exit 0, objectql exit 0 (incl. check:test-typecheck OK). (7) Matrix: 36 cells (the 24 dispatched + 12 extra with drafts P and P+Q) measured on main before any edit, then once at HEAD 6cf2237 against the final texts (identical to the earlier post-fix run); the extras' before is the ablated build, which reproduces main byte-for-byte on all 24 base cells.","gates": "dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived at 6cf2237 with no paths: 67 commands; I ran those plus the 3 roster gates marked for my paths (node scripts/check-changeset-fixed.mjs, pnpm check:authz-resolver, pnpm check:error-code-casing), each exit code captured before any pipe: 67 exit 0. NOT MEASURED (prerequisite, not a finding): pnpm check:dual-build-cjs-loads exit 3 (dist/ absent for packages outside this card's build closure); node scripts/check-plugin-teardown-shape.mjs --self-test exit 3 (shallow clone cannot reach its pinned fixture commit); node scripts/check-engine-split-ratio.mjs --days 90 exit 2 (refuses on a shallow clone). The reconciliation counts the last one as run, but it measured nothing. --ran reconciliation (record as
cmd :: exit N): '67 derived, 65 run, 2 NOT-MEASURED, 0 UNRUN' (exit 0). CI check-runs on PR #23769: not yet read, in_progress at report time; the PM reads them.","mcp_calls": "5 — mcp__github__issue_read x3 (get #23712; get_comments #23712; get_comments read-back of this report), mcp__github__list_pull_requests x1 (open PRs), mcp__github__pull_request_read x1 (get_files #23755); no write tool",
"api_writes": "2 relay strokes via scripts/pm/fleet-write/dispatch.mjs, each one POST /repos/objectstack-ai/objectstack/dispatches (204): (1) pr_create executed as POST /repos/objectstack-ai/objectstack/pulls (draft #23769) + POST /repos//issues/23769/assignees (sunhaolin); (2) comment executed as POST /repos//issues/23712/comments (this report). git push x4 (not REST). No label writes: the dispatch names no label and skip-changeset does not apply (the PR carries a changeset).",
"open_questions": [
{
"question": "Deviation from role file rule 1: the shared checkout was already on branch claude/issue-23712-draft-save-d99-address at a869ea6; I detached it (git checkout --detach) and added the worktree ../objectstack-issue-23712 on that existing branch, fast-forwarded to origin/main 2906cd8, rather than
worktree add -bfrom origin/main. No edit was ever made on the shared checkout.","options": [
"A accept as recorded",
"B none needed"
],
"recommendation": "A, because the branch held no commits and the resulting base is origin/main."
},
{
"question": "The D9.9 question is asked of the draft address for every object owner, not only the sentinel (the publish-mode save naming no package already does the same). For a code-package owner it is unreachable today: the package door answers 403 NOT_OVERRIDABLE first, measured with and without the change and pinned as a CONTROL. For a runtime owner bound to a real package R, the address is R's, so the answer is own, unchanged.",
"options": [
"A keep general (one rule with the publish-mode save; the triage scope 'asked of the address the write lands in')",
"B gate the address read on a sentinel owner"
],
"recommendation": "A, on the long-term and anti-AI-error axes: one door rule for both modes, no extra branch, and no measured cell changes for non-sentinel owners."
},
{
"question": "The text's way out discards each package draft (?state=draft&package=X). That draft's content is lost, but no publish could serve it, and the save sent again carries the caller's edit. To keep the work in Q instead, the draft save naming Q answers PR #23704's move text, which walks (matrix rows 18, 20, 22, 24).",
"options": [
"A as shipped",
"B also name the move-into-Q alternative in this text"
],
"recommendation": "A: it fits the 500-character bound (longest 416), and it is what the seat's ruling asked for (a sequence to the package-less draft)."
}
],
"out_of_scope_findings": [
"carrier: #23514's documented state (no new card) · noted, not filed — over legacy active rows [package-less, Q], getMetaItem naming no package serves Q's row ('Gadget com.qa.q legacy') while the registry and data plane serve the package-less one (matrix boots, main and HEAD); every refusal text's first step removes Q's row; in PR Acceptance notes."
],
"files_changed": [
".changeset/23712-draft-save-d99-address.md",
"packages/metadata-protocol/src/protocol.ts",
"packages/objectql/src/protocol-sentinel-owner-draft-save-address.test.ts"
],
"line_budget": "+498 / -2 across 3 files (dispatch-gates: 500 changed lines, under the 3000 human-merge threshold)",
"deviations": [
"worktree created on the pre-existing local branch after detaching the shared checkout (see open_questions[0])",
"3 derived gates NOT MEASURED for shallow-clone/dist prerequisites (see gates)",
"matrix extended from 24 to 36 cells (drafts P and P+Q) to close the class; the extras' before is the ablated build, not main itself",
"PR body carries the harness's attribution lines as prose above the rule plus the role file's session-URL footer"
],
"clause_2": "Clause-②: no (narrowing) — copied at line start into the PR body and the changeset; one ADR-0087 marker (not-required, no-migration-prescription) in the changeset; check-adr-0087-registration --base origin/main exit 0",
"open_prs_touching_protocol_ts": "none of the 13 open PRs at opening; #23755 touches protocol.lock-one-resolution.test.ts only; #23609 has no open PR",
"pr_body_edits_requested": [],
"draft_save_matrix": [
{
"active": "[pl]",
"drafts": "none",
"save_names": "none",
"extra_cell": false,
"before": 200,
"before_source": "main 2906cd8",
"after": 200,
"arm": null,
"text_chars": null,
"steps_walked": null,
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "none",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "move-draft",
"text_chars": 448,
"steps_walked": [
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "unbound",
"save_names": "none",
"extra_cell": false,
"before": 200,
"before_source": "main 2906cd8",
"after": 200,
"arm": null,
"text_chars": null,
"steps_walked": null,
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "unbound",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "move-draft",
"text_chars": 448,
"steps_walked": [
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:-:Draft unbound seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "Q",
"save_names": "none",
"extra_cell": false,
"before": 200,
"before_source": "main 2906cd8",
"after": 422,
"arm": "draft-save-naming-no-package (new)",
"text_chars": 356,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q","state":"draft"} -> 200",
"{"op":"resend"} -> 200"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "Q",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "move-draft",
"text_chars": 448,
"steps_walked": [
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "unbound+Q",
"save_names": "none",
"extra_cell": false,
"before": 200,
"before_source": "main 2906cd8",
"after": 200,
"arm": null,
"text_chars": null,
"steps_walked": null,
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent",
"draft:com.qa.q:Draft com.qa.q seeded"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "unbound+Q",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "move-draft",
"text_chars": 448,
"steps_walked": [
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:-:Draft unbound seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "P",
"save_names": "none",
"extra_cell": true,
"before": 200,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "draft-save-naming-no-package (new)",
"text_chars": 356,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.p","state":"draft"} -> 200",
"{"op":"resend"} -> 200"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "P",
"save_names": "Q",
"extra_cell": true,
"before": 422,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "move-draft",
"text_chars": 448,
"steps_walked": [
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.p:Draft com.qa.p seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "P+Q",
"save_names": "none",
"extra_cell": true,
"before": 409,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 409,
"arm": "409-ambiguity",
"text_chars": 282,
"steps_walked": [
"(after the walk) same draft save -> 409 RESOURCE_CONFLICT"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:com.qa.p:Draft com.qa.p seeded",
"draft:com.qa.q:Draft com.qa.q seeded"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl]",
"drafts": "P+Q",
"save_names": "Q",
"extra_cell": true,
"before": 422,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "move-draft",
"text_chars": 448,
"steps_walked": [
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.p:Draft com.qa.p seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "none",
"save_names": "none",
"extra_cell": false,
"before": 200,
"before_source": "main 2906cd8",
"after": 422,
"arm": "draft-save-naming-no-package (new)",
"text_chars": 324,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"resend"} -> 200"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "none",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "rows-move",
"text_chars": 362,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "unbound",
"save_names": "none",
"extra_cell": false,
"before": 200,
"before_source": "main 2906cd8",
"after": 422,
"arm": "draft-save-naming-no-package (new)",
"text_chars": 324,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"resend"} -> 200"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "unbound",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "rows-move",
"text_chars": 362,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:-:Draft unbound seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "Q",
"save_names": "none",
"extra_cell": false,
"before": 200,
"before_source": "main 2906cd8",
"after": 422,
"arm": "draft-save-naming-no-package (new)",
"text_chars": 380,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete","packageId":"com.qa.q","state":"draft"} -> 200",
"{"op":"resend"} -> 200"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "Q",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "rows-move",
"text_chars": 362,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "unbound+Q",
"save_names": "none",
"extra_cell": false,
"before": 200,
"before_source": "main 2906cd8",
"after": 422,
"arm": "draft-save-naming-no-package (new)",
"text_chars": 324,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"resend"} -> 200"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent",
"draft:com.qa.q:Draft com.qa.q seeded"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "unbound+Q",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "rows-move",
"text_chars": 362,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:-:Draft unbound seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "P",
"save_names": "none",
"extra_cell": true,
"before": 200,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "draft-save-naming-no-package (new)",
"text_chars": 380,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete","packageId":"com.qa.p","state":"draft"} -> 200",
"{"op":"resend"} -> 200"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "P",
"save_names": "Q",
"extra_cell": true,
"before": 422,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "rows-move",
"text_chars": 362,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.p:Draft com.qa.p seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "P+Q",
"save_names": "none",
"extra_cell": true,
"before": 200,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "draft-save-naming-no-package (new)",
"text_chars": 416,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete","packageId":"com.qa.p","state":"draft"} -> 200",
"{"op":"delete","packageId":"com.qa.q","state":"draft"} -> 200",
"{"op":"resend"} -> 200"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"draft:-:Draft sent"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,Q]",
"drafts": "P+Q",
"save_names": "Q",
"extra_cell": true,
"before": 422,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "rows-move",
"text_chars": 362,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.p:Draft com.qa.p seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "none",
"save_names": "none",
"extra_cell": false,
"before": 409,
"before_source": "main 2906cd8",
"after": 409,
"arm": "409-ambiguity",
"text_chars": 282,
"steps_walked": [
"(after the walk) same draft save -> 409 RESOURCE_CONFLICT"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"active:com.qa.p:Gadget com.qa.p legacy",
"active:com.qa.q:Gadget com.qa.q legacy"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "none",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "rows-move",
"text_chars": 400,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.p"} -> 200",
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "unbound",
"save_names": "none",
"extra_cell": false,
"before": 409,
"before_source": "main 2906cd8",
"after": 409,
"arm": "409-ambiguity",
"text_chars": 282,
"steps_walked": [
"(after the walk) same draft save -> 409 RESOURCE_CONFLICT"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"active:com.qa.p:Gadget com.qa.p legacy",
"active:com.qa.q:Gadget com.qa.q legacy",
"draft:-:Draft unbound seeded"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "unbound",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "rows-move",
"text_chars": 400,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.p"} -> 200",
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:-:Draft unbound seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "Q",
"save_names": "none",
"extra_cell": false,
"before": 409,
"before_source": "main 2906cd8",
"after": 409,
"arm": "409-ambiguity",
"text_chars": 282,
"steps_walked": [
"(after the walk) same draft save -> 409 RESOURCE_CONFLICT"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"active:com.qa.p:Gadget com.qa.p legacy",
"active:com.qa.q:Gadget com.qa.q legacy",
"draft:com.qa.q:Draft com.qa.q seeded"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "Q",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "rows-move",
"text_chars": 400,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.p"} -> 200",
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "unbound+Q",
"save_names": "none",
"extra_cell": false,
"before": 409,
"before_source": "main 2906cd8",
"after": 409,
"arm": "409-ambiguity",
"text_chars": 282,
"steps_walked": [
"(after the walk) same draft save -> 409 RESOURCE_CONFLICT"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"active:com.qa.p:Gadget com.qa.p legacy",
"active:com.qa.q:Gadget com.qa.q legacy",
"draft:-:Draft unbound seeded",
"draft:com.qa.q:Draft com.qa.q seeded"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "unbound+Q",
"save_names": "Q",
"extra_cell": false,
"before": 422,
"before_source": "main 2906cd8",
"after": 422,
"arm": "rows-move",
"text_chars": 400,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.p"} -> 200",
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:-:Draft unbound seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "P",
"save_names": "none",
"extra_cell": true,
"before": 409,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 409,
"arm": "409-ambiguity",
"text_chars": 282,
"steps_walked": [
"(after the walk) same draft save -> 409 RESOURCE_CONFLICT"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"active:com.qa.p:Gadget com.qa.p legacy",
"active:com.qa.q:Gadget com.qa.q legacy",
"draft:com.qa.p:Draft com.qa.p seeded"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "P",
"save_names": "Q",
"extra_cell": true,
"before": 422,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "rows-move",
"text_chars": 400,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.p"} -> 200",
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.p:Draft com.qa.p seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "P+Q",
"save_names": "none",
"extra_cell": true,
"before": 409,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 409,
"arm": "409-ambiguity",
"text_chars": 282,
"steps_walked": [
"(after the walk) same draft save -> 409 RESOURCE_CONFLICT"
],
"after_boot": {
"rows": [
"active:-:Gadget unbound",
"active:com.qa.p:Gadget com.qa.p legacy",
"active:com.qa.q:Gadget com.qa.q legacy",
"draft:com.qa.p:Draft com.qa.p seeded",
"draft:com.qa.q:Draft com.qa.q seeded"
],
"owner": "sys_metadata",
"data_plane": "Gadget unbound",
"meta_read": "Gadget unbound",
"records": 2,
"tables_dropped": 0
}
},
{
"active": "[pl,P,Q]",
"drafts": "P+Q",
"save_names": "Q",
"extra_cell": true,
"before": 422,
"before_source": "ablated build (reproduces main on the 24 base cells)",
"after": 422,
"arm": "rows-move",
"text_chars": 400,
"steps_walked": [
"{"op":"delete","packageId":"com.qa.p"} -> 200",
"{"op":"delete","packageId":"com.qa.q"} -> 200",
"{"op":"delete"} -> 200",
"{"op":"save-publish","packageId":"com.qa.q"} -> 200",
"(after the walk) same draft save -> 200"
],
"after_boot": {
"rows": [
"active:com.qa.q:Gadget com.qa.q moved",
"draft:com.qa.p:Draft com.qa.p seeded",
"draft:com.qa.q:Draft sent"
],
"owner": "com.qa.q",
"data_plane": "Gadget com.qa.q moved",
"meta_read": "Gadget com.qa.q moved",
"records": 2,
"tables_dropped": 0
}
}
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → PR #23769 comment 6205855640 ·
domain:engineseat 1 ·session_01GP3comALHRcRBixS2TEnLF· 2026-10-16T01:21Z. The contract review atCONTRACT_REVIEW_TIERis 6205839091, PASS on6cf2237086. The lane's choice is to refuse before writing: the draft save naming no package now asks D9.9 of the draft address it writes. 36 cells were measured, and every refused walk lands package-less.Clause-②: no (narrowing). CI is green. Landing follows through the merge queue.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:engineseat 1 ·session_01GP3comALHRcRBixS2TEnLF· 2026-10-16T01:54Zpr_ready+automerge_enablethrough the fleet-write relay (run 38834755212) after ACCEPT 6205855640 and theCONTRACT_REVIEW_TIERrecord 6205839091 (PASS).14aff678b8's commit time, 2026-10-16T01:24:04Z, is the enqueue. After the merge,git ls-remotelists queue branches only for PRs #23763 and #23771. None is left for PR #23769.origin/main14aff678b8is onorigin/main(git merge-base --is-ancestorexit 0). It is the squash of PR #23769: the same 3 files, +498/−2 (the changeset,packages/metadata-protocol/src/protocol.ts, and the 8-case real-kernel pinprotocol-sentinel-owner-draft-save-address.test.ts). The merge event and this card's close were both at 2026-10-16T01:52:58Z.domain:cli; #23528, #23735, #23634:domain:spec; #23739:domain:devx). None is this lane's. Nothing unexpected.Status: #23712 is closed, and its
pm:dispatchedis removed in this stroke. The cloud dev sessionsession_01VXa74mKHXdwRyYmB3TCuo1is archived. With PR #23704 (#23514) before it, the object save door now judges every save naming no package, publish or draft, at the row it writes.Generated by Claude Code