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-verify-npm: the 15-minute read-back budget is shorter than the 18.0.0 publish took to settle (@objectstack/console, 42 MB, readable at +16m22s), so a complete publish read red and skipped its Releases, D4 asset and image #24888
Filing gate ③: a task the maintainer set. The maintainer asked 「如何避免类似的问题」 about the 18.0.0 publish run, then answered 「立卡」 to triage's proposal. Filed by the triage seat (#6015, session_01AavokzJ5DndAwitDXvKy4U). ⛔ Not a claim.
Reader (who acts): the domain:devx seat, in one PR on scripts/release-verify-npm.mjs and its self-test. ⛔ No workflow edit, no new gate, no second publish lane.
Measured (Release run 39421537775, job 118624531794, version commit 06cab4849a)
The verify window: step 21 pushed the 73 tags, then verification started at 12:41:37Z ("Verifying 73 published package(s) … up to 900s"). The budget was spent at 12:57:38Z with 1 of 73 still unreadable: @objectstack/console@18.0.0, whose dist is "42424 KB".
The package did arrive: the registry's time for @objectstack/console18.0.0 is 12:57:59.327Z, 21 s after the budget ran out and 16m22s after the first read. All 73 are now on npm, and latest = 18.0.0.
What the false red cost:
step 22 (Create GitHub Releases), step 23 (attach spec-changes.json, ADR-0087 D4) and the Docker image job were skipped;
the next landing's Release integrity backfill (run 39426677839, at 13:02–13:07Z) created them;
the maintainer's force: true repair dispatch (run 39427630088) was spent for nothing, and was then refused by the release gate on the hourly red (hourly full run: red on main (CI) #24879).
Where the budget comes from:RETRY_BUDGET_MS = 15 * 60 * 1000 (:286). The header (:43–55) derives it from 17.3.0's measured spread, 7m07s, doubled. 18.0.0 is the first measurement past that: its spread was 16m22s, driven by one large tarball.
Done when
The budget is re-derived from the 18.0.0 reading and the header records it. The script's maintainer picks one of:
a flat budget that covers 16m22s with the same margin as before;
a budget that scales with each package's packed size, so the 42 MB console tarball gets its own allowance.
It still fails closed: a package absent after the budget exits non-zero and is named. ⛔ No downgrade to a warning, no || true.
The self-test covers a package that becomes readable after the old 900 s and before the new budget, plus the absent case.
Dedupe
objectstack issues and PRs updated since 2026-09-20 were grepped for RETRY_BUDGET, release-verify-npm and "readable on npm". The only hit is PR #24470 (closed, console-dist cache key), which is unrelated. The script's own origin, the 17.3.0 race, is recorded in release.yml at about :2070–2090. New.
Claim: PM loop round 30 · a p2 domain:devx card the maintainer set (「立卡」), release tooling before the next publish; serial dispatch under the maintainer's 「串行派发」
Session: session_01FM29ZqLTrnPNXxijioZwMp
Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-24888-verify-npm-budget
Worktree: objectstack-issue-24888
Domain: domain:devx
Seat: domain:devx#1
File surface: scripts/release-verify-npm.mjs and its self-test.
The read-back budget is re-derived from the 18.0.0 reading, with the derivation in the header.
It still fails closed: an absent package exits non-zero and is named.
The self-test covers a package readable after the old 900 s but before the new budget, and the absent case.
⛔ No workflow edit (.github/workflows/** is governed); the new budget must fit inside the calling step's and job's existing timeouts. ⛔ No new gate, no second publish lane, no downgrade to a warning. ⛔ No release act. Stop on breach and explain.
Container & model: S (one budget constant, or a per-package allowance, plus its self-test cases), mode:subagent, model: TIER_DEFAULT
Clause-②: no
Responsibility: the 18.0.0 publish read red because @objectstack/console (42 MB) became readable at +16m22s, past the 15-minute budget, so its Releases, D4 asset and image were skipped (#24888) | the next landing's Release integrity backfill | every publish from the 18.1.0 Version Packages PR #24876 on
Thread-read: none
Serial constraints cleared: no open PR touches scripts/release-verify-npm*, and no live Claim: names it (read at 2026-10-20T21:29Z). No dev of this session is in flight: #24928's dev has reported, and its PR #24982 is queued.
os-dev-report
{
"issue": 24888,
"status": "done",
"branch": "claude/issue-24888-verify-npm-budget",
"pr": "#24989",
"session": "session_01FM29ZqLTrnPNXxijioZwMp — this run's harness-stamped id (subagent = parent's)",
"premise_still_valid": true,
"summary": "RETRY_BUDGET_MS in scripts/release-verify-npm.mjs is re-derived from the 18.0.0 reading: the 17.3.0 margin (900 s / 427 s = 2.11x) over the 18.0.0 spread (12:41:37Z to 12:57:59.327Z = 982.3 s) gives 2070 s, rounded up to 35 minutes (2100 s, 2.14x). The header records it next to the 17.3.0 derivation. The shape is a FLAT budget. The deciding axis is actual business need (实际业务需求), measured: on 18.0.0 spec's tarball is the largest (42,118,133 B packed) and was readable at +10m04s, six minutes BEFORE console (9,399,458 B packed). 17.5.0 had the reverse order and 17.3.0 ended on runtime, so a size scale points the wrong way. It still fails closed. main() now takes the verifier's own probe/sleep seams (production defaults) so the self-test pins its exit code. Premise holds on the core claim (15 min shorter than a 16m22s spread). Two corrections to the card: (1) console's packed tarball is 9.4 MB, not 42 MB; the card's 42424 KB sits in the job log, and the largest tarball is spec's. (2) The 12:41:37Z start could not be re-read, because the job-log download redirects to a blob host this container's proxy refuses (403 policy, not retried). It is corroborated by step 21 ending 12:57:38Z after 900 s of waits (start at or before 12:42:38Z) and by 408 replayed probes (~150 ms each). No workflow edited, no release act, no new gate. Cleanup: the worktree's node_modules was removed before this report was posted, and the worktree itself right after (git worktree remove, no --force).",
"tests": "node scripts/release-verify-npm.mjs --self-test: EXIT=0, 'OK release-verify-npm self-test: 131 cases pass across 14 batteries' (BASE 0603bfa: 115 cases across 13). New: battery 1 +2 cases (outlasts the 16m22s spread; keeps the 2.11x margin). Battery 14 (14 cases) replays npm's time for sdui-parser/cli/spec/console on a sleep-driven clock with no real sleeps. Old 900 s (as a parameter) reds naming only console after 19 rounds over 900 s. The production default goes green on the first round after console landed, at +17m15s. main() over a fixture workspace exits 0 with ::notice::. With console absent, main() exits 1 with an ::error:: line naming @objectstack/console@18.0.0 and 1 of 4, names none of the landed three, and only after waits sum to RETRY_BUDGET_MS. Size-scaled large/small case: not applicable (no per-package allowance). Ablation, fix committed first at a9e6157: node scripts/ablation-replace.mjs wrap mode, '35 * 60 * 1000' replaced by '15 * 60 * 1000'. Landed: anchor x1 to x0, replacement x0 to x1, blob 7f259d67ff62 to c36e8cf51a07. Self-test then SELFTEST_EXIT=1, '8 of 131 case(s) failed', exactly the after-900 s cases (battery 1 x2, battery 14 production-budget x4, main() pass x2). The old-budget and absent cases stayed green (the expected direction). Restore proven: blob after restore == HEAD blob 7f259d67ff62, git diff HEAD empty, git status --porcelain empty. No package touched: no build closure, no package test/typecheck owed.",
"gates": "Local at a9e6157: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 33 commands (one path, +198/-19). All 33 ran with exit codes captured before any pipe, every one exit 0, including pnpm check:pm-dispatch-gates (fast tier 1913 cases, 273.8 s), pnpm check:nul-bytes, node scripts/release-verify-npm.mjs --self-test. --ran reconciliation: RAN_EXIT=0, '33 derived, 33 run, 0 NOT-MEASURED, 0 UNRUN'. Extra: npx eslint --no-inline-config scripts/release-verify-npm.mjs exit 0. git merge-tree --write-tree origin/main HEAD (origin/main 78ab647) exit 0; the commits since BASE touch none of the script, release-github-releases.mjs, workspace-enumerator.mjs or release.yml. CI check-runs on a9e6157 at report time: success = Check Changeset, Governed Surface Queue Guard, Type Check · workspace, Type Check · debt ledger, Test Core (4/6), Test Core (6/6), Check PR Size, Check Documentation Links, Dogfood Regression Gate, Auto Label, 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. in_progress = Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · scoped · tooling self-tests, Lint · scoped · slot lookup & corpus, Lint · scoped · query-options erasure, Type Check · source gates, Type Check · consumer gates, Test Core (1/6, 2/6, 3/6, 5/6). Not waited on, per contract.",
"mcp_calls": "0 — no MCP GitHub tool used, read or write",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches x2 through scripts/pm/ (fleet relay, as objectstack-fleet[bot]). Stroke 1 (run 39504541363, success) was pr_create via fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /issues/24989/assignees [os-warren] + POST /issues/24989/labels [skip-changeset]. Read back by REST: draft true, assignees [os-warren], labels [skip-changeset], body 11571 chars identical to the sent file through its footer. Stroke 2 is this comment via post-stamped.mjs: POST /repos//issues/24888/comments. Plus git push x2 (empty-branch probe, then a9e6157), not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed: .github/workflows/release.yml comments at :2077-2080 ('retries with bounded backoff for 15 minutes, derived from ... 7m07s') and :1236 ('instead of waited on for 15 minutes') now read stale against the 35-minute budget. Governed surface, so not edited; it is in the PR's Acceptance notes. A comment-only governed edit is the PM's to route if wanted.",
"carrier: none (承接者:无) · noted, not filed: pre-existing. With every registry request hanging to REQUEST_TIMEOUT_MS (15 s), each round costs 73 x 15 s = 18m15s, so verification exceeds GitHub's 360-minute job default at the old 19 rounds (347 min of probing) and at the new 39 (712 min). The job is cancelled red (fails closed) but unnamed. The outcome is identical before and after. This is an inference from the constants, not reproduced; it is in Acceptance notes."
]
}
PR #24989 merged at 2026-10-20T22:30Z as e4d604efd3 (ACCEPT 6302863542; not governed; Fixes #24888)
origin/main, by content
scripts/release-verify-npm.mjs is byte-identical to the head a9e61579a3
State change: PR #24989 closed this card through Fixes #24888 (completed). pm:dispatched comes off in this act.
RETRY_BUDGET_MS is now 35 minutes, flat. It is derived from the 18.0.0 spread (16m22s) at 17.3.0's 2.11x margin, and it still fails closed. The first publish that reads under it is the next one; this seat reads that run's verify step when it happens.
Left as noted, a governed comment-only edit for the maintainer to route if wanted: release.yml:1236 and :2077–2080 still say "15 minutes".
Activity
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 30 · a p2
domain:devxcard the maintainer set (「立卡」), release tooling before the next publish; serial dispatch under the maintainer's 「串行派发」Session:
session_01FM29ZqLTrnPNXxijioZwMpAccount:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-24888-verify-npm-budgetWorktree:
objectstack-issue-24888Domain:
domain:devxSeat:
domain:devx#1File surface:
scripts/release-verify-npm.mjsand its self-test.⛔ No workflow edit (
.github/workflows/**is governed); the new budget must fit inside the calling step's and job's existing timeouts. ⛔ No new gate, no second publish lane, no downgrade to a warning. ⛔ No release act. Stop on breach and explain.Container & model:
S (one budget constant, or a per-package allowance, plus its self-test cases),mode:subagent,model: TIER_DEFAULTClause-②: no
Responsibility:
the 18.0.0 publish read red because @objectstack/console (42 MB) became readable at +16m22s, past the 15-minute budget, so its Releases, D4 asset and image were skipped (#24888)|the next landing's Release integrity backfill|every publish from the 18.1.0 Version Packages PR #24876 onThread-read: none
Serial constraints cleared: no open PR touches
scripts/release-verify-npm*, and no liveClaim:names it (read at 2026-10-20T21:29Z). No dev of this session is in flight: #24928's dev has reported, and its PR #24982 is queued.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{
"issue": 24888,
"status": "done",
"branch": "claude/issue-24888-verify-npm-budget",
"pr": "#24989",
"session": "session_01FM29ZqLTrnPNXxijioZwMp — this run's harness-stamped id (subagent = parent's)",
"premise_still_valid": true,
"summary": "RETRY_BUDGET_MS in scripts/release-verify-npm.mjs is re-derived from the 18.0.0 reading: the 17.3.0 margin (900 s / 427 s = 2.11x) over the 18.0.0 spread (12:41:37Z to 12:57:59.327Z = 982.3 s) gives 2070 s, rounded up to 35 minutes (2100 s, 2.14x). The header records it next to the 17.3.0 derivation. The shape is a FLAT budget. The deciding axis is actual business need (实际业务需求), measured: on 18.0.0 spec's tarball is the largest (42,118,133 B packed) and was readable at +10m04s, six minutes BEFORE console (9,399,458 B packed). 17.5.0 had the reverse order and 17.3.0 ended on runtime, so a size scale points the wrong way. It still fails closed. main() now takes the verifier's own probe/sleep seams (production defaults) so the self-test pins its exit code. Premise holds on the core claim (15 min shorter than a 16m22s spread). Two corrections to the card: (1) console's packed tarball is 9.4 MB, not 42 MB; the card's 42424 KB sits in the job log, and the largest tarball is spec's. (2) The 12:41:37Z start could not be re-read, because the job-log download redirects to a blob host this container's proxy refuses (403 policy, not retried). It is corroborated by step 21 ending 12:57:38Z after 900 s of waits (start at or before 12:42:38Z) and by 408 replayed probes (~150 ms each). No workflow edited, no release act, no new gate. Cleanup: the worktree's node_modules was removed before this report was posted, and the worktree itself right after (git worktree remove, no --force).",
"tests": "node scripts/release-verify-npm.mjs --self-test: EXIT=0, 'OK release-verify-npm self-test: 131 cases pass across 14 batteries' (BASE 0603bfa: 115 cases across 13). New: battery 1 +2 cases (outlasts the 16m22s spread; keeps the 2.11x margin). Battery 14 (14 cases) replays npm's time for sdui-parser/cli/spec/console on a sleep-driven clock with no real sleeps. Old 900 s (as a parameter) reds naming only console after 19 rounds over 900 s. The production default goes green on the first round after console landed, at +17m15s. main() over a fixture workspace exits 0 with ::notice::. With console absent, main() exits 1 with an ::error:: line naming @objectstack/console@18.0.0 and 1 of 4, names none of the landed three, and only after waits sum to RETRY_BUDGET_MS. Size-scaled large/small case: not applicable (no per-package allowance). Ablation, fix committed first at a9e6157: node scripts/ablation-replace.mjs wrap mode, '35 * 60 * 1000' replaced by '15 * 60 * 1000'. Landed: anchor x1 to x0, replacement x0 to x1, blob 7f259d67ff62 to c36e8cf51a07. Self-test then SELFTEST_EXIT=1, '8 of 131 case(s) failed', exactly the after-900 s cases (battery 1 x2, battery 14 production-budget x4, main() pass x2). The old-budget and absent cases stayed green (the expected direction). Restore proven: blob after restore == HEAD blob 7f259d67ff62, git diff HEAD empty, git status --porcelain empty. No package touched: no build closure, no package test/typecheck owed.",
"gates": "Local at a9e6157: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 33 commands (one path, +198/-19). All 33 ran with exit codes captured before any pipe, every one exit 0, including pnpm check:pm-dispatch-gates (fast tier 1913 cases, 273.8 s), pnpm check:nul-bytes, node scripts/release-verify-npm.mjs --self-test. --ran reconciliation: RAN_EXIT=0, '33 derived, 33 run, 0 NOT-MEASURED, 0 UNRUN'. Extra: npx eslint --no-inline-config scripts/release-verify-npm.mjs exit 0. git merge-tree --write-tree origin/main HEAD (origin/main 78ab647) exit 0; the commits since BASE touch none of the script, release-github-releases.mjs, workspace-enumerator.mjs or release.yml. CI check-runs on a9e6157 at report time: success = Check Changeset, Governed Surface Queue Guard, Type Check · workspace, Type Check · debt ledger, Test Core (4/6), Test Core (6/6), Check PR Size, Check Documentation Links, Dogfood Regression Gate, Auto Label, 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. in_progress = Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · scoped · tooling self-tests, Lint · scoped · slot lookup & corpus, Lint · scoped · query-options erasure, Type Check · source gates, Type Check · consumer gates, Test Core (1/6, 2/6, 3/6, 5/6). Not waited on, per contract.",
"mcp_calls": "0 — no MCP GitHub tool used, read or write",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches x2 through scripts/pm/ (fleet relay, as objectstack-fleet[bot]). Stroke 1 (run 39504541363, success) was pr_create via fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /issues/24989/assignees [os-warren] + POST /issues/24989/labels [skip-changeset]. Read back by REST: draft true, assignees [os-warren], labels [skip-changeset], body 11571 chars identical to the sent file through its footer. Stroke 2 is this comment via post-stamped.mjs: POST /repos//issues/24888/comments. Plus git push x2 (empty-branch probe, then a9e6157), not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed: .github/workflows/release.yml comments at :2077-2080 ('retries with bounded backoff for 15 minutes, derived from ... 7m07s') and :1236 ('instead of waited on for 15 minutes') now read stale against the 35-minute budget. Governed surface, so not edited; it is in the PR's Acceptance notes. A comment-only governed edit is the PM's to route if wanted.",
"carrier: none (承接者:无) · noted, not filed: pre-existing. With every registry request hanging to REQUEST_TIMEOUT_MS (15 s), each round costs 73 x 15 s = 18m15s, so verification exceeds GitHub's 360-minute job default at the old 19 rounds (347 min of probing) and at the new 39 (712 min). The job is cancelled red (fails closed) but unnamed. The outcome is identical before and after. This is an inference from the constants, not reproduced; it is in Acceptance notes."
]
}
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:devxseat 1 ·session_01FM29ZqLTrnPNXxijioZwMp· 2026-10-20T22:31Ze4d604efd3(ACCEPT6302863542; not governed;Fixes #24888)origin/main, by contentscripts/release-verify-npm.mjsis byte-identical to the heada9e61579a3State change: PR #24989 closed this card through
Fixes #24888(completed).pm:dispatchedcomes off in this act.RETRY_BUDGET_MSis now 35 minutes, flat. It is derived from the 18.0.0 spread (16m22s) at 17.3.0's 2.11x margin, and it still fails closed. The first publish that reads under it is the next one; this seat reads that run's verify step when it happens.Left as noted, a governed comment-only edit for the maintainer to route if wanted:
release.yml:1236and:2077–2080still say "15 minutes".Generated by Claude Code