Repository navigation
Every shipping-kernel member rides testcases behind its rows' jobs, and the two debug timing rows ride shared-debug: 23 boots to 20 - #799
Conversation
…nd the two debug timing rows ride shared-debug: 23 boots to 20 Stage 3b of step B of the one-boot plan for the T14's metal rows. `shared` and `ccorpus` are no boots of their own: the 85 discovered Rust binaries, the 137 C cases and the three bounds programs are `testcases`' members, in that order, behind the ten jobs its rows name. `testcases-debug` is gone: `tlb_shootdown_waits` and `trace_record_cost` name `shared-debug`, whose kernel is the one they need, and run before its seven members. A shared boot's members each say what they add to the list's bound (`metal::Member`), since one boot now carries Rust tests at 300 ms and C cases at 100. `testcases` is told `--bound-ms=100100` and armed with `boot-deadline=200200`; `shared-debug` keeps 62100 and 124200. A boot's last job ends its rows' jobs and no longer the whole list. Stage 3a put it behind the members, with no boot that had both. `acpi_hold` gives up 54 s after boot, and by the readings on record the rows' jobs end 43.2 s in and the members take 8.7 to 9.3 s more: behind them the hold would start with under two seconds left, and past that time it panics before it reads a line that has been in the log for twenty seconds. Before them it starts where stage 1 measured it, and the three bounds programs stay the last jobs of the boot, which is the only place a machine has run them. Two jobs of one boot the kernel records under one name are refused in `batches`, for every boot; the C corpus's own check of its cases is that one now. The judge prints a shared boot's members' time summed between each one's own markers, against what they add to the bound: the time from `Boot: complete` to the last record now holds the rows' jobs too. The record rows of `shared`, `ccorpus` and `testcases-debug` are deleted. The allowance issue carries the merged list summed from the boots it was: 51.8 to 52.5 s of a 100.1 s bound, past half by the rows' jobs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
Mutations at
|
| patch | toyos-checks metal_ |
what went red | --metal --list |
|---|---|---|---|
m1-the-last-job-lands-behind-the-members |
101 | metal_rows_run_before_members_under_a_bound_the_members_widen: ["tone", "cost", "late", "m1", "c1", "m2", "hold"] |
0 |
m2-every-member-adds-what-the-first-does |
101 | the same check: bounds (62580, 125160), want (61980, 123960); the list arms testcases with 127 500 and 255 000 ms |
0 |
m3-two-jobs-under-one-recorded-name-are-batched |
101 | the same check: two jobs the kernel records under one name were batched |
0 |
The list stays green under each: it prints what it batches and judges nothing.
m1-the-last-job-lands-behind-the-members
diff --git a/tests/common/metal.rs b/tests/common/metal.rs
index b3ed98370..58210b26f 100644
--- a/tests/common/metal.rs
+++ b/tests/common/metal.rs
@@ -634,12 +634,6 @@ pub fn batches(
}
}
}
- for batch in out.values_mut() {
- if let Some(last) = batch.last {
- batch.jobs.retain(|job| job != last);
- batch.jobs.push(last.to_string());
- }
- }
let mut ridden: BTreeSet<&str> = BTreeSet::new();
for boot in shared {
if !ridden.insert(&boot.boot) {
@@ -652,6 +646,12 @@ pub fn batches(
batch.files.extend(boot.files.iter().cloned());
batch.links.extend(boot.links.iter().cloned());
}
+ for batch in out.values_mut() {
+ if let Some(last) = batch.last {
+ batch.jobs.retain(|job| job != last);
+ batch.jobs.push(last.to_string());
+ }
+ }
for (label, batch) in &out {
let mut recorded: BTreeMap<String, &str> = BTreeMap::new();
for job in &batch.jobs {m2-every-member-adds-what-the-first-does
diff --git a/tests/common/metal.rs b/tests/common/metal.rs
index b3ed98370..365a2f7ee 100644
--- a/tests/common/metal.rs
+++ b/tests/common/metal.rs
@@ -123,7 +123,7 @@ pub struct Member {
impl SharedBoot {
/// What the members add to their boot's list bound.
fn members_ms(&self) -> u64 {
- self.members.iter().map(|member| member.adds_ms).sum()
+ self.members.len() as u64 * self.members.first().map_or(0, |member| member.adds_ms)
}
/// This boot with the members `named` and none else, or `None` where thatm3-two-jobs-under-one-recorded-name-are-batched
diff --git a/tests/common/metal.rs b/tests/common/metal.rs
index b3ed98370..b7a961915 100644
--- a/tests/common/metal.rs
+++ b/tests/common/metal.rs
@@ -655,7 +655,7 @@ pub fn batches(
for (label, batch) in &out {
let mut recorded: BTreeMap<String, &str> = BTreeMap::new();
for job in &batch.jobs {
- if let Some(other) = recorded.insert(bootlog::recorded_name(job), job) {
+ if let Some(other) = recorded.insert(job.clone(), job) {
return Err(format!(
"the boot {label:?} runs {other} and {job}, and the kernel records both as {:?}: one \
boot's log cannot tell their verdicts apart",
Review, round 1, at
|
…markers; the hold's boot-relative give-up is filed; the allowance issue's exit reads per part The judge's line for a shared boot's members summed only the members with a start and an end marker and then said "over the N that ran", N being the members that passed: one cut inside its run, the longest of them, left the sum in silence. The line now reads "summed over the N of M with both markers", and a second line, "K without a start and an end marker, the first <job>", is printed where K is not zero. The mean is gone with the count it was divided by. It stays a line a reader reads. `acpi_hold`'s `UNTIL_MS` is 54 000 ms from boot while its runner is given 100 100 ms: the round-1 review found that this branch ordered the list around it and recorded nothing. It is filed, owner the harness, not fixed. The allowance issue's exit read one sum against half of one bound, which hid two opposite errors: members at about 4.3 times their work, rows' jobs at about 1.4 times theirs. By the orchestrator's ruling it is three parts now: the members' share, the rows' jobs' share, and `testcases` reading both inside. None is built and the issue stays open. Its price table and its late-expiry sentence named `shared` and `ccorpus`, which are no boots any more, and the retention issue called the hold `testcases`' last job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
Mutations at
|
| patch | toyos-checks metal_ |
what went red | --metal --list |
|---|---|---|---|
m1-the-last-job-lands-behind-the-members |
101 | metal_rows_run_before_members_under_a_bound_the_members_widen at tests/checks/metal.rs:479: ["tone", "cost", "late", "m1", "c1", "m2", "hold"] |
0 |
m2-every-member-adds-what-the-first-does |
101 | the same check at :480: bounds (62580, 125160), want (61980, 123960) |
0 |
m3-two-jobs-under-one-recorded-name-are-batched |
101 | the same check at :499: two jobs the kernel records under one name were batched |
0 |
The list stays green under each: it prints what it batches and judges nothing.
m1-the-last-job-lands-behind-the-members
diff --git a/tests/common/metal.rs b/tests/common/metal.rs
index 7810ecabe..85becb29b 100644
--- a/tests/common/metal.rs
+++ b/tests/common/metal.rs
@@ -634,12 +634,6 @@ pub fn batches(
}
}
}
- for batch in out.values_mut() {
- if let Some(last) = batch.last {
- batch.jobs.retain(|job| job != last);
- batch.jobs.push(last.to_string());
- }
- }
let mut ridden: BTreeSet<&str> = BTreeSet::new();
for boot in shared {
if !ridden.insert(&boot.boot) {
@@ -652,6 +646,12 @@ pub fn batches(
batch.files.extend(boot.files.iter().cloned());
batch.links.extend(boot.links.iter().cloned());
}
+ for batch in out.values_mut() {
+ if let Some(last) = batch.last {
+ batch.jobs.retain(|job| job != last);
+ batch.jobs.push(last.to_string());
+ }
+ }
for (label, batch) in &out {
let mut recorded: BTreeMap<String, &str> = BTreeMap::new();
for job in &batch.jobs {m2-every-member-adds-what-the-first-does
diff --git a/tests/common/metal.rs b/tests/common/metal.rs
index 7810ecabe..57c152833 100644
--- a/tests/common/metal.rs
+++ b/tests/common/metal.rs
@@ -123,7 +123,7 @@ pub struct Member {
impl SharedBoot {
/// What the members add to their boot's list bound.
fn members_ms(&self) -> u64 {
- self.members.iter().map(|member| member.adds_ms).sum()
+ self.members.len() as u64 * self.members.first().map_or(0, |member| member.adds_ms)
}
/// This boot with the members `named` and none else, or `None` where thatm3-two-jobs-under-one-recorded-name-are-batched
diff --git a/tests/common/metal.rs b/tests/common/metal.rs
index 7810ecabe..109ac6100 100644
--- a/tests/common/metal.rs
+++ b/tests/common/metal.rs
@@ -655,7 +655,7 @@ pub fn batches(
for (label, batch) in &out {
let mut recorded: BTreeMap<String, &str> = BTreeMap::new();
for job in &batch.jobs {
- if let Some(other) = recorded.insert(bootlog::recorded_name(job), job) {
+ if let Some(other) = recorded.insert(job.clone(), job) {
return Err(format!(
"the boot {label:?} runs {other} and {job}, and the kernel records both as {:?}: one \
boot's log cannot tell their verdicts apart",
Answer to the round-1 review, at
|
|
The T14 at The red: So the member walks Everything else as the request asked:
Not landable at this head: a red row is a defect. A round follows for the member. |
…target has a row The T14 read the merged testcases boot at 2c7e1be red on this member: "/system/bin/134_double_to_signed" is a link to something else. The C corpus's cases ride that boot now, each a link to the comparator test_rs_ccheck, and the walk asserted every link in /system/bin lands on toybox. What a link carries is its target's row: the supervisor's `declared` follows one link and matches a row by its whole path, and a target no row names is answered undeclared, which the caller spawns itself with what it holds (the build's `unnamed_program` says the same of every harness binary). A link to test_rs_ccheck therefore buys no authority a policy table could limit, and a second multicall binary that does carry a row still reds the assertion. The walk now skips a link whose target the manifest names no row for, matched by the whole path as the supervisor matches it, and the line counts those links. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017cSFvbD35xJ2kGANVdm23C
…Me (#797), into the one-boot merge No conflict. In tests/toyos.rs main's two hunks are the `nvme_disk_keeps_log_and_home` machine test's row in MACHINE_TESTS and its arm and function after `run_machine_test`, both guest tests and neither in the METAL table or near `shared_metal`. tests/common/qemu.rs moved on main only; this branch does not touch it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017cSFvbD35xJ2kGANVdm23C
…, and the hold issue its start there At 2c7e1be: the first job 1 191 ms after the kernel's zero, the rows' ten jobs 41 924 ms, ending 43 115 ms in, the 225 members 9 253 ms of the 40 100 ms they add, the last record 52 352 ms of 100 100. acpi_hold started 43 095 ms in, 10.9 s before its give-up. Stamps from that boot's kernel.log, the zero being the `Boot: complete (1135ms)` line's stamp less 1 135 ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017cSFvbD35xJ2kGANVdm23C
Round 3, at
|
Review, round 2, at
|
|
The T14 at
The optional |
|
CI at |
Stage 3b of step B of the one-boot plan for the T14's metal rows: merge boots. Stage 1 was #785, stage 2 #789, stage 3a #794. Head
01fd3aedd, which holdsmainat558283168(#797, with #796 under it) by a merge with no conflict: intests/toyos.rsmain's two hunks are thenvme_disk_keeps_log_and_homemachine test's row inMACHINE_TESTSand its arm and function afterrun_machine_test, guest tests both, neither in theMETALtable nor nearshared_metal;tests/common/qemu.rsmoved onmainalone, and this branch does not touch it.--metal --listis unchanged by it.--metal --listbefore (965e62bb1): 61 registrations and 232 shared members over 23 boots. After: 61 and 232 over 20.shared,ccorpusandtestcases-debugare gone; no test is.The T14 read
2c7e1be1a: 266 passed, 1 failed. The red was this merge's own: see the first decision. This head is staged and owed a reading: see "The T14".What changed, per decision
endowment_deniedholds a link against toybox's policy table only where the link's target has a[programs]row. The red at2c7e1be1a:"/system/bin/134_double_to_signed" is a link to something else: a second multicall binary needs its own policy table, not this one, after every earlier phase passed. The member walks/system/binand asserted every link lands on/system/bin/toybox; the merged ROOT carries the C corpus, whose 137 cases are links to the comparatortest_rs_ccheck, which readsargv[0]so the kernel records each run under the case's name. Onshared's own ROOT there were none. The walk was too wide, and the corpus is not a second multicall binary in the sense the claim is about. What a link carries is its target's row: the supervisor'sdeclaredfollows one link and matches a row by its whole path, and a target no row names is answeredNotDeclared, which the caller spawns itself with what it holds; the build'sunnamed_programsays the same of every harness binary ("a harness binary has none, holding only what its spawner moved in"), andtest-runnerspawns every job directly in any case. A policy table limits what a row grants; a binary with no row is granted nothing by one. So the walk skips a link whose target the image's manifest names no row for, matched by the whole path as the supervisor matches it (its own parse of the manifest, as before), and a second binary that does have a row behind a link reds as before. The applets line counts the links it passed over. The corpus's shape is unchanged: one comparator under one link per case is what lets a stick say which case failed. Nothing of the endowment policy for C programs is decided here: the corpus's cases hold whattest-runnergives every job, as onccorpus' own boot.sharedandccorpusridetestcases. Its list is the ten jobs its rows name, then the 85 discovered Rust binaries, then the 137 C cases, then the three bounds programs (LAST_MEMBERS), thenreboot: 234 jobs, sincefault_gatesis a row's job and a member and runs once, among the rows'.c_corpus_metalgives the corpus's part of that boot andshared_metalputs the Rust members around it.testcases-debugridesshared-debug.tlb_shootdown_waitsandtrace_record_costname that boot, its kernel and its parameters, and their two jobs run before its seven members.metal::Member), where a shared boot said one number for all of its members: one boot now carries Rust tests at 300 ms and C cases at 100.acpi_holdgives up 54 000 ms after boot (UNTIL_MS); behind the members it would have started 51.8 to 52.5 s in by the readings before the merge. On the T14 at2c7e1be1a, before them, it started 43 095 ms into the kernel's clock with 10.9 s left and exited 0. It also keeps the three bounds programs the last jobs of the boot. The compromise under it is filed, not fixed:issues/acpi-hold-gives-up-at-a-time-counted-from-boot-whatever-its-runner-was-given.md, owner the harness, exit the hold bounded from its own start or by the bound its runner was given; it now carries the T14's start too.batches, for every boot. The C corpus checked its own cases; the merged list puts Rust members, C cases and rows' jobs under one log, so the check is the boot's now and the corpus's own is deleted.its members took <ms> ms of the <ms> ms they add to the list's bound, summed over the <n> of <all> with both markers, and a line<k> without a start and an end marker, the first <job>only where there is one. It is a line a reader reads and reds nothing; no host test holds it. On the T14:9253 ms of the 40100 ms … summed over the 225 of 225.shared,ccorpusandtestcases-debugare deleted from the machine's record undertests/metal/. The threetestcases-windowrows stay:issues/the-t14s-record-keeps-three-rows-of-a-boot-nothing-stages.mdowns them and half its exit.testcasesreading both inside, the pair from the kernel's own lines, the margin to the list bound beside them. None of it is built and the issue stays open. Its present numbers are now the T14's reading of the merged boot, beside the sum of the three boots it was.What the merged boots arm
--metal --listand the staging's own lines at01fd3aedd; the wait ismetal::return_secs' arithmetic. The T14 read the same pairs off the kernel's own lines at2c7e1be1a.--bound-ms=boot-deadline=toyos-metalwaitstestcasesmain: 60 000)main: 120 000)main: 60 000)main: 420)shared-debugmain: 7)100 100 is 60 000 for the rows' jobs, 88 members at 300 and 137 at 100. No other boot's list, bound or deadline changes.
The merged list against its bound, as the T14 measured it
testcasesat2c7e1be1a, each part between its own markers, the kernel's clock counted from itsBoot: complete (1135ms)line; beside it the sum of the three boots it was, three readings each (testcasesat9e70cd2e3,473efea22,accbd79dd;sharedandccorpusateff8b20ee,d6d008e88,49e12f23b).2c7e1be1aRead per part, as
issues/a-shared-members-allowance-sets-the-kernels-deadline-at-several-times-the-work.md's exit reads: the members at about 4.3 times their work, the rows' jobs at about 1.4 times theirs (counters_metalalone 32.7 s), the last record 47.7 s inside its bound, read by nothing. No part of that exit is met and none is built: the issue stays open. Behind 42 s of rows' jobs the members took 9 253 ms, inside what they took alone.The loader at
2c7e1be1a: ROOT read 9 301 ms, loader 13 069 ms, as the measured rate predicted (30.5 ms/MiB to read, 7.1 to hash, a ROOT partition of 305 MiB), under the firmware's 60 s.shared-debug: 176 ms of members over 7 of 7, its last record 1 754 ms of 62 100 ms.Why each row can share its boot
Rows' jobs run first, so every row's own jobs see the machine
testcasesgave them at stage 1: the same config, the same prefix, one job at a time. What changes is what stands in the log, the page and the census behind them. By what each judge reads:blackbox_unclaimed_page,control_regs,ioapic_topology,klogd_hosted,smp_roster_and_tsc_trail,pmm_accounting,acpi_table_inventory,timer_calibration,pci_inventory,loader_watchdog_arms' control armReadback::kerneldrops every program's line), and these are said at bootwake_storm_cost,syscall_costsyscall_cost's own two linesexit_codetakes the lowest pid of a name, and a row's job is spawned before any memberaudio_idle_suspend,hda_tone,hda_client_stall,shipped_client_departuresjob_window: the log from the job's spawn to its sessions' end, or to the next spawnrepeated completion for free buffer. The second gains no stream: no member opens one on soundserver.cpal_drop_unreleasedis its own stream server (its header: "No sound is played and soundserver is not involved"), and in the threesharedreadbacks soundserver says nothing after its startcounterscounters_metal's own lines by theircounters_metal <phase>:head; the idle second by stamp; noacpi: legacy mode againin the bootacpiclaim's holder goes, and no member holds or kills it (none in six readings)acpi_server_events,acpi_tables_loadedacpiserver, and boot recordsrfind: a boot that passes the server's next interval prints a later one, also a countclaim_reuses_its_remapping_entryiommu: irterecord whose source is it, counted: two and twopci_reclaimis onRUST_SKIP, and six readings of the member boots carry nohanded over on slotdomain_ends_below_the_host_bridgesiommu: domainrecord of the bootcrash_report_reads_no_kernel_memoryfault_gatesstages, and no report line anywhere in the boot that carries a kernel address's contentsshared's readback belowirq_census_conservationtlb_shootdown_waits(toshared-debug)elapsed >= FLOOR_NANOS), which no load shortens. The eleven self-tests run at init and on the first syscall of the boot (task_probes, once), before any jobtrace_record_cost(toshared-debug)task_probes; the flood is one syscallThe boot-wide judges, run over the member boots a machine has already answered. The
sharedandccorpusreadbacks of #794's third reading, relabelledtestcasesand judged at3055ab0d1(--metal --metal-readback <dir>with thirteen row names):shared's 88 membersirq_census_conservation(5 196 shootdowns, every delivery accounted for),domain_ends_below_the_host_bridges,acpi_tables_loadedandcrash_report_reads_no_kernel_memoryamong themccorpus' 137 casescrash_report_reads_no_kernel_memoryred for its premise, sincefault_gatesdid not run on that bootAnd the old readbacks under the new profile (
boot:testcases boot:shared-debugover stage 1'stestcasesand #794'sshared-debug): exit 1, everytestcasesrow and every self-test row PASS, 224 members and the two moved rows red as never run, which is what those logs hold.shared-debugreadsits members took 176 ms of the 2100 ms they add, the sum taken by hand above.The numbers each boot measures are the boot's own (
boot.testcases.complete_ms,panel_us,panel_max_us): the kernel's time toBoot: complete, before any job, and the panel's census, which painted 10 times ontestcases,sharedandccorpusalike. No row riding these two boots records a number of its own.No row kept a boot for sharing's sake.
mkdir_capandreaddir_boundkeep theirs until stage 3c.The members that read machine-wide state
The red was a member reading something the merged ROOT changed. Each other member whose source reads state another program moves, by
rgovertests/toyos-rust-tests/src/binfor directory walks, roster reads (SYS_SYSINFOentries), the memory header and the log:std_fs/system/bin's listinghierarchy_paths/'s listing againstROOT_ENTRIES/is the mount table, not ROOT's content; the corpus'sexpect/and binaries land under/systemtoybox_file_tools.partnames;/homefor one nameempty_dir_stat/tmp/empty_dir_stat_emptyreaddir_bound,mkdir_cap/tmp's exact count; the VFS directory cap, left fulltestcases-readdir,testcases-mkdir), unchanged hereendowment_deniedps's row count above zeropscounted 26 processes at2c7e1be1a. Past 256 threads it would red "does not contain this process", loud and misnamed; nothing near thatkill_ends_every_waitprocess_tree,abuse_thread_nameaudio_idle_suspendallocator_stressabuse_connect_floodmain'ssharedshm_release_reclaims,handle_lifetimeinbox_log_postfile_mtime/logNo other member walks a directory it did not make, counts processes or files, or reads a log line count. This is evidence for this list; a member a later landing adds is held to the same question by its own review.
The log
The T14's
testcaseslog at2c7e1be1a: 8 123 829 bytes, whole (no part missing), where the sum of the boots it was predicted 8 095 744 to 8 130 458. Eight parts at logkeeper's 1 MiB a part; a fresh volume keeps sixteen beforeretiredeletes one of this boot's own continuations; a part that is missing reds the whole boot by name (bootlog::lost_parts, #785), unchanged.The T14
At
2c7e1be1a(the orchestrator's reading; worktree clean before and after, each image's sha256 checked in the command that flashed it): three boots, eachtoyos-metalexit 0; judged with--metal --metal-readback <dir> boot:testcases boot:shared-debug: exit 1, 266 passed, 1 failed,test_rs_endowment_deniedexit 101 as above. Everything else as the request asked: the armed pairs 200 200 / 100 100 and 124 200 / 62 100 from the kernel's own lines;acpi_holdat the end of the rows' jobs, exit 0; the bounds programs last; no bound fired; each loader pass after the resetDONE; the members' line over 225 of 225. That reading is this change's negative control: the walk as it stood, on a ROOT with the corpus's links, red.At
01fd3aedd: staged withcargo test --test toyos-build -- --metal --metal-readback <dir> boot:testcases boot:shared-debug, exit 2, which is "staged"; no machine touched. The images of2c7e1be1awere gone already (the runner deletes each after its boot).testcasesd99c1440e52def650a5f9600cd75fe4283322db709d40f95fb12f181358003cdshared-debug82c1d8aee120d02b9acee3af3245ec2f12d4d33abd81b664c1467cdd5299e43ctestcases-watchdogc296fb0c0b9b37e2617a1b371c442a78598c011436a320510cd5b818783f1ed4The hashes stand in
request.txtasshasum -a 256lines, andshasum -a 256 -cover them answers OK for the three. The request names round 2's fourteen with this head's expected numbers, then:PASS test_rs_endowment_deniedwith its lineapplets: 15 links behind /system/bin/toybox, 14 declared over-grants and no undeclared one; 137 links to a binary no row namesand the lines after it; and 267 passed. Sent back by any FAIL or a count other than 267, an applets line with other numbers, a bound or aWEDGED, a missing part, the hold at or past 54 000 ms, another order, or a members' line over fewer than 225.A mutation boot, optional, staged beside it:
m4-a-second-binary-with-a-row-behind-a-link(the patch is in the round-3 comment) addsbin/zz_second_multicall -> /system/bin/symbolizetotests/testcases/system.toml,symbolizehaving a row. Staged from a never-pushed commit of it on01fd3aeddwith--metal --metal-readback <dir> endowment_denied 134_double_to_signed, exit 2, the tree restored to01fd3aeddand clean after; one image of 134 217 728 bytes, sha256b6787c435359a87d68264f014fef286583667a9a73d8e93c8f91752b6db74d71, its config carrying both the C case's link totest_rs_ccheckand the mutation's. Expected: exit 1,test_rs_endowment_deniedred naming/system/bin/zz_second_multicall: a second binary with a row behind a link still reds. No machine has run it, and only a machine can: see below.Where the tree differs from the design's text
mainis at 23 (A metal boot's list bound and deadline follow from who rides it, at 300 and 100 ms a member: shared-2 and the three bounds rows ride shared, 25 boots to 23 #794 was 25 to 23), so this stage is 23 to 20.Gates, at
01fd3aeddLogs are kept beside the orchestrator's scratch as
r3-*.cargo run -- --clippycargo test --test toyos-checkscargo test -p toyos-build --libcargo test --test toyos-build -- --metal --listcargo run -- --ci hostcargo run -- --build-onlycargo test --test toyos-build -- test_rs_endowment_deniedNo test matches filter "test_rs_endowment_denied"cargo test --test toyos-build -- --metal --metal-readback <dir> boot:testcases boot:shared-debugendowment_denied 134_double_to_signed, underm4Host load when the gates started: 18.65 / 29.42 / 32.46.
No guest runs
endowment_denied, so the T14 is its only oracle. The guest suite's names areMACHINE_TESTSandSCREEN_TESTS; the discovered Rust binaries and the C corpus are shared members, run only by--metaland the interactive--debug, and the filter above is refused for that reason. No QEMU boot carries a ROOT with the corpus's links either: the guest stages C cases astest_c_<case>and no comparator. The rest of the change is reached only through--metalandtoyos-checks;guest / suiteis a required check and runs at the landing head.High-risk checks
The harness's batching decides what the kernel's deadline is armed with and which program's exit a verdict is read from;
endowment_deniedis a security claim about endowments.tests/common/metal.rs, each red (101) inmetal_rows_run_before_members_under_a_bound_the_members_widenattests/checks/metal.rs479, 480 and 499 (the round-2 comment);metal.rshas not changed since. Forendowment_denied: the T14's reading of2c7e1be1a, the walk before the change on a ROOT with the corpus's links, red; andm4, staged, owed a machine.declaredand the build'sunnamed_programare the rule the narrowed walk follows, read, not run.The host check, and what it sees that reading cannot
rows_run_before_members_under_a_bound_the_members_widenis changed, not added: the last job's place in a list rows and members share, a bound summed over members of two allowances, and the refusal of two jobs under one recorded name. No guest test is added or cut;endowment_denied's walk is narrowed, its claim kept. No dependency is added. No program is changed.Size
git diff --shortstat origin/main...01fd3aedd: 9 files, +266 −151.issues/: 4 files, +97 −25, one new.tests/checks/: +29 −18. The harness and the record: +128 −106 as before.endowment_denied.rs: +12 −2.Unsure of
2c7e1be1apass again: one reading of a boot of its kind.read_dirlists/system/binin. Onm4's boot the walk reds on the mutation's link whichever it meets first; that it passes over the C case's link there holds only if it meets that one first. The main boot's 137 is what shows the pass-over.endowment_denied's roster read takes 256 entries and asserts its own pid among them without first refusing a larger roster by name, askill_ends_every_waitdoes. Not this change's, and far from reached (26 processes).🤖 Generated with Claude Code
https://claude.ai/code/session_017cSFvbD35xJ2kGANVdm23C