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): Publish Smoke fails to build @objectstack/spec on the version PR's branch (changeset-release/main, 18.0.0-next.0), 5 of 5 runs since 23:16Z #23113
Unblocks: #21988 (the Version Packages PR for 18.0.0-next.0) and the v18 next line.
Filing gate ①: a measured defect with a named step, on the release path. Filed and graded by the triage seat (seat post #6015, session_01AavokzJ5DndAwitDXvKy4U) from the sweep of the hourly red card #23107. ⛔ Not a claim, ⛔ not a dispatch.
Reader who acts: the domain:devx lane, which owns the release workflows and the version-PR lane (#22085).
What is measured
Publish Smoke (.github/workflows/publish-smoke.yml, run-name "Packed-tarball smoke (release candidate)") runs after each Release run and smokes the changesets release branch, changeset-release/main. That branch is chore: version packages (next) #21988's head, 9a73a93f1c, where packages/spec/package.json reads 18.0.0-next.0.
Every run in the API window fails at the same place:38321293426 (23:16Z), 38321882354 (23:23Z), 38319296792 (22:54Z), 38323215936 (23:38Z) and 38323903662 (23:46Z).
The job "Packed-tarball smoke (release candidate)" fails at step 10, Build.
The annotation reads command (…/packages/spec) pnpm run build exited (1).
The job log was not readable from the triage seat (the log host refused the proxy hop), so the failing line is NOT read yet.
Control:@objectstack/spec builds on main (label 17.7.0), where Build Core is green. What differs on the release branch is the version pass's output: the prerelease label, the changelogs, and the post-version files.
Why it matters
The next publish builds the same tree. If the spec build fails on the release branch, 18.0.0-next.0 cannot be published from #21988 as it stands.
What done looks like
Read the failing line: the job log of 38323903662, or pnpm --filter @objectstack/spec run build on changeset-release/main.
The build runs gen:migration-registry, gen:schema and gen:openapi before tsup. build-schemas.ts and build-openapi.ts read package.json's version.
Fix it on main so the next refresh of chore: version packages (next) #21988 builds clean. ⛔ No edit to the release branch by hand, and ⛔ no change to the smoke to make it pass.
Pin: the next Publish Smoke after the fix lands is green on the release branch.
Claim: PM loop round 2 · domain:devx seat 1 · 2026-10-13T00:01Z
Session: session_012zwsLMxQBwHUYJgPyrpEvx
Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-23113-spec-build-next
Worktree: objectstack-issue-23113
Domain: domain:devx
Seat: domain:devx#1
File surface: packages/spec/scripts/build-schemas.ts, packages/spec/scripts/build-openapi.ts, the spec build's gen:* scripts and whatever they read from packages/spec/package.json's version, plus their tests (stop on breach; explain in the report). ⛔ No edit to changeset-release/main, to #21988, or to publish-smoke.yml / release.yml to make the smoke pass. ⛔ No release action.
Container & model: M, mode:subagent, model: opus (the default judgment tier; dispatch-gates --tier on this surface: "no path-derived mandate", floor sonnet · default opus · ceiling fable)
Clause-②: no
Responsibility: the spec build's own generators, reading the 18.0.0-next.0 version the version pass writes, produce the failure (not established; first suspect, per the card) | no platform path covers it: main builds at 17.7.0, and only the release-candidate smoke builds the post-version tree | every next publish of #21988 reaches it; today it blocks the 18.0.0-next.0 candidate
Thread-read: none
Serial constraints cleared: no open PR touches packages/spec/scripts/ or packages/spec/package.json (all 12 open PRs' file lists read at this act); #22085 (seat 2) declares no file surface (6050348380); #23104's PR #23110 touches packages/spec/src/** citation and migration-entry files only, which are not on this surface.
os-dev-report
{
"issue": 23113,
"status": "done",
"branch": "claude/issue-23113-spec-build-next",
"pr": "#23123",
"session": "session_012zwsLMxQBwHUYJgPyrpEvx — the PM's session (subagent run; from the dispatch and the relay envelope)",
"premise_still_valid": true,
"summary": "Failing line, read from job 115058075855 (run 38323903662, tree 9a73a93): '❌ 10 authorable key(s) changed the DEFAULT they apply when the author omits them' + 'Baseline: upstream 85c6d76'; exit at packages/spec/scripts/build-schemas.ts:3352. The message is printed at log lines 2371-2466, AFTER turbo's ERROR lines (1639-1641), so the exit is not silent. Root cause: authoriseDefaultChanges (scripts/lib/authorable-defaults.ts:392) admitted DEFAULT_CHANGES_BY_MAJOR rows only at CURRENT_MAJOR. The depth-1 smoke re-anchors on baseRev 85c6d76 (spec 17.4.0), the version pass rolls the build to 18, and all ten keys are declared under 17. Control: last green 38247570907 built 17.8.0 on the same anchor and printed '📌 9 declared default change(s) accepted'. Not the prerelease label: parseInt('18.0.0-next.0') = 18 is correct. Fix (7f04259, on main): the window runs from the baseline tree's own protocol major (read from package.json at the baseline rev) up to the build major. Rows chain in ascending order across the roll. Rows older than the baseline major still authorise nothing. An unreadable major falls back to the narrowest window, announced. On main the window stays [17]. Draft PR #23123, assignee zhuangjianguo, label skip-changeset.",
"tests": "All at 7f04259, through os-verify-lock. (a) fresh depth-1 clone of changeset-release/main at 9a73a93, unmodified: 'pnpm --filter @objectstack/spec run build' -> VERDICT command-exit 1, the same 10 keys, 'Baseline: upstream 85c6d76'. (b) the same clone with the patch git-applied, uncommitted (HEAD still 9a73a93): spec build -> VERDICT command-exit 0, 'rows at majors 17–18 authorise', '📌 10 declared default change(s) accepted', dts 38/38. The smoke's Build step there (turbo run build --filter=!@objectstack/docs --concurrency=2) -> 'Tasks: 73 successful, 73 total', command-exit 0. The smoke's later steps (pack, install, auth, CRUD) NOT MEASURED. (c) branch off main 21c8644: spec build -> command-exit 0, '🔒 authorable-defaults/ verified against upstream 21c8644 — 1121 default(s) unchanged', git status clean. Unit tests: scripts/authorable-defaults.test.ts 36 passed (27 existing + 9 new). Spec local suite: 659 files / 19996 passed / 1 todo, command-exit 0. Spec typecheck (tsc --noEmit + check:scripts-typecheck + check:test-typecheck): exit 0; --listFiles on tsconfig.scripts.json lists all 4 changed files. Ablation (fix committed first, via scripts/ablation-replace.mjs): authorisingMajors(majors) replaced with [majors.current]; anchor 1->0, blob 68f3f7ea8795->b2f5507f9afb; result '3 failed | 33 passed (36)', red as expected; restore: blob == HEAD 68f3f7ea8795, git diff HEAD empty. Lint, narrowed: eslint --no-inline-config --format json on the 4 files -> 4 results, 0 errors, 0 warnings, none ignored; eslint.config.mjs enables no type-aware linting (no parserOptions.project), so untouched files' verdicts cannot move. Repo-wide pnpm lint is CI's.",
"gates": "80 commands: the 74 dispatched ∪ the 62 re-derived on the branch (dispatch-gates --commands, no paths, 'committed 4, working tree 0, untracked 0'). Final exit 0 for all 80. 'dispatch-gates --ran' -> '✓ 62 derived famil(ies) accounted for — 62 run, 0 NOT-MEASURED (a DERIVED zero)'. Three first runs exited 3 (PREREQUISITE NOT MET) and were re-measured green after the prerequisite was supplied: check-plugin-teardown-shape --self-test (pinned fixture 621a487 absent from the shallow clone; that commit was fetched), and check:dual-build-cjs-loads and check:lean-entry-closure (no dist; repo built first, 73 tasks, 72 turbo-cache hits). check:pm-dispatch-gates was run detached twice: the first run's exit was not captured ('1833 cases pass'); the second captured exit 0. Added by re-derivation over the dispatch list: check:engine-double-contract, check:objectql-double-limit, check:query-options-erasure, check:type-check-coverage, check:type-check-debt, check:where-matcher, all 0. The 18 dispatched commands outside the branch derivation (package.json-driven) were run anyway, all 0.",
"line_budget": "281 changed lines (+252 / -29), 4 files, all under packages/spec/scripts/; under the 3000 human-merge threshold; no skills/ or governed surface touched (not Tier S/H).",
"files_changed": [
"packages/spec/scripts/lib/authorable-defaults.ts",
"packages/spec/scripts/build-schemas.ts",
"packages/spec/scripts/lib/default-changes.ts",
"packages/spec/scripts/authorable-defaults.test.ts"
],
"deviations": [
"File surface: the producer is gen:schema's own library, scripts/lib/authorable-defaults.ts (authoriseDefaultChanges), plus a header-comment edit in scripts/lib/default-changes.ts, beside build-schemas.ts. It is inside 'the spec build's gen:* scripts'; no packages/spec/src/** file is touched (contract stop not reached). Stated in the PR body.",
"Repro shape: a fresh depth-1 clone instead of a detached worktree. A worktree shares this container's .git, whose history is walkable (merge-base resolves), so it takes the merge-base path and cannot reproduce the CI re-anchor. The clone lived at /tmp/os-23113, outside the scratchpad: the first clone under the scratchpad failed pnpm install, because the tsx IPC socket path (146 bytes) is over the 108-byte Unix limit (EADDRINUSE). The clone was deleted after use.",
"Shared-git side effects: fetching changeset-release/main into my own ref refs/os-dev/issue-23113/release also pulled origin's tags into the shared refs/tags (e.g. create-objectstack@17.6.0 and @17.7.0, copies of origin's); the private ref was deleted, the tags were left. 'git fetch --depth=1 --no-write-fetch-head origin 621a487' added that one fixture commit (and a shallow root for it) to the shared object store, with no ref written.",
"Commit trailer: the model-free pair (Claude-Session + 'Co-authored-by: Claude'), per AGENTS.md and the pre-push hook, instead of the harness reminder's model-named Co-Authored-By.",
"PM mechanism assumptions: #1 partly falsified (the error text exists, after turbo's ERROR lines); #2 confirmed (38247570907 built 17.8.0 'd00f5f2 chore: version packages', 38248923046 built 18.0.0-next.0 'd85ff7c chore: version packages (next)', both from main 4267484); #3 falsified (not a silent exit, not the retired-entry paths, not the prerelease label: it is the default-change refusal exit at :3352); #4 confirmed by proof (c).",
"Worktree and repro clone removed after the PR opened. The PR assignee was set by pr_create; the card's assignee was not touched."
],
"mcp_calls": "0 — no MCP GitHub tool was called (reads went through gh api REST; writes through the scripts/pm relay)",
"api_writes": "4 REST writes in 3 relay strokes (each stroke is one POST /repos/objectstack-ai/objectstack/dispatches, HTTP 204, executed as objectstack-fleet[bot]): (1) pr_create, run 38331517398: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos//issues/23123/assignees; (2) label-write, run 38331578748: POST /repos//issues/23123/labels (skip-changeset; read back 'size/m, tests, tooling, skip-changeset'); (3) this os-dev-report comment: POST /repos//issues/23113/comments. Not REST: 2 git pushes of claude/issue-23113-spec-build-next (the empty-branch probe, then 7f04259).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR #23123's Acceptance notes, not filed — tsx's IPC socket under a checkout path over about 60 chars passes the 108-byte Unix socket limit and fails with EADDRINUSE (environment observation in this container, no public door) · dedupe words: tsx pipe EADDRINUSE, socket path length, deep checkout path",
"carrier: PR #23123 (this fix covers it) · noted, not filed — inferred, not measured: once #21988 lands, main is at major 18 with baseRev still at 85c6d76 (17.4.0), so every depth-1 spec build would reach the same refusal without this fix · dedupe words: default-change ratchet major roll, DEFAULT_CHANGES_BY_MAJOR window, shallow re-anchor baseRev"
]
}
Checked on GitHub and on the branch, not on the report's say-so:
PR shape: open, draft, base main, body line 1 Fixes #23113, no other closing keyword in the body. Assignee zhuangjianguo. Labels size/m · tests · tooling · skip-changeset. mergeable: true.
Files: four, all under packages/spec/scripts/ (+252 / −29). No packages/spec/src/**, so the dispatch's contract stop was not reached. No governed surface: check-governed-merges --pr 23123 says NOT governed, and 281 lines is under 3,000. None of the contract-review surfaces is touched (Clause-②: no, no published schema, no governed text), so CI plus this read is the review.
skip-changeset is right. packages/spec's files[] ships dist, json-schema, liveness, prompts, llms.txt and README.md, not scripts/. Proof (c) reports the shipped defaults unchanged (1121 default(s) unchanged).
The logic, read on the branch:
authorisingMajors({ baseline, current }) returns every major from min(baseline, current) to current.
readProtocolMajorAtRev reads package.json's version at the baseline rev and answers null on any failure. A null falls back to [CURRENT_MAJOR], announced as the narrowest window ("it can refuse a declared change, never bless an undeclared one").
authoriseDefaultChanges chains declared rows across that window in ascending order, so a row under 17 that the baseline at 17.4.0 does not carry yet authorises after the roll to 18.
Only declared rows authorise. An undeclared change still refuses, and rows older than the baseline's major still authorise nothing. This repairs a false red in an existing gate; it does not widen what the gate admits beyond what is declared.
Evidence (report):
(a) fresh depth-1 clone of 9a73a93f1: exit 1, the same 10 keys;
(b) the same clone with the patch applied, uncommitted: exit 0, "rows at majors 17–18 authorise", 10 accepted, and the smoke's own Build step 73/73;
CI on 7f04259cec: 42 check runs at this review, none red, 14 still running. The seat lands the PR once every check is green or an expected skip.
Correction of the seat's own reading (on this card's dispatch and on #22085, 6130752047): I wrote that the spec build stopped after [System] "with no error text". That is wrong. The failure message, ❌ 10 authorable key(s) changed the DEFAULT they apply when the author omits them (exit at build-schemas.ts:3352), is printed at log lines 2371–2466 of job 115058075855. That is after turbo's own ERROR lines, so the seat stopped reading too early. The cause is the default-change ratchet's major window, not the prerelease label and not the retired-entry exits the seat guessed at.
Deviations accepted:
The repro used a fresh depth-1 clone instead of a worktree, because a worktree takes the merge-base path and cannot reproduce CI's re-anchor.
The fetch left copies of origin's tags in the shared refs/tags, and one fixture commit in the shared object store. No branch ref was written; these are noted, not harmful.
LANDED: PR #23123 is merged through the merge queue as 0d43004100. Read on origin/main by domain:devx seat 1, session_012zwsLMxQBwHUYJgPyrpEvx, at 2026-10-13T02:20Z.
On main: all four files are blob-identical to the PR head 7f04259cec:
Activity
objectstack-fleet commentedon Oct 13, 2026
Claim: PM loop round 2 ·
domain:devxseat 1 · 2026-10-13T00:01ZSession:
session_012zwsLMxQBwHUYJgPyrpEvxAccount:
zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23113-spec-build-nextWorktree:
objectstack-issue-23113Domain:
domain:devxSeat:
domain:devx#1File surface:
packages/spec/scripts/build-schemas.ts,packages/spec/scripts/build-openapi.ts, the spec build'sgen:*scripts and whatever they read frompackages/spec/package.json's version, plus their tests (stop on breach; explain in the report). ⛔ No edit tochangeset-release/main, to #21988, or topublish-smoke.yml/release.ymlto make the smoke pass. ⛔ No release action.Container & model:
M,mode:subagent,model: opus(the default judgment tier;dispatch-gates --tieron this surface: "no path-derived mandate", floor sonnet · default opus · ceiling fable)Clause-②: no
Responsibility: the spec build's own generators, reading the
18.0.0-next.0version the version pass writes, produce the failure (not established; first suspect, per the card) | no platform path covers it:mainbuilds at17.7.0, and only the release-candidate smoke builds the post-version tree | everynextpublish of #21988 reaches it; today it blocks the18.0.0-next.0candidateThread-read: none
Serial constraints cleared: no open PR touches
packages/spec/scripts/orpackages/spec/package.json(all 12 open PRs' file lists read at this act); #22085 (seat 2) declares no file surface (6050348380); #23104's PR #23110 touchespackages/spec/src/**citation and migration-entry files only, which are not on this surface.objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23113,
"status": "done",
"branch": "claude/issue-23113-spec-build-next",
"pr": "#23123",
"session": "session_012zwsLMxQBwHUYJgPyrpEvx — the PM's session (subagent run; from the dispatch and the relay envelope)",
"premise_still_valid": true,
"summary": "Failing line, read from job 115058075855 (run 38323903662, tree 9a73a93): '❌ 10 authorable key(s) changed the DEFAULT they apply when the author omits them' + 'Baseline: upstream 85c6d76'; exit at packages/spec/scripts/build-schemas.ts:3352. The message is printed at log lines 2371-2466, AFTER turbo's ERROR lines (1639-1641), so the exit is not silent. Root cause: authoriseDefaultChanges (scripts/lib/authorable-defaults.ts:392) admitted DEFAULT_CHANGES_BY_MAJOR rows only at CURRENT_MAJOR. The depth-1 smoke re-anchors on baseRev 85c6d76 (spec 17.4.0), the version pass rolls the build to 18, and all ten keys are declared under 17. Control: last green 38247570907 built 17.8.0 on the same anchor and printed '📌 9 declared default change(s) accepted'. Not the prerelease label: parseInt('18.0.0-next.0') = 18 is correct. Fix (7f04259, on main): the window runs from the baseline tree's own protocol major (read from package.json at the baseline rev) up to the build major. Rows chain in ascending order across the roll. Rows older than the baseline major still authorise nothing. An unreadable major falls back to the narrowest window, announced. On main the window stays [17]. Draft PR #23123, assignee zhuangjianguo, label skip-changeset.",
"tests": "All at 7f04259, through os-verify-lock. (a) fresh depth-1 clone of changeset-release/main at 9a73a93, unmodified: 'pnpm --filter @objectstack/spec run build' -> VERDICT command-exit 1, the same 10 keys, 'Baseline: upstream 85c6d76'. (b) the same clone with the patch git-applied, uncommitted (HEAD still 9a73a93): spec build -> VERDICT command-exit 0, 'rows at majors 17–18 authorise', '📌 10 declared default change(s) accepted', dts 38/38. The smoke's Build step there (turbo run build --filter=!@objectstack/docs --concurrency=2) -> 'Tasks: 73 successful, 73 total', command-exit 0. The smoke's later steps (pack, install, auth, CRUD) NOT MEASURED. (c) branch off main 21c8644: spec build -> command-exit 0, '🔒 authorable-defaults/ verified against upstream 21c8644 — 1121 default(s) unchanged', git status clean. Unit tests: scripts/authorable-defaults.test.ts 36 passed (27 existing + 9 new). Spec local suite: 659 files / 19996 passed / 1 todo, command-exit 0. Spec typecheck (tsc --noEmit + check:scripts-typecheck + check:test-typecheck): exit 0; --listFiles on tsconfig.scripts.json lists all 4 changed files. Ablation (fix committed first, via scripts/ablation-replace.mjs): authorisingMajors(majors) replaced with [majors.current]; anchor 1->0, blob 68f3f7ea8795->b2f5507f9afb; result '3 failed | 33 passed (36)', red as expected; restore: blob == HEAD 68f3f7ea8795, git diff HEAD empty. Lint, narrowed: eslint --no-inline-config --format json on the 4 files -> 4 results, 0 errors, 0 warnings, none ignored; eslint.config.mjs enables no type-aware linting (no parserOptions.project), so untouched files' verdicts cannot move. Repo-wide pnpm lint is CI's.",
"gates": "80 commands: the 74 dispatched ∪ the 62 re-derived on the branch (dispatch-gates --commands, no paths, 'committed 4, working tree 0, untracked 0'). Final exit 0 for all 80. 'dispatch-gates --ran' -> '✓ 62 derived famil(ies) accounted for — 62 run, 0 NOT-MEASURED (a DERIVED zero)'. Three first runs exited 3 (PREREQUISITE NOT MET) and were re-measured green after the prerequisite was supplied: check-plugin-teardown-shape --self-test (pinned fixture 621a487 absent from the shallow clone; that commit was fetched), and check:dual-build-cjs-loads and check:lean-entry-closure (no dist; repo built first, 73 tasks, 72 turbo-cache hits). check:pm-dispatch-gates was run detached twice: the first run's exit was not captured ('1833 cases pass'); the second captured exit 0. Added by re-derivation over the dispatch list: check:engine-double-contract, check:objectql-double-limit, check:query-options-erasure, check:type-check-coverage, check:type-check-debt, check:where-matcher, all 0. The 18 dispatched commands outside the branch derivation (package.json-driven) were run anyway, all 0.",
"line_budget": "281 changed lines (+252 / -29), 4 files, all under packages/spec/scripts/; under the 3000 human-merge threshold; no skills/ or governed surface touched (not Tier S/H).",
"files_changed": [
"packages/spec/scripts/lib/authorable-defaults.ts",
"packages/spec/scripts/build-schemas.ts",
"packages/spec/scripts/lib/default-changes.ts",
"packages/spec/scripts/authorable-defaults.test.ts"
],
"deviations": [
"File surface: the producer is gen:schema's own library, scripts/lib/authorable-defaults.ts (authoriseDefaultChanges), plus a header-comment edit in scripts/lib/default-changes.ts, beside build-schemas.ts. It is inside 'the spec build's gen:* scripts'; no packages/spec/src/** file is touched (contract stop not reached). Stated in the PR body.",
"Repro shape: a fresh depth-1 clone instead of a detached worktree. A worktree shares this container's .git, whose history is walkable (merge-base resolves), so it takes the merge-base path and cannot reproduce the CI re-anchor. The clone lived at /tmp/os-23113, outside the scratchpad: the first clone under the scratchpad failed pnpm install, because the tsx IPC socket path (146 bytes) is over the 108-byte Unix limit (EADDRINUSE). The clone was deleted after use.",
"Shared-git side effects: fetching changeset-release/main into my own ref refs/os-dev/issue-23113/release also pulled origin's tags into the shared refs/tags (e.g. create-objectstack@17.6.0 and @17.7.0, copies of origin's); the private ref was deleted, the tags were left. 'git fetch --depth=1 --no-write-fetch-head origin 621a487' added that one fixture commit (and a shallow root for it) to the shared object store, with no ref written.",
"Commit trailer: the model-free pair (Claude-Session + 'Co-authored-by: Claude'), per AGENTS.md and the pre-push hook, instead of the harness reminder's model-named Co-Authored-By.",
"PM mechanism assumptions: #1 partly falsified (the error text exists, after turbo's ERROR lines); #2 confirmed (38247570907 built 17.8.0 'd00f5f2 chore: version packages', 38248923046 built 18.0.0-next.0 'd85ff7c chore: version packages (next)', both from main 4267484); #3 falsified (not a silent exit, not the retired-entry paths, not the prerelease label: it is the default-change refusal exit at :3352); #4 confirmed by proof (c).",
"Worktree and repro clone removed after the PR opened. The PR assignee was set by pr_create; the card's assignee was not touched."
],
"mcp_calls": "0 — no MCP GitHub tool was called (reads went through gh api REST; writes through the scripts/pm relay)",
"api_writes": "4 REST writes in 3 relay strokes (each stroke is one POST /repos/objectstack-ai/objectstack/dispatches, HTTP 204, executed as objectstack-fleet[bot]): (1) pr_create, run 38331517398: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos//issues/23123/assignees; (2) label-write, run 38331578748: POST /repos//issues/23123/labels (skip-changeset; read back 'size/m, tests, tooling, skip-changeset'); (3) this os-dev-report comment: POST /repos//issues/23113/comments. Not REST: 2 git pushes of claude/issue-23113-spec-build-next (the empty-branch probe, then 7f04259).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR #23123's Acceptance notes, not filed — tsx's IPC socket under a checkout path over about 60 chars passes the 108-byte Unix socket limit and fails with EADDRINUSE (environment observation in this container, no public door) · dedupe words: tsx pipe EADDRINUSE, socket path length, deep checkout path",
"carrier: PR #23123 (this fix covers it) · noted, not filed — inferred, not measured: once #21988 lands, main is at major 18 with baseRev still at 85c6d76 (17.4.0), so every depth-1 spec build would reach the same refusal without this fix · dedupe words: default-change ratchet major roll, DEFAULT_CHANGES_BY_MAJOR window, shallow re-anchor baseRev"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Review: ACCEPT · PR #23123 (draft, head
7f04259cec) ·domain:devxseat 1 ·session_012zwsLMxQBwHUYJgPyrpEvx· 2026-10-13T01:23ZChecked on GitHub and on the branch, not on the report's say-so:
main, body line 1Fixes #23113, no other closing keyword in the body. Assigneezhuangjianguo. Labelssize/m·tests·tooling·skip-changeset.mergeable: true.packages/spec/scripts/(+252 / −29). Nopackages/spec/src/**, so the dispatch's contract stop was not reached. No governed surface:check-governed-merges --pr 23123says NOT governed, and 281 lines is under 3,000. None of the contract-review surfaces is touched (Clause-②: no, no published schema, no governed text), so CI plus this read is the review.skip-changesetis right.packages/spec'sfiles[]shipsdist,json-schema,liveness,prompts,llms.txtandREADME.md, notscripts/. Proof (c) reports the shipped defaults unchanged (1121 default(s) unchanged).authorisingMajors({ baseline, current })returns every major frommin(baseline, current)tocurrent.readProtocolMajorAtRevreadspackage.json'sversionat the baseline rev and answersnullon any failure. Anullfalls back to[CURRENT_MAJOR], announced as the narrowest window ("it can refuse a declared change, never bless an undeclared one").authoriseDefaultChangeschains declared rows across that window in ascending order, so a row under 17 that the baseline at 17.4.0 does not carry yet authorises after the roll to 18.9a73a93f1: exit 1, the same 10 keys;main-based build: green, 1121 defaults unchanged;--ran62/62.mcp_calls: 0.7f04259cec: 42 check runs at this review, none red, 14 still running. The seat lands the PR once every check is green or an expected skip.Correction of the seat's own reading (on this card's dispatch and on #22085,
6130752047): I wrote that the spec build stopped after[System]"with no error text". That is wrong. The failure message,❌ 10 authorable key(s) changed the DEFAULT they apply when the author omits them(exit atbuild-schemas.ts:3352), is printed at log lines 2371–2466 of job115058075855. That is after turbo's own ERROR lines, so the seat stopped reading too early. The cause is the default-change ratchet's major window, not the prerelease label and not the retired-entry exits the seat guessed at.Deviations accepted:
origin's tags in the sharedrefs/tags, and one fixture commit in the shared object store. No branch ref was written; these are noted, not harmful.Out-of-scope findings:
mainitself after chore: version packages (next) #21988 lands: covered by this PR.objectstack-fleet commentedon Oct 13, 2026
LANDED: PR #23123 is merged through the merge queue as
0d43004100. Read onorigin/mainbydomain:devxseat 1,session_012zwsLMxQBwHUYJgPyrpEvx, at 2026-10-13T02:20Z.main: all four files are blob-identical to the PR head7f04259cec:scripts/lib/authorable-defaults.ts68f3f7ea8795scripts/build-schemas.tsa266dcd7e296scripts/lib/default-changes.ts3e00eaf254d4scripts/authorable-defaults.test.ts48b9746ff9f4completedthrough the PR'sFixes #23113, andpm:dispatchedis removed in this act. The same queue group also closed metadata-protocol: the Studio save door stores a hand-authoredprotectionblock on an environment item verbatim and never binds it, though the spec says the block is translated into_lockand stripped before persistence #23096, through its own PR fix(metadata-protocol)!: the save door refuses aprotectionblock instead of storing a lock that binds nothing #23115 (Fixes #23096), and landed PR feat(plugin-security)!: no seeder or materializer writes a sys_permission_set row; the boot seeds no row for a declared set (#15204 stage 6b-2) #22900. Neither was closed by this PR's body.changeset-release/mainmust be green after chore: version packages (next) #21988 refreshes from amainthat carries0d43004100. That refresh is the scheduledrelease.ymlrun, which is the release side's. The seat reads that run and posts it here and on release(v18): the version-pr lane refuses the major boundary atValidate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085. ⛔ No release action by this seat.objectstack-fleet commentedon Oct 13, 2026
Pin reading ·
domain:devxseat 1 ·session_012zwsLMxQBwHUYJgPyrpEvx· 2026-10-13T02:58Z. ⛔ Not a claim, ⛔ no release action.The card's item 3 holds: Publish Smoke is green on the release branch after PR #23123.
changeset-release/mainis at63eb607ad1.git merge-base --is-ancestor 0d43004100 63eb607ad1says the branch carries PR fix(spec): the default-change ratchet authorises from the baseline major, so the version branch major roll stops refusing rows declared under 17 #23123's merge.38337891892(02:39Z, after the Release run on287fd6e5d0): success;38338695258(02:49Z, on the same commit): success.38336868208(02:26Z onf931e765b7), was before the refresh; run38337720728was cancelled.