Skip to content

docs(adr): amend ADR-0125 to admit a maintainer-approved next snapshot lane beside D1 (#29466 ruling B) #30590

Closed

Description

@objectstack-fleet

domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8

Filing gate ③, a task the maintainer directed: #29466 ruled letter B (ruling 6663894403, maintainer 「29029 29425 29918 30461 29466 同意」 2026-11-05T16:47:09Z). The ruling names two Tier H PRs for domain:devx; this is the first. ⛔ Not a claim.

Ruling-ref: 6663894403

Business reason. App repos wait about a week for a fix (18.3.0 published 2026-11-03, 7 days after 18.2.0; 214 changesets pending on main at b17dbcf2). A daily next snapshot lets an app repo pin a fix the day it lands, while the stable channel and its QA gate stay as they are. ADR-0125 D1 today says the version commit is the only publish, so the lane cannot be built until the ADR admits it.

Reader who acts. The domain:devx seat, one PR touching docs/adr/0125-release-approval-gate-replaces-the-typed-version.md only. The release.yml lane card is blocked on this one.

What the amendment states (bound by the ruling)

  • Stable releases are unchanged: QA sweep, Version Packages PR, maintainer approval at environment: release, publish to latest.
  • A second publish path is admitted: a dispatch-only next snapshot from main, proposed daily.
  • It requires the full battery green at that commit.
  • It runs changeset version --snapshot next in the workspace only and never commits it, then changeset publish --tag next --no-git-tag.
  • It is held at environment: release like the stable publish, so every snapshot stays the maintainer's own act (AGENTS.md Prime Directive 15; D2 and D3 apply to it unchanged).
  • It pushes no tag, creates no GitHub Release, never touches the Version Packages PR, and ⛔ never moves latest.
  • Trial of two weeks; the director reports usage on [Decision] Release cadence: a week of merges is about 1,700 PRs, so each QA-gated release carries a very large delta and app repos wait days to install fixes #29466.

Acceptance

  • An ## Amendment (2026-11-…, #29466) section in ADR-0125 states the lines above and names how D1 and D4 read with it. D1–D6 text is not rewritten.
  • Any gate that reads ADR-0125's decision list (ADR index, counts) stays green.
  • An ADR change needs a complete Fable review before merge (maintainer rule, 2026-10-25). Tier H hand-off after ACCEPT + review PASS.

Dedupe (open AND closed): is:issue "snapshot next release.yml" → 29 hits, is:issue "ADR-0125 snapshot" → 5 hits, is:issue "next snapshot lane" → 523 hits; none but #29466 is about a snapshot lane. Precedent for the next channel: 18.0.0-next.0–5 under pre mode (retired by #26196).

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 kept · domain:devx · 2026-11-05T19:01Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8

    Claim: PM loop round 1
    Session: session_017ihL2ebbZkr2QAEG1x7UC8
    Account: marchtian
    Branch: claude/issue-30590-adr-0125-next-lane
    Worktree: objectstack-issue-30590
    Domain: domain:devx
    Seat: domain:devx#2
    Ruling-ref: 6663894403
    File surface: docs/adr/0125-release-approval-gate-replaces-the-typed-version.md only — one new ## Amendment section admitting the dispatch-only next snapshot lane beside D1, worded to the ruling's bound lines; D1–D6 and the 2026-09-29 amendment are not rewritten. Plus whatever ADR index or count a gate derives from that file, only if a gate requires it. ⛔ No release.yml change (that is #30591, blocked on this card).
    Container & model: M, mode:subagent, model: CONTRACT_REVIEW_TIER, effort: xhigh, reason: maintainer ruling 2026-10-25 「adr 这种任务都需要 fable extra」 (every docs/adr/** card is drafted at Fable xhigh)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — ADR text (Tier H, governed); an independent full Fable review before ACCEPT, then hand-off to os-zhuang + hotlong
    Thread-read: 6666636809
    Premise: holds (ADR-0125 at origin/main 788715ef5c has D1–D6 and one amendment dated 2026-09-29; no snapshot lane admitted; no open PR touches the file).
    Serial constraints cleared: #30591 waits on this card through Blocked-by:; nothing else is in flight on ADR-0125.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
    os-dev-report

    {
      "change": "docs/adr/0125-release-approval-gate-replaces-the-typed-version.md: one new terminal section `## Amendment (2026-11-05, #29466): a maintainer-approved next snapshot lane beside D1` (Status of this amendment · Why · What the ruling binds, eight numbered lines · How D1 to D6 read with it · What the lane must satisfy, requirements on #30591 not workflow text · What stays forbidden · What does not change, with a Not decided here list), plus one `· **Amended** (2026-11-05, #29466 …)` entry appended to the `**Status**:` line in the shape the 2026-09-29 entry set. TL;DR, D1 to D6, the 2026-09-29 amendment, release.yml and docs/adr/README.md are untouched. Draft PR #30719 at head 28c6fc09b8538570dff8e5a10aaa13ee4ffbab3a (branch claude/issue-30590-adr-0125-next-lane, one merge of origin/main 4bf9a2d7ee, label skip-changeset, no reviewers, no assignees).",
      "ruling_lines_mapped": [
        { "ruling_line": "B: stable releases stay as today — the QA sweep, the Version Packages PR, and the maintainer's approval at environment: release, publishing to latest.", "adr_sentence": "What the ruling binds, item 1: 'The stable release is unchanged. The QA sweep, the Version Packages PR, the maintainer's approval at `environment: release` and the publish to the `latest` dist-tag are exactly what D1 (as amended), D2 and D3 describe.'" },
        { "ruling_line": "Added: a maintainer-approved next snapshot from main, proposed daily. It is a dispatch-only lane.", "adr_sentence": "What the ruling binds, item 2: 'A second publish path is added: a `next` snapshot of `main`, maintainer-approved, proposed daily, dispatch-only. The lane runs on `workflow_dispatch` alone … and publishes only after the maintainer approves its `release` deployment.'" },
        { "ruling_line": "It requires the full battery green at that commit.", "adr_sentence": "What the ruling binds, item 3: 'It requires the full battery green at the commit it snapshots. A snapshot of a commit whose full battery is not green is refused before any deployment is queued.'" },
        { "ruling_line": "Runs changeset version --snapshot next in the workspace only (never committed), and runs changeset publish --tag next --no-git-tag.", "adr_sentence": "What the ruling binds, item 4: 'It versions in the workspace only and publishes under `next`. The lane runs `changeset version --snapshot next` against its checkout and never commits what that writes, then `changeset publish --tag next --no-git-tag`.'" },
        { "ruling_line": "It is held at environment: release like the stable publish; every publish stays the maintainer's own act (Prime Directive 15).", "adr_sentence": "What the ruling binds, item 5: 'It is held at `environment: release`, like the stable publish. GitHub holds the whole snapshot job until a required reviewer approves, so every snapshot stays the maintainer's own act (AGENTS.md Prime Directive #15). D2 and D3 apply to it unchanged.'" },
        { "ruling_line": "It pushes no tag, creates no GitHub Release, never touches the Version Packages PR, and never moves latest.", "adr_sentence": "What the ruling binds, item 6: 'It pushes no tag, creates no GitHub Release, never touches the Version Packages PR, and ⛔ never moves `latest`.' The guard sits under What the lane must satisfy as a requirement on #30591: 'Any publish from the snapshot lane that would carry a dist-tag other than `next` fails the job before anything reaches the registry.'" },
        { "ruling_line": "App repos pin next when they need a fix now.", "adr_sentence": "What the ruling binds, item 7: 'App repositories pin `next` when they need a fix now.'" },
        { "ruling_line": "Two-week trial, then the director reports usage on this card.", "adr_sentence": "What the ruling binds, item 8: 'A trial of two weeks, then the director reports usage on #29466. The trial starts at the first snapshot the lane publishes.'" },
        { "ruling_line": "Maintainer question 3: today's release.yml publishes only the version-commit push and the repair dispatch; D1 publishes the version commit only.", "adr_sentence": "How D1 to D6 read with it — D1: 'Before this amendment the version commit was the only publish; now it is the only stable publish — the only path that writes `latest`.' D4: 'a dispatch that does not ask for a snapshot runs exactly as today; `force` … never reaches the snapshot lane.'" }
      ],
      "gates": {
        "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at head 28c6fc09b8 (merge base 4bf9a2d7ee, change set 1 path, +63/-1): 21 commands — 13 matched by path, 8 whole-tree",
        "local_run": "all 21 ran at 28c6fc09b8 with each exit code captured before any pipe. First pass: 20 exit 0; `pnpm --filter @objectstack/lint run check:doc-formula-expressions` exit 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint not built). Built with `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under os-verify-lock.sh (VERDICT command-exit 0, held 77s, waited 0s); rerun exit 0.",
        "reconciliation": "dispatch-gates --ran: 21 derived families accounted for, 21 run, 0 NOT MEASURED, 0 UNRUN (exit 0)",
        "commands_exit_0": ["node scripts/check-adr-links.mjs", "node scripts/check-adr-links.mjs --self-test", "node scripts/check-closing-keyword-parity.mjs", "node scripts/check-closing-keyword-parity.mjs --self-test", "node scripts/check-comment-mask-corpus.mjs", "node scripts/ci/plan-test-core-shards.mjs --self-test", "pnpm --filter @objectstack/lint run check:doc-formula-expressions", "pnpm check:adr-anchors", "pnpm check:adr-index", "pnpm check:adr-symbol-anchors", "pnpm check:ci-filter-parity", "pnpm check:closed-ceremony-text", "pnpm check:cross-package-test-inputs", "pnpm check:doc-authoring", "pnpm check:driver-memory-census", "pnpm check:gitlink-declared", "pnpm check:nul-bytes", "pnpm check:pm-governed-merges", "pnpm check:pm-prior-rulings", "pnpm check:refd-timer-probe", "pnpm check:watch-hint-literal"],
        "adr_index": "node scripts/adr-index.mjs --report: exit 0 — docs/adr/README.md is current, every record parsed, self-test 46 assertions green (the 0125 row keys on the first status keyword, Accepted, so it did not move)",
        "control_characters": "grep -naP over the edited file for the control-byte class: none",
        "scope_1_and_2": "none owed — docs-only diff, no package moved; no pnpm test or typecheck run",
        "ci": "PR check-runs not awaited (os-dev contract); the whole-tree and wide-population families, check-issue-citations (added citations #29466, #30590, #30591, #24528 resolve on the board), Lint & Repo Gates and the rest are read from the PR by the seat"
      },
      "files_changed": ["docs/adr/0125-release-approval-gate-replaces-the-typed-version.md"],
      "deviations": [
        "The Status line was edited in addition to the one new section: the ADR's own convention (its 2026-09-29 entry; Prime Directive 13's amended status line) records each amendment there. The TL;DR is untouched (the 2026-09-29 amendment did not touch it either) and the README index row is unchanged.",
        "No inline pointer callout was added under D1 even though the 2026-09-29 amendment used that shape under D1 and D5: the order asked for one new section and no rewrite of D1 to D6, so how D1 reads now lives in the section and in the Status line only.",
        "One merge of origin/main (4bf9a2d7ee, one commit touching packages/spec and a changeset) was taken before the PR; the branch's delta against origin/main is still the single ADR file, so no rebuild or spec regeneration is owed by this diff. The formula and lint build above served a gate prerequisite only and wrote no tracked file (git status clean).",
        "The relay's own stderr prints the proxy address held in HTTPS_PROXY; two log tails echoed in this session carried that line. Variable named, value not repeated here.",
        "The PR body opens with the two attribution lines the order dictates, the first an HTML comment; every other GitHub-bound line in the PR and in this comment carries no angle-bracket shape."
      ],
      "open_questions": [
        { "question": "The ruling says the full battery must be green at that commit. release.yml's full-battery job reads the newest full-battery run at or before the commit on main's first-parent chain. The amendment keeps the ruling's wording, names that reader, and leaves the choice to the lane's text. Should the ADR fix at versus at-or-before?", "options": ["A: leave as written — #30591's text states which it implements", "B: amend the sentence to at-or-before, matching the existing reader", "C: amend the sentence to exactly that commit, so the lane snapshots the commit the newest green full-battery run tested"], "recommendation": "A — B and C are decisions the ruling did not make; the seat or the maintainer makes it on #30591." },
        { "question": "Should a one-line pointer callout be added under D1 in the 2026-09-29 house shape (Amended 2026-11-05, #29466: the version commit is the only stable publish; see the amendment at the end)?", "options": ["A: no — the order forbade rewriting D1 to D6 and the Status line already points at the section", "B: yes — add it in the review round"], "recommendation": "A unless the reviewer wants the pointer; a one-line follow-up either way." }
      ],
      "mcp_calls": "0 — no MCP GitHub tool was called; all reads were gh api GET and npm view",
      "api_writes": "2 REST write strokes, both through scripts/pm: (1) fleet-write relay dispatch POST /repos/objectstack-ai/objectstack/dispatches (request fw-20261105T230733Z-e7f752, run 42127164440) carrying pr_create — POST /repos/objectstack-ai/objectstack/pulls (draft) then POST /repos/objectstack-ai/objectstack/issues/30719/labels [skip-changeset]; (2) this comment, post-stamped.mjs --comment=30590 — POST /repos/objectstack-ai/objectstack/issues/30590/comments. Plus two git push of claude/issue-30590-adr-0125-next-lane (not REST).",
      "filed_issues": []
    }
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
    os-dev-report

    {
      "round": 2,
      "change": "Delta on PR #30719 after the independent full review (record 6672362721, round 1 FAIL): every finding applied in docs/adr/0125-release-approval-gate-replaces-the-typed-version.md as the seat ruled. New head 8adeb7793ed45ebf6b1537ffd622edf1a6b8f85e (commit 33e9648b6e plus a merge of origin/main ab44ec94b0; lockfile moved, install rerun). Delta vs origin/main: the one file, +69/-1, four hunks — Status line, a callout under D1, a callout under D4, the terminal amendment section; exactly one removed line (the Status line), D1 to D6 text not rewritten. PR body patched through the relay (issue_patch, signed trailer on its last line): relay run 42132357439 concluded success, read-back 9001 bytes sent and 9001 stored, identical, exit 0.",
      "finding_map": [
        { "finding": "M1 must-fix — a first publish moves latest; the guard cannot see it", "adr_sentence": "What the lane must satisfy, 'The guard, and the debut rule': 'the lane never debuts a package: a member of the fixed group with no version on npm is refused before anything publishes, because a package's first publish takes `latest` whatever tag the client sends, and the guard cannot see it — that publish does carry `next`. The stable lane debuts packages. With both, bound line 6's ⛔ is executable: `latest` is written by the stable lane and by nothing else.' Names @objectstack/service-push (18.2.0 in tree, never published). Bound line 6 gloss and 'What stays forbidden' carry the same rule; the Status line gains 'debuting no package'." },
        { "finding": "S1 — exclusivity of the two dispatch uses", "adr_sentence": "'Dispatch-only, and exclusive': 'A dispatch that asks for one runs none of the stable lane's jobs — release-integrity, stale-prompts, the stable full-battery gate and publish read the snapshot input exactly as they read `refresh_version_pr` today, strictly subtractive — and the snapshot job runs on no other dispatch.' The un-sweepable second-prompt hazard (17.4.0 shape) is named in the same bullet; cross-referenced from the D1 and D4 reading paragraphs and the forbidden list." },
        { "finding": "S2 — pre mode collision, channel table, next moving up at a stable publish", "adr_sentence": "'Not during a major's RC cycle': refuses while .changeset/pre.json says mode: pre (ADR-0087 owns next for the RC cycle; changesets refuses --snapshot and publish --tag there); 'the release-channels table in docs/releases-maintenance.md, and ADR-0087's reading of the channel, are consumers #30591 updates'. Bound line 7: 'at each stable publish the stable lane's dist-tag step moves `next` up to the new stable … intended since #25581'. Forbidden list: 'none is cut while .changeset/pre.json says mode: pre'." },
        { "finding": "S3 — at that commit, one reading", "adr_sentence": "Bound line 3: 'It requires the full battery green at that commit. The commit a snapshot is cut from is … the head commit of the newest green full-battery run on `main`'. Requirement 'The commit': reader scripts/ci/scheduled-full-run.mjs --release-gate, 'the lane requires that distance to be zero, so green at that commit holds literally'. The 'read the way the stable lane reads it' sentence is gone." },
        { "finding": "S4 — pointer callouts under D1 and D4", "adr_sentence": "Blockquote '⚠️ Amended 2026-11-05 (#29466, ruling record 6663894403)' appended under D1 (after the 2026-09-29 callout) and under D4, both pointing to the amendment at the end; the decisions' text is unchanged." },
        { "finding": "S5 — mark this record's own readings", "adr_sentence": "Bound line 8: 'Where the trial starts is this record's reading, not the ruling's: at the first snapshot the lane publishes, as the seat's note on #29466 (comment 6664069140) sets the card's restart condition.' D2/D3 paragraph: 'What then becomes of a dispatch-only lane is this record's reading, not the ruling's: it is removed in the same change that reverts D1 …'; the inexact rc.3 / rc.4 comparison is replaced." },
        { "finding": "Observations for #30591 (109 packages; packed manifests; consumed changesets and CHANGELOGs; bare changeset version; job name shape)", "adr_sentence": "Folded into the requirements: 'The dry run' (109 names at this writing, the ruling's 69 is the rc.3 / rc.4 count; changesets does not rewrite workspace ranges, pnpm publish substitutes at pack time, so the dry run reads packed manifests), 'Workspace only' (bare changeset version --snapshot next, never pnpm run version; consumed changeset files and rendered CHANGELOG.md entries stay uncommitted), 'The approval screen' (the name must not match the stable prompt shape release-pending-publish.mjs reads)." }
      ],
      "gates": {
        "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at head 8adeb7793e: 21 commands — 13 matched by path, 8 whole-tree (same 21 families as round 1)",
        "local_run": "all 21 ran at 8adeb7793e with each exit code captured before any pipe; every one exit 0 on the first pass (no prerequisite refusal this round — the formula and lint dist from round 1's lock-held build were present)",
        "reconciliation": "dispatch-gates --ran: 21 derived families accounted for, 21 run, 0 NOT MEASURED, 0 UNRUN (exit 0)",
        "adr_index": "pnpm check:adr-index exit 0 — docs/adr/README.md is current, every record parsed, self-test 46 assertions green",
        "control_characters": "none in the edited file; no arrow shapes",
        "scope_1_and_2": "none owed — docs-only diff",
        "ci": "PR check-runs on 8adeb7793e not awaited (os-dev contract); read from the PR by the seat"
      },
      "files_changed": ["docs/adr/0125-release-approval-gate-replaces-the-typed-version.md"],
      "deviations": [
        "The harness forced two handbacks mid-round (one while the gate sweep ran, one while the patch stroke was in flight); this comment is the round's record of what landed — the sweep and the patch were read back after each wake, never re-dispatched.",
        "The D2/D3 paragraph's inexact 'rc.3 / rc.4 shape' comparison (the review's smaller flag) was reworded although the seat's calls did not list it; no decision changed.",
        "The relay's stderr prints HTTPS_PROXY's value; log tails echoed in session carried that line before masking was added. Variable named, value not repeated."
      ],
      "open_questions": [
        { "question": "The ADR now requires the snapshot commit to be the head of the newest green full-battery run (distance zero). Full-battery runs on main are the 4-hourly schedule runs and the affected-only push runs, so the daily snapshot will usually be a few landings behind main's head. Is that the intended trade for the literal 'at that commit'?", "options": ["A: yes — the snapshot is the battery-tested commit, as ruled; #30591 shows the distance on the approval screen", "B: no — reopen on #30591 with the maintainer"], "recommendation": "A — it is the seat's binding call on S3 and keeps the ruling literal; naming the commit's age on the prompt is #30591's to add." }
      ],
      "mcp_calls": "0 — no MCP GitHub tool was called",
      "api_writes": "2 REST write strokes this round, both through scripts/pm: (1) fleet-write relay dispatch POST /repos/objectstack-ai/objectstack/dispatches (request fw-20261105T234950Z-6eadc6, run 42132357439) carrying issue_patch — PATCH /repos/objectstack-ai/objectstack/issues/30719 (body); (2) this comment, post-stamped.mjs --comment=30590 — POST /repos/objectstack-ai/objectstack/issues/30590/comments. Plus one git push of claude/issue-30590-adr-0125-next-lane (not REST). Round 1's report: comment 6671957724.",
      "filed_issues": []
    }
  7. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8

    Landed · PR #30719 merged as e8a9387ef6 · 2026-11-06T01:14Z. ADR-0125 now carries ## Amendment (2026-11-05, #29466). It admits a maintainer-approved next snapshot lane beside D1 and lists what the lane must satisfy. ACCEPT 6673134607; complete Fable review PASS on round 4 (6672965881). For #30591, the lane itself: the debut rule means its first snapshot waits until @objectstack/service-push has a stable version on npm (note 6672973281). The unblock sweep releases #30591 now that this card is closed. The card closed through Fixes; pm:dispatched comes off in this stroke.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions