Skip to content

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

Closed

Description

@claude

Filed by the skills lane seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) on the maintainer's direction, 2026-09-07T02:5xZ. Surface owner stays domain:devx.

Authority (maintainer, verbatim, live PM chat 2026-09-07): 「同意你的建议,你负责执行派发所有可行的优化」. This card is the alarm half of the measurement loop.

What

Every Test Core shard compares its measured duration with the weight the partitioner predicted for it, and the aggregate Test Core check says so: a warning when measured/predicted exceeds 1.3×, red when any shard's measured duration exceeds 70% of its timeout-minutes. A pinned premise is checked against observation and never overwritten by it (H8's rule).

Measured

Ruling

  1. --emit writes predictedSeconds and measuredSeconds into the shard attestation; --verify applies the two thresholds above and prints one line per shard in the job summary, with the remedy naming the refresh (CI: the shard-timings file is stale for the CLI package — 672s predicted vs 28m46s measured against a 30-minute timeout, so Test Core shard 1/6 is one slow run from being killed on any PR touching the CLI #16173's command, or the scheduled workflow once it exists).
  2. Red only on the 70%-of-timeout condition (the one that predicts a kill); the 1.3× ratio is a ::warning::. Both thresholds are named constants with a self-test case each.
  3. .github/workflows/ci.yml: only the shard job's emit step and the aggregator's verify step gain the two numbers; nothing else in that file.

Serial

Blocked behind #16453 (V, the package-set step), #16455 (X, the test step's environment) and #16454 (W, the capture step): four flights on one workflow file is the fold the seat does not take. Dispatched when those three have merged.

Refs #16173.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 55
    Session: session_01VDtqoecgES7ScQYGbFVDRv
    Branch: claude/issue-16465-wire-shard-drift-check (cut from origin/main 1c3a4d9730)
    Worktree: objectstack-issue-16465
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: the triage ruling 5925054826, as the unblock 5981255485 re-derived it.

    • .github/workflows/ci.yml, the Test Core shard job only. Restore the step the in-tree comment (about :959–:982) prescribes:
      • it runs partition-test-shards.mjs --check-drift over .turbo/runs/*.json with --label "Test Core (${{ matrix.shard }}/6)";
      • with no if: and no continue-on-error;
      • placed above the attestation pair, so a drift red also withholds the attestation.
      • The "deliberately not wired" comment is replaced by what the step now does.
    • The red rule is the in-tree one: MAX_MEASURED_OVER_PREDICTED = 1.5, unchanged. The card's 1.3× becomes a ::warning:: annotation only, below the red, with a self-test case, in scripts/partition-test-shards.mjs beside the existing constant.
    • ⛔ No second red rule: the 70%-of-timeout-minutes red is not taken. ⛔ No change to the attestation schema the card's first draft proposed.
    • Rider (from ci(test-core): retire the CLI's file-level slicing by the partitioner's own slice-count derivation #21487's body): the ci.yml slice-leg comments and the 1231.52 s note at the drift step no longer describe the tree, because FILE_SHARDED_PACKAGES is {}. The dev rewrites them to what the tree does at the claim ref.
    • Dataset reading: the dev confirms against the dataset refreshed by chore(ci): refresh the Test Core shard-timings dataset #20388 (ea7ff394b6) that every shard's predicted vs. measured ratio on a current main CI run sits under 1.5×. If one would red on every PR today, stop and report it rather than wiring a standing red.

    Stop on a breach and explain it in the report.
    Container & model: M (one CI step, one warning tier with a self-test, comment repair, a dry run against a real run's summaries), mode:subagent, model: opus
    Clause-②: no
    Thread-read: 5925054826
    Serial constraints cleared: board read at 2026-10-04T15:51Z. #20388 merged (ea7ff394b6), and serial blockers #16453 / #16454 / #16455 are closed. No open PR touches ci.yml, check-shard-attestation.mjs or the shard-timings files. #16468 waits on this card (Blocked-by: #16465).

    Priority rule 3 reading: domain:devx has no open P0/P1. This is the alarm half of a maintainer-directed measurement loop, wiring an existing gate rather than adding one. No contract-review face is touched, and nothing publishes, so the PR carries skip-changeset.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 16465,
      "status": "blocked",
      "branch": "claude/issue-16465-wire-shard-drift-check",
      "pr": null,
      "session": "session_01VDtqoecgES7ScQYGbFVDRv",
      "premise_still_valid": false,
      "summary": "STOPPED at brief step 4 (dataset reading before wiring); nothing was written to ci.yml or partition-test-shards.mjs, no commit, no PR. The unblock premise (the #20388 refresh makes --check-drift safe to wire) does not hold for @objectstack/cli: the refreshed dataset records it at 733.33s, while two EXECUTED whole-CLI test windows on main after #21487 (9ff74285f1, which retired the CLI slice) read 1659.03s and 1667.97s = 2.26x / 2.27x. On the refreshed-dataset partition at the claim ref (shard 2/6 = cli + 11 packages, 1208.1s predicted) that shard's ratio is at least 1.77x if its other packages ran on prediction and 2.27x if they were cache hits, so wiring the 1.5x red would red shard 2 on every run whose affected set reaches cli (any spec/core-touching PR, every queue and main build). The same shard's test step took 29m58.88s (run 37212954836, job 111467712089) against the 45-minute temporary wall whose revert condition is 30. Remedy is upstream of this card: re-measure cli's whole-package cost (or re-slice it) before the gate can be wired; then this card's diff is unchanged from the claim.",
      "tests": "No code changed, so no gate ran. Measurement method (declared): the test-core-run-summary artifacts could NOT be downloaded (built-in gh refuses the redirect to *.blob.core.windows.net; no fleet credential in this container), so I used (1) a local partition at 1c3a4d9730 with the refreshed dataset: `turbo ls --output=json` then `node scripts/partition-test-shards.mjs turbo-ls.json --shard n/6 --exclude @objectstack/dogfood` to bins 1391.4/1208.1/1206.4/1208.1/1207.9/1208.1s, max/mean 1.12x, shard 2 = cli + 11; and (2) per-package vitest `Duration` lines from the last 5000 lines of each shard job log (MCP get_job_logs caps the tail at 5000 of 25k-61k lines), classifying executed vs replayed by the live time span of the package's own output lines (a replay prints in ~0s). This is a package-level reading of vitest Duration, not turbo's task window; the drift gate's shard ratio needs every MISS package on the shard, which the tail does not carry, so shard ratios below other than shard 2 are partial (NOT MEASURED as shard totals). Job step timings alone cannot reproduce the gate: the dataset is in contended per-task seconds at --concurrency=4, so a shard's predicted sum is not its wall clock.",
      "mcp_calls": "13 — mcp__github__get_job_logs x13 (read-only); no MCP write tool",
      "api_writes": "1 — git push of the empty branch (write-route probe, rule 1); plus this report comment via scripts/pm/post-stamped.mjs on issue 16465",
      "open_questions": [
        {
          "question": "How should cli's dataset entry be corrected before the drift red is wired? The refreshed 733.33s is contradicted by two executed whole-CLI windows (1659.03s run 37199214385 shard 1/6 job 111427680338; 1667.97s run 37212954836 shard 2/6 job 111467712089).",
          "options": [
            "A: re-run the refresh (scripts/measure-test-shard-timings.mjs) over today's green runs' run-summary artifacts, now that cli runs whole, then wire this card unchanged",
            "B: restore FILE_SHARDED_PACKAGES for cli (pin 3c derives n from the dataset, so it needs A's corrected number first) and wire after",
            "C: wire --check-drift now with the red as a warning-only step until A lands"
          ],
          "recommendation": "A, because the red rule is correct and the number is wrong; the drift gate exists to catch exactly this, and C would be a second, temporary rule the triage ruling did not authorise. A is a seat/maintainer act (the refresh lane), not this card's file surface."
        }
      ],
      "out_of_scope_findings": [
        "class: a · reach: named producer — scripts/test-shard-timings.json (generated by scripts/measure-test-shard-timings.mjs, refreshed in #20388 at ea7ff394b6) records @objectstack/cli at 733.33s; executed whole-CLI runs after #21487 measure 1659.03s (run 37199214385, job 111427680338, 52/60 cached, cli output live for 1303s) and 1667.97s (run 37212954836, job 111467712089, test step 29m58.88s against the temporary 45-minute wall); the partitioner's own docblock reasons that cli fits whole up to ~1852s on the 733.33s figure, which is how #21487 retired the slice · dedupe words: test-shard-timings cli 733.33, cli whole 1667s, shard 2 29m58, FILE_SHARDED_PACKAGES retired, shard timeout 45",
        "ratios (refreshed dataset, package-level, vitest Duration / dataset, executed only): run 37212954836 (schedule at ea7ff394b6, refreshed partition) — shard 1 spec: cached, NOT MEASURED; shard 2 cli 1667.97/733.33 = 2.27x, shard total predicted 1208.1s to 1.77x..2.27x; shard 3 runtime 422.27/434.86 = 0.97x (shard total NOT MEASURED); shard 4 objectql 486.19/359.61 = 1.35x; shard 5 metadata-protocol 509.44/341.53 = 1.49x (rest 475.49/240.77 = 1.97x but FAILED, which the gate excludes); shard 6 driver-sql 1.19x, plugin-security 1.16x, plugin-auth 296.24/189.18 = 1.57x. Run 37206451320 (schedule at 316be321ef, old partition): runtime 1.10x, objectql 1.16x, plugin-security 1.19x, metadata-protocol 1.24x, rest 1.25x, example-showcase 0.92x, verify 0.61x, example-todo 0.65x. Run 37210604695 (push at ea7ff394b6) shard 1: spec test 739.25 + test:repo 366.09 = 1105.34 / 1391.38 = 0.79x.",
        "carrier: whoever lands the cli dataset correction (refresh lane / #16468 seat) · noted, not filed — plugin-auth (1.57x) and metadata-protocol (1.49x) are single readings near the bound; they are worth a second sample in that refresh before the red is wired"
      ]
    }

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    Contributor

    Blocked-by: #21758

    Stand-down for round 55 (claim 5981791999), seat domain:devx#1, at 2026-10-04T16:01Z. No PR was opened and nothing was committed. The branch claude/issue-16465-wire-shard-drift-check holds only the claim ref.

    pm:dispatched → pm:blocked.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    Contributor

    Triage owned-24 h re-check: the chain is live, and its next step is the maintainer's

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-05T16:56Z. ⛔ Not a claim, ⛔ not a dispatch; the assignee is untouched.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Pointer from domain:devx seat 2 (#20163, session_01VF48aw8RPG6wzDnMgp6rtw) at 2026-10-06T08:14Z. ⛔ Not a claim. This card's labels and assignee are untouched.

    Your blocker has closed. #21758 is completed: PR #21966 → 4c49150e0c, landing record and acceptance reading 6012200987. Option B was not taken: cli fits whole at 1.044× the mean, and the bound allows it up to ~2234 s.

    Three notes #21758 carries to this card (PR #21966's Acceptance notes, reviewed in 6011252812). They are for whoever wires the drift alarm:

    1. Shard 1/6 is the whole CLI alone, and its wall time already crosses the 30-minute line. Its test step was 1860 s in run 37427862594. Its job wall times were 31m37s, 34m39s and 32m09s in three of four post-refresh runs. The temporary 45-minute timeout-minutes has a written revert condition back to 30, which would kill that shard. The 1.3× ratio bound still holds; this is wall clock only.
    2. Two stale ci.yml comments.
      • The drift-step block still cites cli as "458.15s recorded, 1231.52s measured".
      • "WHY SIX" names @objectstack/spec as the heaviest indivisible suite. On the landed dataset the CLI is (1702.69 s against 1134.86 s).
        The next editor of the Test Core block carries both.
    3. The landed dataset rests on one run (provenance.runs = ['37262126122']). The CLI alone read 1033.74 s and 1723.05 s one hour apart.
      • One reading near the bound is not a baseline, so take a second sample before the drift red is wired.
      • Shards 2–6 currently read far below their weights because of turbo replays (0.13–0.29× in run 37427862594). Any drift ratio should be computed on executed windows, not replayed ones.

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Path: fleet decision — the merge gate says how long each shard really runs | 缺项 | none

    Unlock: pm:blocked → pm:queue. #21758 landed; the ruling 5925054826 stands, and the four notes #21758 hands on ride this card

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T09:09Z. ⛔ Not a claim, ⛔ not a dispatch. The assignee is untouched; the next claim is the seat's act.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Release: 5981791999 (baozhoutao, session_01VDtqoecgES7ScQYGbFVDRv, seat domain:devx#1, round 55), taken over by domain:devx seat 2, session_01VF48aw8RPG6wzDnMgp6rtw. Cause: the holder's session is out of tokens, per the maintainer. The holder stood the claim down in 5981877376 but kept the assignee, and triage's unlock 6013064225 returned the card to pm:queue without re-claiming it. Destination: the Claim: below.

    谁的指令: the maintainer (os-justin)
    原话:

    他没有token了,他的任务你也要接手

    and, naming this card after this seat asked about it:

    接手
    在哪说: the chat of session session_01VF48aw8RPG6wzDnMgp6rtw, 2026-10-06T13:36Z

    Claim: PM loop round 2 (takeover)
    Session: session_01VF48aw8RPG6wzDnMgp6rtw
    Account: os-justin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-16465-wire-shard-drift-check (continued, remote head 1c3a4d9730, which is the holder's empty probe at its main base)
    Worktree: objectstack-issue-16465
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: the triage ruling 5925054826 as the unlock 6013064225 restates it. The released claim's surface carries over unchanged, plus the four items the unlock hands on.

    Priority rule 3 reading: domain:devx's one open P1, #21989, is the director's (claim 6016390252). No contract-review face is touched, and nothing publishes, so the PR carries skip-changeset.

    The four-part takeover, in one comment

    ① The Release: line above names the holder's claim 5981791999 and its session, with the three provenance fields.
    ② Assignee: baozhoutao → os-justin, written just before this comment, in the same act as pm:queue → pm:dispatched.
    ③ The Claim: above continues branch claude/issue-16465-wire-shard-drift-check at remote 1c3a4d9730.
    ④ Handover record: the holder's last pushed sha is 1c3a4d9730. That is the empty-branch probe at main's base, with no commit on it. Status: the dev stopped at the dataset reading (5981857497), so no PR was opened.

    • ⛔ This is a takeover on the maintainer's word, not a liveness verdict on seat 1. ⛔ This seat does not take seat 1, its queue, or any of its cards beyond what the maintainer named.

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 16465,
      "status": "done",
      "branch": "claude/issue-16465-wire-shard-drift-check",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/21998",
      "session": "session_01VF48aw8RPG6wzDnMgp6rtw (dispatching PM session; this run is its subagent)",
      "premise_still_valid": true,
      "summary": "RED WIRED, not warning-only: the stop condition did not fire, because no executed-window reading put any shard at or over 1.5x. The PR wires `Check this shard's timing drift` (partition-test-shards.mjs --check-drift over .turbo/runs/*.json, label Test Core (N/6), no if:, no continue-on-error, between the run-summary upload and the completeness guard, above the attestation pair), and adds WARN_MEASURED_OVER_PREDICTED = 1.3 beside the unchanged MAX_MEASURED_OVER_PREDICTED = 1.5. Same ratio, warning band exclusive of the red, one ::warning annotation on stdout, exit 0. Its self-test battery is 'drift warning tier under the red (#16465)', 12 cases floored at 12, with the roster floor raised from 10 to 11. SECOND SAMPLE, executed windows only. Source: the Test Core aggregator's timing table (turbo windows via samplesFromSummary, replays listed and excluded), because the run-summary artifacts could not be read here. Shard 1/6 (CLI alone, predicted 1702.69s) is exact on all eight scheduled runs since the #21826 refresh: 37416453417 1033.74s 0.61x; 37427862594 1790.73s 1.05x; 37433381795 1112.66s 0.65x; 37440129185 1325.01s 0.78x; 37446949708 1733.75s 1.02x; 37453598388 1751.53s 1.03x; 37460325624 1726.65s 1.01x; 37467795959 1341.12s 0.79x. Shards 2/6 to 6/6 of the full split: whole-shard NOT MEASURED on every scheduled run. Blocker: the table prints only the 10 slowest packages. The lighter members' windows exist only in the test-core-run-summary-N-of-6 and test-core-timings-N-of-6 artifacts, whose host productionresultssa17.blob.core.windows.net the session egress policy refuses (proxy CONNECT 403, recentRelayFailures). Job logs reach only their last 5000 lines through get_job_logs (for example 5000 of 23896 for run 37467795959 shard 3/6, job 112283258421). What is measured there: heavy members' executed windows, plus the turbo --concurrency=4 capacity bound (sum of windows at most 4x the test step). Shard 2/6: spec 1651.04/1134.86 = 1.45x (37433381795) and 1573.20 = 1.39x (37453598388); its 11 unmeasured members would have to average 1.61x / 1.77x before the shard reached 1.5x; capacity-proven under 1.5x in 37416453417 (at most 1.09x) and 37446949708 (at most 1.30x). Shard 3/6: metadata-protocol 0.54-0.97x, service-analytics 0.75-1.27x; capacity-proven under 1.5x in 37427862594 (at most 0.82x), 37446949708 (at most 1.05x) and 37467795959 (at most 1.01x). Shard 4/6: objectql 0.78-1.38x, service-automation 0.68-1.18x; capacity-proven in 37416453417 (at most 1.37x). Shard 5/6: rest 0.67-0.98x, plugin-auth 0.83-1.10x; capacity-proven in 37416453417 and 37440129185 (at most 1.40x each). Shard 6/6: runtime 0.75-1.22x, plugin-security 0.65-1.05x, driver-sql 0.75-1.00x; no run decisive. Push 37467882762 at the merge base aa09db58c9 had 70 executed and 0 replayed, with spec 1617.61s = 1.43x and objectql 1.32x as the highest. Whole-shard exact readings, each on that run's own split: small-set push 37422473456 gave spec 0.90x, rest 0.48x and create-objectstack 0.67x, with shards 4-6 empty; push 37413386379 gave client 0.18x, and spec replayed (NOT MEASURED). This PR's own CI run 37478942825 printed the step's verdicts on its affected set (spec, client, driver-sql): Test Core (1/6) spec 1050.0s measured vs 1134.9s predicted = 0.93x OK; (2/6) driver-sql 130.8/300.2 = 0.44x OK; (3/6) client 51.9/193.7 = 0.27x OK; (4/6) NOT MEASURED, no packages (5/6 and 6/6 sit in 0s bins). All six shards attested and the Test Core aggregate concluded success. STALE COMMENTS REWRITTEN, each number with its source: (1) The drift-step block: dataset provenance run 37262126122 and CLI 1702.69s are from scripts/test-shard-timings.json at aa09db58c9; the second-sample figures are from the timing tables of the runs named above. (2) WHY SIX: CLI 1702.69s against spec 1134.86s (same dataset). Five-shard max 1957s, six-shard bins 1703/1615-1617s, and the 6/7/8/10 table (1.04/1.22/1.39/1.74x, max 1703s, means 1630/1397/1223/978s) were computed with partition()/balanceOf() on that dataset at 430859c2f. The old CLI 733.33s is from the ea7ff394b6 dataset. (3) The 45-minute timeout comment: shard 1/6 job wall times 6m14s-35m43s, over 30 minutes on 9 of 16 runs, from GET /actions/runs/ID/jobs for runs 37413386379 through 37467882762; 79% = 35m43s / 45m. The value is unchanged, and the new revert condition is 24 minutes (80% of 30) on a week of scheduled runs. (4) Slice-leg prose: FILE_SHARDED_PACKAGES is {} at aa09db58c9. (5) Two present-tense '30-minute wall' phrases in the same job now read '`timeout-minutes` wall'.",
      "tests": "All at HEAD 430859c2f. (In quoted output, the less-or-equal sign is rendered as ≤.) node scripts/partition-test-shards.mjs --self-test: 'self-test OK (72 measured packages -> 72 shard items, 6 shards, max/mean 1.04x ≤ 1.3x, floor 1703s, bins 1703/1615/1615/1615/1617/1616s, file-level slices: none)', exit 0. --check-drift on synthetic summaries, each with a replayed sibling: 550s/521.16s = 1.06x gave OK, exit 0; 700s = 1.34x gave WARN plus one '::warning title=Test Core shard timing drift::Test Core (5/6): ...' stdout line, exit 0; 800s = 1.54x gave DRIFT, exit 1. The step's bash body run locally: an empty directory gave the NOT MEASURED line and exit 0; one summary gave the WARN verdict and exit 0. Gates: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran (with exit codes) printed '59 derived famil(ies) accounted for — 59 run, 0 NOT-MEASURED (a DERIVED zero — all 59 recorded an exit code and none of them is 3)'. All 59 exited 0, each exit written to disk before any pipe. check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure and check:sourcemap-no-sources-content first exited 3 (PREREQUISITE NOT MET). They exited 0 after a workspace build through scripts/pm/os-verify-lock.sh: first call killed at the 560s timeout with 56 of 58 tasks done; resumed with 'Tasks: 73 successful, 73 total, Cached: 56', 'VERDICT command-exit 0'. check:pm-dispatch-gates: 'dispatch-gates self-test: 1976 cases pass', battery 1089.7s. check:self-test-workflow-commands: 'no self-test CI runs prints a line the Actions runner would parse as a workflow command'. check-governed-merges --test on the final two paths: '0 of 2 path(s) hit the register ... NOT governed', 494 changed lines. PR CI run 37478942825: all six Test Core shards success and attested, Test Core aggregate success. Lint & Repo Gates was in_progress at report time; CI convergence is the PM's. No ablation was run: the new behaviour is pinned by the self-test battery, with no dist/build path in between.",
      "gates": "59 derived / 59 run / 0 NOT MEASURED, all exit 0 at 430859c2f (reconciled with --ran plus exit codes). The derived list equals the dispatch's list exactly.",
      "files_changed": [
        ".github/workflows/ci.yml",
        "scripts/partition-test-shards.mjs"
      ],
      "line_budget": "not applicable: no skills/** or governed ledger touched. Diff +368/-126 over 2 files, not governed, under 5000 lines.",
      "deviations": [
        "Second-sample source: the run-summary artifacts were unreachable (egress policy denies productionresultssa17.blob.core.windows.net), so I used the aggregator timing tables plus a capacity bound. Shards 2-6 of the full split are NOT MEASURED whole; they were not reported as a PASS.",
        "The suggested route 1 (this PR's own run as the sample) measures only the PR's affected set, spec / client / driver-sql, simulated locally and confirmed in run 37478942825. I waited for it in the foreground per the dispatch's route.",
        "Two present-tense '30-minute wall' phrases in the Test Core job (test step and capture step comments) were also restated. They sit outside the four listed comment blocks but in the same job, and the restated timeout block made them contradictory.",
        "The 24-minute (80% of 30) revert criterion is the dev's choice, stated with its reason in the comment. No ruling names a number.",
        "The new battery name carries a tracker number, in the style of the file's existing batteries. Runtime output strings carry none.",
        "One read-only call to claude-code-remote read_documentation (environment.network), made after the blob host was denied."
      ],
      "mcp_calls": "20, all reads: mcp__github__actions_get x1 (download_workflow_run_artifact, which returned a blob URL that could not be fetched); mcp__github__get_job_logs x18 (13 Test Core aggregator timing tables, 1 shard log of run 37467795959, 4 shard logs of this PR's run 37478942825); mcp__claude-code-remote__read_documentation x1. No MCP write tool.",
      "api_writes": "8: git push x3 to claude/issue-16465-wire-shard-drift-check (merge 74192b464, 094d962b0, 430859c2f), not REST; relay stroke fw-20261006T142233Z-c11ecb as objectstack-fleet[bot], run 37478428594, which made POST /repos/objectstack-ai/objectstack/pulls (draft PR #21998, body read back 9082/9082 bytes identical); label-write relay stroke fw-20261006T142433Z-7d702b, run 37478712221, which made POST /issues/21998/labels (skip-changeset) and POST /issues/21998/assignees (os-justin), read back MATCHES; and this os-dev-report via scripts/pm/post-stamped.mjs, POST /issues/16465/comments. Each relay stroke is itself one POST /repos/objectstack-ai/objectstack/dispatches.",
      "open_questions": [
        {
          "question": "Should the PR stay draft until shards 2-6 of the full split have a whole-shard executed-window reading? Today the only blocker is artifact access. The run-summary artifacts of runs 37467795959 and 37467882762 expire around 2026-10-07T13:00Z, and `node scripts/partition-test-shards.mjs --check-drift` over each shard's summary is the exact reading, one command per shard.",
          "options": [
            "A: accept the evidence in hand (shard 1 exact at most 1.05x; no executed package at or over 1.5x across 9 near-full runs; 8 shard-run pairs capacity-proven under 1.5x) and let the first scheduled runs after landing print the whole-shard verdicts",
            "B: before un-drafting, a seat that can reach the blob host runs --check-drift over the six run-summary artifacts of 37467795959 (or 37467882762) and appends the six verdicts to #16465",
            "C: convert to warning-only until B is done"
          ],
          "recommendation": "B if any seat can reach the blob host before the artifacts expire, otherwise A. Weighed on the four axes: business need and contract-first both favour wiring the ruled red now; the dataset that would breed AI mistakes is the one the red guards; and C adds a temporary second state, which is what startup-stage focus refuses. B costs six commands and turns the bounds into the gate's own numbers, including shard 2/6, which sits nearest the bound (spec 1.39-1.45x)."
        }
      ],
      "out_of_scope_findings": [
        "carrier: the shard-timings refresh lane (.github/workflows/shard-timings-refresh.yml) / the #16468 seat · noted, not filed. On the dataset of single run 37262126122, @objectstack/spec 1134.86s reads 1651.04 / 1573.20 / 1617.61s on its three executed cold runs (1.39-1.45x), and @objectstack/objectql 521.33s reads 1.29-1.38x on six of nine. This is exactly the drift the new WARN tier will annotate on shard 2/6 and 4/6; the remedy is a multi-run refresh, not this PR.",
        "carrier: the next editor of the Test Core job (#16468 seat) · noted, not filed. Shard 1/6 (the CLI alone) already uses 79% of the 45-minute timeout on its slowest post-refresh reading (35m43s, run 37453598388, job wall time).",
        "carrier: none (承接者:无) · noted in the PR's Acceptance notes only. driftReport() has no floor on predicted seconds, so a PR whose shard executes one few-second package gets that package's ratio as the shard verdict. Every lone-package reading found was under 1.0x (0.18x, 0.27x, 0.44x, 0.48x, 0.67x, 0.90x, 0.93x), so no defect is reproduced."
      ]
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Review: ACCEPT — PR #21998 at 430859c2f1

    Seat domain:devx#2 · session_01VF48aw8RPG6wzDnMgp6rtw (takeover 6017480873) · reviewed against GitHub and the fetched branch at 2026-10-06T14:55Z, not against the report (6018891729).

    PR shape.

    • Draft against main, merge base aa09db58c9. The body opens Fixes #16465, then Clause-②: no at line start. A scan of the whole body finds no other closing keyword.
    • Assignee os-justin. Labels ci/cd · size/m · skip-changeset. skip-changeset is right: the PR touches root scripts/ and one workflow, and nothing in it publishes.
    • check-governed-merges --pr 21998: 0 of 2 paths governed, 494 changed lines. It lands through the ordinary queue.

    The ruling (5925054826, restated in 6013064225), read in the diff.

    • The step. "Check this shard's timing drift" runs partition-test-shards.mjs --check-drift over .turbo/runs/*.json with --label "Test Core (${{ matrix.shard }}/6)". It has no if: and no continue-on-error, and it sits after the run-summary upload and above the attestation pair. A shard that wrote no summary prints NOT MEASURED and exits 0.
    • One red, unchanged. MAX_MEASURED_OVER_PREDICTED = 1.5.
    • The warning. The new WARN_MEASURED_OVER_PREDICTED = 1.3 is its own constant, and its docblock separates it from MAX_SHARD_OVER_MEAN. It is the band (1.3, 1.5], exclusive of the red, and it emits one escaped ::warning line on stdout with exit 0.
    • The self-test. Battery "drift warning tier under the red (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)" has 12 cases, floored at 12, and the roster floor rises from 10 to 11. It pins both edges, the red-only verdict past 1.5, a replay-only shard as NOT MEASURED, a non-empty band, the rendered annotation and workflow-command escaping.
    • ⛔ There is no 70%-of-timeout-minutes red and no attestation schema change. timeout-minutes stays at 45.

    Carried items (6013064225).

    1. Executed windows only. Measurements go through samplesFromSummary(), which drops cache HITs and failed suites, and the existing replay self-test still holds.
    2. The second sample: the stop condition did NOT fire. No executed reading puts any shard at or over 1.5×.
      • Shard 1/6 (the CLI alone) reads 0.61–1.05× on all eight scheduled runs since chore(ci): refresh the Test Core shard-timings dataset #21826.
      • No executed package reached 1.5×. The highest is @objectstack/spec at 1.39–1.45×.
      • Shards 2–6 are NOT MEASURED whole: the timing table prints ten packages, and the run-summary artifacts are unreachable. They are bounded instead, by the heavy members' executed windows and the --concurrency=4 capacity bound, which proves eight shard-run pairs under 1.5×.
      • The seat's own check: the aggregator log of run 37453598388 (job 112248922952) reads cli 1751.53/1702.69 = 1.03× and spec 1573.20/1134.86 = 1.39×, the same as the report, and its highest package is spec.
      • Artifact access: this seat cannot reach the artifact host either (gh run download 37467795959 -n test-core-run-summary-2-of-6 answers Forbidden). So the report's option B is not available here, and option A is taken, as its own recommendation allows.
    3. Stale comments, rewritten.
      • The drift block, WHY SIX, the slice-leg prose, and two present-tense "30-minute wall" phrases in the same job; the last is a disclosed deviation.

      • WHY SIX, recomputed by the seat with partition()/balanceOf() at 430859c2f1 (72 items, @objectstack/dogfood excluded):

        shards result
        5 max 1957 s
        6 bins 1703/1615/1615/1615/1617/1616, 1.04×
        7 1.22×
        8 1.39×
        10 1.74×

        These match the comment exactly.

    4. The revert condition. It is restated against measured job wall time, and the value is unchanged. The 24-minute threshold (80% of 30, for a week of scheduled runs) is the dev's choice, stated with its reason. No ruling names a number, so it binds no one until the next editor of the block weighs it.

    CI on the head.

    • PR run 37478942825 (pull_request, head 430859c2f1) succeeded. All six Test Core (N/6) jobs ran the new step to success, and each attested.
    • At this verdict, check-runs on the head show 30 success, 10 skipped and 1 in progress. That one is Lint & Repo Gates. TypeScript Type Check is success.
    • Gates. The dev ran 59 of 59, all exit 0 at 430859c2f1 (--ran reconciled).

    Out-of-scope notes, carried and not filed.

    Owed after landing: the seat reads the six drift verdicts of the first scheduled full run on main and records them here. A DRIFT on any shard is acted on that round, because the red blocks the queue.

    Landing: once Lint & Repo Gates is success on 430859c2f1 with every other check green: pr_ready + automerge_enable, verify on main, and #16465 closes through Fixes.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Landed: PR #21998 → 9c3bec0f4d, verified on origin/main by content at 2026-10-06T15:39Z. Seat domain:devx#2 (takeover 6017480873).

    • .github/workflows/ci.yml (79d4aa4e06) and scripts/partition-test-shards.mjs (a7c6fc76ec) on main are blob-identical to the reviewed landing head 430859c2f1. The merge commit is an ancestor of origin/main.
    • The card was closed completed by the PR's Fixes #16465. pm:dispatched is removed in this act.
    • First full-set reading: merge-group run 37483891740 ran "Check this shard's timing drift" to success on all six Test Core (N/6) jobs, and the Test Core aggregate succeeded. So the red did not fire on the queue's own run.
    • Still owed by this seat: the six verdicts of the first scheduled full run on main after 9c3bec0f4d, recorded here. A DRIFT on any shard is acted on that round.
    • Carried to 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, which this card unblocks; pointer on that card:
      • spec (1.39–1.45×) and objectql (1.29–1.38×) drift, which the new warning tier will annotate. The remedy is a multi-run refresh.
      • Shard 1/6 already uses 79% of the 45-minute timeout.
      • The landed dataset rests on one run (37262126122).

    Generated by Claude Code

  11. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Post-landing reading (owed in 6019846983) · seat domain:devx#2 · 2026-10-06T16:38Z

    The first scheduled full run on main after 9c3bec0f4d: run 37492319239 (schedule, head 803764a36f, which contains the merge commit).

    shard job drift step drift annotation job wall time
    1/6 112368139313 success none 36m01s
    2/6 112368139162 success none 18m59s
    3/6 112368139178 success none 11m34s
    4/6 112368139185 success none 16m28s
    5/6 112368139349 success none 15m06s
    6/6 112368139243 success none 14m55s
    • No shard read DRIFT, so the red did not fire. No shard carries a "Test Core shard timing drift" annotation (each job's check-run annotations were read through the REST annotations endpoint), so none reached the 1.3× warning either.
    • Not separated here: OK and NOT MEASURED. Both are green without an annotation, and the step's log lines were not read. This reading claims "no DRIFT, no WARN", not six OK verdicts.
    • Shard 1/6's wall time is new evidence for 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's lane. At 36m01s it is a new high (it was 35m43s, run 37453598388), and it is 80% of the 45-minute timeout. The timeout's revert condition (24 minutes on every scheduled run for a week) is further away, not closer. Nothing here changes the value; that is a ruling's. It is recorded so whoever next weighs the timeout has the reading.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions