Skip to content

chore(ci): refresh the Test Core shard-timings dataset - #20388

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
claude/shard-timings-refresh-36380128221
Open

github-actions[bot] wants to merge 1 commit into
mainfrom
claude/shard-timings-refresh-36380128221

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Refreshes scripts/test-shard-timings.json, the balancing input for the Test Core
shard split. Opened automatically by .github/workflows/shard-timings-refresh.yml.
Every byte came out of scripts/measure-test-shard-timings.mjs; nothing here was
hand-edited, and no bound, timeout or matrix entry was touched.

Source

Measured across 1 accumulated run(s) of the HOURLY schedule run of CI on
main — the full-battery run (#16467). A push run on main is affected-only and
is not a measurement of the workspace, so no push run feeds this file.

No single green run measures the whole workspace either — turbo's cache is namespaced
per shard and only main pushes write it, so a
package whose inputs have not changed is a HIT and the generator refuses hits rather
than recording a replay as a duration. Runs are therefore accumulated, each fenced by
its own --run group, until every package the committed dataset holds is measured
again; a package seen in several of them gets the median of those observations.

  • https://github.com/objectstack-ai/objectstack/actions/runs/36380128221

  • Newest run in the set: 36380128221, commit eee0974236c87a7232f9805a19b6e53e3e36da59 — the date this refresh carries.

  • Every run above had all six Test Core (N/6) jobs conclude success with its six
    run-summary artifacts still retained; runs that were cancelled, failed or had lost
    their artifacts were rejected by name in the log before any of these were used.

All 72 package weights were measured in these runs; nothing was carried.

⚠️ This PR references #16173 and #16222 but does NOT carry a closing keyword for them,
because a weekly lane cannot know which cards a given run ought to retire. If this is
the first refresh to land, retire those two by hand as part of merging it.

Measured per-shard suite time on the newest run in the set

1: 1023s  |  2: 757s  |  3: 957s  |  4: 728s  |  5: 728s  |  6: 619s

Predicted bins, before and after

BEFORE  partition-test-shards: self-test OK (70 measured packages -> 71 shard items, 6 shards, max/mean 1.00x <= 1.3x, floor 404s, bins 666/666/666/667/666/666s)
AFTER   file:///home/runner/work/objectstack/objectstack/scripts/partition-test-shards.mjs:967
        throw new Error(
              ^

Error: slice derivation: UNSLICED, @objectstack/cli at 1231.52s is 1391s against a 1321s mean and now fits under 1.3x on its own, so the two cases above no longer prove the slicing is what satisfies the bound. Re-derive the slice count (or retire it) instead of leaving a pin that cannot fail.
    at file:///home/runner/work/objectstack/objectstack/scripts/partition-test-shards.mjs:967:15
    at check (file:///home/runner/work/objectstack/objectstack/scripts/partition-test-shards.mjs:694:5)
    at selfTest (file:///home/runner/work/objectstack/objectstack/scripts/partition-test-shards.mjs:965:5)
    at main (file:///home/runner/work/objectstack/objectstack/scripts/partition-test-shards.mjs:1513:9)
    at file:///home/runner/work/objectstack/objectstack/scripts/partition-test-shards.mjs:1579:3
    at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
    at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)
    at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)

Node.js v22.23.2

The partitioner's own pins RED on this refresh — read this before merging

This is the designed behaviour, not a defect in the refresh: the acceptance bound is
a ratio, and a package that has grown past what any six-way split can bin makes the
pins fail with the arithmetic in the message. The remedy the partitioner names is to
raise the file-level slice count for that package — ⛔ never to raise the bound, and
⛔ never to hand-edit this dataset. This workflow deliberately does neither: it
reports and stops, because both are decisions.

No checks will start on this PR by themselves

It was opened with the Actions GITHUB_TOKEN, and GitHub's recursion guard means a
PR opened that way triggers no workflow runs. Push any commit to the branch, or close
and reopen the PR, to start CI.

Refs #16464, #16173, #16222.

Regenerated by .github/workflows/shard-timings-refresh.yml from the test-core-run-summary artifacts of 1 accumulated run(s) (36380128221), newest 36380128221 at eee0974. Generated, never hand-edited.
@objectstack-fleet

Copy link
Copy Markdown
Contributor

Claim: PM loop round 1
Session: session_01HRYqpqGcWpJuJkDmbRF75w
Account: os-sales
Branch: claude/issue-20388-cli-slice-pins
Worktree: objectstack-issue-20388
Domain: domain:devx
Seat: domain:devx#2
File surface: scripts/partition-test-shards.mjs only, i.e. its self-test slice pins and, if the re-derivation needs it, FILE_SHARDED_PACKAGES. ⛔ Not scripts/test-shard-timings.json (this PR's generated dataset stays byte-identical), ⛔ not .github/workflows/ci.yml (the drift-step wiring is #16465). Stop on breach and explain in the report.
Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier printed no path-derived mandate for this surface)
Clause-②: no
Thread-read: none
Serial constraints cleared: no open PR other than this one touches scripts/partition-test-shards.mjs, scripts/test-shard-timings.json or .github/workflows/ci.yml (4 open PRs, all file lists read); no in-flight claim in the lane; #16465 and #16468 wait behind this PR on the same files.

Why a seat claims a bot PR. The maintainer approved this PR and armed auto-merge on it (2026-09-30T05:51Z, os-zhuang); that state is theirs and this claim does not touch it. What has no owner is the remedy that lets it go green. This PR is the blocker named by Blocked-by: #20388 on #16465; #16468 waits on it too. It cannot land as it stands: by its own body, partition-test-shards.mjs --self-test reds on this dataset at the slice-derivation counterfactual ("UNSLICED, @objectstack/cli … now fits under 1.3x on its own … Re-derive the slice count (or retire it)"), and no CI has run on it (opened with GITHUB_TOKEN). No card or person owns that remedy, so the blocked lane seat takes it (execution-duties.md: an ownerless blocker is claimed and done by the seat it blocks).

How it lands. The dev opens a separate draft PR from the branch above that re-derives the pins so the self-test passes on both datasets: the one on main and this PR's. Once that merges, this seat reviews this PR's dataset diff, then merges main into it (update-branch). The merge also starts its CI, and on green the auto-merge the maintainer armed takes it into the queue. This PR's dataset is not edited by hand at any point.

Stamp: 2026-10-02T22:01Z · read against origin/main 49524f6906, this PR's head 8d60ae8676


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor

os-dev-report
{
"issue": 20388,
"status": "done",
"branch": "claude/issue-20388-cli-slice-pins",
"pr": "#21487",
"session": "session_01HRYqpqGcWpJuJkDmbRF75w (subagent of the dispatching PM session; harness-stamped id in the commit's Claude-Session trailer)",
"premise_still_valid": true,
"summary": "Retired the CLI's file-level slicing (FILE_SHARDED_PACKAGES emptied, mechanism kept) because the partitioner's own derivation gives n = 1 on #20388's dataset: K / R / R-worst = 1.124x / 1.124x / 1.053x, all inside 1.3x, with spec (1391.38s) the heaviest item in every case. Pin 3c now refuses any slice count that n - 1 could replace (sliceCountProblems, 5 fixtures plus the live case), and pin 3b also grades a cut of the heaviest package, so it is not vacuous. The mechanism's pins read a fixture map through new optional sliced parameters on sliceCountFor, weighItems and driftReport. Pin 6's inversion pair, which had flipped in the refresh (example-todo 35.30s vs core 57.09s, a second red masked behind 3c's), is now plugin-pinyin-search over sdui-parser, with a guard on the dataset's order. The self-test passes on both datasets at c614a09. measure-test-shard-timings.mjs's live-map case was rewritten too, because its unedited self-test exits 1 under an empty map.",
"decision": {
"choice": "retire (empty map, mechanism kept)",
"readings_on_20388_dataset": {
"K_cli_sliced_2": "bins 1391/1208/1208/1207/1208/1208s, max/mean 1.124x, heaviest spec 1391s, meets",
"R_cli_whole_733.33s": "bins 1391/1208/1206/1208/1208/1208s, max/mean 1.124x, heaviest spec 1391s, meets",
"R_worst_cli_whole_1231.52s": "bins 1391/1308/1307/1307/1308/1307s, max/mean 1.053x, heaviest spec 1391s, meets",
"cli_whole_breach_point": "C ≤ (1.3/6)(6696.67 + C) holds until about 1852s, 1.5x the worst reading"
},
"readings_on_main_dataset": "K 1.000x; R 1.001x (heaviest cli 458s); R-worst 1.549x BREACH (the old bridge, only on the stale dataset)",
"four_axes": "need: slicing moves no bin maximum on the refreshed data and costs a duplicated closure build plus a sequential slice leg on two shards (run 36380128221: closure step 6m15s on 5/6 and 6m43s on 6/6; 5/6 was the longest job at 19m23s) / long-term: keeping 2 leaves a count no failing pin can justify / AI-error: the new 3c reds on an over-sliced count / startup focus: no new gate, and the retirement is immediate",
"interim_model": "between this merge and #20388's, main splits on stale weights with the CLI whole. Costed at #20388's weights, the heaviest bin stays spec's (1775s sliced vs 1773s whole); the CLI's bin is 1116s at 733.33s or 1614s at 1231.52s"
},
"premise_checks": {
"A1": "holds on aa46322 (map {cli:2}; 3b prose 1231.52s/800.7s; 3c CLI_MEASURED = 1231.52)",
"A2": "reproduced on aa46322 with #20388's blob 84342b45 overlaid: exit 1 at partitioner line 1075 (967 in the PR body), the same message. The message mislabels spec's 1391s as the CLI's",
"A3": "main 70 pkgs 3997.47s, cli 458.15, spec 403.65; #20388 72 pkgs 7430.00s, measuredAt 2026-09-28, runs [36380128221], spec 1391.38, cli 733.33; new packages are organizations and vitest-filter-preflight; the package set equals the workspace minus dogfood",
"A4": "well-formed: today's generator writes identical keys and byte-identical note/mergeRule/refresh strings, and accepts the file as --merge-into; skippedAsCached, skippedIncompleteSlices and carriedOver are empty; cli is a two-slice sum from one run; the 09-28 passthrough carrier is still read (sliceOfCliArguments). NOT MEASURED: byte-level regeneration, reason: the run's summary artifacts are no longer retained"
},
"files_changed": [
"scripts/partition-test-shards.mjs (+ map retired, sliceCountProblems/meetsBound, optional sliced params, pins 3b/3c/6 and the slice-items and wiring batteries rewritten, floors 21 to 25 and 9 to 11)",
"scripts/measure-test-shard-timings.mjs (live-map case rewritten for either map state; one stale comment parenthetical dropped) -- outside the claimed surface: the unedited file's self-test exits 1 under the empty map (measured)"
],
"gates": "head c614a09; dispatch-gates --commands (2 paths from git) derived 32 families; all 32 exit 0; --ran reconciliation: 32 derived, 32 run, 0 NOT-MEASURED, 0 UNRUN. Plus report-test-timings --self-test exit 0. The 32: check-ci-filter-parity 0, check-closing-keyword-parity 0 / --self-test 0, check-comment-mask-corpus 0, check-declaration-mirrors 0 / --self-test 0, check-scripts-symbol-anchors 0 / --self-test 0, check-self-test-wired 0 / --self-test 0, check-self-test-workflow-commands 0 / --self-test 0, check-whole-set-label-write 0 / --self-test 0, select-shard-timings-run --self-test 0, measure-test-shard-timings --self-test 0, partition-test-shards --self-test 0, bare-root-worklist --self-test 0, check:agent-test-spelling 0, check:bash32-floor 0, check:cli-command-ids 0, check:cross-package-test-inputs 0, check:driver-memory-census 0, check:entry-guard 0, check:gitlink-declared 0, check:nul-bytes 0, check:parse-guard 0, check:pm-dispatch-gates 0 (1976 cases, 1000.4s), check:pnpm-filter-targets 0, check:ratchet-remedy-authority 0, check:refd-timer-probe 0, check:watch-hint-literal 0. Lint narrowed and proven: eslint --format json reports 2 files, 0 errors / 0 warnings, none ignored; print-config shows 2 per-file rules and no parserOptions.project/projectService, so no untouched file's verdict can move. CI on the PR: in_progress at report time.",
"tests": "partition-test-shards --self-test at c614a09: main dataset exit 0 'self-test OK (70 measured packages -> 70 shard items, 6 shards, max/mean 1.00x ... floor 458s, bins 666/666/667/667/667/666s, file-level slices: none)'; #20388 dataset (blob 84342b45, unstaged overlay in a second worktree, never committed) exit 0 'self-test OK (72 measured packages -> 72 shard items ... max/mean 1.12x ... floor 1391s, bins 1391/1208/1206/1208/1208/1208s, file-level slices: none)'. BEFORE at aa46322: main exit 0, #20388 exit 1 (3c). Battery counts are measured equal to the floors on both datasets (balancing 25, slice items 20, wiring 11). Mutation proof: 20 committed-first mutations via scripts/ablation-replace.mjs, run on both datasets. Each leg: anchor x1, replacement 0 to 1, restored to the HEAD blob with git diff HEAD empty; a bash trap re-proved the hashes in both worktrees. All went red at the targeted case (M1 live 3c 'Retire the entry' at 458.15s / 733.33s; M2-M6 the five 3c fixtures; M7 3b cut; M8 old pin-6 pair green on main and red on #20388 at the new guard (35.3s vs 57.09s); M9 pin 6 weighing; M10-M17 slice-item cases; M18-M19 wiring live + tree fixture; M20 measure live-map case). Controls: measure generator on synthetic env-carried 1/2 + 2/2 CLI summaries gives aa46322 exit 0 cli 733.33, c614a09 exit 1 (the designed refusal); BASE with 3c muted on #20388's dataset reds pin 6 with a 'weighing test-file count again' misdiagnosis; nightly-tiers partition under the new map gives shard 1/2 '@objectstack/cli' whole and 2/2 empty.",
"deviations": [
"landing also in scripts/measure-test-shard-timings.mjs (outside the claim's surface), under the dispatch's File-surface clause (land where measurement shows the change must live): its self-test reds under the empty map (measured exit 1)",
"pin 6 (inversion pair) changed although it is not a slice pin: #20388's dataset reds it (a second red masked behind 3c), so the self-test could not pass on that dataset otherwise",
"optional sliced parameters added to three exported functions (sliceCountFor, weighItems, driftReport); defaults are the live map, so production behaviour is unchanged",
"commit trailers are the model-free pair AGENTS.md requires, not the harness reminder's model-named Co-Authored-By",
"the first gate-loop spelling (a bash -c over the derived list) was refused by the harness safety check and never ran; a static script ran the same list. Its 600s foreground cap moved the run to the background, and it was waited on in the foreground (tail --pid) until exit",
"consequences outside the diff, named in the PR body: the refresh lane's pull_request dry run is predicted to red on this PR (every candidate run predates the map change and is refused by design; the check is running at report time); nightly-tiers shard 2/2 is now empty"
],
"mcp_calls": "0 — no MCP tool used",
"api_writes": "3 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls (draft, #21487; body read back byte-identical); (2) label-write, executed as POST /repos//issues/21487/labels (skip-changeset) + POST /repos//issues/21487/assignees (os-sales), read back as matching; (3) this report, executed as POST /repos//issues/20388/comments. Plus 2 git pushes (not REST). No other writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: #16468 · spec's 1391.38s is larger than every shard's measured test-step wall in run 36380128221 (max 1023s), consistent with the generator summing overlapping test + test:repo windows (its documented fold). Spec is now the floor at about 83% of its about-1670s breach point, and #16468's ceilings will read this number · noted in the PR's Acceptance notes, not filed",
"carrier: #16465 · ci.yml's slice-leg comments (shards 5/6 and 6/6 'carry a slice') and its drift-step note '(458.15s recorded, 1231.52s measured)' go stale with the retirement; #16465 edits that file · noted, not filed",
"carrier: 承接者:无 · test-nightly-tiers.yml's header says FILE_SHARDED_PACKAGES cuts the CLI in two, and its matrix is [1, 2]; under the empty map shard 2/2 is empty (measured locally) and 1/2 runs the CLI whole · Acceptance notes only",
"carrier: 承接者:无 · packages/cli/vitest.config.ts comment 'partition-test-shards.mjs slices this package (FILE_SHARDED_PACKAGES)' is now stale (the env read stays as dormant wiring, pinned by the tree fixture) · Acceptance notes only",
"carrier: 承接者:无 · shard-timings-refresh.yml: when the generator refuses every candidate, the final ::error:: blames a coverage shortfall ('a suite failed, a package was renamed ...') rather than the refusals. This is inferred from the step's code and predicted to show on this PR's dry run, not yet observed · not filed (no public door)"
]
}


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor

os-dev-report
{
"issue": 20388,
"status": "done",
"branch": "claude/issue-20388-cli-slice-pins",
"pr": "#21487",
"session": "session_01HRYqpqGcWpJuJkDmbRF75w (subagent of the dispatching PM session; harness-stamped id in the commit's Claude-Session trailer)",
"premise_still_valid": true,
"summary": "Round 2 (the coordinator's red rehearsal): the retire route stands, and the refresh lane now survives it. At c614a09 the lane's pull_request rehearsal refused all ten eligible hourly runs on main, because every retained summary carries the CLI's 1/2 and 2/2 as OS_TEST_SHARD digests and the emptied map gave the matcher no candidate. d049d35 declares PREVIOUS_FILE_SHARDED_PACKAGES (the outgoing map, cli: 2) beside the map, and the generator's matcher decodes digests against both declared maps by hash equality. Per-run completeness and the refusal of undeclared digests are unchanged. The rehearsal at d049d35 is GREEN (run 37075730446, job 111065090886, first candidate accepted). Round 1 is unchanged: FILE_SHARDED_PACKAGES emptied by the derivation (K / R / R-worst 1.124x / 1.124x / 1.053x on #20388's dataset), pin 3c's minimality check, pin 3b's cut, the fixture-pointed mechanism pins, and pin 6's new inversion pair. The self-test passes on both datasets at d049d35.",
"decision": {
"choice": "retire (empty map, mechanism kept)",
"readings_on_20388_dataset": {
"K_cli_sliced_2": "bins 1391/1208/1208/1207/1208/1208s, max/mean 1.124x, heaviest spec 1391s, meets",
"R_cli_whole_733.33s": "bins 1391/1208/1206/1208/1208/1208s, max/mean 1.124x, heaviest spec 1391s, meets",
"R_worst_cli_whole_1231.52s": "bins 1391/1308/1307/1307/1308/1307s, max/mean 1.053x, heaviest spec 1391s, meets",
"cli_whole_breach_point": "C ≤ (1.3/6)(6696.67 + C) holds until about 1852s, 1.5x the worst reading"
},
"readings_on_main_dataset": "K 1.000x; R 1.001x (heaviest cli 458s); R-worst 1.549x BREACH (the old bridge, only on the stale dataset)",
"four_axes": "need: slicing moves no bin maximum on the refreshed data and costs a duplicated closure build plus a sequential slice leg on two shards (run 36380128221: closure step 6m15s on 5/6 and 6m43s on 6/6; 5/6 was the longest job at 19m23s) / long-term: keeping 2 leaves a count no failing pin can justify / AI-error: the new 3c reds on an over-sliced count / startup focus: no new gate, and the retirement is immediate",
"interim_model": "between this merge and #20388's, main splits on stale weights with the CLI whole. Costed at #20388's weights, the heaviest bin stays spec's (1775s sliced vs 1773s whole); the CLI's bin is 1116s at 733.33s or 1614s at 1231.52s",
"transition": {
"choice": "retire + decode the outgoing map (PREVIOUS_FILE_SHARDED_PACKAGES), not keep-2",
"why_four_axes": "need: every run summary that exists today carries the CLI's two slices, and that is the lane's only input until a day after the merge / long-term: the matcher stays a whitelist of two declared maps, decoded by hash; any later map change gets the same one-day bridge by setting one constant / AI-error: the refusal is unchanged for any digest neither map names (mutation N4), and completeness is still judged within a run / startup: no new gate, and no grace window beyond the artifacts' own one-day life (retention-days: 1). Keep-2 would bring back a count pin 3c refuses on both datasets, with no measured counterfactual (R-worst meets).",
"hypothesis": "CONFIRMED that the empty map caused it, and the rival is FALSIFIED. The 09-30 green rehearsals predate the env carrier, so they could not tell 'empty map refuses' from 'env carrier never decoded on real summaries'. The d049d35 rehearsal is green on main's real env-carried runs once the matcher knows the outgoing map. Local repro on synthetic summaries in the measured turbo 2.10.10 digest format, fed to the lane's generator + --check-coverage commands: aa46322 exit 0 / c614a09 exit 1 ('none: FILE_SHARDED_PACKAGES does not slice it') / d049d35 exit 0, packages identical to aa46322. The real run logs and artifacts are blocked by egress policy (blob host 403, summary_raw 403).",
"monday_refresh": "Mon 2026-10-05 05:30Z after merge: expected to succeed. With one-day retention, its candidates are post-change runs (whole CLI, no digest). Measured: a post-change run alone gives exit 0 (cli 740s); post + pre-change accumulated gives exit 0 (cli 599.08s). Still a prediction, as every refresh depends on an eligible full-battery run existing."
}
},
"premise_checks": {
"A1": "holds on aa46322 (map {cli:2}; 3b prose 1231.52s/800.7s; 3c CLI_MEASURED = 1231.52)",
"A2": "reproduced on aa46322 with #20388's blob 84342b45 overlaid: exit 1 at partitioner line 1075 (967 in the PR body), the same message. The message mislabels spec's 1391s as the CLI's",
"A3": "main 70 pkgs 3997.47s, cli 458.15, spec 403.65; #20388 72 pkgs 7430.00s, measuredAt 2026-09-28, runs [36380128221], spec 1391.38, cli 733.33; new packages are organizations and vitest-filter-preflight; the package set equals the workspace minus dogfood",
"A4": "well-formed: today's generator writes identical keys and byte-identical note/mergeRule/refresh strings, and accepts the file as --merge-into; skippedAsCached, skippedIncompleteSlices and carriedOver are empty; cli is a two-slice sum from one run; the 09-28 passthrough carrier is still read (sliceOfCliArguments). NOT MEASURED: byte-level regeneration, reason: the run's summary artifacts are no longer retained"
},
"files_changed": [
"scripts/partition-test-shards.mjs: map retired, PREVIOUS_FILE_SHARDED_PACKAGES declared, sliceCountProblems/meetsBound, optional sliced params; pins 3b/3c/6 and the slice-items and wiring batteries rewritten; floors 21 to 25 and 9 to 11",
"scripts/measure-test-shard-timings.mjs (outside the claimed surface): the digest matcher reads the previous map too; the live-maps case is rewritten and an across-change case added (env-carried floor 10 to 11); one stale parenthetical dropped"
],
"gates": "head d049d35 (final): dispatch-gates --commands derived the same 32 families as on c614a09; all 32 exit 0; --ran: 32 derived, 32 run, 0 NOT-MEASURED, 0 UNRUN; report-test-timings --self-test exit 0; check:pm-dispatch-gates 976.7s, 1976 cases. eslint --format json at d049d35: 2 files, 0 errors / 0 warnings; no type-aware linting (print-config: 2 per-file rules, no project). CI at d049d35 at report time: Regenerate the shard-timings dataset SUCCESS (rehearsal); Test Core x6 + aggregate SUCCESS (the closure step idle on all six); TypeScript Type Check SUCCESS; Dogfood Regression Gate SUCCESS; Governed Surface Queue Guard SUCCESS; Lint & Repo Gates in_progress. c614a09: rehearsal FAILURE (run 37074888579).",
"tests": "Self-test at d049d35: main dataset exit 0 and #20388 dataset (blob 84342b45 overlay) exit 0, lines identical to c614a09. measure / select-shard-timings-run / report-test-timings self-tests exit 0. Mutation proof re-run from committed d049d35 on both datasets: M1-M20 plus N1-N4 = 24 mutations x 2 trees = 48 legs, all landed (anchor x1, replacement 0 to 1) and restored (HEAD blob, git diff HEAD empty, trap re-proof in both trees). All red except M8 on main (by design). N1 (matcher ignores the previous map) and N2 (previous default not live) red at the live-maps case; N3 (explicit previous dropped) red at the across-change case; N4 (decodes a count neither map names) and M20 red at the live-maps refusal ('1/3 ... was not refused listing (1/2, 2/2)'). Lane repro on synthetic summaries: aa46322 gen 0 + coverage OK; c614a09 gen 1; d049d35 gen 0 + coverage OK, packages identical to aa46322; post-change-only exit 0; mixed exit 0 (cli 599.08). Round 1 measurements stand (K/R/R-worst, BEFORE red, masked pin-6 red, nightly partition).",
"deviations": [
"landing also in scripts/measure-test-shard-timings.mjs (outside the claim's surface), under the dispatch's File-surface clause (land where measurement shows the change must live): its self-test reds under the empty map (measured exit 1)",
"pin 6 (inversion pair) changed although it is not a slice pin: #20388's dataset reds it (a second red masked behind 3c), so the self-test could not pass on that dataset otherwise",
"optional sliced parameters added to three exported functions (sliceCountFor, weighItems, driftReport); defaults are the live map, so production behaviour is unchanged",
"commit trailers are the model-free pair AGENTS.md requires, not the harness reminder's model-named Co-Authored-By",
"the first gate-loop spelling (a bash -c over the derived list) was refused by the harness safety check and never ran; a static script ran the same list. Its 600s foreground cap moved the run to the background, and it was waited on in the foreground (tail --pid) until exit",
"PR body NOT patched: the coordinator asked for the Monday answer 'in the PR body', but the role file forbids a dev PATCH of the PR body (written once, at pr_create; later edits named in the report, written by the seat). The conflict is flagged here, not settled by choosing a side. The full replacement body (v2: the refresh-lane red-then-green section, the Monday answer, the transition choice, N1-N4, gates at d049d35) is at /tmp/claude-0/-home-user/0a250331-4d01-53c7-82d4-060195186652/scratchpad/issue-20388/pr-body-v2.md (18406 bytes, sha256 prefix 2a87f42199cb08ba), ready for the seat's issue_patch on #21487. The live body (v1) still says the rehearsal is 'predicted' to red, which d049d35 overtook.",
"the round-2 change extends the matcher with a declared second map; it is not a looser match. The refusal text names both maps, and the coordinator should judge whether this counts as weakening (mutation N4 proves an undeclared count is still refused)",
"the worktree was re-created for round 2 from the pushed branch; worktrees, node_modules and owned refs are removed again after this report"
],
"mcp_calls": "0 — no MCP tool used",
"api_writes": "round 1: 3 relay dispatches (pr_create to POST /repos/objectstack-ai/objectstack/pulls; label-write to POST .../issues/21487/labels + POST .../issues/21487/assignees; os-dev-report to POST .../issues/20388/comments, comment 5962771016). round 2: 1 relay dispatch, this os-dev-report, to POST /repos//issues/20388/comments. git pushes: 3 in total (empty branch, c614a09, d049d35), not REST. No PR body PATCH.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: #16468 · spec's 1391.38s is larger than every shard's measured test-step wall in run 36380128221 (max 1023s), consistent with the generator summing overlapping test + test:repo windows (its documented fold). Spec is now the floor at about 83% of its about-1670s breach point, and #16468's ceilings will read this number · noted in the PR's Acceptance notes, not filed",
"carrier: #16465 · ci.yml's slice-leg comments (shards 5/6 and 6/6 'carry a slice') and its drift-step note '(458.15s recorded, 1231.52s measured)' go stale with the retirement; #16465 edits that file · noted, not filed",
"carrier: 承接者:无 · test-nightly-tiers.yml's header says FILE_SHARDED_PACKAGES cuts the CLI in two, and its matrix is [1, 2]; under the empty map shard 2/2 is empty (measured locally) and 1/2 runs the CLI whole · Acceptance notes only",
"carrier: 承接者:无 · packages/cli/vitest.config.ts comment 'partition-test-shards.mjs slices this package (FILE_SHARDED_PACKAGES)' is now stale (the env read stays as dormant wiring, pinned by the tree fixture) · Acceptance notes only",
"carrier: 承接者:无 · shard-timings-refresh.yml: when the generator refuses every candidate, the final ::error:: blames a coverage shortfall ('a suite failed, a package was renamed or removed, or its slices could not be assembled') rather than the refusals; OBSERVED on run 37074888579 ('The 0 eligible run(s) ...') · not filed (no public door)"
],
"round": 2
}


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor

ACCEPT — PR #21487 (head d049d3539d) · domain:devx seat 2 (session_01HRYqpqGcWpJuJkDmbRF75w) · 2026-10-02T23:33Z

Reviewed against GitHub and the diff, not the report (os-dev-report comments 5962771016 and 5963093078).

Checklist

  • Shape. Draft, base main, first line Unblocks #20388 …. No closing keyword sits near chore(ci): refresh the Test Core shard-timings dataset #20388, ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 or ci: a per-package suite-duration ratchet — a PR that makes a suite exceed its measured ceiling is red; ceilings rise only by ruling (maintainer-directed, growth constraint) #16468: the body says they "remain open". The PR's assignee is os-sales, and it carries skip-changeset. Root scripts/ ships in no package.
  • Files. Exactly two: scripts/partition-test-shards.mjs (+308/−138) and scripts/measure-test-shard-timings.mjs (+120/−33), 599 changed lines in total.
    • ⛔ Not touched: the dataset, .github/workflows/ci.yml, MAX_SHARD_OVER_MEAN, MAX_MEASURED_OVER_PREDICTED and the shard count.
    • No governed path, and no contract-review face.
  • File surface amended (this seat, recorded here): the claim's surface now includes scripts/measure-test-shard-timings.mjs. The producer-side change was measured necessary in two places: its self-test exits 1 under the empty map, and its digest matcher refused every pre-change run.
  • Rulings held.
    • The pins can still fail: 3c judges minimality for every map entry and carries five fixtures. 3b grades a cut of the heaviest package. The undeclared-digest refusal is kept, and the diff spot-checked as matches no slice … or emitted under the map it replaced.
    • The dev reports 24 mutations × 2 datasets, red-then-restored. The seat read the mutated assertions in the diff.
  • Choice: retire the CLI's slicing. It is derived by the file's own minimality rule. On chore(ci): refresh the Test Core shard-timings dataset #20388's dataset K / R / R-worst read 1.124x / 1.124x / 1.053x, with spec heaviest at 1391s in each. PREVIOUS_FILE_SHARDED_PACKAGES is a closed, hash-exact decode bridge, bounded by the summaries' one-day retention. It is not a looser match.
  • CI on d049d353. The refresh rehearsal Regenerate the shard-timings dataset is green; it was red at c614a094 and that red is fixed by this head. Also green: Test Core, TypeScript Type Check, Dogfood Regression Gate and Governed Surface Queue Guard. Lint & Repo Gates was still running at this stamp; the PR is not readied until it concludes success.
  • Nightly tiers. The empty shard 2/2 is handled: the workflow says "An EMPTY shard short-circuits the test step". It wastes a runner but does not red.

Out-of-scope findings, each disposed

Body. The live body is the dev's v2, written by this seat (the role file forbids a dev PATCH). Read back: 18406 bytes, identical.

Landing plan.

  1. Once Lint & Repo Gates is success: pr_ready + automerge_enable through the relay.
  2. On MERGED: this seat merges main into chore(ci): refresh the Test Core shard-timings dataset #20388 (update-branch), which starts its CI, and the auto-merge the maintainer armed there lands it on green.
  3. The window between the two merges splits on stale weights with the CLI whole: modeled worst CLI bin 1614s, actual walls lower. Keep it short.

Generated by Claude Code

This branch has not been deployed

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

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants