Repository navigation
ci: Test Core's two timing gates exit-grade on schedule alone (C2), with a 20s ceiling floor - #22973
Merged
objectstack-fleet[bot] merged 2 commits intoOct 12, 2026
Conversation
`--check-drift` takes the run's event (`--event`), required. On `schedule`, the profile scripts/test-shard-timings.json is measured on, a DRIFT exits 1 as before; on every other event it prints the same text, raises one `::warning::` annotation and exits 0. A missing or empty event is refused. Claude-Session: https://claude.ai/code/session_012yK1ddAdAqfzwigRHZq3r2 Co-authored-by: Claude <noreply@anthropic.com>
…one, with a 20s floor The ceiling check takes the run's event (`--event`, required). On `schedule`, the profile the ceilings were measured on, a package over its ceiling reds the step as before; on every other event the same table prints, each package over its ceiling is a `::warning::` annotation, and the step exits 0. Refusals stay red on every event. A package whose effective ceiling is under CEILING_FLOOR_SECONDS (20s) is never red and prints "below floor"; the header records the floor's reading. ci.yml passes `--event "$GITHUB_EVENT_NAME"` to both timing steps, which keep no `if:` and no `continue-on-error`. Claude-Session: https://claude.ai/code/session_012yK1ddAdAqfzwigRHZq3r2 Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 12, 2026
This was referenced Oct 12, 2026
objectstack-fleet
Bot
deleted the
claude/issue-22949-timing-gates-schedule-only
branch
October 12, 2026 08:33
This was referenced Oct 12, 2026
This was referenced Oct 12, 2026
This was referenced Oct 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #22949
Clause-②: no (internal CI tooling; no published surface)
Refs #22966
Refs #22968
Implements ruling 6119186511 (letter C2 for both timing steps, plus an absolute floor; the maintainer's word 「当然短期先尽快修复」): a timing gate exit-grades only on the run profile its baseline was measured on; everywhere else it reports. #22966 (the PR-time drift card) is the drift half of the same ruling and remains open for triage. #22968 (the hourly card) remains open until an uneventful green hourly run after this lands.
What changes
ci.yml)schedulemerge_group,pull_request,push,workflow_dispatchTest Core→ "Check the per-package suite-duration ceilings"::error::annotation::warning::annotation, exit 0Test Core (N/6)→ "Check this shard's timing drift"::warning::annotation, exit 0CEILING_FLOOR_SECONDS) is never red on any event and printsbelow floor. A ceiling at the floor is graded; a ruled raise that lifts a ceiling to the floor or above grades the package again.RULED_CEILING_RAISES, the Q2 B rule for new packages, the dataset and the refresh lane. No edit toscripts/test-shard-timings.json,scripts/measure-test-shard-timings.mjsor.github/workflows/shard-timings-refresh.yml.--event, is not a timing reading and does not vary with runner load, so it exits 1 everywhere. The raise record is already checked at PR time by lint.yml's--self-test("the live record is well-formed"). This is my reading of the ruling's scope (it names "every package over its ceiling or shard over its drift bound"); if the seat reads it as "the step never exits 1 off schedule", the change is small and local to the two render functions.workflow_dispatchreports. The ruling namesscheduleas the one exit-graded event. The refresh lane readsevent=scheduleruns only (DEFAULT_RUN_EVENTinscripts/ci/select-shard-timings-run.mjs, no--eventoverride inshard-timings-refresh.yml), and a dispatched run writes the remote turbo cache (TURBO_CACHErw) where the hourly run only reads it, so it is not the baseline's profile.H2: how the off-schedule path is spelled
Both scripts take a required
--event, and ci.yml passes--event "$GITHUB_EVENT_NAME". The rule (TIMING_GRADED_EVENT = 'schedule',timingGateMode,timingModeNote) is defined once, inscripts/partition-test-shards.mjs, and imported byscripts/check-test-suite-ceilings.mjs(which already importedescapeWorkflowCommandMessagefrom there).continue-on-error(theci.yml:1204spelling): it leaves the::error::annotations in place and does not produce the::warning::the ruling asks for.--report-onlyset by a YAML expression: the policy would then live in an expression no self-test reads, and a typo in it fails silently in one direction or the other. With--event, the decision table is self-tested in the script, and a missing or empty event is refused (exit 1), never defaulted to either mode.if:or acontinue-on-error. The drift step's comment block carries "NOif:and NOcontinue-on-error(the red is the point)"; that line still holds as written and is extended, not removed. The other ⛔ lines H1 named (ci.yml:1036-1037and:1218) bind the attestation pair, which this PR does not touch.partition-test-shards.mjs --check-driftneeded the same flag for a warning to exist at all.The floor: 20 s, and its reading
Read by the
domain:devxseat off the table's distribution, as the ruling assigns: on1f312fdfa(unchanged at this PR's base246edf5b3) the 72 ceilings run 3.40, 3.69, 4.24, 5.18, 6.39, 9.10 and 16.23 s, then 22.71 s (downstream-contract) and up. 20 s sits in the widest gap of the low band (16.23 to 22.71). Seven packages fall under it:knowledge-ragflow,service-cache,observability,sdui-parser,knowledge-memory,embedder-openai,client-react. The value, its reading and the ruling URL are recorded once, in the gate header ("The absolute floor").H5: packages the hourly run never grades
The hourly run grades only the packages it executes; a turbo cache replay carries no window. I read the "How much of the run this table saw" block of six hourly
scheduleruns (MCPget_job_logson eachTest Corejob; the 04:09Z set is the complement of that run's graded rows against the 72-package dataset, since the tail read missed its block):381922736983819522226938198819852382026453213820666080438210849670formula,metadata-fs,observability,sdui-parserandspec.core,metadata,plugin-hono-server. Each was also replayed at 01:32Z and 03:12Z (5 of 6); the one run that executed them (02:17Z) predates the ceiling table, so none of the three has been graded yet.formula,metadata-fsandspecwere replayed on 4-5 of the 6.Parity checkers
None was touched; none needed an edit. Run green on the head unchanged:
check-self-test-workflow-commands,check-step-collectors,check-workflow-status-functions,check-required-contexts,check-aggregator-roster,check-ratchet-remedy-authority,check-stall-guard-budget,check-stall-guard-headroom,check-workflow-step-name-quoting,check-shard-attestation. H3 ("expect at least one to need a matching edit") did not hold.Evidence (head
ef3d0764b)Ceiling CLI, one synthetic capture (
cloud-connection200.33 s vs 163.89 s,downstream-contract25.00 s vs 22.71 s,knowledge-ragflow4.80 s vs 3.40 s,client150.00 s vs 179.74 s, against the live dataset):Drift CLI, one synthetic turbo summary (
runtime916.1 s,service-analytics463.7 s,client183.5 s against the live weights = 1.82x):Self-tests:
check-test-suite-ceilings --self-testOK, 58 cases across 9 batteries (two new: the floor, 8 cases; off-schedulereporting, 8 cases; roster floor 7 to 9).partition-test-shards --self-testOK (one new battery, 8 cases; roster floor 12 to 13).Ablations (each through
scripts/ablation-replace.mjs, anchor hit 1 to 0, restored to the HEAD blob,git diff HEADempty after):CEILING_FLOOR_SECONDSingradeCeilingsrewritten to compare against 0): ceiling self-test red,floor: a 3.40s ceiling run at 4.20s read over / OVER, exit 1.timingGateModealways'grade': partition self-test red (C2: merge_group, pull_request, push, workflow_dispatch exit-grade, but only schedule may) and ceiling self-test red (floor: a 22.71s ceiling run at 25s off schedule was not a warning alone: exit 1).Gates:
dispatch-gates --commandson this diff derives 59 commands (the same 59 as at dispatch);--ranreconciliation: 59 accounted, 55 exit 0, 4 NOT MEASURED (exit 3, PREREQUISITE NOT MET:check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closure,check:sourcemap-no-sources-contentread builtdist/; this diff touches no package, so no build is owed and CI runs them).pnpm check:pm-dispatch-gates: fast tier 1828 cases, exit 0. The 9 workflow-valued families (the ceiling step's own--capturesrun among them) are CI's.Lint, narrowed: eslint over the two edited scripts, 2 files, 0 errors, 0 warnings (
--format json). Population:eslint.config.mjslints**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}, so both are in it; ci.yml is not eslint's. Invariance: the config enables no type-aware linting (--print-configshowsparserOptionswithoutproject), so this diff cannot move a verdict on any untouched file.Acceptance notes
ci.yml's comment above "Download this run's shard test timings" still says the ceiling check "is the one step here that DOES red the job". It remains true onschedule; I left it as is because the file surface is the two timing steps. Carrier: none.Generated by Claude Code