Repository navigation
Memory overwrite on every boot; the black box goes, and a clean stop proves an image - #1196
Conversation
Decision for stage 2: what replaces the black box's other jobsThese are the implementer's proposals, not verified results. The owner's ruling accepts losing crash records. The black-box page also does three other jobs, and these need a decision before deleting it. A. Proving an image (the anti-rollback floor and dead slots). This must be replaced in the same landing. Today a
B. The boot chain (
C. Records written after
Records to update alongside: step 1 of the logging track plans a ring in persistent RAM, and the wipe rules that out. A new track, Estimated size of stage 2 (inference): roughly −3,000 lines across |
- Delete the fair-band record: its aim was adopted as J1, and only the reservation layer it waited on was declined, which the cpu-time record holds. Nothing cited it. - Remove the reservation model from the records that still stated it as done or as the partner of placement. - The guids record names stage 5's good flag, not tries; the planned `hang_bounded_by_the_stick` row bounds a `--once` image's hang. - The package track's stage 6 and installer bullet keep the ruling date, what is built and the exit; the design is the manual's. - The cpu.rs comment cites the corpse-deferral finding instead of restating it; the scheduling page drops the per-stream line the general one covers. - Update-track stage 2 keeps the next boot's report of the last boot's death, and loader stage 5 says its good flag replaces the black-box page as an image's proof, leaving its order against the page's removal to #1196. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s mark The loader's memory-overwrite request has the firmware wipe RAM after a reset, so nothing the black-box page carried survives it. Measured on the T14 at 1e459d3 (#1196): the pass after the kernel's reset read the request back as [00] and found no record, and began at 10.725 s after reset against 9.753 s for the pass after Ubuntu's reboot and a 9.63 s median over 148 earlier passes: the firmware overwrote memory, in about a second. The owner ruled on 2026-11-05 ("just wipe it ... if that means we remove the blackbox then so be it") and the same day made updates fix-forward, with no automatic fallback to the previous slot. This removes the page and every job it did: - Proof. A boot proves its image by stopping cleanly: logkeeper writes the stop mark (toyos_logstream::STOPPED) on the log partition once a stop's flush has made the log durable, and takes it back on RESUME. The loader records the image it boots (lib/update's record, now just that image) and the next pass takes record and mark, raising the anti-rollback floor to the verified header's version only where both are there. Death marking, the dead-slot fallback, Refusal::Died, the attempt count and its hang bound go. - The boot chain. The loader no longer points BootNext at itself, and every pass boots a kernel: the pass after a reset that read the page, ended the chain and reset the machine is gone, with loader.log's append mode. - The page. lib/blackbox, kernel/src/blackbox.rs and loader/src/blackbox.rs go, with everything only they used: the fault entry's register seal, the panic's and the stop's seals, the stop's log tail, the census's sealed form, the deadline's and the hard-lockup detector's wedge reports and the state kept only for them (each CPU's last kernel pc and NMI frame, the lock a spin waits on, the boot phase), the x86 cache write-back in both, and the wedge-before-reset, hard-lockup-probe and blackbox-foreign-identity arms. The deadline and the detector still reset the machine. - The harness. A metal boot is judged by what survives it: the log partition (logkeeper's files and the stop mark) and the loop seeing the machine come back; build/bootlog.rs states it once. The rows whose oracle was the page go (blackbox_unclaimed_page, blackbox_foreign_record, blackbox_done_chain, irq_census_conservation, boot_deadline_ends_a_wedge, watchdog_resets, hard_lockup_ends_a_deaf_cpu), with the panel timings and the stop-record check; machine_reboot, watchdog_fed, the disk-load row and amdvi_usbd are judged off the volume. screen_loader_clears, which held a loader pass that booted no kernel, goes, and its gap is filed. Records: the follow-up track for a crash record that survives a reset outside RAM is filed (ERST, a UEFI variable, a disk dump; the owner chooses). Seven records whose subject was the page close; the rest that cited it are corrected. The manual's boot, kernel and diagnostics pages say what is true. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1e459d3 to
2ae221e
Compare
|
Guest rows for #1196 (guest-rows workflow):
|
|
T14 metal for #1196: one Boot verdict: Judged with this branch's harness ( Proof lines:
Overwrite cost on the second boot: not readable from this run.
Not judged here: The bench record still holds 167 numbers this run measured nothing for. Among them are the deleted |
Review of #1196 at
|
… and the metal verdict judges the come-back - Only the row that keeps the log (it holds the log's origins) has /log read-write; every other declared row's view holds it read-only (toyos_manifest::Program::view). No program but logkeeper, the supervisor and the loader can write the stop mark or the loader's record, so none can credit a boot or name another slot's image for the floor. - The mark is written as late as the log volume is still written: the supervisor's stop flushes the log, syncs its files, then asks logkeeper for the mark (MARK/MARKED) before it stops its drivers, the log volume's among them. A hang after that is the one window still credited; it is named in build/bootlog.rs's contract and in the crash-record track. - The metal verdict judges the machine coming back: back_secs is a recorded number per boot, held to its bench record like complete_ms, so a stop the deadline ended comes back late and reds. build/bootlog.rs states the contract once: the log partition and the come-back, and the window neither sees. - The loader's record is overwritten in place once the mark is gone, rather than deleted and rewritten, so no old record pairs with a fresh mark; record.rs keeps one form (no "no boot" record, no version nobody reads). - The x86 timer stub calls the deadline poll through an extern "sysv64" wrapper, as every other symbol it calls is. - Records: the slot fallback and the loader track's stage 7 exit under fix-forward, the attempts file, the manual's overwrite claims qualified to firmware that honours the request, the authority claims corrected, and the vacuous metal census check in ps2server filed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review r1 response (
Suggestions taken:
Suggestion not taken: a separate deadline row. The "a deadline ends the boot" shape already has one, Evidence leak. The T14 NVMe EUI-64 appeared in the device paths of two published
Requesting a focused review of |
Review r2 of #1196:
|
…t, true comments - The supervisor counts unanswered stop marks as it counts flushes (toyos_logstream::Unanswered), so a MARKED that arrives after its wait was given up is counted off the marks during a later flush or mark rather than panicking the supervisor or ending a newer mark's wait before that mark is written. Host test: a_late_answer_is_counted_off_its_own_kind. - metalprobe's usbwrite and usbread write /boot on the same disk, since /log is the log keeper's alone; both device-boot records say so. - STOPPED's doc and loader/src/proof.rs refer to Program::view for who may write /log, and proof.rs no longer claims a found mark always pairs with the record when that pass's write failed. - build/bootlog.rs states when back_secs catches a hang after the mark: where the deadline is past twice the boot's recorded come-back. - only_the_log_keeper_writes_the_log carries its two controls: a row that receives the log wire, and one named logkeeper that holds nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review r2 response, head
Suggestions taken:
Evidence (https://github.com/ToyOSOrg/evidence/tree/3fb30fc8722101623b5c488bb9b2b7f5bcf72662/r6):
Requesting a focused review of |
Review r3 of #1196:
|
… fails /boot is read-only at every layer below the view, and is the ESP: no place for a probe to write. The probe keeps its /log paths; its header and the-device-boot-is-flashed-by-no-metal-row.md say usbwrite and usbread now fail with ReadOnly under the /log rule, and that the probe needs a writable place on the stick, for whoever revives that row. The cache record names /log again. The late-answer test sits below the module's uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Orchestrator verification of the r3 fix (a261141..7bbfecf):
Landing waits only on the AMD bench boot (with this branch as flasher), which is pending a power cycle of that bench. |
|
AMD metal for #1196: one Boot verdict: Judged with this branch's harness at What the AMD firmware did with the request:
Proof lines: "Proof: the last boot left no stop mark", which is expected after a reflash, and "Proof: slot A's image is written down". With this, the PR's evidence is complete:
|
Every loader pass now sets the TCG MemoryOverwriteRequestControl variable (vendor e20939be-32d4-41be-a150-897f85d49829) to 0x01 where the firmware defines it, so firmware that honours the request overwrites memory before the next boot: whoever resets a ToyOS machine into a medium of their own reads nothing the last boot left in RAM. This is the line of Linux's reset-attack mitigation ToyOS declined under the 2026-10-03 "Keep crash records" ruling, which the owner reversed on 2026-11-05. The facts are the TCG PC Client Platform Reset Attack Mitigation Specification 1.2's: the firmware creates the variable and an OS loader never does (section 4.1), so a firmware that has none is told nothing; the byte is ClearMemory in bit 0 with DisableAutoDetect and the reserved bits 0, under NV|BS|RT (4.1.2); the firmware clears the request once it has overwritten memory (4.1.3), so the loader sets it again on every pass. DisableAutoDetect stays 0, so firmware that can tell an orderly shutdown may skip the wipe (3.3). No kernel makes a runtime SetVariable, so ToyOS never clears the request at a clean shutdown. The pass logs the value it found, which on the T14 is the request Ubuntu sets on every boot, and the new metal row memory_overwrite_requested holds the T14 and the AMD bench to the firmware defining the request and taking the write. It rides the testcases boot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The loader now sets MemoryOverwriteRequestControl on every pass, so: - the-loader-never-sets-the-firmwares-memory-overwrite-request (rejected under "Keep crash records") is resolved and deleted; - a-memory-overwrite-request-ubuntu-left-set-stays-set-under-toyos is deleted: its exit cleared a request another system left set so crash records would survive. A request another system set is now the one ToyOS makes itself; the loader logs the value it found and writes 0x01; - the security track no longer declines that line of Linux's; - toyos-explains-itself records the owner's reversal of "Keep crash records" (2026-11-05). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s mark The loader's memory-overwrite request has the firmware wipe RAM after a reset, so nothing the black-box page carried survives it. Measured on the T14 at 1e459d3 (#1196): the pass after the kernel's reset read the request back as [00] and found no record, and began at 10.725 s after reset against 9.753 s for the pass after Ubuntu's reboot and a 9.63 s median over 148 earlier passes: the firmware overwrote memory, in about a second. The owner ruled on 2026-11-05 ("just wipe it ... if that means we remove the blackbox then so be it") and the same day made updates fix-forward, with no automatic fallback to the previous slot. This removes the page and every job it did: - Proof. A boot proves its image by stopping cleanly: logkeeper writes the stop mark (toyos_logstream::STOPPED) on the log partition once a stop's flush has made the log durable, and takes it back on RESUME. The loader records the image it boots (lib/update's record, now just that image) and the next pass takes record and mark, raising the anti-rollback floor to the verified header's version only where both are there. Death marking, the dead-slot fallback, Refusal::Died, the attempt count and its hang bound go. - The boot chain. The loader no longer points BootNext at itself, and every pass boots a kernel: the pass after a reset that read the page, ended the chain and reset the machine is gone, with loader.log's append mode. - The page. lib/blackbox, kernel/src/blackbox.rs and loader/src/blackbox.rs go, with everything only they used: the fault entry's register seal, the panic's and the stop's seals, the stop's log tail, the census's sealed form, the deadline's and the hard-lockup detector's wedge reports and the state kept only for them (each CPU's last kernel pc and NMI frame, the lock a spin waits on, the boot phase), the x86 cache write-back in both, and the wedge-before-reset, hard-lockup-probe and blackbox-foreign-identity arms. The deadline and the detector still reset the machine. - The harness. A metal boot is judged by what survives it: the log partition (logkeeper's files and the stop mark) and the loop seeing the machine come back; build/bootlog.rs states it once. The rows whose oracle was the page go (blackbox_unclaimed_page, blackbox_foreign_record, blackbox_done_chain, irq_census_conservation, boot_deadline_ends_a_wedge, watchdog_resets, hard_lockup_ends_a_deaf_cpu), with the panel timings and the stop-record check; machine_reboot, watchdog_fed, the disk-load row and amdvi_usbd are judged off the volume. screen_loader_clears, which held a loader pass that booted no kernel, goes, and its gap is filed. Records: the follow-up track for a crash record that survives a reset outside RAM is filed (ERST, a UEFI variable, a disk dump; the owner chooses). Seven records whose subject was the page close; the rest that cited it are corrected. The manual's boot, kernel and diagnostics pages say what is true. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The proof chain crosses two components and a reset: logkeeper writes the stop mark at the stop's flush, and the next loader pass takes it with the loader's record and raises the anti-rollback floor. No host test has the loader's second pass on the same disk and firmware variables, and a metal run reflashes before any second pass, so this is a guest row: a boot whose first pass proves nothing, a reboot the guest asks for, and the next pass naming the clean stop and raising the floor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A refused stop's RESUME took the mark back unconditionally, so a boot whose /log never opened asked a file server that may never answer for a file it never wrote. The flush now records whether it wrote the mark, and RESUME removes it only then. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The boot console the harness keeps starts at the kernel, so the first pass's proof line is read off the loader's channel, and the second pass is found on the console after the reboot or as the 16550 file's second pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and the metal verdict judges the come-back - Only the row that keeps the log (it holds the log's origins) has /log read-write; every other declared row's view holds it read-only (toyos_manifest::Program::view). No program but logkeeper, the supervisor and the loader can write the stop mark or the loader's record, so none can credit a boot or name another slot's image for the floor. - The mark is written as late as the log volume is still written: the supervisor's stop flushes the log, syncs its files, then asks logkeeper for the mark (MARK/MARKED) before it stops its drivers, the log volume's among them. A hang after that is the one window still credited; it is named in build/bootlog.rs's contract and in the crash-record track. - The metal verdict judges the machine coming back: back_secs is a recorded number per boot, held to its bench record like complete_ms, so a stop the deadline ended comes back late and reds. build/bootlog.rs states the contract once: the log partition and the come-back, and the window neither sees. - The loader's record is overwritten in place once the mark is gone, rather than deleted and rewritten, so no old record pairs with a fresh mark; record.rs keeps one form (no "no boot" record, no version nobody reads). - The x86 timer stub calls the deadline poll through an extern "sysv64" wrapper, as every other symbol it calls is. - Records: the slot fallback and the loader track's stage 7 exit under fix-forward, the attempts file, the manual's overwrite claims qualified to firmware that honours the request, the authority claims corrected, and the vacuous metal census check in ps2server filed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t, true comments - The supervisor counts unanswered stop marks as it counts flushes (toyos_logstream::Unanswered), so a MARKED that arrives after its wait was given up is counted off the marks during a later flush or mark rather than panicking the supervisor or ending a newer mark's wait before that mark is written. Host test: a_late_answer_is_counted_off_its_own_kind. - metalprobe's usbwrite and usbread write /boot on the same disk, since /log is the log keeper's alone; both device-boot records say so. - STOPPED's doc and loader/src/proof.rs refer to Program::view for who may write /log, and proof.rs no longer claims a found mark always pairs with the record when that pass's write failed. - build/bootlog.rs states when back_secs catches a hang after the mark: where the deadline is past twice the boot's recorded come-back. - only_the_log_keeper_writes_the_log carries its two controls: a row that receives the log wire, and one named logkeeper that holds nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Unanswered counts them now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… fails /boot is read-only at every layer below the view, and is the ESP: no place for a probe to write. The probe keeps its /log paths; its header and the-device-boot-is-flashed-by-no-metal-row.md say usbwrite and usbread now fail with ReadOnly under the /log rule, and that the probe needs a writable place on the stick, for whoever revives that row. The cache record names /log again. The late-answer test sits below the module's uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7bbfecf to
03c1042
Compare
|
Rebased onto main ( Range-diff
The loader's proof, overwrite and slot code is unchanged, and it applies to #1189's loader flow without conflict. Checks at
Evidence: the r8 logs could not be published. Every push to |
|
Orchestrator verification of the rebase onto main (7bbfecf → 03c1042), which adds no logic:
Landing. |
…om the replay #1190's logkeeper rounds r1 to r5 (1815b94, 7d45162, a99667b, 7011568, bc12850), rebased onto #1195's opener thread and #1196's stop mark as #1195's reviewer planned. - A refused create, append, sync or continuation is asked again (`policy::Retry`, 1 s doubling to 64 s). `Volume` keeps the file's bytes (`size`, `durable`) apart from the replay's offsets (`from`, `through`, `durable_through`). `catch_up` opens the part again, cut to its last sync, or rebuilds it whole where it is shorter, and gives it what it is owed from the replay (`Hub::owed(at, max)` → `store::Owed`), a part's worth a round, through the ordinary part-sized writes and continuations. A gap the replay let go of is said in the file only. - The stop (`Volume::finish`) catches up within `STOP_CATCH_UP`, half the supervisor's flush bound, syncs what it wrote, and says any shortfall in the file and on the console; a refusal there leaves the part lost and the count from the last sync. - #1195: its opener thread stays; `adopt` only takes the volume, whose file stands at the replay's start, so the next round's catch-up gives it the boot so far; #1195's own catch-up loop, `Hub::owed(&mut u64)` and `serve::Owed` go. A volume still opening at the stop is waited for within the same `STOP_CATCH_UP`, then given the boot by `finish`, or said not to have opened. - #1196: the stop mark is written only over a part that is open, since a refused volume's file is not the boot's whole log. Host tests in `store.rs` (27 in all): the bookkeeping through an unsynced write, a replay gap, a refused continuation and a part cut behind its back; a refused first create; a stop with and without time; a stop whose reopen is refused after an unsynced write. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lings #1190's records (1e70db4, 1728915), rebased: - logkeeper-ends-the-boots-log-on-one-refused-create-and-nothing-durable-says-so stays open, rewritten to what is built. Its exit is the row, which was green before #1196 (run 42040641298). The row frees the full volume with a test job, and #1196 made `/log` read-only to every row but the log keeper's, so the row now stalls there and needs another way to free it. - a-file-held-across-a-file-servers-restart-answers-gone is narrowed to DATA reopen by inode number, waiting on a volume identity, and names the swapped-stick hazard of reopening by path. - std-file-lock-answers-ok-and-locks-nothing stays with M4. - The storage track records the DATA commit's two flushes and FUA missing end to end. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ng rulings #1190's records (1e70db4, 1728915), rebased: - logkeeper-ends-the-boots-log-on-one-refused-create-and-nothing-durable-says-so closes on the host tests, by the coordinator's ruling (option 3). `store.rs`'s tests cover each case: - a refused first create; - an unsynced write with bytes torn past it; - a gap the replay let go of; - a refused continuation; - a part cut short behind the volume's back; - a stop with and without time; - a stop whose reopen is refused after an unsynced write. End to end, `a_refused_log_is_written_whole_once_the_volume_takes_it` was green on the guest runner before #1196 (run 42040641298 at `6405def8d`): the stick read back held the boot from its first kernel record, each CPU's records as the console carried them. That row is not carried here. It freed its full log volume with a test job, and #1196 leaves `/log` writable to the log keeper alone. Filling the volume with logkeeper's own old parts instead does not heal it either: retention sweeps only at open, before the first write, and at a rotation, which a refused part never reaches. - a-file-held-across-a-file-servers-restart-answers-gone is narrowed to DATA reopen by inode number, waiting on a volume identity, and names the swapped-stick hazard of reopening by path. - std-file-lock-answers-ok-and-locks-nothing stays with M4. - The storage track records the DATA commit's two flushes and FUA missing end to end. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Status: evidence complete. Review rounds 1 to 3 are addressed, through
7bbfecf61. Host checks are green, both builds exit 0, and the stop-path guest rows pass. Metal boots on the T14 and the AMD bench, both flashed by this branch, passed, withmemory_overwrite_requestedgreen on each. The T14 metal boot (flashed by this branch's harness at8aee19205) is in; the AMD bench is pending a power cycle.Problem
Linux's EFI stub asks the firmware to overwrite RAM after a reset (TCG
MemoryOverwriteRequestControl). ToyOS had declined that under the owner's 2026-10-03 ruling, "Keep crash records". As a result, anyone who reset a ToyOS machine into their own boot medium could read what the last boot left in RAM. The owner reversed that ruling on 2026-11-05: "just wipe it … if that means we remove the blackbox then so be it". The same day he ruled that updates are fix-forward, with no automatic fallback to the previous slot.What changes
1. The loader requests the overwrite on every pass (
loader/src/overwrite.rs).MemoryOverwriteRequestControl(vendore20939be-32d4-41be-a150-897f85d49829), logs the value it found, and writes0x01withNV|BS|RT.SetVariable, so the lock would protect nothing extra.2. Measured on the T14 (at
1e459d3f2; evidence below):[00]and set[01].[00]and found no black-box record.[00]at the usual time, so the firmware treats Ubuntu's shutdown as orderly and clears the request without overwriting.3. Proving an image moves from RAM to the log partition.
logkeeperfor the stop markstopped(MARK/MARKED), then stop its drivers. The mark is the last write to the log volume before its storage driver stops. OnRESUME,logkeeperdeletes the mark if it wrote one.bootedin place once the last mark is gone./logread-write; every other declared row's view holds it read-only. So onlylogkeeper, the supervisor and the loader can write the mark or the record.Refusal::Died, the attempt count and its hang bound.4. The boot chain and the black box are deleted.
BootNextat itself, and every pass boots a kernel. The pass that read the black box, ended the chain and reset the machine is gone, and so isloader.log's append mode.lib/blackbox,kernel/src/blackbox.rsandloader/src/blackbox.rs.wedge-before-reset,hard-lockup-probeandblackbox-foreign-identity.5. The metal verdict uses only what survives the boot. The contract is stated once, in
build/bootlog.rs's header: the log partition (logkeeper's files and the stop mark) and the machine coming back within its bench's recorded time.back_secsis now a recorded number per boot, held to the bench record likecomplete_ms; the first run under this harness records it.blackbox_unclaimed_page,blackbox_foreign_record,blackbox_done_chain,irq_census_conservation,boot_deadline_ends_a_wedge,watchdog_resetsandhard_lockup_ends_a_deaf_cpu. The panel timings and the stop-record check go with them.machine_reboot,watchdog_fed, the disk-load row andamdvi_usbd.screen_loader_clearsrelied on a loader pass that booted no kernel, so it is deleted and the gap is filed. The page read inscreen_fatal_halt_compositedgoes.a_clean_stop_proves_its_image(x86-64 q35). It boots, reboots, and checks that the next loader pass reads the mark and raises the floor.6. Records and manual.
a-crash-record-survives-a-reset-outside-ram.md, a track for a crash record that survives a reset outside RAM. It lists ERST, a UEFI variable (pstore / NVRAM) and a disk dump; the owner chooses the route.the-loaders-screen-clear-is-tested-by-nothing.md.Temporary gaps (recorded in the crash-record track)
Settled by the orchestrator
wedge-before-resetwith its rows is accepted.a-frozen-toyos-waits-for-a-hand-on-the-power-button.mdsays its T14 TCO reading brings the switch back.Checks
cargo run -- --build-onlyand--build-only --arch aarch64at the head: exit 0 (logs below).cargo run -- --ci hostat2ae221e53: exit 0, 108 steps all green.dd878948aadds only the guest row, whichcargo check --testscompiles.the_stop_owes_its_record,a_bound_fires_within_one_period_of_itselfanda_cleared_page_owes_no_panelwere deleted with what they judged. The planted-readback checks were updated.machine_shutdown_short_stop,screen_*fatal rows,session_lifecycle,preempt,a_clean_stop_proves_its_image; AArch64virt_reboot,virt_timer_preempts,virt_early_panic,virt_fatal_halts_the_others_first,virt_first_entry,virt_ring0_timer_in_syscall. The AArch64 rows run because its trap entry changed.testcasesboot ofdd878948a, flashed by this branch at8aee19205. Verdict passed under the new contract, andmemory_overwrite_requestedpasses (evidence r4).7bbfecf61. Verdict passed, andmemory_overwrite_requestedpasses. The firmware defines the request (0x7), read[00]and took[01]. Its overwrite cost is unmeasured, because this bench's loader states no counter rate (evidence r7).Evidence (
ToyOSOrg/evidence, branchpr-1196):a261141c4: https://github.com/ToyOSOrg/evidence/tree/7b03f6c114e173cc65d85f80462a13101d1e190a/r6114babfe8(host checks, builds, guest rows): https://github.com/ToyOSOrg/evidence/tree/7b03f6c114e173cc65d85f80462a13101d1e190a/r52ae221e53, 108 steps all green), image builds, metal staging: https://github.com/ToyOSOrg/evidence/tree/7b03f6c114e173cc65d85f80462a13101d1e190a/r3🤖 Generated with Claude Code