You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
release(next): 18.0.0-next.2 shipped 11 changesets with no CHANGELOG entry (the version PR merged behind main; #21361's class, in pre mode) #23818
Filing gate: (b) a defect measured at a public door. Found by the os-dev on objectstack-ai/hotcrm#2124 (the hotcrm bump to 18.0.0-next.2, report on that card). Filed by the repo:cloud#1 seat (seat post #6026, session session_01WVbr5J6u8BHh8EyFtcWciH); the seat re-read the evidence below. ⛔ Not a claim.
Dedupe: #21361 is the same class: a Version Packages PR that merges behind main ships changesets with no CHANGELOG entry. It was closed by PR #21373 (7b21af80cb, release.yml plus scripts/release-pending-publish.mjs), and on this cut the guard did not hold. #23282, #23703, #22586 and #23136 are other release-text cards and not this one. #23801 is next.2's Docker failure, a different step.
What is wrong
chore: version packages (next) (#23481, release commit e5136ff10f) was generated from base 4fe8b3def0 and merged at 2026-10-16T02:44Z. Eleven changesets that landed on main in between ship in the 18.0.0-next.2 packages, but no 18.0.0-next.2 CHANGELOG.md entry names them. They are still unconsumed at the root of .changeset/ at e5136ff10f (git ls-tree e5136ff10f .changeset/):
Each one's commit is an ancestor of e5136ff10f. For example, a69a40a572 (objectstack#23610, committed 02:00Z) is.
Reach (public door)
The published @objectstack/spec@18.0.0-next.2 refuses page template full-width, a region its template does not place, and isDefault off a record page (objectstack#23610). On hotcrm, os validate exits 1 on the bump alone: pages.0.template: Page template full-width was removed in @objectstack/spec 18. Yet packages/spec/CHANGELOG.md's 18.0.0-next.2 section at e5136ff10f has 0 lines naming full-width.
The v18 release page tells consumers: "Those changesets become the CHANGELOG.md entries shipped inside each 18.0.0-next.N package, so read the CHANGELOG of every prerelease you move to". A consumer who follows it does not learn about this breaking change, nor about 23634 (a stack datasource default is refused).
Left as is, the 11 entries will appear under the next prerelease's heading, which mis-dates when they shipped.
Done when
The 18.0.0-next.2 release text covers the 11 changesets: corrected in place, or carried by the next cut under a heading that says they shipped in next.2. Which of the two is the release owner's call.
A consumer reading the CHANGELOG is not warned: hotcrm's os validate exits 1 on the bump alone.
Unfixed, every next cut can repeat it.
State: pm:queue.
The claimant also decides how the eleven entries reach readers, as an 18.0.0-next.2 note or in next.3's section, so that they are not silently attributed to the wrong prerelease.
The fix must land before the next Version PR is cut.
Claim: PM loop round 7 · domain:devx seat 2 · 2026-10-16T06:54Z · triage first touch 6209112863 (p1, domain:devx; the claimant decides how the 11 entries reach readers)
Session: session_016PVjjuVPte5XEJvaQx1E4t
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-23818-version-pr-behind-main
Worktree: objectstack-issue-23818
Domain: domain:devx
Seat: domain:devx#2
File surface: scripts/release-pending-publish.mjs and its tests; .github/workflows/release.yml (governed: a hit makes the PR Tier H); a new guard script under scripts/ with its test, if the dev measures that as the better home; the 11 unconsumed .changeset/*.md named on the card (text only, for the "shipped in next.2" route); packages/*/CHANGELOG.md and .changeset/pre.json only if the in-place route is chosen at review. Stop on breach and explain it in the report. ⛔ No push to changeset-release/main. ⛔ No release act.
Container & model: M, mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier: "no path-derived mandate")
Clause-②: no
Responsibility: release.yml's version-pr job, which cuts the Version Packages PR from a base that main can pass before the merge (#21373's guard misses it in pre mode) | none: #21373 covers another shape | every prerelease consumer reading CHANGELOG.md; today 18.0.0-next.2's 11 entries, including the BREAKING #23610 refusal
Thread-read: 6209112863
Serial constraints cleared:
No open PR touches release.yml, scripts/release-pending-publish.mjs or .changeset/pre.json. All open PRs' file lists were read at this act.
Nothing is in flight in either seat this session holds.
Maintainer ruling: the 11 next.2 entries take the simplest route · domain:devx seat 2 · session_016PVjjuVPte5XEJvaQx1E4t · 2026-10-16T07:01Z
The dispatch (claim 6209900371) asked the dev to measure two routes for recording the 11 changesets that shipped in 18.0.0-next.2 unlisted, and to recommend one. The maintainer ruled in the seat 2 session, verbatim:
那 11 条怎么补记, 怎么简单怎么处理
("For the 11 entries, take whichever way is simplest.")
The seat has relayed this to the running dev as follows:
Route B is dropped: no in-place CHANGELOG.md edits and no pre.json surgery.
Route A it is: one lead line in each of the 11 changeset bodies saying the change already shipped in 18.0.0-next.2. Each frontmatter (package names, bump types) stays as it is. The next Version Packages PR then lists the 11 under next.3, each carrying that note.
The dev may take a still simpler form that marks the same 11 as shipped in next.2, such as one shared note, if it says in the PR body why it is simpler.
The rest of the dispatch is unchanged: the root cause of the guard miss, the guard itself, and the instruction for #23825 in the PR body.
os-dev-report
{
"issue": 23818,
"status": "blocked",
"branch": "claude/issue-23818-version-pr-behind-main",
"pr": "#23833",
"session": "session_016PVjjuVPte5XEJvaQx1E4t",
"premise_still_valid": true,
"summary": "Blocked on one thing only the PM can decide: extending the claim surface to lint.yml for the single wiring step that makes the guard refuse. Delivered: (1) release-pending-publish.mjs queue-guard, a merge-queue guard that finds each version commit in merge_group base..head and refuses (exit 1) when the unconsumed changeset set is non-empty there, with 6 new self-test batteries; (2) route A per the maintainer ruling 「那 11 条怎么补记, 怎么简单怎么处理」: one lead line in each of the 11 changesets, frontmatter byte-unchanged. Root cause, which partly falsifies PM assumption 3: #21373 did not miss the measurement. Run 38841989023 warned about all 11 (11 changeset(s) from 10 commit(s)), and pre mode played no part, because v3 moves consumed changesets into .changeset/pre/. Its contract is post-landing and warn-only, and nothing judges the tree that lands before it lands. A scheduled refresh gets no pull_request build (d5c44f8: 0 check runs); a dispatched one does (958e5b0: 45), but against its own base. Only the merge_group build sees the landing tree. The guard cannot be wired in release.yml, the only workflow on the surface: release.yml has no merge_group trigger and no required context, so a check there would be advisory. The required contexts live in lint.yml, ci.yml and governed-surface-guard.yml. So I stopped at the breach. The exact step is in the PR body (lint.yml lane Lint · CI, release & engine gates); adding it makes the PR Tier H. Today the PR is ungoverned (0 of 12 paths). #23825: hold it; refresh it once (refresh_version_pr: true) after this PR lands; then queue it with nothing changeset-bearing ahead.",
"tests": "Self-test node scripts/release-pending-publish.mjs --self-test on final head 1115d43: ✓ release-pending-publish self-test: 111 cases across 28 batteries pass. (was 22 batteries; floor raised to 28). Ablation via scripts/ablation-replace.mjs with a trap: anchor : versionCommits.some((vc) => vc.report.unconsumed.length > 0) hit 1 -> 0, blob 2e8e5f5b66b0 -> 00055b997b2a. Result: ✗ release-pending-publish self-test: 5 failure(s) across 28 batteries. (behind verdict, refusal report, CLI exit 1, mid-batch, non-pre), ABLATION_EXIT=1. Restore: blob == HEAD 2e8e5f5b66b0 and git diff HEAD empty. No build or dist is involved (plain node script). Miss reproduced as a control in the self-test: the post-landing unconsumed report on the same next.2-shaped fixture names the same 3 changesets and only emits a ::warning::. Real history, full-history clone (is-shallow false), read-only: #23481 queue build, base 8684079, head e5136ff: EXIT=1, 11 changesets from 10 commits (the card list). #23825 squashed onto main 1ecb08a (local merge-tree squash 0f5edbbbbd): EXIT=1, refusing 23731-activity-changed-fields (#23814) and 23808-type-descriptions-plain (#23817). #23825 against its own base f606ba2: EXIT=0, current. A locally rendered next.3 cut of this branch (c078e7c25a on 15f51d1): EXIT=0, current. Ordinary landing 5b6c257..1ecb08a: EXIT=0, no version commit. Premise legs: each add commit vs e5136ff merge-base --is-ancestor exit 0; vs base 4fe8b3d exit 1; control root -> 4fe8b3d exit 0. 0 of 11 under .changeset/pre/; 0 add-commit hashes in any next.2 CHANGELOG section; spec next.2 section (763 lines) has 0 lines naming full-width. Route A render (changeset version in a throwaway clone, never pushed): the lead line is the first line of 19 next.3 entries across 12 packages, with the original hashes (e.g. - a69a40a: **Shipped in 18.0.0-next.2**, ...). breakingDeclaration is unchanged on all 11; the 4 breaking ones lose only bang and keep BREAKING and/or the narrowing arm. eslint --no-inline-config on the script: exit 0.",
"gates": "Local, final head 1115d43: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 41 families (identical to the derivation at 15f51d1). Each was run with its exit code captured before any pipe: 40 exit 0, including release-pending-publish --self-test, check-adr-0087-registration --base, check-self-test-wired, check:nul-bytes, check:published-files, check:changeset-gate-self-tests, and pnpm check:pm-dispatch-gates (nohup + tail --pid, BATTERY_EXIT=0, fast tier 1884 cases, 206.5s). 1 exits 1 as expected: node scripts/check-empty-changeset.mjs --base origin/main, the foreign-changeset rule refusing the 11 M rows (DELIBERATE CORRECTION class; confirmation written in the PR body citing the ruling; its CI home Check Changeset is not a required context). --ran: ✓ dispatch-gates --ran: 41 derived famil(ies) accounted for — 41 run, 0 NOT-MEASURED. check-governed-merges --branch: 0 of 12 path(s) hit the register, NOT governed (no tier yet; Tier H once the lint.yml step is added). PR check-runs at report time on 1115d43: success: Auto Label, Check Documentation Links, Check PR Size, filter, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, The card this PR closes must claim this branch. skipped by selector: Build Core, Build Docs, Console Pin Gate, Dogfood Verify CLI, Temporal Conformance, Packed-tarball smoke. in_progress: Check Changeset (expected red), Governed Surface Queue Guard, all Lint · lanes, all Type Check · lanes, Test Core 1-6, Dogfood Regression Gate. Not waited on, per contract.",
"mcp_calls": "0",
"api_writes": "2 seat-side REST writes, both POST /repos/objectstack-ai/objectstack/dispatches through scripts/pm/with-fleet.sh --via dispatch. Stroke 1 (run 38868061510): pr_create, executed as objectstack-fleet[bot] as POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos//issues/23833/assignees [os-sales]. Read-back: 14471 bytes sent, 14471 stored. Stroke 2: comment, executed as POST /repos//issues/23818/comments (this report). Plus git push of the branch: the empty probe, then 3 commits. No label writes, no PR body PATCH.",
"open_questions": [
{
"question": "Extend the claim surface so the guard can be wired? It refuses only as a step inside a required merge_group context, and release.yml cannot host one.",
"options": [
"A: add the one step (text in the PR body) to lint.yml's Lint · CI, release & engine gates lane. Required via Lint & Repo Gates; fetch-depth 0 already; it already runs this script's self-test; the lane verdict reads toJSON(steps), so no roster edit. Cost: PR becomes Tier H; one patch round.",
"B: add it to governed-surface-guard.yml (Governed Surface Queue Guard, required, fetch-depth 0, no collector). Cost: Tier H, and it mixes a release concern into the governed-surface guard whose header says the script is its single authority.",
"C: leave it unwired. The post-landing ::warning:: stays the only reader, and the card's second Done-when stays unmet."
],
"recommendation": "A, because the release-path instruments and this script's self-test already live in that lane, and the step is evaluated on the merge-queue build, which is the one point that sees the landing tree and that merging at the wrong moment cannot bypass."
},
{
"question": "Land route A ahead of the guard to unblock next.3?",
"options": [
"A: keep one PR. next.3 waits for the wiring round, then #23825 is refreshed once.",
"B: split commit 15f51d1 (11 lead lines, ungoverned) into its own PR now; the guard PR follows as Tier H."
],
"recommendation": "A unless next.3 is wanted today; the halves are independent, so B costs one extra PR and nothing else."
}
],
"out_of_scope_findings": [
"carrier: none · noted in PR Acceptance notes, not filed · check-adr-0087-registration's pass line counts the 4 inherited-breaking changesets among 11 non-breaking changeset(s) seen (misleading summary wording only; the verdict is right).",
"carrier: none · noted, not filed · the same inheritance exemption means a PR editing an already-breaking changeset is not re-asked for its ADR-0087 disposition, so deleting the marker would pass (read off the code, not exercised).",
"carrier: this card's wiring round · noted, not filed · unconsumed's post-landing warning prescribes 'Name them in the VERSION release notes'; for a prerelease the effective fix is a changeset edit. It becomes the bypass-only backstop once the queue guard is wired."
],
"files_changed": [
"scripts/release-pending-publish.mjs",
".changeset/23528-exposure-refusal-code.md",
".changeset/23609-legacy-org-read-seam.md",
".changeset/23610-page-isdefault-template-slots.md",
".changeset/23634-stack-datasource-default-refused.md",
".changeset/23712-draft-save-d99-address.md",
".changeset/23714-unique-violation-arm-relay.md",
".changeset/23723-sandbox-unreadable-rejection.md",
".changeset/23732-attachment-readable-ids.md",
".changeset/23735-reference-deleted-when.md",
".changeset/23740-form-section-columns-no-default.md",
".changeset/console-daeb77fc84dd.md"
],
"changed_lines": "369 (+367 / -2) over 12 files at 1115d43, per GET pulls/23833. The PR body's gates section says 366: that was the reading at 15f51d1, before the header-correction commit added 3 lines. Seat fix if wanted: replace 0 of 12 paths governed; 366 changed lines. with 0 of 12 paths governed; 369 changed lines. (no PATCH sent by me).",
"deviations": [
"Surface breach avoided, not taken: the wiring step needs lint.yml (outside the claim); stopped and explained per the dispatch.",
"Check Changeset will be red by design (foreign-changeset rule, DELIBERATE CORRECTION class). No skip-changeset; confirmation written in the PR body citing the ruling.",
"The commit trailers use the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude); the harness reminder asked for a model-named Co-Authored-By, which the pre-push hook refuses. The PR footer uses the AGENTS.md session-URL form, not the reminder's form.",
"The mechanism-assumption-3 framing ('why the guard did not catch this cut in pre mode') was falsified: the guard measured correctly and pre mode played no part. The root cause is post-landing and warn-only.",
"One --ran call first died MODULE_NOT_FOUND (cwd slip); rerun with an absolute path, not counted as a measurement.",
"Throwaway clone render worktree removed with --force (scratch clone holding a node_modules symlink and a local never-pushed commit); the task worktree itself was removed without --force after node_modules."
]
}
Claim: PM loop round 7, file surface revised for a patch round · domain:devx seat 2 · 2026-10-16T07:40Z · supersedes 6209900371; the dev's report 6210532819 stopped at a surface breach, and the seat takes its recommendation
Session: session_016PVjjuVPte5XEJvaQx1E4t
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-23818-version-pr-behind-main (#23833, the guard; it closes this card)
Worktree: objectstack-issue-23818
Domain: domain:devx
Seat: domain:devx#2
File surface: scripts/release-pending-publish.mjs and its self-test (round 1, accepted); .github/workflows/lint.yml, one step in the Lint · CI, release & engine gates lane (lint-ci-engine) that runs queue-guard on the merge-queue build (governed: #23833 becomes Tier H); the 11 unconsumed .changeset/*.md named on this card, text only (route A, per the maintainer's ruling 6209999534), split onto a second branch claude/issue-23818-changeset-lead-lines as a Part of #23818 PR that lands ahead of the guard. Dropped from round 1's surface: .github/workflows/release.yml, packages/*/CHANGELOG.md, .changeset/pre.json. Stop on breach and explain it in the report. ⛔ No push to changeset-release/main. ⛔ No release act.
Container & model: M, mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier: "no path-derived mandate")
Clause-②: no
Responsibility: the merge queue landing a Version Packages PR whose version commit did not consume every changeset in its tree; #21373's report sees it only after landing and only warns | none: #21373 covers the post-landing report | every prerelease consumer reading CHANGELOG.md; today 18.0.0-next.2's 11 entries, and #23825 if merged as cut
Thread-read: 6210532819
Serial constraints cleared:
No other open PR touches scripts/release-pending-publish.mjs or any of the 11 changesets. The file lists of all 14 open PRs were read at this act. Version Packages PR chore: version packages (next) #23825's first 100 files name none of the 11.
Nothing else is in flight in either seat this session holds.
os-dev-report
{
"issue": 23818,
"status": "done",
"branch": "claude/issue-23818-version-pr-behind-main",
"pr": "#23833",
"split_pr": "#23835",
"split_branch": "claude/issue-23818-changeset-lead-lines",
"session": "session_016PVjjuVPte5XEJvaQx1E4t",
"premise_still_valid": true,
"summary": "Patch round done, in the order asked. (1) SPLIT: #23835 (draft, assignee os-sales) on claude/issue-23818-changeset-lead-lines from origin/main 43567a8. Its head af52476 is a cherry-pick of 15f51d1, git patch-id --stable identical (36811cbc07). The body opens Part of #23818 with no closing keyword, cites ruling 6209999534 verbatim, and gives the deliberate-correction confirmation for Check Changeset. It is ungoverned (0 of 11 paths), 22 lines. (2) WIRE on #23833: one step in lint-ci-engine, right after Release version-commit selection self-test (lint.yml hunk @@ -3330,0 +3331,22, about 700 lines from #23824's @@ -4057). It has an id, continue-on-error: true and a rationale comment, and runs queue-guard --event \"$OS_GATE_EVENT_NAME\" --base \"$OS_GATE_MERGE_GROUP_BASE_SHA\" --head \"$OS_GATE_MERGE_GROUP_HEAD_SHA\" from github.event_name and github.event.merge_group.base_sha/head_sha. The script now refuses a merge_group build without a full head sha too, so the head is never read off the checkout. Proofs (a), (b) and (c) were shown with output. For (d), the parsed fetch-depth: 0 plus the guard's shallow refusal stand; the live checkout log is NOT MEASURED (blob 403). The live pull_request run 38869800551 ran step #16 green and the lane verdict passed. A merge of main after #23835 lands was measured clean: merge-tree exit 0, and only lint.yml (+22) and the script (+359/-2) remain. (3) Replacement body for #23833 written, not PATCHed: path /tmp/claude-0/-home-user/e9108b9f-1d0a-5c33-aac9-35f3a54b498d/scratchpad/issue-23818/pr-23833-body.md, sha256 7f770eb56bab55dc173e14f4bed18715c90cd3ab292426bce45296a703d74c43, 17389 bytes. It is Tier H, carries the 维护者速读 section with the seat-opinion line empty, the wiring step and its proofs, the split, and the corrected changed-line count (405 now, 383 after the main merge). (4) The throwaway clone, actionlint download and both worktrees are removed.",
"tests": "node scripts/release-pending-publish.mjs --self-test at 31e38ea: ✓ release-pending-publish self-test: 113 cases across 28 batteries pass. (+2 cases: an empty or ref-name merge_group head is refused, including via the CLI). It went red first on a malformed new check (throws() with no pattern) and was fixed before the commit. (a) The real scripts/ci/lane-verdict.mjs (GITHUB_JOB=lint-ci-engine) on the edited lint.yml reads a roster of 67 steps / 60 gates, with the new step at position 15, gate=true, id set, no if:. All-green context: exit 0, OK -- 60 gate(s): 60 passed. New step outcome failure with conclusion success: exit 1, RED Version Packages PR lands no changeset behind main -- outcome failure, 59 passed, 1 red. New step absent from context: exit 1, UNREAD ... 1 unread. No roster edit is needed. (b) The literal run: line from the parsed workflow, with empty merge_group fields: pull_request, push, schedule and workflow_dispatch each exit 0 with Version-PR queue guard: event pull_request is not a merge-queue build, and only a merge_group build lands a commit on main, so there is nothing to judge here. Live: run 38869800551 (pull_request, 31e38ea), step #16Version Packages PR lands no changeset behind main = success, Lane verdict = success. (c) Parsed env: OS_GATE_MERGE_GROUP_BASE_SHA=${{ github.event.merge_group.base_sha }} and OS_GATE_MERGE_GROUP_HEAD_SHA=${{ github.event.merge_group.head_sha }}. The same run: line in a full-history clone of 31e38ea: #23481 base 8684079.. head e5136ff.. exit 1, 11 changesets; ordinary landing 43567a8..0cfd0c4 exit 0, no version commit; empty head exit 1 needs --head ... (got \"\"); head HEAD exit 1; empty base exit 1; short base 8684079 exit 1. (d) The lane checkout parses as actions/checkout@v7 with {"fetch-depth":0}; the guard refuses a shallow clone, so a shallow lane goes red, never green. Live checkout log for merge_group run 38868950353 job 116868229076: NOT MEASURED, the log blob answers 403 from this container. Merge simulation: #23835 squashed onto main 0cfd0c4 (local 7bf1f2e715, never pushed), then git merge-tree --write-tree 31e38ea07 7bf1f2e715 exit 0, no conflicts. The diff from simulated main is 2 files: lint.yml +22, the script +359/-2. Workflow lint: actionlint 1.7.7 (release tarball, sha256 023070a287cd8cccd71515fedc843f1985bf96c436b7effaecce67290e7e0757, equal to its published checksums) exit 0 with 0 findings on edited lint.yml, and 0 on the base version; shellcheck absent, so its run-script pass was skipped. check:workflow-status-functions exit 0; check:workflow-step-name-quoting exit 0. eslint --no-inline-config on the script exit 0.",
"gates": "Guard branch, final head 31e38ea: dispatch-gates --commands --repo objectstack-ai/objectstack derived 68 families (41 + 27 from lint.yml). Each was run with its exit code captured before any pipe. 67 exit 0, including check-aggregator-roster, check-step-collectors, check:required-contexts, check:select-gate-families, check-self-test-wired, check-self-test-workflow-commands, check:workflow-status-functions, check:workflow-step-name-quoting, check:type-check-coverage, check:type-check-debt (--re-measure under the verify lock, 294.5s, none above its recorded number), check:pm-governed-merges and pnpm check:pm-dispatch-gates (pid 23155, BATTERY_EXIT=0, 1884 cases, 168.4s). 1 exit 1 as expected: check-empty-changeset --base origin/main, the 11 M rows this branch carries until #23835 lands and main is merged. --ran: 68 derived famil(ies) accounted for — 68 run, 0 NOT-MEASURED. check-governed-merges --branch: 1 of 13 governed (.github/workflows/lint.yml), landing tier H, 405 changed lines (+403/-2). Split branch, head af52476: 20 families derived; 19 exit 0; 1 exit 1 as expected (check-empty-changeset --base, the 11 M rows, DELIBERATE CORRECTION). --ran: 20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED. Not governed (0 of 11), 22 lines. PR check-runs at report time: #23833 @31e38ea077: 31 success, 7 skipped, 1 failure = Check Changeset (expected); Lint · CI, release & engine gates = success; Governed Surface Queue Guard = success. #23835 @af52476f35: 25 success, 8 skipped, 1 failure = Check Changeset (expected); Lint · CI, release & engine gates = success; Governed Surface Queue Guard = success.",
"mcp_calls": "0",
"api_writes": "2 seat-side REST writes, both POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/with-fleet.sh --via dispatch. Stroke 1 (run 38869418115): pr_create for #23835, executed as objectstack-fleet[bot] as POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos//issues/23835/assignees [os-sales]. Read-back: 5293 bytes sent, 5293 stored. Stroke 2: comment, executed as POST /repos//issues/23818/comments (this report). git push: the split branch (empty probe + 1 commit) and the guard branch (1 commit, 31e38ea). No label, reviewer or PR-body writes. Round 1's writes are in comment 6210532819.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: seat (decides at landing, per its record 6210600098) · noted in #23833 Acceptance notes, not filed · check-adr-0087-registration's pass line counts 4 inherited-breaking changesets among 11 non-breaking changeset(s) seen.",
"carrier: seat (same record) · noted, not filed · the inheritance exemption lets an edit of an already-breaking changeset drop its ADR-0087 marker unasked (read off the code, not exercised)."
],
"files_changed": [
"scripts/release-pending-publish.mjs",
".github/workflows/lint.yml",
".changeset/23528-exposure-refusal-code.md (and the other 10 of the 11, on both branches until #23835 lands and main is merged)"
],
"changed_lines": "#23833 at 31e38ea: 405 (+403 / -2) over 13 files; after #23835 lands and main is merged (measured by merge-tree): 383 (+381 / -2) over 2 files. #23835 at af52476: 22 (+22 / -0) over 11 files.",
"pr_body_replacement": {
"pr": 23833,
"path": "/tmp/claude-0/-home-user/e9108b9f-1d0a-5c33-aac9-35f3a54b498d/scratchpad/issue-23818/pr-23833-body.md",
"sha256": "7f770eb56bab55dc173e14f4bed18715c90cd3ab292426bce45296a703d74c43",
"bytes": 17389,
"note": "Not PATCHed by me (os-dev.md:64). Scanned: no less-than character, no control byte, no model identifier. The only closing keyword is line 1 Fixes #23818."
},
"deviations": [
"(d) is proved from the parsed workflow and the guard's fail-closed shallow refusal. The live merge_group checkout log is NOT MEASURED (job-log blob 403 from this container, as in round 1).",
"actionlint is not in the repo. I downloaded the pinned 1.7.7 release tarball into an isolated scratch dir, verified its sha256 against the published checksums, ran it, and deleted it. shellcheck is absent, so actionlint skipped run: script analysis. A copy of the base lint.yml was placed briefly under .github/workflows/ for actionlint and removed in the same command (worktree status clean before commit).",
"The 600s tool ceiling moved the 67-gate loop to the background. I kept the round alive, read its result files in-turn, and it finished with exit 0 (type-check-debt alone took 298s under the verify lock); no result was taken from a notification.",
"Beyond the one lint.yml step: the script now refuses a merge_group build with no full head sha. This is in the claimed surface, so that (c) holds for the head as well as the base.",
"Commit trailers use the AGENTS.md model-free pair, and PR footers the AGENTS.md session-URL form, not the harness reminder's forms."
]
}
Claim: PM loop round 7, file surface revised for a redesign round · domain:devx seat 2 · 2026-10-16T08:23Z · supersedes 6210589327; the guard's refusal is withdrawn (6211287288 on #23833), per the maintainer's question 「23833 做的对吗?发版本的时候 main 上的队列就是不停在合并的」
Session: session_016PVjjuVPte5XEJvaQx1E4t
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-23818-version-pr-behind-main (#23833; it closes this card)
Worktree: objectstack-issue-23818
Domain: domain:devx
Seat: domain:devx#2
File surface: scripts/release-pending-publish.mjs and its self-test (the queue-guard mode is replaced by an annotate step that never refuses); the root package.jsonversion script, only to run that step ahead of changeset version; .github/workflows/lint.yml only to restore it byte-identical to origin/main (the added step is dropped, so #23833 leaves Tier H); the 11 changesets stay on #23835 (Part of #23818, in the queue). Stop on breach and explain it in the report. ⛔ No .github/workflows/** edit beyond that restore. ⛔ No push to changeset-release/main. ⛔ No release act.
Container & model: M, mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier: "no path-derived mandate")
Clause-②: no
Responsibility: the Version Packages PR landing behind main, which the busy queue makes the normal case: 77 of 111 landings in 24 h carried a changeset | none: #21373's report sees it only after landing and only warns | every prerelease consumer reading CHANGELOG.md
Thread-read: 6211139752
Serial constraints cleared:
os-dev-report
{
"issue": 23818,
"status": "done",
"branch": "claude/issue-23818-version-pr-behind-main",
"pr": "#23833",
"split_pr": "#23835 (landed as 3c080a6)",
"session": "session_016PVjjuVPte5XEJvaQx1E4t",
"premise_still_valid": true,
"summary": "Redesign round done: automate route A, never refuse. release-pending-publish.mjs annotate-shipped finds the last version commit (select's definition) and the changesets left unconsumed in its tree, via the new tree-only pendingChangesetsAt, which unconsumed now shares. It prepends to each one still pending: **Shipped in VERSION**, whose CHANGELOG missed this entry; listed here one prerelease late. ("release" when VERSION has no prerelease tag; no card number). The frontmatter is byte-unchanged. A body already led by **Shipped in is left as it is, so #23835's 11 lines are not doubled. It annotates only when VERSION is on npm. It warns and writes nothing on anything it cannot decide, and exits 0 on every path. A shallow clone deepens itself with git fetch --no-tags --deepen=N origin HEAD-SHA, N = 100..1600, stopping early when a round gains nothing. The root version script runs it first, joined with ;, so every pnpm run version caller gets it with no workflow edit. queue-guard, its batteries and the lint.yml step are removed; lint.yml has no diff against origin/main. Once #23835 landed I merged origin/main (no history rewrite): #23833 is now 2 files, ungoverned (0 of 2 paths), 529 lines. Replacement body written, not PATCHed: /tmp/claude-0/-home-user/e9108b9f-1d0a-5c33-aac9-35f3a54b498d/scratchpad/issue-23818/pr-23833-body-v3.md, sha256 2930ef81b827f00f08443abf936e9d0db83036a2e73031800b66b2dfab413911. Seat action needed: Check Changeset is red only because the PR adds no changeset. Root package.json is private and scripts/ ships in no package, so skip-changeset is the right label (no label writes by me).",
"tests": "node scripts/release-pending-publish.mjs --self-test: ✓ release-pending-publish self-test: 112 cases across 28 batteries pass. Six annotate batteries replace the six queue-guard ones: next.2 shape (byte-exact, CRLF, unparseable); second run byte-identical; hand-annotated #23835 form untouched (read from disk); non-pre "release" form; depth-1 clone deepens and annotates (read from disk), unreachable origin warns with CLI exit 0, --no-deepen undecided; no-decision cases (no manifest, root-born manifest, later-created manifest, not on npm, npm unknown, outside git with CLI exit 0, bad pre.json). Ablation: write writeFileSync(w.abs, w.next); replaced by void w.next; (anchor 1 -> 0, blob 4bfd5209005c -> 9566045703cc). Result: 5 failure(s) across 28 batteries, ABLATION_EXIT=1. Restore: blob == HEAD 4bfd5209005c, git diff HEAD empty. Real history (this branch's script; depth-1 sha-pinned clones shaped like actions/checkout): origin/main 3fed1eb (before #23835): deepened +100 in 6.9s, last version commit e5136ff (next.1 -> next.2), exactly the 11 annotated, exit 0. Second run: 0 annotated / 11 already, tree byte-identical. Each annotated file differs from #23835's blob only by (#23818) on that line. #23835 head af52476: 0 annotated / 11 already, nothing written. Re-cut base 3c080a6 (run 38875444505): 0 annotated / 11 already, nothing written. Re-cut #23825 head dedc6fe: last version commit is itself (next.3, npm absent) -> nothing shipped without a CHANGELOG entry, nothing written. The re-cut's next.3 sections: 19 entries carry the line, 0 twice. Full pnpm run version in a full-history clone of 3fed1eb with this branch's script and version line overlaid (local commit, never pushed): VERSION_EXIT=0, 14.5s, 11 annotated, next.3 = 19 entries across 12 packages carrying the line once. Old script on the same tree: 0 lines; moved-path sets identical (230 = 230). The 10 render-step content gates on the annotated tree all exit 0: check:docs-image-tag, -sync, template-version-sync, release-index-currency-sync, skill-compatibility, nul-bytes, release-notes, release-page-status, check-release-section-coverage.mjs, published-readme-links. Local rehearsal clone of the shared checkout: exit 0, only .changeset/ written. eslint --no-inline-config on the script: exit 0.",
"gates": "Final head 1cdd9d1 (merge base 66d456d): dispatch-gates --commands --repo objectstack-ai/objectstack derived 38 families. All 38 exit 0, exit code captured before any pipe. That includes the 4 dist gates (check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content) after a closure build under os-verify-lock (VERDICT command-exit 0, 74/74 tasks, held 533s), check:merge-driver, check:turbo-task-graph, check-self-test-wired, check-self-test-workflow-commands, and pnpm check:pm-dispatch-gates (pid 2849, BATTERY_EXIT=0, 351.5s). --ran: 38 derived famil(ies) accounted for — 38 run, 0 NOT-MEASURED. Pre-merge head f2b4cd5 (superseded): 49 derived; 44 exit 0; check-empty-changeset 1 (the 11 M rows, since gone); 4 dist gates exit 3 PREREQUISITE (no build). Those were re-run green on the merged head above. check-governed-merges --branch: 0 of 2 path(s) hit the register, NOT governed, 529 changed lines. PR check-runs at 1cdd9d1: 33 success, 6 skipped, 1 failure = Check Changeset (This PR adds no changeset; needs the seat's skip-changeset label). Lint & Repo Gates = success, Lint · CI, release & engine gates = success, Governed Surface Queue Guard = success.",
"mcp_calls": "0",
"api_writes": "1 seat-side REST write this round: POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/with-fleet.sh --via dispatch, executed as POST /repos//issues/23818/comments (this report). git push of claude/issue-23818-version-pr-behind-main: acb5919 (redesign), f2b4cd5 (disk-read batteries), 1cdd9d1 (merge of origin/main). No label, reviewer or PR-body writes. Earlier rounds' writes are in comments 6210532819 and 6211058406.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: published release text, the @objectstack/*@18.0.0-next.2 CHANGELOG sections · evidence: next.1's version commit 0c52e43 (#23382) left 6 changesets unconsumed (23268-external-sharing-model-retired, 23268-skills-lint-rules-row, 23357-page-component-view-data-api-refused, 23387-two-master-names-release, 23397-ceremony-builtin-positions, 23399-ceremony-not-declared-column-drop). Each add commit has 0 hits in next.1 sections and appears in next.2 sections at e5136ff; npm has 18.0.0-next.1. Same family as #23818, so it is folded here, not a single-point card: annotate-shipped covers every cut from now on, and the published next.2 entries could only be fixed by a docs-only amendment. Measured by running the step in a rehearsal clone of the shared checkout (head 9bb9370) · dedupe words: next.1 unconsumed changesets, version PR behind main, CHANGELOG missing entry, shipped in prerelease",
"carrier: seat (decides at landing) · noted in the PR body, not filed · at pre exit the GA CHANGELOG re-lists every prerelease changeset, so an annotated one (or a #23835 hand line) carries "listed here one prerelease late" into the GA section.",
"carrier: seat (record 6210600098) · noted, not filed · check-adr-0087-registration's pass line counts inherited-breaking changesets as non-breaking, and the inheritance exemption does not re-ask an edited breaking changeset for its disposition (read off the code).",
"carrier: none · noted, not filed · unconsumed's post-landing warning still prescribes "Name them in the VERSION release notes"; the next cut now does it automatically."
],
"files_changed": [
"scripts/release-pending-publish.mjs",
"package.json (the version script line only)"
],
"changed_lines": "529 (+502 / -27) over 2 files at 1cdd9d1, versus merge base 66d456d: package.json +1/-1, script +501/-26. lint.yml: no diff. The 11 changesets: no diff (identical to #23835's blobs on main).",
"pr_body_replacement": {
"pr": 23833,
"path": "/tmp/claude-0/-home-user/e9108b9f-1d0a-5c33-aac9-35f3a54b498d/scratchpad/issue-23818/pr-23833-body-v3.md",
"sha256": "2930ef81b827f00f08443abf936e9d0db83036a2e73031800b66b2dfab413911",
"bytes": 12580,
"note": "Not PATCHed by me. Not Tier H, so no 速读 section; the root-cause section stays. Scanned: no less-than character, no control byte, no model identifier, the only closing keyword is line 1 Fixes #23818. The round-2 body file pr-23833-body.md is superseded."
},
"deviations": [
"Beyond the PM's sketch, two choices, both inside the claimed surface. (1) The step annotates only when the last VERSION is on npm (npm view, the script's existing npmState), so it never claims "Shipped in" for a version nobody published; npm unreadable is the warn-only answer. (2) The version script joins the step with ; rather than &&, so even a crash of the step cannot stop changeset version.",
"The lead line follows the PM's form, without the card number; it says "release" instead of "prerelease" for a version with no prerelease tag.",
"The first self-test run after the rewrite failed one floor pin: battery 6 registered 5 cases against a pin of 6, because I miscounted. Corrected before the commit.",
"The pre-merge gate run (f2b4cd5) had 4 dist gates at exit 3 (no build). I did not report those as measurements; I built the closure under the verify lock and re-ran all 38 families green on the merged head.",
"The release.yml render-step and changesets/action callers were measured by replaying their commands in clones; no workflow ran. cut-rc.yml was judged from its YAML (fetch-depth 0, gates before the version step, .changeset staged wholesale), not run.",
"Commit trailers use the AGENTS.md model-free pair; the PR footer form is the AGENTS.md session-URL form."
]
}
Landed: each Version Packages cut now marks what the last release shipped unlisted · domain:devx seat 2 · session_016PVjjuVPte5XEJvaQx1E4t · 2026-10-16T09:52Z
reading
value
the 11 entries
#23835 → 3c080a65c8, merged 2026-10-16T08:40:44Z; all 11 blobs equal the PR head (record 6211634272 on #23835)
Version PR
#23825 re-cut by the seat's refresh_version_pr (run 38875444505) from 3c080a65c8. The next.3 sections carry the 11 with their lead line: 19 lines across 12 CHANGELOG.md files (6211697477 on #23825)
the step
#23833 → 0af559e806 on origin/main, merged 2026-10-16T09:40:52Z. The blobs of scripts/release-pending-publish.mjs (4bfd5209005c) and package.json (24ad00fa5dda) equal the PR head 1cdd9d114
What now holds: the root version script runs annotate-shipped before changeset version. When a Version Packages PR lands behind main, the next cut gives each changeset it left out the lead line **Shipped in <version>**, …. Nothing refuses or holds a release.
⚠️ The merge commit's subject is stale.0af559e806 reads "fix(release): refuse a Version Packages PR whose queue build lands behind main; mark next.2's 11 missed changesets". The seat updated the PR body for the redesign but not its title, and the squash took the title. The commit does neither of those things. It adds the annotate step, which is described in the PR body and in this record. No changeset was involved, so no CHANGELOG carries the stale words. main is not rewritten.
Noted, not filed (the ACCEPT 6212384630 has the reasons): next.1's 6 changesets listed under next.2 with no note; the GA CHANGELOG repeating the lead line at pre exit; two check-adr-0087-registration observations.
Activity
objectstack-fleet commentedon Oct 16, 2026
First touch: lane confirmed · grade p2 → p1 (release priority) ·
pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T05:56ZRead in this act: the body in full, 0 comments.
domain:devx, confirmed (release.ymlandscripts/release-pending-publish.mjs, ci(release): the release-integrity audit names the changesets a version commit did not consume #21373's landing).18.0.0-next.2with no CHANGELOG entry, among them the BREAKING spec:PageTypeSchemasayshomeis "the platform-level landing page" andutilitya "floating utility panel", but the landing is the first navigation item and both types render as ordinary inline pages #23610 refusal (full-width).os validateexits 1 on the bump alone.pm:queue.18.0.0-next.2note or innext.3's section, so that they are not silently attributed to the wrong prerelease.target:v18stands.⛔ Not a claim.
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 7 ·
domain:devxseat 2 · 2026-10-16T06:54Z · triage first touch6209112863(p1,domain:devx; the claimant decides how the 11 entries reach readers)Session:
session_016PVjjuVPte5XEJvaQx1E4tAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23818-version-pr-behind-mainWorktree:
objectstack-issue-23818Domain:
domain:devxSeat:
domain:devx#2File surface:
scripts/release-pending-publish.mjsand its tests;.github/workflows/release.yml(governed: a hit makes the PR Tier H); a new guard script underscripts/with its test, if the dev measures that as the better home; the 11 unconsumed.changeset/*.mdnamed on the card (text only, for the "shipped in next.2" route);packages/*/CHANGELOG.mdand.changeset/pre.jsononly if the in-place route is chosen at review. Stop on breach and explain it in the report. ⛔ No push tochangeset-release/main. ⛔ No release act.Container & model:
M,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate")Clause-②: no
Responsibility:
release.yml's version-pr job, which cuts the Version Packages PR from a base that main can pass before the merge (#21373's guard misses it in pre mode) | none: #21373 covers another shape | every prerelease consumer reading CHANGELOG.md; today 18.0.0-next.2's 11 entries, including the BREAKING #23610 refusalThread-read: 6209112863
Serial constraints cleared:
release.yml,scripts/release-pending-publish.mjsor.changeset/pre.json. All open PRs' file lists were read at this act.f606ba2e25) is already behindmain1ecb08a1cby two changeset-bearing merges, fix(spec): four metadata type descriptions Setup shows are plain admin sentences #23817 and feat(plugin-audit): sys_activity gains writer-stamped read-rule columns with an idempotent backfill, and the withheld-row rule is a predicate with no SYSTEM pre-scan (ADR-0139 E6) #23814. A note on chore: version packages (next) #23825 says so in this act.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Maintainer ruling: the 11 next.2 entries take the simplest route ·
domain:devxseat 2 ·session_016PVjjuVPte5XEJvaQx1E4t· 2026-10-16T07:01ZThe dispatch (claim
6209900371) asked the dev to measure two routes for recording the 11 changesets that shipped in 18.0.0-next.2 unlisted, and to recommend one. The maintainer ruled in the seat 2 session, verbatim:("For the 11 entries, take whichever way is simplest.")
The seat has relayed this to the running dev as follows:
CHANGELOG.mdedits and nopre.jsonsurgery.18.0.0-next.2. Each frontmatter (package names, bump types) stays as it is. The next Version Packages PR then lists the 11 under next.3, each carrying that note.The rest of the dispatch is unchanged: the root cause of the guard miss, the guard itself, and the instruction for #23825 in the PR body.
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 23818,
"status": "blocked",
"branch": "claude/issue-23818-version-pr-behind-main",
"pr": "#23833",
"session": "session_016PVjjuVPte5XEJvaQx1E4t",
"premise_still_valid": true,
"summary": "Blocked on one thing only the PM can decide: extending the claim surface to lint.yml for the single wiring step that makes the guard refuse. Delivered: (1)
release-pending-publish.mjs queue-guard, a merge-queue guard that finds each version commit in merge_group base..head and refuses (exit 1) when the unconsumed changeset set is non-empty there, with 6 new self-test batteries; (2) route A per the maintainer ruling 「那 11 条怎么补记, 怎么简单怎么处理」: one lead line in each of the 11 changesets, frontmatter byte-unchanged. Root cause, which partly falsifies PM assumption 3: #21373 did not miss the measurement. Run 38841989023 warned about all 11 (11 changeset(s) from 10 commit(s)), and pre mode played no part, because v3 moves consumed changesets into .changeset/pre/. Its contract is post-landing and warn-only, and nothing judges the tree that lands before it lands. A scheduled refresh gets no pull_request build (d5c44f8: 0 check runs); a dispatched one does (958e5b0: 45), but against its own base. Only the merge_group build sees the landing tree. The guard cannot be wired in release.yml, the only workflow on the surface: release.yml has no merge_group trigger and no required context, so a check there would be advisory. The required contexts live in lint.yml, ci.yml and governed-surface-guard.yml. So I stopped at the breach. The exact step is in the PR body (lint.yml laneLint · CI, release & engine gates); adding it makes the PR Tier H. Today the PR is ungoverned (0 of 12 paths). #23825: hold it; refresh it once (refresh_version_pr: true) after this PR lands; then queue it with nothing changeset-bearing ahead.","tests": "Self-test
node scripts/release-pending-publish.mjs --self-teston final head 1115d43:✓ release-pending-publish self-test: 111 cases across 28 batteries pass.(was 22 batteries; floor raised to 28). Ablation via scripts/ablation-replace.mjs with a trap: anchor: versionCommits.some((vc) => vc.report.unconsumed.length > 0)hit 1 -> 0, blob 2e8e5f5b66b0 -> 00055b997b2a. Result:✗ release-pending-publish self-test: 5 failure(s) across 28 batteries.(behind verdict, refusal report, CLI exit 1, mid-batch, non-pre), ABLATION_EXIT=1. Restore: blob == HEAD 2e8e5f5b66b0 andgit diff HEADempty. No build or dist is involved (plain node script). Miss reproduced as a control in the self-test: the post-landingunconsumedreport on the same next.2-shaped fixture names the same 3 changesets and only emits a ::warning::. Real history, full-history clone (is-shallow false), read-only: #23481 queue build, base 8684079, head e5136ff: EXIT=1, 11 changesets from 10 commits (the card list). #23825 squashed onto main 1ecb08a (local merge-tree squash 0f5edbbbbd): EXIT=1, refusing 23731-activity-changed-fields (#23814) and 23808-type-descriptions-plain (#23817). #23825 against its own base f606ba2: EXIT=0, current. A locally rendered next.3 cut of this branch (c078e7c25a on 15f51d1): EXIT=0, current. Ordinary landing 5b6c257..1ecb08a: EXIT=0, no version commit. Premise legs: each add commit vs e5136ff merge-base --is-ancestor exit 0; vs base 4fe8b3d exit 1; control root -> 4fe8b3d exit 0. 0 of 11 under .changeset/pre/; 0 add-commit hashes in any next.2 CHANGELOG section; spec next.2 section (763 lines) has 0 lines naming full-width. Route A render (changeset version in a throwaway clone, never pushed): the lead line is the first line of 19 next.3 entries across 12 packages, with the original hashes (e.g.- a69a40a: **Shipped in 18.0.0-next.2**, ...). breakingDeclaration is unchanged on all 11; the 4 breaking ones lose onlybangand keep BREAKING and/or the narrowing arm. eslint --no-inline-config on the script: exit 0.","gates": "Local, final head 1115d43:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 41 families (identical to the derivation at 15f51d1). Each was run with its exit code captured before any pipe: 40 exit 0, including release-pending-publish --self-test, check-adr-0087-registration --base, check-self-test-wired, check:nul-bytes, check:published-files, check:changeset-gate-self-tests, andpnpm check:pm-dispatch-gates(nohup + tail --pid, BATTERY_EXIT=0, fast tier 1884 cases, 206.5s). 1 exits 1 as expected:node scripts/check-empty-changeset.mjs --base origin/main, the foreign-changeset rule refusing the 11 M rows (DELIBERATE CORRECTION class; confirmation written in the PR body citing the ruling; its CI home Check Changeset is not a required context).--ran:✓ dispatch-gates --ran: 41 derived famil(ies) accounted for — 41 run, 0 NOT-MEASURED. check-governed-merges --branch:0 of 12 path(s) hit the register, NOT governed (no tier yet; Tier H once the lint.yml step is added). PR check-runs at report time on 1115d43: success: Auto Label, Check Documentation Links, Check PR Size, filter, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, The card this PR closes must claim this branch. skipped by selector: Build Core, Build Docs, Console Pin Gate, Dogfood Verify CLI, Temporal Conformance, Packed-tarball smoke. in_progress: Check Changeset (expected red), Governed Surface Queue Guard, all Lint · lanes, all Type Check · lanes, Test Core 1-6, Dogfood Regression Gate. Not waited on, per contract.","mcp_calls": "0",
"api_writes": "2 seat-side REST writes, both POST /repos/objectstack-ai/objectstack/dispatches through scripts/pm/with-fleet.sh --via dispatch. Stroke 1 (run 38868061510): pr_create, executed as objectstack-fleet[bot] as POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos//issues/23833/assignees [os-sales]. Read-back: 14471 bytes sent, 14471 stored. Stroke 2: comment, executed as POST /repos//issues/23818/comments (this report). Plus git push of the branch: the empty probe, then 3 commits. No label writes, no PR body PATCH.",
"open_questions": [
{
"question": "Extend the claim surface so the guard can be wired? It refuses only as a step inside a required merge_group context, and release.yml cannot host one.",
"options": [
"A: add the one step (text in the PR body) to lint.yml's
Lint · CI, release & engine gateslane. Required viaLint & Repo Gates; fetch-depth 0 already; it already runs this script's self-test; the lane verdict reads toJSON(steps), so no roster edit. Cost: PR becomes Tier H; one patch round.","B: add it to governed-surface-guard.yml (
Governed Surface Queue Guard, required, fetch-depth 0, no collector). Cost: Tier H, and it mixes a release concern into the governed-surface guard whose header says the script is its single authority.","C: leave it unwired. The post-landing ::warning:: stays the only reader, and the card's second Done-when stays unmet."
],
"recommendation": "A, because the release-path instruments and this script's self-test already live in that lane, and the step is evaluated on the merge-queue build, which is the one point that sees the landing tree and that merging at the wrong moment cannot bypass."
},
{
"question": "Land route A ahead of the guard to unblock next.3?",
"options": [
"A: keep one PR. next.3 waits for the wiring round, then #23825 is refreshed once.",
"B: split commit 15f51d1 (11 lead lines, ungoverned) into its own PR now; the guard PR follows as Tier H."
],
"recommendation": "A unless next.3 is wanted today; the halves are independent, so B costs one extra PR and nothing else."
}
],
"out_of_scope_findings": [
"carrier: none · noted in PR Acceptance notes, not filed · check-adr-0087-registration's pass line counts the 4 inherited-breaking changesets among
11 non-breaking changeset(s) seen(misleading summary wording only; the verdict is right).","carrier: none · noted, not filed · the same inheritance exemption means a PR editing an already-breaking changeset is not re-asked for its ADR-0087 disposition, so deleting the marker would pass (read off the code, not exercised).",
"carrier: this card's wiring round · noted, not filed ·
unconsumed's post-landing warning prescribes 'Name them in the VERSION release notes'; for a prerelease the effective fix is a changeset edit. It becomes the bypass-only backstop once the queue guard is wired."],
"files_changed": [
"scripts/release-pending-publish.mjs",
".changeset/23528-exposure-refusal-code.md",
".changeset/23609-legacy-org-read-seam.md",
".changeset/23610-page-isdefault-template-slots.md",
".changeset/23634-stack-datasource-default-refused.md",
".changeset/23712-draft-save-d99-address.md",
".changeset/23714-unique-violation-arm-relay.md",
".changeset/23723-sandbox-unreadable-rejection.md",
".changeset/23732-attachment-readable-ids.md",
".changeset/23735-reference-deleted-when.md",
".changeset/23740-form-section-columns-no-default.md",
".changeset/console-daeb77fc84dd.md"
],
"changed_lines": "369 (+367 / -2) over 12 files at 1115d43, per GET pulls/23833. The PR body's gates section says 366: that was the reading at 15f51d1, before the header-correction commit added 3 lines. Seat fix if wanted: replace
0 of 12 paths governed; 366 changed lines.with0 of 12 paths governed; 369 changed lines.(no PATCH sent by me).","deviations": [
"Surface breach avoided, not taken: the wiring step needs lint.yml (outside the claim); stopped and explained per the dispatch.",
"Check Changeset will be red by design (foreign-changeset rule, DELIBERATE CORRECTION class). No skip-changeset; confirmation written in the PR body citing the ruling.",
"The commit trailers use the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude); the harness reminder asked for a model-named Co-Authored-By, which the pre-push hook refuses. The PR footer uses the AGENTS.md session-URL form, not the reminder's form.",
"The mechanism-assumption-3 framing ('why the guard did not catch this cut in pre mode') was falsified: the guard measured correctly and pre mode played no part. The root cause is post-landing and warn-only.",
"One --ran call first died MODULE_NOT_FOUND (cwd slip); rerun with an absolute path, not counted as a measurement.",
"Throwaway clone render worktree removed with --force (scratch clone holding a node_modules symlink and a local never-pushed commit); the task worktree itself was removed without --force after node_modules."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 7, file surface revised for a patch round ·
domain:devxseat 2 · 2026-10-16T07:40Z · supersedes6209900371; the dev's report6210532819stopped at a surface breach, and the seat takes its recommendationSession:
session_016PVjjuVPte5XEJvaQx1E4tAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23818-version-pr-behind-main(#23833, the guard; it closes this card)Worktree:
objectstack-issue-23818Domain:
domain:devxSeat:
domain:devx#2File surface:
scripts/release-pending-publish.mjsand its self-test (round 1, accepted);.github/workflows/lint.yml, one step in theLint · CI, release & engine gateslane (lint-ci-engine) that runsqueue-guardon the merge-queue build (governed: #23833 becomes Tier H); the 11 unconsumed.changeset/*.mdnamed on this card, text only (route A, per the maintainer's ruling6209999534), split onto a second branchclaude/issue-23818-changeset-lead-linesas aPart of #23818PR that lands ahead of the guard. Dropped from round 1's surface:.github/workflows/release.yml,packages/*/CHANGELOG.md,.changeset/pre.json. Stop on breach and explain it in the report. ⛔ No push tochangeset-release/main. ⛔ No release act.Container & model:
M,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate")Clause-②: no
Responsibility:
the merge queue landing a Version Packages PR whose version commit did not consume every changeset in its tree; #21373's report sees it only after landing and only warns | none: #21373 covers the post-landing report | every prerelease consumer reading CHANGELOG.md; today 18.0.0-next.2's 11 entries, and #23825 if merged as cutThread-read: 6210532819
Serial constraints cleared:
.github/workflows/lint.yml: feat(scripts): check:pnpm-flag-spellings — no committed pnpm call spells -s, --prod=VALUE, --production=VALUE or --no-production, which a global pnpm 11+/12 frontend rejects #23824 (draft,check:pnpm-flag-spellings), adding one step in the samelint-ci-enginelane at about line 4057. The two PRs edit different hunks of the same job, andlint.ymlis not a single-writer path (scripts/check-single-claim-paths.mjsdeclares only.objectui-sha). Whichever lands second mergesmain. The guard step must not sit next to that hunk.scripts/release-pending-publish.mjsor any of the 11 changesets. The file lists of all 14 open PRs were read at this act. Version Packages PR chore: version packages (next) #23825's first 100 files name none of the 11.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 23818,
"status": "done",
"branch": "claude/issue-23818-version-pr-behind-main",
"pr": "#23833",
"split_pr": "#23835",
"split_branch": "claude/issue-23818-changeset-lead-lines",
"session": "session_016PVjjuVPte5XEJvaQx1E4t",
"premise_still_valid": true,
"summary": "Patch round done, in the order asked. (1) SPLIT: #23835 (draft, assignee os-sales) on claude/issue-23818-changeset-lead-lines from origin/main 43567a8. Its head af52476 is a cherry-pick of 15f51d1, git patch-id --stable identical (36811cbc07). The body opens
Part of #23818with no closing keyword, cites ruling 6209999534 verbatim, and gives the deliberate-correction confirmation for Check Changeset. It is ungoverned (0 of 11 paths), 22 lines. (2) WIRE on #23833: one step in lint-ci-engine, right afterRelease version-commit selection self-test(lint.yml hunk @@ -3330,0 +3331,22, about 700 lines from #23824's @@ -4057). It has an id, continue-on-error: true and a rationale comment, and runsqueue-guard --event \"$OS_GATE_EVENT_NAME\" --base \"$OS_GATE_MERGE_GROUP_BASE_SHA\" --head \"$OS_GATE_MERGE_GROUP_HEAD_SHA\"from github.event_name and github.event.merge_group.base_sha/head_sha. The script now refuses a merge_group build without a full head sha too, so the head is never read off the checkout. Proofs (a), (b) and (c) were shown with output. For (d), the parsed fetch-depth: 0 plus the guard's shallow refusal stand; the live checkout log is NOT MEASURED (blob 403). The live pull_request run 38869800551 ran step #16 green and the lane verdict passed. A merge of main after #23835 lands was measured clean: merge-tree exit 0, and only lint.yml (+22) and the script (+359/-2) remain. (3) Replacement body for #23833 written, not PATCHed: path /tmp/claude-0/-home-user/e9108b9f-1d0a-5c33-aac9-35f3a54b498d/scratchpad/issue-23818/pr-23833-body.md, sha256 7f770eb56bab55dc173e14f4bed18715c90cd3ab292426bce45296a703d74c43, 17389 bytes. It is Tier H, carries the 维护者速读 section with the seat-opinion line empty, the wiring step and its proofs, the split, and the corrected changed-line count (405 now, 383 after the main merge). (4) The throwaway clone, actionlint download and both worktrees are removed.","tests": "
node scripts/release-pending-publish.mjs --self-testat 31e38ea:✓ release-pending-publish self-test: 113 cases across 28 batteries pass.(+2 cases: an empty or ref-name merge_group head is refused, including via the CLI). It went red first on a malformed new check (throws() with no pattern) and was fixed before the commit. (a) The real scripts/ci/lane-verdict.mjs (GITHUB_JOB=lint-ci-engine) on the edited lint.yml reads a roster of 67 steps / 60 gates, with the new step at position 15, gate=true, id set, no if:. All-green context: exit 0,OK -- 60 gate(s): 60 passed. New step outcome failure with conclusion success: exit 1,RED Version Packages PR lands no changeset behind main -- outcome failure,59 passed, 1 red. New step absent from context: exit 1,UNREAD ... 1 unread. No roster edit is needed. (b) The literal run: line from the parsed workflow, with empty merge_group fields: pull_request, push, schedule and workflow_dispatch each exit 0 withVersion-PR queue guard: event pull_request is not a merge-queue build, and only a merge_group build lands a commit on main, so there is nothing to judge here.Live: run 38869800551 (pull_request, 31e38ea), step #16Version Packages PR lands no changeset behind main= success, Lane verdict = success. (c) Parsed env: OS_GATE_MERGE_GROUP_BASE_SHA=${{ github.event.merge_group.base_sha }} and OS_GATE_MERGE_GROUP_HEAD_SHA=${{ github.event.merge_group.head_sha }}. The same run: line in a full-history clone of 31e38ea: #23481 base 8684079.. head e5136ff.. exit 1, 11 changesets; ordinary landing 43567a8..0cfd0c4 exit 0, no version commit; empty head exit 1needs --head ... (got \"\"); headHEADexit 1; empty base exit 1; short base 8684079 exit 1. (d) The lane checkout parses as actions/checkout@v7 with {"fetch-depth":0}; the guard refuses a shallow clone, so a shallow lane goes red, never green. Live checkout log for merge_group run 38868950353 job 116868229076: NOT MEASURED, the log blob answers 403 from this container. Merge simulation: #23835 squashed onto main 0cfd0c4 (local 7bf1f2e715, never pushed), thengit merge-tree --write-tree 31e38ea07 7bf1f2e715exit 0, no conflicts. The diff from simulated main is 2 files: lint.yml +22, the script +359/-2. Workflow lint: actionlint 1.7.7 (release tarball, sha256 023070a287cd8cccd71515fedc843f1985bf96c436b7effaecce67290e7e0757, equal to its published checksums) exit 0 with 0 findings on edited lint.yml, and 0 on the base version; shellcheck absent, so its run-script pass was skipped. check:workflow-status-functions exit 0; check:workflow-step-name-quoting exit 0. eslint --no-inline-config on the script exit 0.","gates": "Guard branch, final head 31e38ea: dispatch-gates --commands --repo objectstack-ai/objectstack derived 68 families (41 + 27 from lint.yml). Each was run with its exit code captured before any pipe. 67 exit 0, including check-aggregator-roster, check-step-collectors, check:required-contexts, check:select-gate-families, check-self-test-wired, check-self-test-workflow-commands, check:workflow-status-functions, check:workflow-step-name-quoting, check:type-check-coverage, check:type-check-debt (--re-measure under the verify lock, 294.5s,
none above its recorded number), check:pm-governed-merges andpnpm check:pm-dispatch-gates(pid 23155, BATTERY_EXIT=0, 1884 cases, 168.4s). 1 exit 1 as expected: check-empty-changeset --base origin/main, the 11 M rows this branch carries until #23835 lands and main is merged.--ran:68 derived famil(ies) accounted for — 68 run, 0 NOT-MEASURED. check-governed-merges --branch: 1 of 13 governed (.github/workflows/lint.yml), landing tier H, 405 changed lines (+403/-2). Split branch, head af52476: 20 families derived; 19 exit 0; 1 exit 1 as expected (check-empty-changeset --base, the 11 M rows, DELIBERATE CORRECTION).--ran:20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED. Not governed (0 of 11), 22 lines. PR check-runs at report time: #23833 @31e38ea077: 31 success, 7 skipped, 1 failure = Check Changeset (expected); Lint · CI, release & engine gates = success; Governed Surface Queue Guard = success. #23835 @af52476f35: 25 success, 8 skipped, 1 failure = Check Changeset (expected); Lint · CI, release & engine gates = success; Governed Surface Queue Guard = success.","mcp_calls": "0",
"api_writes": "2 seat-side REST writes, both POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/with-fleet.sh --via dispatch. Stroke 1 (run 38869418115): pr_create for #23835, executed as objectstack-fleet[bot] as POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos//issues/23835/assignees [os-sales]. Read-back: 5293 bytes sent, 5293 stored. Stroke 2: comment, executed as POST /repos//issues/23818/comments (this report). git push: the split branch (empty probe + 1 commit) and the guard branch (1 commit, 31e38ea). No label, reviewer or PR-body writes. Round 1's writes are in comment 6210532819.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: seat (decides at landing, per its record 6210600098) · noted in #23833 Acceptance notes, not filed · check-adr-0087-registration's pass line counts 4 inherited-breaking changesets among
11 non-breaking changeset(s) seen.","carrier: seat (same record) · noted, not filed · the inheritance exemption lets an edit of an already-breaking changeset drop its ADR-0087 marker unasked (read off the code, not exercised)."
],
"files_changed": [
"scripts/release-pending-publish.mjs",
".github/workflows/lint.yml",
".changeset/23528-exposure-refusal-code.md (and the other 10 of the 11, on both branches until #23835 lands and main is merged)"
],
"changed_lines": "#23833 at 31e38ea: 405 (+403 / -2) over 13 files; after #23835 lands and main is merged (measured by merge-tree): 383 (+381 / -2) over 2 files. #23835 at af52476: 22 (+22 / -0) over 11 files.",
"pr_body_replacement": {
"pr": 23833,
"path": "/tmp/claude-0/-home-user/e9108b9f-1d0a-5c33-aac9-35f3a54b498d/scratchpad/issue-23818/pr-23833-body.md",
"sha256": "7f770eb56bab55dc173e14f4bed18715c90cd3ab292426bce45296a703d74c43",
"bytes": 17389,
"note": "Not PATCHed by me (os-dev.md:64). Scanned: no less-than character, no control byte, no model identifier. The only closing keyword is line 1
Fixes #23818."},
"deviations": [
"(d) is proved from the parsed workflow and the guard's fail-closed shallow refusal. The live merge_group checkout log is NOT MEASURED (job-log blob 403 from this container, as in round 1).",
"actionlint is not in the repo. I downloaded the pinned 1.7.7 release tarball into an isolated scratch dir, verified its sha256 against the published checksums, ran it, and deleted it. shellcheck is absent, so actionlint skipped
run:script analysis. A copy of the base lint.yml was placed briefly under .github/workflows/ for actionlint and removed in the same command (worktree status clean before commit).","The 600s tool ceiling moved the 67-gate loop to the background. I kept the round alive, read its result files in-turn, and it finished with exit 0 (type-check-debt alone took 298s under the verify lock); no result was taken from a notification.",
"Beyond the one lint.yml step: the script now refuses a merge_group build with no full head sha. This is in the claimed surface, so that (c) holds for the head as well as the base.",
"Commit trailers use the AGENTS.md model-free pair, and PR footers the AGENTS.md session-URL form, not the harness reminder's forms."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → #23833 comment
6211127283·domain:devxseat 2 · 2026-10-16T08:14Z. The card is split in two:Part of #23818, 11 lead lines, not governed) is accepted in6211090465on docs(changeset): mark the 11 changesets 18.0.0-next.2 shipped without a CHANGELOG entry #23835, readied, and in the queue with auto-merge armed. Once it lands, the seat dispatchesrefresh_version_prso chore: version packages (next) #23825 regenerates from the currentmain.Fixes #23818) is Tier H, because it touches.github/workflows/lint.yml. It stays a draft withneeds-user-decision, and review is requested fromos-zhuangandhotlong. After an authorised approval and green CI, the seat lands it.Merging #23825 is the maintainer's act.
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 7, file surface revised for a redesign round ·
domain:devxseat 2 · 2026-10-16T08:23Z · supersedes6210589327; the guard's refusal is withdrawn (6211287288on #23833), per the maintainer's question 「23833 做的对吗?发版本的时候 main 上的队列就是不停在合并的」Session:
session_016PVjjuVPte5XEJvaQx1E4tAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23818-version-pr-behind-main(#23833; it closes this card)Worktree:
objectstack-issue-23818Domain:
domain:devxSeat:
domain:devx#2File surface:
scripts/release-pending-publish.mjsand its self-test (thequeue-guardmode is replaced by an annotate step that never refuses); the rootpackage.jsonversionscript, only to run that step ahead ofchangeset version;.github/workflows/lint.ymlonly to restore it byte-identical toorigin/main(the added step is dropped, so #23833 leaves Tier H); the 11 changesets stay on #23835 (Part of #23818, in the queue). Stop on breach and explain it in the report. ⛔ No.github/workflows/**edit beyond that restore. ⛔ No push tochangeset-release/main. ⛔ No release act.Container & model:
M,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate")Clause-②: no
Responsibility:
the Version Packages PR landing behind main, which the busy queue makes the normal case: 77 of 111 landings in 24 h carried a changeset | none: #21373's report sees it only after landing and only warns | every prerelease consumer reading CHANGELOG.mdThread-read: 6211139752
Serial constraints cleared:
check:pnpm-flag-spellings) touches the rootpackage.json, adding acheck:*script entry; theversionscript line is a different hunk, andpackage.jsonis not a single-writer path. No open PR other than fix(release): refuse a Version Packages PR whose queue build lands behind main; mark next.2's 11 missed changesets #23833 and docs(changeset): mark the 11 changesets 18.0.0-next.2 shipped without a CHANGELOG entry #23835 touchesscripts/release-pending-publish.mjsor the 11 changesets.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 23818,
"status": "done",
"branch": "claude/issue-23818-version-pr-behind-main",
"pr": "#23833",
"split_pr": "#23835 (landed as 3c080a6)",
"session": "session_016PVjjuVPte5XEJvaQx1E4t",
"premise_still_valid": true,
"summary": "Redesign round done: automate route A, never refuse.
release-pending-publish.mjs annotate-shippedfinds the last version commit (select's definition) and the changesets left unconsumed in its tree, via the new tree-onlypendingChangesetsAt, whichunconsumednow shares. It prepends to each one still pending:**Shipped in VERSION**, whose CHANGELOG missed this entry; listed here one prerelease late.("release" when VERSION has no prerelease tag; no card number). The frontmatter is byte-unchanged. A body already led by**Shipped inis left as it is, so #23835's 11 lines are not doubled. It annotates only when VERSION is on npm. It warns and writes nothing on anything it cannot decide, and exits 0 on every path. A shallow clone deepens itself withgit fetch --no-tags --deepen=N origin HEAD-SHA, N = 100..1600, stopping early when a round gains nothing. The rootversionscript runs it first, joined with;, so everypnpm run versioncaller gets it with no workflow edit. queue-guard, its batteries and the lint.yml step are removed; lint.yml has no diff against origin/main. Once #23835 landed I merged origin/main (no history rewrite): #23833 is now 2 files, ungoverned (0 of 2 paths), 529 lines. Replacement body written, not PATCHed: /tmp/claude-0/-home-user/e9108b9f-1d0a-5c33-aac9-35f3a54b498d/scratchpad/issue-23818/pr-23833-body-v3.md, sha256 2930ef81b827f00f08443abf936e9d0db83036a2e73031800b66b2dfab413911. Seat action needed:Check Changesetis red only because the PR adds no changeset. Root package.json is private and scripts/ ships in no package, soskip-changesetis the right label (no label writes by me).","tests": "
node scripts/release-pending-publish.mjs --self-test:✓ release-pending-publish self-test: 112 cases across 28 batteries pass.Six annotate batteries replace the six queue-guard ones: next.2 shape (byte-exact, CRLF, unparseable); second run byte-identical; hand-annotated #23835 form untouched (read from disk); non-pre "release" form; depth-1 clone deepens and annotates (read from disk), unreachable origin warns with CLI exit 0, --no-deepen undecided; no-decision cases (no manifest, root-born manifest, later-created manifest, not on npm, npm unknown, outside git with CLI exit 0, bad pre.json). Ablation: writewriteFileSync(w.abs, w.next);replaced byvoid w.next;(anchor 1 -> 0, blob 4bfd5209005c -> 9566045703cc). Result:5 failure(s) across 28 batteries, ABLATION_EXIT=1. Restore: blob == HEAD 4bfd5209005c,git diff HEADempty. Real history (this branch's script; depth-1 sha-pinned clones shaped like actions/checkout): origin/main 3fed1eb (before #23835): deepened +100 in 6.9s, last version commit e5136ff (next.1 -> next.2), exactly the 11 annotated, exit 0. Second run: 0 annotated / 11 already, tree byte-identical. Each annotated file differs from #23835's blob only by(#23818)on that line. #23835 head af52476: 0 annotated / 11 already, nothing written. Re-cut base 3c080a6 (run 38875444505): 0 annotated / 11 already, nothing written. Re-cut #23825 head dedc6fe: last version commit is itself (next.3, npm absent) ->nothing shipped without a CHANGELOG entry, nothing written. The re-cut's next.3 sections: 19 entries carry the line, 0 twice. Fullpnpm run versionin a full-history clone of 3fed1eb with this branch's script and version line overlaid (local commit, never pushed): VERSION_EXIT=0, 14.5s, 11 annotated, next.3 = 19 entries across 12 packages carrying the line once. Old script on the same tree: 0 lines; moved-path sets identical (230 = 230). The 10 render-step content gates on the annotated tree all exit 0: check:docs-image-tag, -sync, template-version-sync, release-index-currency-sync, skill-compatibility, nul-bytes, release-notes, release-page-status, check-release-section-coverage.mjs, published-readme-links. Local rehearsal clone of the shared checkout: exit 0, only .changeset/ written. eslint --no-inline-config on the script: exit 0.","gates": "Final head 1cdd9d1 (merge base 66d456d): dispatch-gates --commands --repo objectstack-ai/objectstack derived 38 families. All 38 exit 0, exit code captured before any pipe. That includes the 4 dist gates (check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content) after a closure build under os-verify-lock (
VERDICT command-exit 0, 74/74 tasks, held 533s), check:merge-driver, check:turbo-task-graph, check-self-test-wired, check-self-test-workflow-commands, andpnpm check:pm-dispatch-gates(pid 2849, BATTERY_EXIT=0, 351.5s).--ran:38 derived famil(ies) accounted for — 38 run, 0 NOT-MEASURED. Pre-merge head f2b4cd5 (superseded): 49 derived; 44 exit 0; check-empty-changeset 1 (the 11 M rows, since gone); 4 dist gates exit 3 PREREQUISITE (no build). Those were re-run green on the merged head above. check-governed-merges --branch:0 of 2 path(s) hit the register, NOT governed, 529 changed lines. PR check-runs at 1cdd9d1: 33 success, 6 skipped, 1 failure = Check Changeset (This PR adds no changeset; needs the seat's skip-changeset label). Lint & Repo Gates = success, Lint · CI, release & engine gates = success, Governed Surface Queue Guard = success.","mcp_calls": "0",
"api_writes": "1 seat-side REST write this round: POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/with-fleet.sh --via dispatch, executed as POST /repos//issues/23818/comments (this report). git push of claude/issue-23818-version-pr-behind-main: acb5919 (redesign), f2b4cd5 (disk-read batteries), 1cdd9d1 (merge of origin/main). No label, reviewer or PR-body writes. Earlier rounds' writes are in comments 6210532819 and 6211058406.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: published release text, the @objectstack/*@18.0.0-next.2 CHANGELOG sections · evidence: next.1's version commit 0c52e43 (#23382) left 6 changesets unconsumed (23268-external-sharing-model-retired, 23268-skills-lint-rules-row, 23357-page-component-view-data-api-refused, 23387-two-master-names-release, 23397-ceremony-builtin-positions, 23399-ceremony-not-declared-column-drop). Each add commit has 0 hits in next.1 sections and appears in next.2 sections at e5136ff; npm has 18.0.0-next.1. Same family as #23818, so it is folded here, not a single-point card: annotate-shipped covers every cut from now on, and the published next.2 entries could only be fixed by a docs-only amendment. Measured by running the step in a rehearsal clone of the shared checkout (head 9bb9370) · dedupe words: next.1 unconsumed changesets, version PR behind main, CHANGELOG missing entry, shipped in prerelease",
"carrier: seat (decides at landing) · noted in the PR body, not filed · at
pre exitthe GA CHANGELOG re-lists every prerelease changeset, so an annotated one (or a #23835 hand line) carries "listed here one prerelease late" into the GA section.","carrier: seat (record 6210600098) · noted, not filed · check-adr-0087-registration's pass line counts inherited-breaking changesets as non-breaking, and the inheritance exemption does not re-ask an edited breaking changeset for its disposition (read off the code).",
"carrier: none · noted, not filed ·
unconsumed's post-landing warning still prescribes "Name them in the VERSION release notes"; the next cut now does it automatically."],
"files_changed": [
"scripts/release-pending-publish.mjs",
"package.json (the
versionscript line only)"],
"changed_lines": "529 (+502 / -27) over 2 files at 1cdd9d1, versus merge base 66d456d: package.json +1/-1, script +501/-26. lint.yml: no diff. The 11 changesets: no diff (identical to #23835's blobs on main).",
"pr_body_replacement": {
"pr": 23833,
"path": "/tmp/claude-0/-home-user/e9108b9f-1d0a-5c33-aac9-35f3a54b498d/scratchpad/issue-23818/pr-23833-body-v3.md",
"sha256": "2930ef81b827f00f08443abf936e9d0db83036a2e73031800b66b2dfab413911",
"bytes": 12580,
"note": "Not PATCHed by me. Not Tier H, so no 速读 section; the root-cause section stays. Scanned: no less-than character, no control byte, no model identifier, the only closing keyword is line 1
Fixes #23818. The round-2 body file pr-23833-body.md is superseded."},
"deviations": [
"Beyond the PM's sketch, two choices, both inside the claimed surface. (1) The step annotates only when the last VERSION is on npm (
npm view, the script's existing npmState), so it never claims "Shipped in" for a version nobody published; npm unreadable is the warn-only answer. (2) The version script joins the step with;rather than&&, so even a crash of the step cannot stopchangeset version.","The lead line follows the PM's form, without the card number; it says "release" instead of "prerelease" for a version with no prerelease tag.",
"The first self-test run after the rewrite failed one floor pin: battery 6 registered 5 cases against a pin of 6, because I miscounted. Corrected before the commit.",
"The pre-merge gate run (f2b4cd5) had 4 dist gates at exit 3 (no build). I did not report those as measurements; I built the closure under the verify lock and re-ran all 38 families green on the merged head.",
"The release.yml render-step and changesets/action callers were measured by replaying their commands in clones; no workflow ran. cut-rc.yml was judged from its YAML (fetch-depth 0, gates before the version step,
.changesetstaged wholesale), not run.","Commit trailers use the AGENTS.md model-free pair; the PR footer form is the AGENTS.md session-URL form."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed: each Version Packages cut now marks what the last release shipped unlisted ·
domain:devxseat 2 ·session_016PVjjuVPte5XEJvaQx1E4t· 2026-10-16T09:52Z3c080a65c8, merged 2026-10-16T08:40:44Z; all 11 blobs equal the PR head (record6211634272on #23835)refresh_version_pr(run 38875444505) from3c080a65c8. The next.3 sections carry the 11 with their lead line: 19 lines across 12CHANGELOG.mdfiles (6211697477on #23825)0af559e806onorigin/main, merged 2026-10-16T09:40:52Z. The blobs ofscripts/release-pending-publish.mjs(4bfd5209005c) andpackage.json(24ad00fa5dda) equal the PR head1cdd9d114Fixesclosed this card ascompleted.pm:dispatchedis removed in this act.versionscript runsannotate-shippedbeforechangeset version. When a Version Packages PR lands behindmain, the next cut gives each changeset it left out the lead line**Shipped in <version>**, …. Nothing refuses or holds a release.0af559e806reads "fix(release): refuse a Version Packages PR whose queue build lands behind main; mark next.2's 11 missed changesets". The seat updated the PR body for the redesign but not its title, and the squash took the title. The commit does neither of those things. It adds the annotate step, which is described in the PR body and in this record. No changeset was involved, so no CHANGELOG carries the stale words.mainis not rewritten.6212384630has the reasons): next.1's 6 changesets listed under next.2 with no note; the GA CHANGELOG repeating the lead line atpre exit; twocheck-adr-0087-registrationobservations.Generated by Claude Code