Repository navigation
Try each network command of a benchmark shard's install up to three times under a four-minute bound, naming the command, and bound both shard jobs at twenty minutes, so a mirror 503 is tried again and a stall fails the shard rather than the merge queue (§AR-ci.5.6) - #1352
Merged
Merged
Conversation
…der a per-attempt bound and tries it again after a pause, and that both shard jobs carry a twenty-minute bound, and pin it failing, red until agent-grounds#1191 (§AR-ci.5.6, §AR-ci.requirements.2) `apt-get update`, `apt-get install`, `cargo install iai-callgrind-runner` and `cargo fetch` each run once today with no wall-clock bound, so a 503 from snapshot.debian.org turns a shard red and a trickling connection holds a merge-queue group until its 90-minute check timeout. §AR-ci.5.6 says what the install does instead and derives its numbers from the shards' measured durations; §AR-ci.5 points at it in place of "rerun it", and §AR-ci.requirements.2 says the two shard jobs carry its bound already while its mark stays deferred. tests/integration/test_bench_shard_install.py runs the install's own script under bash -eo pipefail, with apt-get, cargo, timeout and sleep replaced by stand-ins that answer, fail or stall on demand. Its two shard tests are skipped as red until agent-grounds#1191; the fixture checks run and pass. AR-ci.md's fissile ceiling moves from 1199 to the 1200 non-blank lines it now measures.
…minute bound per attempt, three attempts 30 s apart with a line naming the command and attempt, and bound both shard jobs at twenty minutes, so a 503 is tried again and a stall fails the shard rather than the queue (§AR-ci.5.6)
vjovanov
force-pushed
the
fix/issue-1191
branch
from
November 11, 2026 00:40
7f42560 to
0fef997
Compare
vjovanov
marked this pull request as ready for review
November 11, 2026 00:40
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.
Closes #1191
A benchmark shard's install now tries each network command up to three times, each attempt bounded at four minutes, and says which command it is on. Both shard jobs are bounded at twenty minutes. A 503 or 504 from
snapshot.debian.orgis tried again instead of turningcargo bench (shard N)red, and a stalled fetch now fails the shard instead of holding a merge-queue group until its 90-minute timeout.Before, a shard either failed on one mirror error:
or went silent in the install step until the queue or a person cancelled it, with nothing to say which command was running (job 126984740865, 88 minutes):
After, every network command names itself before each attempt. This is shard 4 of hosted run 42920806655 on this branch, where every command succeeded on its first attempt:
A 503 is now one failed attempt, not a failed step. Below is the committed wrapper, copied byte for byte from the action, run locally against a stand-in
apt-getthat answers 503 once (withsleepstubbed out):What changed
ci.yml'sbenchjob andbench-nightly.yml'sbenchjob use.github/actions/bench-shard. Its stepInstall Valgrind and iai-callgrind-runnerranapt-get update,apt-get install,cargo install iai-callgrind-runnerandcargo fetchonce each, with no time bound, and neither job had atimeout-minutes. That caused both failure shapes in the issue:Acquire::Retries=5turned the shard red.rust:1.95.0-bookworm@sha256:6258907a…): it ran the shard'sapt-get -o Acquire::Retries=5 update -qqagainst a loopback mirror that sends one byte every 20 s. apt stayed on its first connection until the outer bound killed it, and one run held it for 1320 s. A mirror that accepts and never answers does not stall apt: apt gives up after 211 s. Only the trickle does. The live stalls' logs end before dpkg's first line, so the stall was in apt's fetch. That is inferred, not shown, because-qqand--quiethid the command.fetch LABEL COMMAND..., and all four network commands go through it (§AR-ci.5.6):timeout --kill-after=10 240;sleep 30only after a failed one, so a healthy install never waits;bench-shard: <label>, attempt <n> of 3is printed before each attempt, andbench-shard: <label> failed with exit <status>, attempt <n> of 3after a failed one;timeout-minutes: 20. This catches a stall that no per-command bound covers, including one incargo benchitself. Even if one command fails all three attempts at full length (3 × 250 s + 2 × 30 s = 810 s), the step fails and names that command with more than five minutes to spare. A command that recovers on its last attempt adds about 9.3 minutes. On the durations triage measured (56 passing pull-request shards on 2026-11-10, 70 nightly shard jobs from 2026-11-01 to 2026-11-10), that still ends a pull-request shard inside 15 minutes and a nightly shard inside 20.20261001T000000Z,valgrind=1:3.19.0-1, thelibc6-dbg="$(dpkg-query …)"expression, runner 0.16.1 and the image digest. A retry asks the same snapshot for the same versions.-qqand--quietstay too, as §AR-ci.requirements.5.4 requires. The marker lines name the command instead.Specification points
All are architecture points in
docs/architecture/AR-ci.md, because this is the repository's own CI. No FS or REQ point moves, and nothing a user ofgrundsees changes.ci.ymljob.docs/file-size-agent-exceptions.toml: AR-ci.md's ceiling goes from 1199 to the 1200 non-blank lines it now measures, with a reason paragraph in the file's usual form.Found and deliberately not fixed
apt-get install's dpkg phase, which takes about 2 s. apt runs dpkg in its own session, so a kill that lands there leaves dpkg locked or interrupted, and both retries fail with exit 100. Review reproduced this in the shard's image with a shortened bound. It needs the bound to fire in the last ~2 s of a download that would otherwise have finished. The result is a red shard in bounded time: no worse than before, and not the 90-minute hold. The follow-up is to put onlyapt-get install --download-onlyunderfetchand install from the cache outside it. A kill during the download or duringapt-get updatedoes recover: review saw attempt 2 resume the download with aRange:request and install.ci.yml(lychee, fissile),ci-leg.yml,macos-suites.ymlandlinks-nightly.yml. This is out of scope. §AR-ci.5.6 governs the shard's install alone, every 503/504 on record namessnapshot.debian.org, and the repository'sflaky-testhistory has no crates.io install flake..github/actions/, sogrund checknever resolves the action's§AR-ci.5.6citation, nor its older ones. The citation is correct. The gap predates this change and belongs to a change of its own..debs. §AR-ci.5.6 names it as the next step if an outage ever outlasts the three attempts.How it was verified
tests/integration/test_bench_shard_install.py(new, cites §AR-ci.5.6) does not read the install as text. It runs it. It inlines the composite action into each shard job and runs the install step underbash --noprofile --norc -eo pipefail, as the step'sshell: bashdoes.apt-get,cargo,timeoutandsleepare replaced by stand-ins. For each of the four commands, in bothci.ymlandbench-nightly.yml, it runs four scenarios: healthy, fails once, stalls once, and down for good. It also reads each job'stimeout-minutes. Before the fix, its two shard tests failed with thirteen problems each, one per missing property. Its ten fixture checks run the same checks against altered copies of the install, so a check that can no longer fail is caught: the old install fails every property, and a retry thatbash -eends, one bound around all attempts, unwrapped cargo, a retry with no message or pause, and a bound too short or too long for the job are each caught. The module runs in about 1.7 s.test_bench_shard_install,test_ci_bench_jobsandtest_bench_runtime_pinsran 22 tests: OK, none skipped. Triage's reproducer exits 0 on the branch head7f425602de.pre-commit run --all-files, the whole CI gate, exits 0 in 20m58s.7f425602de: the run succeeded, includingcargo bench (build)and all seven shards. Each shard ran every command once, on attempt 1. The retry path has run only against the test's stand-ins, not against the real mirror, because the mirror did not fail during this run.How this ran: the simple path, with triage, specify, implement, one review round (approve, no blocker or major), then green. Fix round 1 and the second review and fix rounds were cancelled, and no tier was raised. The
greenstep is a program, so it does not appear in the list of agent invocations below.AI workflow: `rhei`, 14 agent invocations across 1 model; 6 tasks completed, 10 in progress.
github-issues-agent-grounds-grund-1191-implement-6567849c.ticketsupervising (visit 1) — cld, anthropic/claude-opus-5-5 — 1.0s — 0 in / 0 outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticketsupervising (visit 1) — cld, anthropic/claude-opus-5-5 — 2.0s — 0 in / 0 outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticketsupervising (visit 1) — cld, anthropic/claude-opus-5-5 — 1m48s — 1.3M in / 10.3k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticket.triageassessing (visit 1) — cld, anthropic/claude-opus-5-5 — 30m02sgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticket.triageassessing (visit 1) — cld, anthropic/claude-opus-5-5 — 15m14s — 4.0M in / 32.7k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticket.triagereproducing (visit 1) — cld, anthropic/claude-opus-5-5 — 8m54s — 4.6M in / 34.3k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticketsupervising (visit 2) — cld, anthropic/claude-opus-5-5 — 2m52s — 2.3M in / 16.1k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticket.specifyspecify — cld, anthropic/claude-opus-5-5 — 57m23s — 13.4M in / 107.6k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticketsupervising (visit 3) — cld, anthropic/claude-opus-5-5 — 1m16s — 715.7k in / 7.7k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticket.implementimplement — cld, anthropic/claude-opus-5-5 — 74m48s — 4.2M in / 20.2k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticketsupervising (visit 4) — cld, anthropic/claude-opus-5-5 — 57.0s — 507.0k in / 6.0k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticket.review-1review — cld, anthropic/claude-opus-5-5 — 10m22s — 5.2M in / 54.2k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticketsupervising (visit 5) — cld, anthropic/claude-opus-5-5 — 1m07s — 864.9k in / 5.9k outgithub-issues-agent-grounds-grund-1191-implement-6567849c.ticketsupervising (visit 6) — cld, anthropic/claude-opus-5-5 — 42.0s — 638.4k in / 4.5k out