Skip to content

The panel test boots an image without sshserver, and a CI step's cargo finds fresh what the job's cargo built - #756

Merged
Japabu merged 2 commits into
mainfrom
wt/toyos-guestimages
Oct 8, 2026
Merged

Japabu merged 2 commits into
mainfrom
wt/toyos-guestimages

Conversation

@Japabu

@Japabu Japabu commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Takes two costs out of guest / suite by building less, and replaces issues/the-guest-job-builds-every-image-on-every-run.md with a file for what remains. No cache entry is added and no workflow is touched.

Head e93b3a141: the branch merged with origin/main 1084ddc9a (#746, the one workspace). Every local measurement under "Gates" and "Mutations" is from this head. CI ran host and guest / suite on it (run 37765227287, both success); what the landing rests on in their logs is under "What CI showed".

The measurement

Four guest / suite jobs of 2026-10-08, each with the sysroot restored from cache, split by the log's own timestamps and the suite's building and testing figures. A is job 113110642665 (run 37715155555, a merge group), B is 113190683753 (run 37740095844, #749, which moved the kernel), C is 113188345621 (run 37739721567, #750, which moved one userland crate). D is 113260475768 (run 37760845496), #746's own merge group at 1084ddc9a: the one baseline that builds as the tree now does. Seconds:

A B C D
deps: apt and rustup 103 171 141 116
the driver's build (Finished dev) 146 102 148 125
the harness's build (Finished test) 54 36 53 45
the suite, building 610 368 542 465
the suite, testing 136 124 131 133
the job 1072 821 1036 911

The BUILT lines behind building:

A B C D
x86_64 kernel, loader, ROOT of tests/netcase 138 84 123 89
x86_64 test kernel, ROOT of tests/testcases 65 37 56 54
x86_64 ROOT of tests/metalcase 212 121 186 158
aarch64 test kernel, loader, ROOT of tests/testcases 110 70 97 91
aarch64 kernel 33 20 31 27
aarch64 mask-windows kernel, ROOT of tests/virtsmpcase 33 21 30 27
the rest: test binaries and the small ROOTs 19 15 19 19

The premise after the fold. #746 changed how steps build, so both halves were checked against D before anything was kept. Both costs are still on main: D prints BUILT x86_64 ROOT of tests/metalcase, for screen_fatal_halt_composited (158s), and between === [ci] the suite and Running tests/toyos.rs it prints Compiling ring v0.17.14, Compiling rustls v0.23.45, Compiling rustls-webpki v0.103.15, Compiling ureq v3.4.2, Compiling toyos-build v0.1.0 and Finished \test` profile ... in 44.82s`. Neither half of this change goes.

What changed, per decision

  • screen_fatal_halt_composited boots tests/panelcase, a new config of logkeeper and compositor, in place of tests/metalcase, the T14's image. It was the only guest test that booted metalcase. cargo build --timings of metalcase's ROOT on the development machine, before the fold: 279 units, 217 compiled, 369 unit-seconds, 230 of them in crates only sshserver reaches (russh, tokio, p521, fiat-crypto, crypto-bigint) and 58 in crates only the compositor reaches. No guest test speaks SSH. Built after the same builds (netcase's and testcases' ROOTs), panelcase's BUILT line read 8 s where metalcase's read 53 s; that pair is from 30d6713a0, before the fold, and was not taken again.
    • The test's assertions are unchanged: the compositor holds the panel before the panic, the fatal report takes it with the fatal fill, and the black box carries the report.
    • What the boot loses: sshserver, netstack, soundserver, diskserver, fileserver and test-runner are no longer running when the kernel dies. The test asserts nothing of them and, the boot being muted, never read a line from them. metalcase is unchanged in what it builds and stays the T14's METALCASE arm; two sentences of its header that described the QEMU boot are deleted.
    • Why this stays a guest test (it changes one): its subject is what is on the panel, read from QEMU's screendump. No type or host test paints a panel, and the metal loop cannot read the T14's glass (SCREEN_TESTS' comment).
  • A step's cargo does not inherit what cargo run told the driver about its own package. cargo run sets CARGO_PKG_* and CARGO_MANIFEST_* for the program it runs, and cargo judges a build script's rerun-if-env-changed by its own environment. ring's script names seven of them. So the suite step's cargo test, a child of the driver, finds ring stale against the build the job's own cargo has just made, and compiles ring, rustls, rustls-webpki, ureq and toyos-build again: the five Compiling lines under === [ci] the suite in all four logs. ci::dispatch removes both families before any step (forget_own_package). Nothing in the tree reads either family from the environment at run time: every use in src/ and tests/ is env!, but the new test's own assertion and a proc macro in a src/cicache.rs fixture, which a cargo of its own runs.
  • Not built: a cache entry of guest targets. Its saving is bounded by the building figure; what stands in its way is in the new issue: the repository's caches are already past 10 GB with no gate reading a stored size, and no pull request can show the saving before a writer on main exists.
  • Not taken: CARGO_INCREMENTAL=0 in the job. A cold x86-64 kernel took 43 s of CPU without it and 62 s with it on the development machine under load, but it also turns rustc's MIR inliner on (the root Cargo.toml, [profile.toyos]), so the job would boot other bytes than cargo run builds. Recorded in the issue.
  • Issues. issues/the-guest-job-builds-every-image-on-every-run.md is deleted. Its exit asked what an entry restored from main's scope would save, measured on a pull request run. That was not measured as written: no entry was restored. What two pull request runs (B, C) measure is each build's cost, which bounds any entry's saving from above; the review's ruling 1 is that the exit is met as that bound and superseded, not met as written. issues/the-guest-suite-compiles-every-guest-crate-cold-on-every-run.md carries the remainder, with an exit a log can fail: building under 60 s on a pull request that moves no guest source.
    • Corrected at this head for the folded tree: [profile.toyos] is cited at the root manifest; the bullet citing the five-locks issue is gone with that issue, its fold having landed; the development machine's figures for a fresh suite (23 s) and an entry's bytes are said to be from before the fold, when the guests built into four target directories, and not measured since; "No runner has measured either" is dropped; D is added.

What CI showed

Run 37765227287 at e93b3a141 (checked out as 7196814, this head merged into 1084ddc9a), against the lines below. One run against one run on different runners: the baseline is D, #746's own merge-group job on main (113260475768).

host (job 113271124288)

  1. [ci] Host: 78 step(s), all green.
  2. Cache not found for input keys: host-sealed-Linux-X64-…, the cache entry, read by content: none restored: the run is cold, and Compiling ring under === [ci] the build system: the cold compile expected until main's nightly after One workspace, one lock: the root, the kernel, the loader, userland and the SDK resolve together #746 seals an entry.

guest / suite (job 113272198698)
3. Between === [ci] the suite and Running tests/toyos.rs: six Compiling lines, toyos-bootmap, kernel, toyos-i219, toyos-xhci, toyos-userbound, toyos-build: the harness and its dev-dependencies, as in D. None of ring, rustls, rustls-webpki or ureq. Finished `test` profile … in 11.92s against D's 44.82 s.
4. BUILT x86_64 ROOT of tests/panelcase, for screen_fatal_halt_composited (35s), PASS screen_fatal_halt_composited (7s), and no line naming tests/metalcase (D: 158 s for that image).
5. test result: ok. 31 passed, 31 total (549.4s; workers: 411s building, 138s testing) against D's 465s building; [ci] Guest: 5 step(s), all green.

What that is and is not: the harness's build fell from 44.82 s to 11.92 s and the panel test's image from 158 s to 35 s, on a runner that was the slower of the two (its driver's build read 2m 36s against D's 2m 04s); every other large BUILT line rose on it (netcase 89 s to 117 s, the x86-64 test kernel and testcases 54 s to 63 s, the AArch64 test kernel, loader and testcases 91 s to 111 s). building is 465 s against 411 s; 54 s is not a saving per run, and nothing past these figures is measured.

The merge with #746

git merge origin/main at 1084ddc9a merged src/build.rs, src/ci.rs and tests/toyos.rs without a conflict. Checked by hand: git diff origin/main HEAD -- src tests is this branch's hunks and nothing else: the ALL_CONFIGS row in src/build.rs; the forget_own_package() call in dispatch, the function and the test pair in src/ci.rs; the tests/panelcase path in tests/toyos.rs; tests/panelcase/system.toml; and the two deleted sentences of tests/metalcase/system.toml. Every other line of the three files is main's.

Gates

All at e93b3a141, run alone by the orchestrator from build-request.sh, tree clean before and after.

Gate Result
cargo metadata --locked exit 0: the root lock resolves after the merge
cargo test --lib (the build system, as host's "the build system" step runs it) exit 0: 394 passed; 0 failed; 11 ignored
cargo test --test toyos-build -- screen_fatal_halt_composited exit 0: BUILT x86_64 kernel boot-actuators,test-actuators, loader, ROOT of tests/panelcase, [panic] the fatal report is on the panel and sealed in the black box (14264 bytes), PASS screen_fatal_halt_composited (8s), 1 passed, 1 total. Its 140s building is the worktree's first sysroot after the merge, not panelcase's cost
cargo run -- --ci host not run locally: CI's host on this head, job 113271124288, [ci] Host: 78 step(s), all green
the whole guest suite not run locally: CI's guest / suite on this head, job 113272198698, 31 passed, 31 total, [ci] Guest: 5 step(s), all green
git status --porcelain --ignore-submodules=none empty

Mutations

Each applied as a checked patch, shown to build (cargo test --lib --no-run, exit 0), run, and reversed (exit 0) in one script. M1 to M4 were run again at e93b3a141 because the merge changed the files they patch (src/ci.rs, src/build.rs); the patches, regenerated against this head, are in the comment below. M5 was not: the merge did not change tests/panelcase/system.toml, and its result is from 30d6713a0.

Mutation Test Exit
M1 forget_own_package removes nothing ci::tests::a_steps_cargo_finds_fresh_what_the_jobs_cargo_built 101: Dirty one v0.1.0 (...): the env variable CARGO_PKG_NAME changed
M2 keep CARGO_MANIFEST_* the same 101: the env variable CARGO_MANIFEST_DIR changed
M3 keep CARGO_PKG_* the same 101: the env variable CARGO_PKG_NAME changed
M4 no ALL_CONFIGS row for panelcase build::tests::every_shipped_boot_config_is_covered 101: assertion \left == right` failedatsrc/build.rs:3564`
M5 panelcase does not start the compositor (at 30d6713a0) screen_fatal_halt_composited (guest) 1: FAIL screen_fatal_halt_composited: the compositor never took the screen

What the new test sees that reading cannot: that cargo compares a build script's named variables against its own environment and not the script's. That dispatch calls the function is read, and line 3 above is where a runner shows it.

Size

git diff --shortstat origin/main...HEAD: 7 files, +160 −32. Production: src/ci.rs +17. Tests: src/ci.rs +43, src/build.rs +1, tests/toyos.rs +1 −1, tests/panelcase/system.toml +20, tests/metalcase/system.toml +1 −4. Issues: +77 −27.

What I am unsure of

  • The runners' figures. One run against one run on different runners, as "What CI showed" says; the saving per run is not measured.
  • Six fewer programs at the moment of the panic. A fatal path that only fails with more servers running would no longer be seen by this test; the review's ruling 2 is that metalcase's load was no part of its claim.
  • M5 after the fold. It was not run again; tests/toyos.rs, which holds the test it turns red, did change in the merge, though not the test's own assertions.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A

…o finds fresh what the job's cargo built

`guest / suite` was measured again on three jobs of 2026-10-08
(113110642665, 113190683753, 113188345621): 821 to 1072 s, of which the
suite's own `building` figure is 368 to 610 s. Two of its costs go here.

tests/panelcase is a config of the compositor and logkeeper.
`screen_fatal_halt_composited` booted tests/metalcase, the T14's image, and
was the only guest test that did: its ROOT's BUILT line was 121 to 212 s on
the runners. `cargo build --timings` of that ROOT on the development machine
gave 369 unit-seconds over 279 units, 230 of them in crates only sshserver
reaches, and no guest speaks SSH. Built after the same builds, panelcase's
BUILT line read 8 s there against metalcase's 53 s. What the test asserts is
unchanged: the compositor holds the panel, the fatal report takes it, and the
black box carries the report. What it loses is sshserver, netstack,
soundserver, the block and file servers and test-runner running when the
kernel dies; it asserts nothing of them.

`cargo run` hands the program it runs CARGO_PKG_* and CARGO_MANIFEST_*, and
cargo judges a build script's `rerun-if-env-changed` by its own environment.
ring's script names seven of them, so the suite step's `cargo test`, a child
of the driver, found ring stale against the build the job's own cargo had
just made and compiled ring, rustls, rustls-webpki, ureq and the build system
again: 36 to 54 s between `=== [ci] the suite` and `Running tests/toyos.rs`.
`dispatch` now takes both families out of the driver's environment before
any step. Setting them by hand on `cargo test --test toyos-build --no-run`
reproduced the five `Compiling` lines; under `cargo run -- --ci guest` at
this commit the step prints `Finished` and none.

issues/the-guest-job-builds-every-image-on-every-run.md is closed: its exit
was the measurement, which the three logs' BUILT lines now are, two of them
pull request runs. What they leave is filed with those numbers as
issues/the-guest-suite-compiles-every-guest-crate-cold-on-every-run.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
@Japabu

Japabu commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator Author

Evidence for the body at 30d6713a0: the mutation patches, and the lines of the local runs the body quotes. Each mutation ran as git apply --check p && git apply p; cargo build --lib; cargo test ...; git apply -R p, and the tree was clean after the last.

m1-forget-nothing

--- a/src/ci.rs
+++ b/src/ci.rs
@@ -106,7 +106,7 @@ fn forget_own_package() {
     for (name, _) in std::env::vars_os() {
         let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_PKG_") || n.starts_with("CARGO_MANIFEST_"));
         if own {
-            std::env::remove_var(name);
+            let _ = name;
         }
     }
 }

m2-keep-manifest-vars

--- a/src/ci.rs
+++ b/src/ci.rs
@@ -104,7 +104,7 @@ pub fn dispatch(root: &Path, args: &[String]) {
 /// its dependents and this crate a second time.
 fn forget_own_package() {
     for (name, _) in std::env::vars_os() {
-        let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_PKG_") || n.starts_with("CARGO_MANIFEST_"));
+        let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_PKG_"));
         if own {
             std::env::remove_var(name);
         }

m3-keep-pkg-vars

--- a/src/ci.rs
+++ b/src/ci.rs
@@ -104,7 +104,7 @@ pub fn dispatch(root: &Path, args: &[String]) {
 /// its dependents and this crate a second time.
 fn forget_own_package() {
     for (name, _) in std::env::vars_os() {
-        let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_PKG_") || n.starts_with("CARGO_MANIFEST_"));
+        let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_MANIFEST_"));
         if own {
             std::env::remove_var(name);
         }

m4-no-gate-row

--- a/src/build.rs
+++ b/src/build.rs
@@ -3159,7 +3159,6 @@ mod tests {
         "tests/metalcase/system.toml",
         "tests/metaldevicecase/system.toml",
         "tests/netcase/system.toml",
-        "tests/panelcase/system.toml",
         "tests/proctreecase/system.toml",
         "tests/testcases/system.toml",
         "tests/virtjobcase/system.toml",

m5-compositor-not-started

--- a/tests/panelcase/system.toml
+++ b/tests/panelcase/system.toml
@@ -7,7 +7,7 @@
 assets = ["assets"]
 
 [boot]
-start = ["logkeeper", "compositor"]
+start = ["logkeeper"]
 
 # `every_boot_config_runs_logkeeper` is what refuses a boot config without it.
 [programs.logkeeper]

The whole suite, cargo run -- --ci guest, exit 0 (every BUILT, verdict and [ci] line but the two instrument lines):

    Finished `dev` profile [optimized + debuginfo] target(s) in 0.27s
08:07:42 === [ci] the suite
    Finished `test` profile [optimized + debuginfo] target(s) in 0.10s
08:07:44   BUILT x86_64 kernel, loader, ROOT of tests/netcase, for iommu_virtio_platform  (2s)
08:07:51   BUILT x86_64 kernel boot-actuators,test-actuators, ROOT of tests/testcases, for iommu_virtio_platform  (1s)
08:07:54   PASS  iommu_virtio_platform  (9s)
08:07:57   PASS  nested_nmi_is_loud  (2s)
08:07:59   PASS  machine_shutdown  (3s)
08:08:05   PASS  acpi_power_button  (6s)
08:08:09   BUILT x86_64 stop_short of tests/toyos-rust-tests, for machine_shutdown_short_stop  (3s)
08:08:10   BUILT x86_64 ROOT of tests/testcases, for machine_shutdown_short_stop  (1s)
08:08:14   PASS  machine_shutdown_short_stop  (4s)
08:08:18   PASS  screen_panic_muted  (4s)
08:08:26   PASS  screen_fatal_behind_a_painter  (8s)
08:08:27   BUILT x86_64 ROOT of tests/panelcase, for screen_fatal_halt_composited  (1s)
08:08:35   PASS  screen_fatal_halt_composited  (8s)
08:08:42   PASS  screen_loader_clears  (7s)
08:08:49   BUILT aarch64 kernel boot-actuators,test-actuators, loader, ROOT of tests/testcases, for virt_early_panic  (8s)
08:08:50   PASS  virt_early_panic  (730ms)
08:08:51   PASS  virt_early_fault  (611ms)
08:08:52   PASS  virt_el2_drop  (915ms)
08:08:52   BUILT aarch64 kernel, for virt_user_mode  (545ms)
08:08:55   PASS  virt_user_mode  (3s)
08:08:55   BUILT aarch64 abuse_readonly_copyout of tests/toyos-rust-tests, for virt_timer_preempts  (553ms)
08:08:56   BUILT aarch64 ring0_timer_in_syscall of tests/toyos-rust-tests, for virt_timer_preempts  (505ms)
08:08:57   BUILT aarch64 ROOT of tests/virtjobcase, for virt_timer_preempts  (989ms)
08:09:01   PASS  virt_timer_preempts  (4s)
08:09:22   [virt] [20.470 cpu0 kernel] irq-storm: PASS sgis=3998225/3998225 ticks=1000: the timer fired through the flood, and every SGI sent was taken
08:09:22   PASS  virt_irq_storm  (21s)
08:09:25   [virt] [ 2.784 cpu0 kernel] timer-floor: PASS span=10000 floor=10000 ticks: the comparator past the counter it was set from
08:09:25   PASS  virt_timer_floor  (3s)
08:09:29   PASS  virt_fp_isolation  (4s)
08:09:32   PASS  virt_first_entry  (3s)
08:09:35   PASS  virt_unmap_touch  (3s)
08:09:39   PASS  virt_debug_refused  (3s)
08:09:42   PASS  virt_readonly_copyout  (4s)
08:09:45   PASS  virt_ring0_timer_in_syscall  (3s)
08:09:46   BUILT aarch64 counters_read of tests/toyos-rust-tests, for virt_mask_windows  (725ms)
08:09:47   BUILT aarch64 trace_read of tests/toyos-rust-tests, for virt_mask_windows  (497ms)
08:09:47   BUILT aarch64 kernel mask-windows, ROOT of tests/virtsmpcase, for virt_mask_windows  (739ms)
08:09:51   PASS  virt_mask_windows  (3s)
08:09:54   PASS  virt_smp  (3s)
08:09:57   PASS  virt_el1_smp  (3s)
08:10:05   PASS  virt_failed_ap_leaves_no_hole  (8s)
08:10:05   BUILT aarch64 panic_halts_first of tests/toyos-rust-tests, for virt_fatal_halts_the_others_first  (583ms)
08:10:06   BUILT aarch64 ROOT of tests/virtpaniccase, for virt_fatal_halts_the_others_first  (664ms)
08:10:09   PASS  virt_fatal_halts_the_others_first  (3s)
08:10:10   BUILT aarch64 ROOT of tests/virtrebootcase, for virt_reboot  (744ms)
08:10:14   PASS  virt_reboot  (4s)
08:10:23   PASS  virt_off_names_the_cpus_left_on  (9s)
08:10:26   PASS  virt_reboot_refused_without_psci  (3s)
08:10:26 test result: ok. 30 passed, 30 total (163.3s; workers: 23s building, 141s testing)
08:10:26 [ci] the suite: test result: ok. 30 passed, 30 total (163.3s; workers: 23s building, 141s testing)
08:10:26 === [ci] nothing left in $TMPDIR or /tmp
08:10:26 [ci] nothing left in $TMPDIR or /tmp: every test took its scratch with it
08:10:26 [ci] Guest: 5 step(s), all green

metalcase's ROOT against panelcase's, each after netcase's and testcases' ROOTs from an empty userland target, development machine:

07:26:09   BUILT x86_64 kernel, loader, ROOT of tests/netcase, for iommu_virtio_platform  (53s)
07:26:38   BUILT x86_64 kernel boot-actuators,test-actuators, ROOT of tests/testcases, for iommu_virtio_platform  (22s)
07:26:41 test result: ok. 1 passed, 1 total (85.2s; workers: 76s building, 10s testing)
07:53:49   BUILT x86_64 kernel boot-actuators,test-actuators, loader, ROOT of tests/metalcase, for screen_fatal_halt_composited  (53s)
07:53:57 test result: ok. 1 passed, 1 total (62.0s; workers: 53s building, 9s testing)
--- userland target emptied, panelcase in place of metalcase
08:02:44   BUILT x86_64 kernel, loader, ROOT of tests/netcase, for iommu_virtio_platform  (10s)
08:02:57   BUILT x86_64 kernel boot-actuators,test-actuators, ROOT of tests/testcases, for iommu_virtio_platform  (7s)
08:03:00 test result: ok. 1 passed, 1 total (25.9s; workers: 17s building, 9s testing)
08:03:14   BUILT x86_64 kernel boot-actuators,test-actuators, loader, ROOT of tests/panelcase, for screen_fatal_halt_composited  (8s)
08:03:22 test result: ok. 1 passed, 1 total (15.5s; workers: 8s building, 8s testing)

The first block began with every target empty, so its first BUILT is a cold kernel and loader as well; the second began with the userland target alone emptied. The comparison is each block's last BUILT: 53 s and 8 s.

The reproduction of the second build, before the change (CARGO_MANIFEST_DIR, CARGO_MANIFEST_PATH, CARGO_PKG_NAME and CARGO_PKG_VERSION* set by hand, cargo test --test toyos-build --no-run):

   Compiling ring v0.17.14
   Compiling rustls v0.23.45
   Compiling rustls-webpki v0.103.15
   Compiling ureq v3.4.2
   Compiling toyos-build v0.1.0 (...)
    Finished `test` profile [optimized + debuginfo] target(s) in 7.96s

@Japabu

Japabu commented Oct 8, 2026

Copy link
Copy Markdown
Collaborator Author

Review round 1 of 30d6713a0 against origin/main (merge base b432ed21c), by reading; I ran no build and no test.

Net lines (git diff --shortstat origin/main...30d6713a0): 7 files, +157 −32. Production: src/ci.rs +17. Tests and test configs: src/ci.rs +43, src/build.rs +1, tests/toyos.rs +1 −1, tests/panelcase/system.toml +20, tests/metalcase/system.toml +1 −4. Issues: +74 −27. The 17 production lines are accepted: they remove a second compile of ring, rustls, rustls-webpki, ureq and the build system that all three baseline logs show under === [ci] the suite. The new test is accepted on the precedent beside it (a_step_of_a_job_that_carries_the_cache_builds_in_its_own_target): what it holds is cargo's judgment of a child's environment, which reading does not show, and M1 to M3 turn it red.

BLOCKER

  • PR body, "Gates" — cargo run -- --ci host was not run at this head — Evidence makes its absence a BLOCKER, and this diff is not beside that gate but in it: src/ci.rs:75 changes what every host step inherits, and a restored host entry was built by steps that had the variables. By reading I found nothing that reads either family at run time (every use in src/ and tests/ is env!; src/cicache.rs:571 is fixture text), so I expect green; an expectation is not the measurement. It closes with the host check green on this head and its job named in the body. No code change is asked for.

NOTE

  • issues/the-guest-suite-compiles-every-guest-crate-cold-on-every-run.md:35-39 — "No runner has measured either" is false of the record once this head's guest / suite has run — replace it with the run's figures or drop the sentence when the body gets them.
  • PR body, "What CI must show", line 3 — 30 passed, 30 total is this head's count only; baseline B printed 31, and a merge group carries whatever main holds — the landing rests on N passed, N total, not on 30.
  • PR body, first line — "Closes ..., whose exit was a measurement" reads as the exit met as written; it was met as a bound and superseded (ruling 1 below).

The three rulings asked for

  1. The close stands. The old exit asked what an entry would save, measured on a pull request run. What is measured on two pull request runs (B, C) is each build's cost, which bounds any entry's saving from above; what a run still pays with every target fresh (23 s) is measured on the development machine only. That remainder is not dropped: the new file's exit (building under 60 s on a pull request that moves no guest source) cannot be met without it, and a log can fail it. Keeping the old file open beside the new one would be two files on one subject. No citation of the old slug is left at this head (git grep of the slug: nothing), the new file's two cited issues exist, its owner names a function and a workflow that exist, and opened is right for a new heading.
  2. The panel test still reaches its claim. Its claim is the kernel's: a fatal report takes a scanout userland has claimed, with the fatal fill, and is sealed in the black box. The kernel, its metal-panic-probe parameter, the profile, smp: 8, mute and all three assertions are unchanged, and the probe is armed by the framebuffer claim, not by any other program. The boot is muted, so the test never read a line from sshserver, netstack, soundserver, diskserver, fileserver or test-runner and could not have failed on any of them; the compositor's source names no sound port, so dropping receives = ["soundserver"] takes nothing it uses. M5 is the negative control that the compositor, not the kernel, holds the panel. Metalcase's load was not part of the claim; no guest behaviour is cut.
  3. What the landing rests on, and whether it waits. It waits on this head's host (the BLOCKER above) and guest / suite; both are required checks, so nothing is added to the path. The local guest evidence stands for correctness: every source file's mtime precedes the run's first line and the tree was clean at the commit. The saving is an estimate until these lines exist:
    • host: [ci] Host: N step(s), all green. Expected under === [ci] the build system, once per run until the next nightly seals: Compiling ring. Its absence is not a red; it means the body's paragraph on the host cache is wrong and is corrected.
    • guest / suite, between === [ci] the suite and Running tests/toyos.rs: no Compiling ring, Compiling rustls, Compiling rustls-webpki or Compiling ureq; a Finished \test` profile` figure under the baselines' 36.07 s to 53.61 s. Any of the four lines present is a red for this change even with the check green: the function is not doing what the title says on a runner.
    • BUILT x86_64 ... ROOT of tests/panelcase, for screen_fatal_halt_composited, PASS screen_fatal_halt_composited, and no line naming tests/metalcase (each baseline has two).
    • test result: ok. N passed, N total (...; workers: B s building, ...) with B under the baselines' 368 s to 610 s, and [ci] Guest: 5 step(s), all green.

Against #746 (9ef866436)

git merge-tree --write-tree 30d6713a0 9ef866436 exits 0 (tree b4f1125db); in it forget_own_package, its test, FIXTURE, buildlock::tests::rerun, the ALL_CONFIGS row and the tests/panelcase path are all present. #746 first is cheaper.

SEND BACK

…e says what is true of the folded tree

The three files both sides changed, src/build.rs, src/ci.rs and
tests/toyos.rs, are main's whole plus this branch's hunks and nothing else:
`git diff origin/main` on them shows the `ALL_CONFIGS` row, the
`forget_own_package` call, function and test pair, and the panelcase path.

The issue file: `[profile.toyos]` is the root manifest's; the bullet that the
five-locks issue folds three target directories is gone with that issue, the
fold having landed; the development machine's figures for a fresh suite and
for an entry's bytes are said to be from before the fold and not measured
since; "No runner has measured either" is dropped. Job 113260475768, #746's
merge group at `1084ddc9a`, is added as column D: the one baseline that
builds as the tree now does. It still shows both costs this branch removes,
`BUILT x86_64 ROOT of tests/metalcase ... (158s)` and ring, rustls,
rustls-webpki, ureq and toyos-build compiled a second time under
`=== [ci] the suite` (`Finished test` in 44.82s).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
@Japabu

Japabu commented Oct 8, 2026

Copy link
Copy Markdown
Collaborator Author

Evidence for the body at e93b3a141: the four mutation patches regenerated against the merged head. Each ran as git apply --check p && git apply p; cargo test --lib --no-run; cargo test --lib <test>; git apply -R p, alone, and the tree was clean after the last. Every one: build exit 0, test exit 101, restore exit 0. M5's patch and log are in the comment at 30d6713a0 above; the merge did not change the file it patches and it was not run again.

m1-forget-nothing

diff --git a/src/ci.rs b/src/ci.rs
index 1fb5d1d48..5053d9954 100644
--- a/src/ci.rs
+++ b/src/ci.rs
@@ -106,7 +106,7 @@ fn forget_own_package() {
     for (name, _) in std::env::vars_os() {
         let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_PKG_") || n.starts_with("CARGO_MANIFEST_"));
         if own {
-            std::env::remove_var(name);
+            let _ = name;
         }
     }
 }

m2-keep-manifest-vars

diff --git a/src/ci.rs b/src/ci.rs
index 1fb5d1d48..fcf6e93e5 100644
--- a/src/ci.rs
+++ b/src/ci.rs
@@ -104,7 +104,7 @@ pub fn dispatch(root: &Path, args: &[String]) {
 /// its dependents and this crate a second time.
 fn forget_own_package() {
     for (name, _) in std::env::vars_os() {
-        let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_PKG_") || n.starts_with("CARGO_MANIFEST_"));
+        let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_PKG_"));
         if own {
             std::env::remove_var(name);
         }

m3-keep-pkg-vars

diff --git a/src/ci.rs b/src/ci.rs
index 1fb5d1d48..f811eae04 100644
--- a/src/ci.rs
+++ b/src/ci.rs
@@ -104,7 +104,7 @@ pub fn dispatch(root: &Path, args: &[String]) {
 /// its dependents and this crate a second time.
 fn forget_own_package() {
     for (name, _) in std::env::vars_os() {
-        let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_PKG_") || n.starts_with("CARGO_MANIFEST_"));
+        let own = name.to_str().is_some_and(|n| n.starts_with("CARGO_MANIFEST_"));
         if own {
             std::env::remove_var(name);
         }

m4-no-gate-row

diff --git a/src/build.rs b/src/build.rs
index 8c8c90eba..c14988ca7 100644
--- a/src/build.rs
+++ b/src/build.rs
@@ -3104,7 +3104,6 @@ mod tests {
         "tests/metalcase/system.toml",
         "tests/metaldevicecase/system.toml",
         "tests/netcase/system.toml",
-        "tests/panelcase/system.toml",
         "tests/proctreecase/system.toml",
         "tests/testcases/system.toml",
         "tests/virtjobcase/system.toml",

The guest test at this head, exit 0 (its BUILT figure is the worktree's first sysroot after the merge, built inside that line):

10:37:53   BUILD x86_64 kernel boot-actuators,test-actuators, loader, ROOT of tests/panelcase, for screen_fatal_halt_composited
10:40:13   BUILT x86_64 kernel boot-actuators,test-actuators, loader, ROOT of tests/panelcase, for screen_fatal_halt_composited  (140s)
10:40:21   [panic] the fatal report is on the panel and sealed in the black box (14264 bytes)
10:40:21   PASS  screen_fatal_halt_composited  (8s)
10:40:21 test result: ok. 1 passed, 1 total (148.0s; workers: 140s building, 8s testing)

@Japabu
Japabu marked this pull request as ready for review October 8, 2026 10:42
@Japabu

Japabu commented Oct 8, 2026

Copy link
Copy Markdown
Collaborator Author

Review round 2 of e93b3a141 against origin/main (d78350c71), by reading the tree, the saved logs of run 37765227287 and of the baseline job 113260475768, and the orchestrator's local logs; I ran no build and no test.

Net lines (git diff --shortstat origin/main...e93b3a141): 7 files, +160 −32. Production: src/ci.rs +17. Tests and test configs: src/ci.rs +43, src/build.rs +1, tests/toyos.rs +1 −1, tests/panelcase/system.toml +20, tests/metalcase/system.toml +1 −4. Issues: +77 −27. Unchanged in source since round 1; the growth was accepted there.

Round 1's BLOCKER

  • host at this head — CLOSED. Job 113271124288 of run 37765227287, checked out as 7196814 Merge e93b3a141… into 1084ddc9a… (the head's own second parent, so the head's tree): [ci] Host: 78 step(s), all green, with build::tests::every_shipped_boot_config_is_covered ... ok and ci::tests::a_steps_cargo_finds_fresh_what_the_jobs_cargo_built ... ok in it. Cache not found for input keys: host-sealed-Linux-X64-37765227287, host-sealed-Linux-X64-, the cache entry, read by content: none restored: the run is cold, and Compiling ring v0.17.14 under === [ci] the build system: the body's line 2 holds as written. Every test result: FAILED in that log sits under a control step, which is green by being red.

Round 1's NOTEs

  • Issue file, "No runner has measured either" — CLOSED: the sentence is gone.
  • Body, 30 passed, 30 total — CLOSED: line 5 rests on N passed, N total.
  • Body, "Closes …, whose exit was a measurement" — CLOSED: the body says "replaces" and that the exit was met as a bound and superseded.

The lines the landing rests on, read in ci-guest-e93b3a141.log (job 113272198698)

  • Line 3: between === [ci] the suite (log line 689) and Running tests/toyos.rs (697) there are six Compiling lines: toyos-bootmap, kernel, toyos-i219, toyos-xhci, toyos-userbound, toyos-build. None of ring, rustls, rustls-webpki or ureq. Finished `test` profile … in 11.92s against the baseline's 44.82 s.
  • Line 4: BUILD and BUILT x86_64 ROOT of tests/panelcase, for screen_fatal_halt_composited (35s), [panic] the fatal report is on the panel and sealed in the black box (14192 bytes), PASS screen_fatal_halt_composited (7s); no line of the log names tests/metalcase.
  • Line 5: test result: ok. 31 passed, 31 total (549.4s; workers: 411s building, 138s testing), [ci] Guest: 5 step(s), all green.

The remaining Compiling toyos-build is owed, and is no red. The step runs cargo test --test toyos-build (src/ci.rs, suite_args); [[test]] name = "toyos-build", path = "tests/toyos.rs" is a target of the package toyos-build, and cargo run builds neither a [[test]] target nor [dev-dependencies]. Cargo prints one Compiling line per package whatever number of its units it builds, so the line's presence cannot tell the harness from a rebuilt library; its duration can. From that line to Finished: 36.3 s in the baseline, where the same job's driver (library and binary) took 27.5 s from its own Compiling toyos-build to Finished; 11.1 s at this head, on a runner where the driver took 36.1 s. The library was built again in the baseline and is not here. The five other lines are the harness's dev-dependencies and stand in the baseline too, in the same place. The body's sentence "Compiling toyos-build stays there once: the harness" is true; "no second build of the build system" holds.

The saving, as the logs give it. One run against one run, on different runners, and this head's was the slower: its driver's build read 2m 36s against the baseline's 2m 04s. building 465 s to 411 s; the harness's build 44.82 s to 11.92 s; metalcase's 158 s against panelcase's 35 s. Every other large BUILT line rose at this head: netcase 89 to 117, the x86_64 test kernel and testcases 54 to 63, the aarch64 test kernel, loader and testcases 91 to 111, the two aarch64 kernels 27 to 32 each. Nothing past those figures is measured, and 54 s is not a saving per run.

The merge with #746

git show --cc e93b3a141 shows one file, the branch's issue file, and its hunks are the corrections the commit message lists. git diff 1084ddc9a e93b3a141 is the seven files of the branch and nothing else, so src/build.rs, src/ci.rs and tests/toyos.rs are main's whole with the ALL_CONFIGS row, forget_own_package with its call and test pair, and the tests/panelcase path. cargo metadata --locked left an empty stderr; M1 to M4 each built and turned its named test red at this head (the env variable CARGO_PKG_NAME changed, CARGO_MANIFEST_DIR changed, CARGO_PKG_NAME changed, left == right at src/build.rs:3564). M5 is from 30d6713a0; tests/panelcase/system.toml and the test's the compositor never took the screen arm are untouched by the merge, and it is accepted.

The issue file against the folded tree

[profile.toyos] is at the root Cargo.toml:268 and in no kernel/Cargo.toml; guests build with --target <triple> --profile toyos into the root's target/; the cited host-cache issue exists; neither the deleted slug nor the five-locks slug is cited anywhere at the head or in the merged tree; column D's figures are the baseline log's own (2m 04s, 44.82s, 465s building, 133s testing, and each BUILT line); "five times" is the five kernel builds either log prints. Frontmatter is open / tooling / opened, as issues/README.md asks. Nothing false found.

Against origin/main now (d78350c71, #761)

git merge-tree --write-tree origin/main e93b3a141 exits 0 (tree 64130b1f0), and that tree differs from origin/main in this branch's seven files only. #761's bar_map_again entries and arm and this branch's tests/panelcase line are both in its tests/toyos.rs; #761 adds no boot config, so ALL_CONFIGS needs no row for it. The pull request reads MERGEABLE, CLEAN. No merge of main into the branch is asked for: the merge group runs host and guest / suite on that tree.

BLOCKER

None.

NOTE

  • PR body, "Head", "What CI must show", "Gates", "What I am unsure of" — it still says neither check has a result on this head, lists cargo run -- --ci host and the whole guest suite as not run, and calls lines 3 and 5 an estimate; all false of the record since run 37765227287. Before the pull request is armed the body, which becomes main's commit, carries the measurement Evidence asks to find there: host job 113271124288 with [ci] Host: 78 step(s), all green; guest / suite job 113272198698 with the lines above; and the saving as stated above, one run against one run on different runners with the other BUILT lines up, and no figure beyond those.

May be armed once the body is corrected; nothing in the tree changes.

LAND AFTER NAMED CHANGES

@Japabu
Japabu added this pull request to the merge queue Oct 8, 2026
Merged via the queue into main with commit 47cbd2e Oct 8, 2026
6 checks passed
@Japabu
Japabu deleted the wt/toyos-guestimages branch October 8, 2026 11:28
Japabu added a commit that referenced this pull request Oct 8, 2026
The track issue conflicted in the meter paragraph, which #766 rewrote with
the T14's reading and this branch had re-owned. It takes main's text whole,
its two new bullets included, with the one owner line this branch changed:
"the power-off stage" is this slice, whose stage paragraph the branch
deletes, so the meter's owner reads "this stage".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
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