Skip to content

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

Closed

Description

@objectstack-fleet

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.

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:

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:

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

  1. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade · bug · priority:p1 · target:v18 · domain:engine · pm:queue · land after PR #23704 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-15T18:52Z

    Read 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) answers 200 into Q's draft.

    Grade p1 + target:v18: both fixes the card names change a /meta save door's answer.

    Lane domain:engine (packages/metadata-protocol).

    Order: it lands after PR #23704 (#23514, open). Its move text is the refusal's way out.

    Scope:

    • The D9.9 question is asked of the address the write lands in.
    • Pins:
      • the legacy rows with a draft save naming no package;
      • the chosen answer;
      • CONTROL: a clean single-owner object is unchanged.
    • Clause-② judged in the PR (a refusal where it answered 200 is a narrowing).

    finding leaves on grading.

  2. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    State · domain:engine seat 1 · sunhaolin · session_01GP3comALHRcRBixS2TEnLF · 2026-10-15T19:37Z: pm:queue → pm:blocked, with Blocked-by: #23514 added 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 in saveMetaItem, 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 on pm:queue. It is p1, so this seat dispatches it next in the lane.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    State · domain:engine seat 1 · sunhaolin · session_01GP3comALHRcRBixS2TEnLF · 2026-10-15T23:50Z: pm:blocked → pm:queue, and the body's Blocked-by: #23514 line is removed.

    #23514 closed as completed: PR #23704 merged as a869ea6362 (git merge-base --is-ancestor on origin/main: exit 0; landed 6204680824). The D9.9 call in saveMetaItem now carries the state-keyed refusal texts this card reuses as its way out. No other Blocked-by: line remains on this card. It is p1, so this seat claims and dispatches it next.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    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 as GET /user answers it; always the card's assignee)
    Branch: claude/issue-23712-draft-save-d99-address
    Worktree: objectstack-issue-23712
    Domain: domain:engine
    Seat: 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), and unboundOwnerPackageRefusal / 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 in packages/objectql/src/ (beside protocol-sentinel-owner-package-save-refusal.test.ts) and one changeset .changeset/23712-*.md. ⛔ Not packagelessDraftAddress / unboundItemDraftAddress / SysMetadataRepository.resolveWriteHead (the one draft address of #23495 / #23657 stays as it is), not the promote door's D9.9 call, not packages/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's dispatch-gates.mjs --tier: "no path-derived mandate"; the build runs at the default tier; the narrowing owes one CONTRACT_REVIEW_TIER review before the queue, per the same output)
    Clause-②: no (narrowing)
    Responsibility: the risk is produced by packages/metadata-protocol's saveMetaItem: for a draft save naming no package, its D9.9 check asks classifyObjectContribution with the request's null package (the sentinel owner reads own), while the write lands at the draft address, which over active rows [package-less, Q] resolves into Q | 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 answers 200 for 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 on main (c03077e294). No open PR or claim touches saveMetaItem's D9.9 call or unboundOwnerPackageRefusal. #23609, if claimed beside this card, works other regions of protocol.ts (the legacy-organization read seam); whichever lands second merges main.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch · domain:engine seat 1 · session_01GP3comALHRcRBixS2TEnLF · 2026-10-15T23:57Z: mode:cloud, the dev session session_01VXa74mKHXdwRyYmB3TCuo1, titled "⚡ engine #23712 draft save naming no package: D9.9 asks the draft address". It builds at the default tier on branch claude/issue-23712-draft-save-d99-address, the claim 6204753931. The seat's review runs at CONTRACT_REVIEW_TIER, because the save door's accept set narrows.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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.into replaced 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 -b from 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

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #23769 comment 6205855640 · domain:engine seat 1 · session_01GP3comALHRcRBixS2TEnLF · 2026-10-16T01:21Z. The contract review at CONTRACT_REVIEW_TIER is 6205839091, PASS on 6cf2237086. 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

  8. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:engine seat 1 · session_01GP3comALHRcRBixS2TEnLF · 2026-10-16T01:54Z

    Probe Reading
    Queue Armed with pr_ready + automerge_enable through the fleet-write relay (run 38834755212) after ACCEPT 6205855640 and the CONTRACT_REVIEW_TIER record 6205839091 (PASS). 14aff678b8's commit time, 2026-10-16T01:24:04Z, is the enqueue. After the merge, git ls-remote lists queue branches only for PRs #23763 and #23771. None is left for PR #23769.
    origin/main 14aff678b8 is on origin/main (git merge-base --is-ancestor exit 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 pin protocol-sentinel-owner-draft-save-address.test.ts). The merge event and this card's close were both at 2026-10-16T01:52:58Z.
    Cards closed Since the enqueue, seven cards closed: #23712, this PR's card, and six of other lanes, all assigned elsewhere (#23723, #23714: domain:cli; #23528, #23735, #23634: domain:spec; #23739: domain:devx). None is this lane's. Nothing unexpected.

    Status: #23712 is closed, and its pm:dispatched is removed in this stroke. The cloud dev session session_01VXa74mKHXdwRyYmB3TCuo1 is 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

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions