Skip to content

The tier declaration is taken from the instrument, the return rule reads both lanes, and twenty-four names move - #467

Closed
Japabu wants to merge 6 commits into
mainfrom
wt/toyos-tiersync
Closed

Japabu wants to merge 6 commits into
mainfrom
wt/toyos-tiersync

Conversation

@Japabu

@Japabu Japabu commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

Seven consecutive main push runs went red on durations. Every one named
sysret_ss_reload, and five of the seven also named a Fast name no pull
request had touched, priced over a line on the push lane that the nightly's
own partition prices the same name well under. From the durations job logs
of those five runs against the nightly 35072262489 partition this branch
commits (ms):

run name push nightly ratio
34773208611 boot_partition_identity 8,205 6,798 1.21x
34778832553 xhci_many_devices 11,102 4,944 2.25x
34834353873 boot_partition_identity 8,319 6,798 1.22x
34899157020 page_cache_partition_offset 8,503 4,559 1.87x
34899157020 so_cache_refusals 10,992 6,348 1.73x
34911665787 home_overwrite_reads_back 10,721 6,734 1.59x
34911665787 metal_sim_input 8,721 6,166 1.41x

Six name/nightly pairs, seven push prices, 1.2x–2.25x over the nightly. Two
things were wrong and this branch moves both. The committed tier declaration
had drifted from the instrument — tests/test-durations was last written from
a partition whose author replaced only the rows their own change had
registered — and the push lane rendered Enforced::Everything on a composition
the merge queue had just measured at Touched, so a disagreement the queue
printed as a warning landed and then reded main on names no pull request
could fix.

The return rule reads both lanes — read this first

A name is Fast only if it is at or under FAST_COMMIT_MS on the instrument
of record, the nightly, and on the gate it must then pass: the returning
landing's own hosted run.
That sentence is FAST_COMMIT_MS's doc in
src/tiers.rs now, and this landing is placed by it.

This pull request's first hosted run (ci 35352795338, head 20b04cc1) was
red in durations on the UNMEASURED marker line alone — the marker's refusal
returns before any price verdict is computed. With the marker replaced, the
same twelve shards priced five names over the 8,000 ms line on the
pull-request lane:

name nightly 35072262489 run 35352795338
screen_gop_firmware_mode 7,667 9,090 one of the 26 returns — not returned
fat_backing_revoked 6,719 8,333 one of the 26 returns — not returned
screen_console_scroll 7,513 8,235 one of the 26 returns — not returned
ftruncate_flush_race 5,844 8,111 one of the 26 returns — not returned
boot_partition_identity 6,798 9,527 an existing Fast name — relegated; main's push runs 34773208611 and 34834353873 priced it 8,205 and 8,319

These five were found because a landing that re-prices the whole profile
renders every re-priced name on its own runs — 433 names here — and that rule
stands as written.

Why the five rows are a new Why and not Why::Cost. The committed
profile is the nightly's, so it prices all five under the line — and a
Why::Cost row priced under the line is exactly what the return arm refuses.
Measured with the five written as Why::Cost:
cargo test -p toyos-build --lib tiers:: exits 101 with five belongs Fast lines, one per name; the nightly would say the same every night, and so
would this pull request's next run, which retains the nightly's row for a name
the fast tier does not run. ci_ms cannot carry the hold for every Why::Cost
row either — it is a hand-kept note (121,441 on desktop_audio_client against
a profile price of 8,401), and a rule that read it would hold every Cost row
for ever and end the nightly's invitation back. So the hold is declared:

Why::CostOnTheGate — priced with margin by the nightly and without it by
the gate a return has to pass. ci_ms is the hosted pull-request-lane
reading that refused the return, and on this variant alone it is checked: a
reading at or under FAST_COMMIT_MS holds nothing and is refused on every
run as a declaration verdict. No nightly price moves the row; it returns
through a landing that re-tiers it Fast and whose own run prices it under the
line.

Why::Cost rows keep the nightly's invitation exactly as it was. What this
does not close is a name that straddles on the nightly's own lane:
log_conservation_smp4 is 9 ms under the line there and 4,881 on the gate, so
both lanes put it Fast, and a nightly that prices it over 8,000 again is its
standing src/redlist.rs row.

The push lane

A push to main is a composition the merge queue already measured, so
.github/workflows/ci.yml's durations job passes
--tier-base ${{ github.event.before }} on push — the tip the push
replaced. The gate holds the order, not the set: src/ci.rs reads the
TIER_BASE: expression and asserts its operands in || order — the merge
group's base, the pull request's base, github.event.before. A pull_request
synchronize payload carries before too (the branch's previous head), so
before first would narrow every pull request to what its last push moved
with all three strings still in the file. Enforced::Everything's doc no
longer names a push to main; schedule and workflow_dispatch still name no
base and render the whole verdict.

One law for what is committed from a run

src/durations.rs's header states it once: the nightly is the instrument of
record, so a re-pricing of the profile is the nightly's whole artifact, landed
as its own change; a pull request replaces only the row its own UNMEASURED
marker holds, from its own hosted run, and that row stands priced by that run
until the next nightly re-prices it. #463's sentence in the same header ("a CI
run's merged durations are committed only for the rows this change's own
markers blocked") is the second half of that law and is folded into it in the
merge of origin/main.

This landing is the first kind: cargo run -- --merge-durations over the
twelve durations-shard-* artifacts of scheduled run 35072262489
(2026-09-16, main at 8261079e, twelve hosted shards under --nightly, all
twelve present) writes 448 measured rows — every row in the profile, none
carried — and its verdict on the base names 27. Its commit 3928e700 is the
second kind
: one row, sysret_ss_reload 5908 shards=12, from this pull
request's own hosted run.

A name whose price a landing re-takes is judged by that landing

Before this, once a marker was replaced by a number, no gate a pull request or
a merge group runs rendered that name's verdict: the reviewer measured exit 0
with sysret_ss_reload sitting at 15,402 ms. The rendered name set gains a
fourth source — any name whose tests/test-durations row differs from the tier
base's — and the same experiment now exits 101:
sysret_ss_reload measured 15402 ms in CI, over the 10000 ms line, but sysret_ss_reload remains Fast [enforced on this run: …re-priced sysret_ss_reload]. UNMEASURED_MS, render_verdict, Enforced, both module
headers and the ci.yml comment now say the marker covers a re-taken price as
well as a new registration.

The consequence for a first-kind landing is deliberate and visible here: this
pull request re-prices every row, so its own runs render the verdict for 433
names rather than for the ones it re-tiers.

sysret_ss_reload — the test is fixed, judged, and priced Fast

15,402 ms on the nightly and 32,237 to 45,686 ms on the five push runs, against
a committed 6,453 — none of it the kernel's. The probe line lands before
===READY===, so boot_log() already held it and the 10 s drain_until
ceiling, scaled by width and host speed, could only time out. The test reads
the boot log for the line and drains only when it is not there.

Its judge: QemuInstance counts its drains, and the test refuses a run
whose boot log held the probe line and whose console was drained anyway.

Its price: ci run 35352795338 ran the fixed test on hosted shard 1 at
5,908 ms — under the commitment line, so the name stays Tier::Fast with no
RELEGATED row, and the marker is gone. Locally, cross-arch TCG:
cargo test sysret_ss_reload exit 0, 2,168 ms.

The redlist row about its price is retired against commit 20b04cc1 with
source at tests/toyos.rs.

Twenty-two returns, plus one rider; four held; one relegated

The nightly partition prices 26 Why::Cost rows at or under the 8,000 ms
commitment line. Twenty-two of them are also under it on this pull request's
own hosted run and return: RELEGATED entry removed, Tier::Nightly
Tier::Fast. The four marked held stay Tier::Nightly as
Why::CostOnTheGate with ci_ms the gate's figure. Removed row's ci_ms /
nightly 35072262489 / run 35352795338, ms:

name was nightly gate name was nightly gate
log_conservation_smp4 8248 7991 4881 wall_clock_zone 9347 4988 6756
screen_gop_firmware_mode held 12624 7667 9090 esp_filesystem 10123 4970 4791
screen_console_scroll held 13401 7513 8235 wall_clock_rtc_dead 8070 4929 6507
log_partition_identity 9516 6896 7854 wall_clock_century_register 9030 4866 5199
fat_backing_revoked held 8226 6719 8333 usb_short_read 8150 4751 4510
xhci_full_speed_device 8833 6695 7130 writeback_spawn 8820 4748 4658
writeback_durability 8888 6555 6803 idle_stack_guard 9601 4642 5560
dump_nmi_probe 8098 6023 6374 console_line_atomicity 8925 4608 4786
fs_rename_durable 9346 5999 5296 gpu_set_resolution 8610 4554 5626
locale_detect 9959 5961 5028 heap_ceiling_recovery 10371 4516 4431
ftruncate_flush_race held 9452 5844 8111 cache_eviction 8165 4515 4621
screen_survived_panic_not_blamed 8477 5794 6548 fsync_failed_commit 8386 4248 4394
xhci_slot_exhaustion 8149 5198 5260 double_panic_names_the_fault 9120 2735 2700

locale_detect_unrecognized (160 → 281 ms) is
Why::RidesTheBootOf("locale_detect") and returns with its carrier: one boot
cannot be in two tiers. boot_partition_identity (6,798 on the nightly; 9,527,
8,319 and 8,205 on the gate's lane) leaves the fast tier as
Why::CostOnTheGate; its guards says what goes dark — the
firmware-against-table agreement and the two-claimant arm — and what stays:
toyos-gpt's host suite and foreign_disk_untouched. Against main: 23 rows
leave RELEGATED, 4 stay with a new Why, 1 is new.

xhci_full_speed_device returning is
issues/build/xhci-full-speed-device-jumped-47-percent-over-its-commitment.md's
2026-08-22 ruling honoured; its standing redlist row about its own variance is
what a fast-tier price red on it is read against.

The two names the profile had never priced

audio_tone (smp=8) and audio_tone_load (smp=8) were labels the committed
profile did not hold. Priced here from CI's own artifact at 8,799 and
12,315 ms; both over the commitment line, both names stay Tier::Nightly.

Tracker

  • issues/build/the-committed-profile-disagrees-with-the-nightly-on-28-names.md
    asked for exactly this landing and is closed by deletion; its one durable
    rule is in src/durations.rs's header (the nightly's artifact is committed whole, as
    its own change).
  • issues/build/idle-stack-guard-price-nearly-doubled-since-its-return.md is
    closed by deletion: its whole evidence was idle_stack_guard 9,601 ms and
    dump_nmi_probe 8,098 ms, and this partition prices them 4,642 and 6,023.
    No citation to it existed.
  • issues/build/the-return-rule-reads-one-sample.md was filed by this pull
    request and is closed by it, by deletion: the rule reads two lanes now. Its
    table is the one above and is in commit 08d700d3's message; no citation to
    it survives (git grep), and log_conservation_smp4's standing redlist row,
    which cited it, is re-sourced to tests/common/logread.rs with run
    35352795338's 4,881 ms added.
  • issues/build/nothing-compares-a-committed-tier-row-to-the-artifact.md
    filed: nothing compares a committed Relegated row or profile row to the
    artifact (ci.yml's git diff --quiet writes a summary bullet and no red),
    with the four partial fixes of this landing that every named gate stays green
    under as its evidence. The gate is not changed here.
  • issues/build/a-timer-anchored-names-tier-is-decided-by-its-price.md loses
    the one paragraph this landing falsifies;
    issues/build/the-shard-split-prices-a-boot-and-not-the-image-behind-it.md
    loses the five run totals whose spread was this test's drain and keeps the
    figures net of it: about 41.7, 12.3, 8.3, 19.9 and 6.5 s, a spread of about
    35 s against a best case of about 31 s.

Risk, named

Negative controls, build exit before test exit.

mutation build test
ci.yml's TIER_BASE reordered before || merge_group || pull_request (the reviewer's) 0 101ci::tests::the_names_a_landing_is_judged_on…, left [before, merge_group, pull_request]
the profile dropped as a source of touched names (the old rule) 0 101durations::tests::a_repriced_name_is_rendered_by_the_landing_that_repriced_it, touched {} against {audio_tone, iommu_empty_domain}
sysret_ss_reload with no guard and a 1 ms ceiling (the reviewer's partial fix) 0 1the boot log already held the probe line and the console was drained 1 time(s) for it anyway
the hold reverted: the five Why::CostOnTheGate rows written Why::Cost 0 101tiers::tests::the_ci_profile_and_tiers_agree with five belongs Fast lines, and a_nightly_price_does_not_return_a_row_the_gate_holds with it
the whole landing reverted: --merge-durations over the nightly's twelve artifacts on a git archive of dc38a054 101, 27 lines: sysret_ss_reload 15,402 over the line and 26 Why::Cost rows that belong Fast

The independent oracle. The prices are CI's own durations-shard-*
artifacts from a scheduled hosted run of main and from this pull request's
own hosted run; the push-lane prices are the five push runs' own durations
job logs; --merge-durations refuses anything that is not one whole
twelve-shard partition.

What this does not claim. The 22 returned names are under the line on two
hosted partitions, one per lane, and no more than that; a name that straddles
on the nightly's own lane is still held nowhere (log_conservation_smp4,
first section). The shortened-ceiling half
of the reviewer's partial fix (guard kept, ceiling cut) is not reded by
anything: it breaks only a shard where iod's probe runs after ===READY===,
and no actuator stages that.

Checks run, on 08d700d3

gate exit
cargo test -p toyos-build --lib 0 — 311 passed, 0 failed, 1 ignored
cargo test --test toyos-build -- --list (check_registration) 0
cargo run -- --merge-durations <run 35352795338's twelve artifacts> --tier-base 9f91b581 — the pull-request lane, with the base ci.yml passes (pull_request.base.sha) 0 — 433 names rendered, 0 warnings. With the five names' lines taken out of the shards, which is the shape of the next hosted run now that the fast tier does not run them: 0
cargo run -- --merge-durations <nightly 35072262489's twelve artifacts>, no base 101, one line — sysret_ss_reload measured 15402 ms in CI, over the 10000 ms line, but sysret_ss_reload remains Fast. That line is the nightly having run the test before 20b04cc1 fixed its drain; nothing else is named, and the written profile differs from the committed one in that row only
same nightly artifacts on a git archive of base dc38a054 101 — the 27 disagreements
cargo test sysret_ss_reload (guest, dev host TCG), on 84bfc3c5 0 — 2,168 ms

cargo run's QEMU path was not used; the guest boot above is the harness.

🤖 Generated with Claude Code

https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK

…ames move to the tier their price earns

Seven consecutive `main` push runs went red, every one of them on `durations`
and its `guest-suite` aggregate. That is one standing disagreement seen seven
times, not seven incidents: `tests/test-durations` was last written from a
partition whose author replaced only the rows their own change had registered
and left every other name at its older number, so the committed declaration
drifted from the instrument on names nobody could see from the landing that did
it, and it drifted until a run that renders the whole verdict met all of them at
once.

## Why the push run reds and the merge group does not, and why that stays

`.github/workflows/ci.yml:614` sets `TIER_BASE` from
`github.event.merge_group.base_sha || github.event.pull_request.base.sha`, which
is empty on `push`, `schedule` and `workflow_dispatch`. An empty base is
`Enforced::Everything`, so a push to `main` renders every price verdict; a
merge-group composition names the `main` it was built on and prints the rows it
did not touch as `::warning::`.

**That asymmetry is the documented design and `ci.yml` is unchanged.**
`src/durations.rs`'s `Enforced::Everything` names "a push to `main`" in its own
doc and states the rule the other way round as well — "a workflow expression
that evaluates to nothing must widen the gate, not silence it" — and the
`TIER_BASE` step's own comment says "Empty on `schedule`, `push` and
`workflow_dispatch` — none of them is a change under review — and empty means
the whole verdict, never none of it." A push run is `main`'s tip and not a
change under review, so it is the instrument of record by construction. The
defect is the declaration, and the declaration is what moves here.

## The instrument

`cargo run -- --merge-durations` over the twelve `durations-shard-*` artifacts
of scheduled run 35072262489 (2026-09-16, `main` at 8261079, twelve hosted
shards under `--nightly`, all twelve present) writes 448 measured rows — every
row in the profile, none carried. The verdict it renders at
`Enforced::Everything` names 27.

## `sysret_ss_reload`, the one over the line

15,402 ms against the 10,000 ms ceiling while declared `Tier::Fast`, on a
committed 6,453 ms. It is relegated `Why::Cost`: "priced without margin by
itself — over `FAST_COMMIT_MS`, whether or not it is also over
`FAST_CEILING_MS`" is the variant's own definition and this is it.

Not `Why::TimerAnchored`. Its verdict is a substring of a line the kernel
printed and no clock is in it, and whether the timer-anchored boundary is a
classification or a cost rule is the open owner question in
`issues/build/a-timer-anchored-names-tier-is-decided-by-its-price.md` — not this
landing's to answer. `Why::Cost` is also the row that retires itself: the price
is the harness's and not the kernel's, and
`issues/build/the-shard-split-prices-a-boot-and-not-the-image-behind-it.md`
already records the mechanism — the probe line lands before `===READY===`, so
`boot_log()` already holds it and `drain_until`'s predicate can only time out,
spending the ceiling in full on every run. Fixing that returns the name by the
table's own rule.

Not its redlist row either. `src/redlist.rs` "declares nothing and exempts
nothing", so the standing row could never be what kept the name Fast; what it
recorded was the price going unenforced at a base. It is retired against this
landing and its `source` repointed from the closed issue file to `src/tiers.rs`,
which is the site that now carries the name.

## The twenty-six in the return direction

Each is a `Why::Cost` row this partition prices at or under the 8,000 ms
commitment line, which is the return rule's own condition, so each loses its
`RELEGATED` entry and its `Tier::Nightly` column. Old `ci_ms` against this
run's price, in ms:

    dump_nmi_probe                    8098 -> 6023
    esp_filesystem                   10123 -> 4970
    fat_backing_revoked               8226 -> 6719
    heap_ceiling_recovery            10371 -> 4516
    idle_stack_guard                  9601 -> 4642
    locale_detect                     9959 -> 5961
    log_partition_identity            9516 -> 6896
    usb_short_read                    8150 -> 4751
    writeback_spawn                   8820 -> 4748
    xhci_full_speed_device            8833 -> 6695
    xhci_slot_exhaustion              8149 -> 5198
    cache_eviction                    8165 -> 4515
    log_conservation_smp4             8248 -> 7991
    fs_rename_durable                 9346 -> 5999
    wall_clock_rtc_dead               8070 -> 4929
    wall_clock_century_register       9030 -> 4866
    wall_clock_zone                   9347 -> 4988
    fsync_failed_commit               8386 -> 4248
    screen_console_scroll            13401 -> 7513
    double_panic_names_the_fault      9120 -> 2735
    console_line_atomicity            8925 -> 4608
    ftruncate_flush_race              9452 -> 5844
    gpu_set_resolution                8610 -> 4554
    writeback_durability              8888 -> 6555
    screen_survived_panic_not_blamed  8477 -> 5794
    screen_gop_firmware_mode         12624 -> 7667

A twenty-seventh row moves with them although no verdict names it.
`locale_detect_unrecognized` (160 -> 281 ms) is
`Why::RidesTheBootOf("locale_detect")` and its own `guards` say it is "relegated
only because its carrier is". `tests/toyos.rs`'s group gate refuses a
`LOCALE_WIZARD` boot split across two tiers, so the rider returns with the
carrier and the reason for its row is gone.

Two of the returns carry standing evidence and the PR names both.
`xhci_full_speed_device` returning is
`issues/build/xhci-full-speed-device-jumped-47-percent-over-its-commitment.md`'s
2026-08-22 ruling being honoured rather than overridden — that entry says the
name stays `Tier::Fast` and is "not answered by a `Why::Cost` row — which the
return rule refuses the moment a run prices it at or under 8,000, and its next
cheap shard will". Its standing redlist row about its own variance is what a
fast-tier price red on it is read against. `log_conservation_smp4` returns at
7,991 ms, nine milliseconds of margin, and its redlist row stands again: the
relegation that retired it is what this landing reverses, so nothing retires it
any more.

## The two names the profile had never priced

`audio_tone (smp=8)` and `audio_tone_load (smp=8)` were labels the committed
profile did not hold, so `Shard::keep` costed each at the longest price it knew.
This run prices them 8,799 and 12,315 ms from CI's own artifact. Both are over
the commitment line, both names stay `Tier::Nightly`, and no `UNMEASURED` marker
is owed — a marker buys a measured run and the measurement already exists. Their
`ci_ms` rows are left where they are: that field is last-measured documentation
a human moves when a tier correction lands, and neither name gets one.

## The tracker

`issues/build/the-committed-profile-disagrees-with-the-nightly-on-28-names.md`
asked for exactly this landing — "one landing takes the whole measured profile
and moves each of the 28 to the tier its price earns" — and is closed by
deletion. Its one durable rule goes to `src/durations.rs`'s header, at the site
that writes the file: a merged profile is committed whole, because one run's
rows are one partition and keeping a name's older number beside the rest prices
nothing against that run. Its only citation, the `sysret_ss_reload` redlist
`source`, moves in this same change.
`issues/build/a-timer-anchored-names-tier-is-decided-by-its-price.md` loses the
one paragraph this landing falsifies; its exit condition is the owner's and is
untouched.

## Verified

- `cargo test -p toyos-build --lib` exit 0 — 308 passed, 0 failed, 1 ignored.
  That is where `tiers::tests::the_ci_profile_and_tiers_agree` runs the same
  bidirectional rule the `durations` job runs, and where the redlist's
  `every_row_can_say_what_it_claims` resolves every `source`.
- `cargo run -- --merge-durations <the twelve artifacts>` exit 0, rendering the
  whole verdict at `Enforced::Everything` — the rendering a `main` push run
  does, and the one that was red. Run again on the committed tree it leaves
  `tests/test-durations` byte-identical, which is the `git diff --quiet` the
  CI step reports on.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
@Japabu
Japabu marked this pull request as ready for review September 16, 2026 13:43
Japabu and others added 5 commits September 16, 2026 17:35
…oad reads its probe off the boot log

The previous commit's premise — seven main push reds as "one standing
disagreement seen seven times" — is false for five of the seven. The
durations job logs of runs 34773208611, 34778832553, 34834353873,
34899157020 and 34911665787 each name sysret_ss_reload and, on five of
them, a second Fast name no pull request touched, priced over a line the
nightly 35072262489 partition prices the same name well under:
boot_partition_identity 8205 and 8319 against 6798 (1.21x, 1.22x),
xhci_many_devices 11102 against 4944 (2.25x), page_cache_partition_offset
8503 against 4559 (1.87x), so_cache_refusals 10992 against 6348 (1.73x),
home_overwrite_reads_back 10721 against 6734 (1.59x), metal_sim_input
8721 against 6166 (1.41x). The push lane rendered Enforced::Everything on
a composition the merge queue had just measured at Touched, so a
disagreement the queue warned on landed and then reded main on names no
pull request could fix. ci.yml's durations job now passes
`--tier-base ${{ github.event.before }}` on push — the tip the push
replaced — and src/ci.rs's workflow gate holds that third expression the
way it holds the other two; Enforced::Everything's doc no longer names a
push to main, and src/durations.rs's header says the nightly is the sole
instrument of record.

sysret_ss_reload is not relegated. Its price was the harness's: the probe
line lands before ===READY===, so boot_log() already held it and the
10 s drain_until ceiling, scaled by width and host speed, could only time
out — 15,402 ms on the nightly, 32,237 to 45,686 ms on the five push
runs. The test now reads the boot log for the line and drains only when
it is not there. The name stays Tier::Fast, its RELEGATED row is gone,
and its committed price is the UNMEASURED marker: a dev-host number may
not price a hosted profile, and the only hosted measurement of the fixed
test is the one the next hosted run takes — the marker buys it and stays
red until the measured value replaces it, by design. Local, TCG on the
dev host: sysret_ss_reload passed at the price the handoff quotes. The
redlist row about its price is retired against this commit with `source`
at tests/toyos.rs, and the comment that called the price "not this
branch's to fix" goes.

Two records filed and one closed. The return rule reads one sample:
log_conservation_smp4 returned at 7,991 ms against 8,248 and 8,572 on two
main push runs, screen_gop_firmware_mode at 7,667 against a committed
12,624, screen_console_scroll at 7,513 against 13,401 — all three stay
Fast, where the recorded rule puts them, and
issues/build/the-return-rule-reads-one-sample.md holds the numbers and the
exit condition. Nothing compares a committed tier row or profile row to
the artifact: four partial fixes of this landing pass every gate it
names, recorded as issues/build/nothing-compares-a-committed-tier-row-to-the-artifact.md.
issues/build/idle-stack-guard-price-nearly-doubled-since-its-return.md is
closed by deletion: its whole evidence was idle_stack_guard at 9,601 ms
and dump_nmi_probe at 8,098, and the committed partition prices them
4,642 and 6,023; no citation to it existed.

Prose the review named is deleted rather than answered: the #431 story in
src/durations.rs's header, the tier clause on sysret_ss_reload's
registration, the third copy of the return-rule sentence in the redlist
retirement, and the dated run id in the test's comment.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
…r is held

Round 3 of PR #467, against the round-2 review.

The tier-base gate holds the order. src/ci.rs asserted that three strings
were somewhere in the `durations` job; it now reads the `TIER_BASE:`
expression and asserts its operands in `||` order — merge group's base,
pull request's base, `github.event.before`. A `pull_request` `synchronize`
payload carries `before` too, so `before` first narrows every pull request
to what its last push moved with all three strings still present. Control:
the reviewer's reorder of ci.yml builds (exit 0) and reds
`ci::tests::the_names_a_landing_is_judged_on…` (exit 101, left
[before, merge_group, pull_request]).

A name whose committed price a landing re-takes is judged by that landing.
`touched_names` gains a fourth source: a name whose `tests/test-durations`
row differs from the tier base's. Before it, a marker replaced by a number
left the name rendered by no run a landing can be stopped by — the reviewer
measured exit 0 with `sysret_ss_reload` at 15,402 ms. Host test
`a_repriced_name_is_rendered_by_the_landing_that_repriced_it`; control: with
the profile dropped as a source the crate builds (exit 0) and the test reds
(exit 101, touched set {} against {audio_tone, iommu_empty_domain}).
`UNMEASURED_MS`, `render_verdict`, `Enforced`, both module headers and the
ci.yml comment say the marker covers a re-taken price as well as a new
registration.

One law for what is committed from a run, in src/durations.rs's header: a
re-pricing of the profile is the nightly's whole artifact, landed as its own
change; a pull request replaces only its own `UNMEASURED` marker's row, from
its own hosted run, and that row stands until the next nightly re-prices it.

`sysret_ss_reload` gets its judge. `QemuInstance` counts its drains, and the
test refuses a run whose boot log held the probe line and whose console was
drained anyway. Control: the reviewer's partial fix (no guard, a 1 ms
ceiling) builds (exit 0) and reds the test (exit 1) by that sentence; the
unmutated test passes (exit 0).

The return-rule record states its criterion: all 26 returns have another
hosted sample over the line (8,070 to 13,401 ms), and what orders them is
distance under the line on the nightly partition. It gains the next hosted
partition, PR #467's run 35352795338, which priced four of the 26 back over
the line: screen_gop_firmware_mode 9,090, fat_backing_revoked 8,333,
screen_console_scroll 8,235, ftruncate_flush_race 8,111.

Prose, by deletion: the shard-split record loses the five totals whose
spread was `sysret_ss_reload`'s drain and keeps the net figures (about 41.7,
12.3, 8.3, 19.9, 6.5 s; spread about 35 s against a best case of about
31 s); the `sysret_ss_reload` redlist retirement is anchored to 20b04cc and
loses its sentence about the marker; `log_conservation_smp4`'s row says what
this landing does with the name, cites the return-rule record, and is
re-measured from nightly 35072262489's shard 11 (7,991 ms, 2026-09-16).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
…08 ms

The second kind of profile commit src/durations.rs's header names: a pull
request replacing only its own `UNMEASURED` marker's row, from its own hosted
run. `ci` run 35352795338 (pull_request, head 20b04cc, twelve hosted shards,
2026-09-18) ran the fixed test on shard 1 and its `test-durations-merged`
artifact prices it 5,908 ms — under the 8,000 ms commitment line, so the name
stays `Tier::Fast` with no `RELEGATED` row. The other 447 rows stay nightly
35072262489's, and this row stands until the next nightly re-prices it.

That run's `durations` job was red on the marker line alone, which returns
before any price verdict is computed. With the marker replaced, the same
twelve shards under `--tier-base dc38a05` exit 101 on five names that run
priced over the commitment line: boot_partition_identity 9,527,
fat_backing_revoked 8,333, ftruncate_flush_race 8,111, screen_console_scroll
8,235, screen_gop_firmware_mode 9,090. Four of the five are among this
landing's 26 returns and were rendered under the old name set too;
boot_partition_identity is rendered because this landing re-prices its row.
`issues/build/the-return-rule-reads-one-sample.md` holds the numbers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
Brings in #463 (five rules for what a measurement is worth). Git merged
src/durations.rs cleanly; one reconciliation is made by hand. #463 added to
the header's `durations`-red paragraph: "A CI run's merged durations are
committed only for the rows this change's own markers blocked." This branch's
header states that law once, with the other half it is true beside — a
re-pricing of the profile is the nightly's whole artifact, landed as its own
change; a pull request replaces only its own `UNMEASURED` marker's row, from
its own hosted run — so the second statement of it is removed here rather
than left to contradict "one run's rows are one partition" two paragraphs up.
.claude/agents/reviewer.md is taken from main unchanged.

`cargo test -p toyos-build --lib` on the merged tree: exit 0, 310 passed,
0 failed, 1 ignored.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
…'s own reading

A name is Fast only if it is at or under FAST_COMMIT_MS (8,000 ms) on the
instrument of record, the nightly, AND on the gate it must then pass: the
returning landing's own hosted run, which renders the name because the landing
re-tiers it. The contract is one sentence in FAST_COMMIT_MS's doc.

This landing returned 26 Why::Cost names on nightly 35072262489's prices. Its
own hosted run, `ci` 35352795338 (pull_request, head 20b04cc), priced four of
them back over the line, and one existing Fast name with them:

  name                       nightly 35072262489   run 35352795338
  screen_gop_firmware_mode   7,667                 9,090
  fat_backing_revoked        6,719                 8,333
  screen_console_scroll      7,513                 8,235
  ftruncate_flush_race       5,844                 8,111
  boot_partition_identity    6,798                 9,527

boot_partition_identity has two more readings on the same lane, both `main`
pushes red in `durations`: 8,205 (run 34773208611) and 8,319 (34834353873).
All five figures were read out of the runs' `durations-shard-*` artifacts.

The four are not returned and boot_partition_identity is relegated. 22 of the
26 return as before, with `locale_detect_unrecognized` riding `locale_detect`
back: 23 rows leave RELEGATED against main, 4 stay, 1 is new.

Why a new variant and not Why::Cost. The committed profile is the nightly's, so
it prices all five under the line, and a Why::Cost row priced under the line is
exactly what the return arm refuses. Measured with the five rows written
`Why::Cost`: `cargo test -p toyos-build --lib tiers::` exits 101 with five
`belongs Fast` lines, one per name (mut-hold-tiersync-4.log) - and the nightly,
and this pull request's next run (which retains the nightly's row for a name
the fast tier does not run, and renders it because this landing re-priced it),
would say the same. `ci_ms` cannot carry the hold for every Cost row either: it
is a hand-kept note, 121,441 on `desktop_audio_client` against a profile price
of 8,401, and a rule reading it would hold every Cost row for ever and end the
nightly's invitation back. So the hold is a declaration:

  Why::CostOnTheGate - priced with margin by the nightly and without it by the
  gate a return has to pass. `ci_ms` is the hosted pull-request-lane reading
  that refused the return, and on this variant alone it is checked: a reading
  at or under FAST_COMMIT_MS holds nothing and is refused on every run as a
  declaration verdict. No nightly price moves the row; it returns through a
  landing that re-tiers it Fast and whose own run prices it under the line.

Why::Cost rows keep the nightly's invitation unchanged.

Negative control: `a_nightly_price_does_not_return_a_row_the_gate_holds` - the
same 8,000 ms that returns `desktop_window_child` leaves a gate-held row alone,
and the hold is refused at ci_ms = 8,000 and stands at 8,001. The whole-change
mutation is the one above: the five rows as Why::Cost, exit 101.

issues/build/the-return-rule-reads-one-sample.md is closed: the rule reads two.
What it recorded, all 26 returns on both partitions, in ms (removed row's
ci_ms / nightly 35072262489 / run 35352795338):

  log_conservation_smp4              8,248 / 7,991 / 4,881
  screen_gop_firmware_mode          12,624 / 7,667 / 9,090   held
  screen_console_scroll             13,401 / 7,513 / 8,235   held
  log_partition_identity             9,516 / 6,896 / 7,854
  fat_backing_revoked                8,226 / 6,719 / 8,333   held
  xhci_full_speed_device             8,833 / 6,695 / 7,130
  writeback_durability               8,888 / 6,555 / 6,803
  dump_nmi_probe                     8,098 / 6,023 / 6,374
  fs_rename_durable                  9,346 / 5,999 / 5,296
  locale_detect                      9,959 / 5,961 / 5,028
  ftruncate_flush_race               9,452 / 5,844 / 8,111   held
  screen_survived_panic_not_blamed   8,477 / 5,794 / 6,548
  xhci_slot_exhaustion               8,149 / 5,198 / 5,260
  wall_clock_zone                    9,347 / 4,988 / 6,756
  esp_filesystem                    10,123 / 4,970 / 4,791
  wall_clock_rtc_dead                8,070 / 4,929 / 6,507
  wall_clock_century_register        9,030 / 4,866 / 5,199
  usb_short_read                     8,150 / 4,751 / 4,510
  writeback_spawn                    8,820 / 4,748 / 4,658
  idle_stack_guard                   9,601 / 4,642 / 5,560
  console_line_atomicity             8,925 / 4,608 / 4,786
  gpu_set_resolution                 8,610 / 4,554 / 5,626
  heap_ceiling_recovery             10,371 / 4,516 / 4,431
  cache_eviction                     8,165 / 4,515 / 4,621
  fsync_failed_commit                8,386 / 4,248 / 4,394
  double_panic_names_the_fault       9,120 / 2,735 / 2,700

Not closed by this and said so: a name that straddles on the nightly's own lane.
`log_conservation_smp4` is 9 ms under the line there and 4,881 on the gate, so
both lanes put it Fast, and a nightly that prices it over 8,000 again is its
standing `src/redlist.rs` row - re-sourced to `tests/common/logread.rs`, since
the row's source was the closed file, with run 35352795338's figure added.

Gates, on this tree:
  cargo test -p toyos-build --lib                      exit 0, 311 passed, 1 ignored
  cargo test --test toyos-build -- --list              exit 0
  --merge-durations, run 35352795338's twelve shards,
    --tier-base 9f91b58 (pull_request.base.sha)       exit 0, 433 names rendered, 0 warnings
  same shards with the five names' lines removed, the
    shape of the next hosted run                       exit 0
  --merge-durations, nightly 35072262489, no base      exit 101, one line:
    `sysret_ss_reload measured 15402 ms` - the nightly ran the test before
    20b04cc fixed its drain; the written profile differs from the committed
    one in that row only
  the same nightly shards on a `git archive` of
    dc38a05 (the base, negative control)              exit 101, 27 lines

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
@Japabu Japabu changed the title The tier declaration is taken from the instrument, and twenty-seven names move to the tier their price earns The tier declaration is taken from the instrument, the return rule reads both lanes, and twenty-four names move Sep 18, 2026
@Japabu

Japabu commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator Author

Superseded by #475 (the test-governance cut, CTO ruling of 2026-09-21): the merge-health instrument is deleted and the duration verdict only warns, so this branch's subject no longer exists. Its measurements stay in its history.

@Japabu Japabu closed this Sep 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant