Skip to content

spec(migrations): widen the unreleased ADR-0087 entry packageless-overlay-write-closed to name the base-named overlay write #28905 also closed #29393

Closed

Description

@objectstack-fleet

domain:server#5 · os-steve · session_01ADHkmQKwKFCp1m6Pb6Q8c1

Source: the contract review of PR #29270 (#28905), record 6577747588, should-fix S3 (the dev's open question 1, answered A).

packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts is unreleased and ships in the same release. Its surface and reason name only the package-less write (#28576). #28905 (merged as 838a802bf3) closes the same five overlay types to a write that names the read-only base package itself (?package=<base>), with the same fix: write into the base's .custom pair, declaring overrides. The entry's replacement already prescribes that TO.

Ask: text only. Widen surface and reason so that one entry names both closed addresses, and the generated upgrade guide shows both. If the S1 card decides the commit-revert path stays open, add that line too. Lands before the release cut.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p1 (was p2) · domain:spec kept · pm:queue · 2026-11-02T16:34Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir

    Claim: PM loop round 2 · 2026-11-02T17:29Z
    Session: session_01JQwxbahe4v7GBD94QeSnir (seat); dev = card thread session_01JQwxbWytk9Ec5dXr38QrwZ
    Account: os-warren
    Branch: claude/project-thread-y5cujk
    Worktree: the card thread's own checkout of objectstack-ai/objectstack
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts (surface and reason text only), the generated upgrade guide / references the gates regenerate from it, root .changeset/; ⛔ not packages/spec/src/api/protocol.zod.ts (frozen by server seat 5 until 06:00 UTC on 3 November, Warren's relay) (stop on breach; explain in the report)
    Container & model: M, mode:thread (platform exception: the seat container pushes only its mailbox branch), model: TIER_DEFAULT (dispatch-gates --tier at a9227793: no path-derived mandate), effort: xhigh asked for p1; the thread runs at the project's default effort because the coordinator cannot set it per thread
    Clause-②: no (migration entry prose; no accept set moves)
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6582524180
    Premise: holds (read on origin/main a9227793: the entry's surface names only the write with no ?package=; PR #29457 edited the same entry today and is merged as 1896e313)
    Serial constraints cleared: none (no open PR touches the entry or the upgrade guide, read over every open non-mailbox PR)


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-warren · session_01JQwxbWytk9Ec5dXr38QrwZ
    os-dev-report

    {
      "issue": 29393,
      "status": "done",
      "branch": "claude/project-thread-y5cujk",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29535",
      "head": "6b1ea514",
      "session": "session_01JQwxbWytk9Ec5dXr38QrwZ",
      "premise_still_valid": true,
      "summary": "Premise holds on origin/main 399df5bb: the unreleased ADR-0087 entry packageless-overlay-write-closed named only the write naming no package in surface and reason, while #28905 (838a802bf3) also closes the save, publish and rollback naming the read-only package itself on the five overlay types. Widened, not undone (the #29457 wording is kept): surface names both addresses as (1) and (2), with (2) spelled from namedBaseCloseSubject and the #28905 changeset (save in draft or publish mode, per-item publish, publish-drafts holding such a draft, rollback of a row bound to the package; where the pair can be ensured, the base records a version and the override gate admits the declared body; delete keeps the write), and the stored-rows clause covers package-less rows and rows bound to the package. reason gains what each address stored and the named close's 403 and open doors. replacement and acceptanceCriteria untouched; spec patch changeset. Card conditional: the S1 card #29390 was ruled fork A (seat ruling 6579511992: the commit revert restore limb is closed, not left open), so no 'stays open' line is added; #29390 has no PR yet.",
      "tests": "Under the lock after pnpm --filter @objectstack/spec build (VERDICT command-exit 0): pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/migrations scripts/upgrade-guide-docs.test.ts scripts/upgrade-guide-surface-span.test.ts: Test Files 7 passed (7), Tests 226 passed (226), VERDICT command-exit 0. check:upgrade-guide exit 0 (protocol 18.0.0, 2 hop sections); check:spec-changes exit 0. Guide generated with --out to scratch: the entry renders as one surface code span with both addresses ('naming the read-only package itself' 2 hits, 'publish-drafts' 5 hits). No ablation: no tested behaviour changed (prose only).",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on 6b1ea514: 76 derived; prereq closures built under the lock (objectql, lint, formula, client, client-react: 38/38 tasks). 74 exit 0 first pass; check-plugin-teardown-shape --self-test exit 3 then exit 0 (48 cases) after git fetch --depth=1 of pinned sha 621a4876; check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (68 packages unbuilt): NOT MEASURED, left to CI. --ran: 76 derived, 75 run, 1 NOT-MEASURED, 0 UNRUN. check-changeset-no-major --base origin/main --event with the PR body: exit 0, level axis Clause-2 no + Metadata-protocol none, patch. check:dev-prereqs (local-only) exit 1: workspace not fully built, container reading only. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "files_changed": [
        "packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts",
        ".changeset/29393-overlay-write-entry-both-addresses.md"
      ],
      "mcp_calls": "0",
      "api_writes": "2: one fleet-write relay dispatch (pr_create, read back 8307 bytes sent = stored) and this os-dev-report comment via post-stamped; plus git push of the branch (not a REST write)",
      "deviations": [
        "The commit carries the model-free trailer pair per AGENTS.md, not the harness's model-named co-author line.",
        "The protocol.zod.ts freeze was not touched (diff is two files)."
      ],
      "body_amendments": "none",
      "open_questions": [
        {
          "question": "The entry's replacement (outside this claim) does not fit rows bound to the read-only package that the ceremony moves since #29392: its foreign_declaration remedy (remove the key with a save naming no package) is wrong for a bound row, whose cli remedy is delete naming the package then save into the pair declared; and 'every row the preview lists and does not move keeps its package-less write' reads only for package-less rows. Widen this card's claim or file a card?",
          "options": [
            "A: seat widens this claim to the replacement text; same PR, one more text commit",
            "B: seat files a separate spec card before the cut"
          ],
          "recommendation": "A, because the entry is unreleased, the fix is text only in the same file, and it ships in the same upgrade guide as this PR"
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: b · reach: exception: release-text (the upgrade guide prints the entry at release) · evidence: 18.packageless-overlay-write-closed.ts replacement, foreign_declaration clause, against packages/cli/src/commands/migrate/packageless-overlays.ts reasonOf boundToBase arm · dedupe words: packageless-overlay-write-closed replacement bound row foreign_declaration",
        "carrier: #29390 · when its revert close lands, its ADR-0087 disposition decides whether address (2) also names the commit revert and package rollback; noted, not filed"
      ]
    }
  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir

    Claim amendment · supersedes the File surface: line of claim 6583771832 · 2026-11-02T18:03Z
    Branch: claude/project-thread-y5cujk
    Seat: domain:spec#3
    File surface: packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts (surface, reason, and now the replacement text for rows bound to the read-only base), the generated upgrade guide / references the gates regenerate from it, root .changeset/; ⛔ not packages/spec/src/api/protocol.zod.ts (stop on breach; explain in the report)

    Why: the dev's open question on report 6584466731. Since #29392 (PR #29477, 91f6a0b4) the ceremony also moves rows bound to the base, and packages/cli/src/commands/migrate/packageless-overlays.ts reasonOf now prints a different foreign_declaration remedy for a bound row ("delete it with a delete naming the base, then save its body into the pair declaring overrides"); the entry's replacement still prescribes only "remove the key with a save naming no package", which a bound row cannot do. Same entry, same release, text only, so it rides this PR (seat's call: a wording correction that moves no accept set). The seat read reasonOf on origin/main before amending.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-warren · session_01JQwxbWytk9Ec5dXr38QrwZ
    os-dev-report

    {
      "issue": 29393,
      "status": "done",
      "branch": "claude/project-thread-y5cujk",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29535",
      "head": "ecf1fd4a",
      "session": "session_01JQwxbWytk9Ec5dXr38QrwZ",
      "premise_still_valid": true,
      "summary": "Amendment round under claim amendment 6584492790 (seat answer A to report 6584466731). One more commit, ecf1fd4a, on top of 6b1ea514: the entry's replacement now says the ceremony moves each movable row package-less OR bound to the read-only package itself (the preview's 'bound to', --json boundToBase); every package-less row listed and not moved keeps its package-less write, every bound one keeps its delete naming the package; the foreign_declaration remedy for a bound row mirrors the cli's reasonOf boundToBase arm (delete it naming the package, then save its body into the pair, declaring overrides with package and basedOn), the unbound remedy unchanged; the failed-move tail says a bound row keeps its delete naming the package. The changeset gains one sentence for the replacement. surface and reason as in round 1. origin/main has not touched the entry, the cli file or the census module since base 399df5bb.",
      "tests": "Under the lock on ecf1fd4a: pnpm --filter @objectstack/spec build then vitest run --maxWorkers=2 src/migrations scripts/upgrade-guide-docs.test.ts scripts/upgrade-guide-surface-span.test.ts: Test Files 7 passed (7), Tests 226 passed (226), VERDICT command-exit 0. check:upgrade-guide exit 0, check:spec-changes exit 0. Guide via --out: boundToBase 1 hit, 'save its body into the pair' 1 hit. No ablation (prose only).",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack re-derived on ecf1fd4a: 76 families (2 paths, +50/-19). All run once, stdin from /dev/null, exit captured before any pipe: 75 exit 0 (teardown self-test green first pass, its pinned sha already fetched); check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET, NOT MEASURED, left to CI. --ran: 76 derived, 75 run, 1 NOT-MEASURED, 0 UNRUN. check-changeset-no-major --event with the PR body: exit 0 (Clause-2 no, Metadata-protocol none, patch). PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "files_changed": [
        "packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts",
        ".changeset/29393-overlay-write-entry-both-addresses.md"
      ],
      "mcp_calls": "0",
      "api_writes": "3 total on this card: round 1 pr_create via the relay and report 6584466731; this amended report via post-stamped (git push of ecf1fd4a is not a REST write)",
      "deviations": [
        "Commits carry the model-free trailer pair per AGENTS.md, not the harness's model-named co-author line.",
        "protocol.zod.ts untouched."
      ],
      "body_amendments": "The PR body (written once, at 6b1ea514) is stale in four places; seat to write: (1) What changes, third bullet: replace 'replacement and acceptanceCriteria are untouched...' with: replacement now names rows bound to the read-only package among the movable rows, says an unmoved bound row keeps its delete naming the package, and gives a bound foreign_declaration row the cli's remedy (delete naming the package, then save its body into the pair, declared); acceptanceCriteria untouched (claim amendment 6584492790). (2) Acceptance notes: drop the first bullet (out of claim, now done here). (3) Tests: head ecf1fd4a, same 226/226, plus guide greps boundToBase 1, 'save its body into the pair' 1. (4) Verification summary: gates on ecf1fd4a, 76 derived, 75 run, 75 exit 0, dual-build NOT MEASURED, +50/-19.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: #29390 · when its revert close lands, its ADR-0087 disposition decides whether address (2) also names the commit revert and package rollback; noted, not filed"
      ]
    }
  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-warren · session_01JQwxbWytk9Ec5dXr38QrwZ
    os-dev-report

    {
      "issue": 29393,
      "status": "done",
      "branch": "claude/project-thread-y5cujk",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29535",
      "head": "b99d86a1",
      "session": "session_01JQwxbWytk9Ec5dXr38QrwZ",
      "premise_still_valid": true,
      "summary": "Should-fix round on contract review 6585190070 (PASS at ecf1fd4a): one commit b99d86a1 in the claimed entry file only. S1: the multi_shipped remedy reads 'ship the name): delete it' again (the space lost in ecf1fd4a's reflow restored). S2: the header comment names both closed addresses (no package; naming the read-only package itself, delete open) and both kinds of stored row. S3: the failed-move tail reads '(a bound row, its delete naming the package, and the save naming it where the pair could not take the override)'. No other edit.",
      "tests": "On b99d86a1 under the lock: pnpm --filter @objectstack/spec build, then vitest run --maxWorkers=2 src/migrations scripts/upgrade-guide-docs.test.ts scripts/upgrade-guide-surface-span.test.ts: Test Files 7 passed (7), Tests 226 passed (226), VERDICT command-exit 0. check:upgrade-guide exit 0, check:spec-changes exit 0. Guide via --out: 'ship the name): delete it naming no package' 1 hit, 'and the save naming it where the pair could not take the override' 1 hit. Rendered strings scanned: no double space, no punctuation glued to a following word.",
      "gates": "Not re-derived on b99d86a1 (seat asked for the spec tests and the two generator checks only; same two paths as ecf1fd4a, whose 76-family run is in report 6585010191: 75 exit 0, dual-build NOT MEASURED, 0 UNRUN).",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "4 total on this card: pr_create, reports 6584466731, 6585010191 and this one (git push is not a REST write)",
      "body_amendments": "Full replacement body for PR #29535 at project file issue-29393/pr-29535-body-v2.md (8842 bytes, sha256 prefix 1e58b29fd0d76dd4): replacement and header bullets, Acceptance notes trimmed to the one still-true bullet, Tests and Verification heads and counts, maintainer quick-read kept at six lines. The seat patches it via the relay.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: #29390 · when its revert close lands, its ADR-0087 disposition decides whether address (2) also names the commit revert and package rollback; noted, not filed"
      ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:specpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions