Repository navigation
One workspace, one lock: the root, the kernel, the loader, userland and the SDK resolve together - #746
Conversation
…and join the root's The root, kernel/, bootloader/, userland/ and toyos/ were five Cargo resolutions with five locks and three copies of [profile.toyos]. They are one workspace now: the root [workspace] names every crate but rust/, the guest test programs, the SSH judge and userland/libc, the root takes userland's [patch] table and the one [profile.toyos], and the root .cargo/config.toml is tracked with one [target.<triple>] table per guest triple in place of three per-directory build.target configs. Four locks, three rust-toolchain.toml and userland's virtual manifest are gone. The lock is every package of the five, resolved: its name and version pairs are their union. The registry getrandom 0.2.17, 0.3.4 and 0.4.2 the root alone resolved give way to the forks at the same versions, which the root [patch] now names for every member. The build system builds every guest at the root with -p into the one target/. What went with the several workspaces: cargo clean of a crate's target (a stale sysroot now takes target/toyos and the guest triples' directories, never the build system's own), the kernel and the loader built on two threads (cargo holds one lock on a target directory, measured: "Blocking waiting for file lock on artifact directory"), the kernel's manifest-path and target-dir on the host, the per-directory clippy runs, and four of the host cache's five target paths. src/hostws.rs says which members a host tests: all but the kernel, the loader, the SDK and userland's, which keep the steps they had. A fork clone under edit is listed in .cargo/local.toml, which the tracked config includes when it exists. What the fold changes of a kernel or a loader is the workspace root and nothing else: both are byte-identical, on both architectures, to a control that is the base with only its workspace root moved up, built at one path, and every rustc command line cargo runs for them is the base's once the tree's path and cargo's path-derived hashes are taken out. They are not byte-identical to the base's own build, and could not be: cargo hashes a path package's path relative to the workspace root into -C metadata, and the base built at a second path differs from itself. cargo test inside kernel/loom and kernel/sim now builds for the host, so that issue closes; the SDK turned out to be linted by no clippy run, which is filed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
#739 added userland/acpiserver/aml to userland's member list and its three path packages to userland's lock, both of which this branch deletes. The member joins the root list as userland/acpiserver/aml; the root lock gains toyos-aml, and already held toyos-acpi and toyos-bootmap. Its name and version pairs are again the union of main's five locks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
|
The proof the body cites, as run (its two absolute paths made arguments for posting). Exit 0 at #!/bin/sh
# The one-workspace fold's proof, run by hand and not part of the tree.
#
# prove.sh <base commit> <fold commit> <sysroot directory> <image key hex> <scratch directory> <worktree>
#
# Every arrangement is built at ONE absolute path, $P, from `git archive`:
# A the base, untouched: kernel/ and bootloader/ are their own roots.
# C the base with only the workspace root moved up: the crate's own base
# lock, its profile, and the base's flags in a root .cargo/config.toml.
# B the fold. B2 is B built again from nothing.
# M1 B without the [target.x86_64-unknown-uefi] table.
# M2 B with dlmalloc 0.2.13 locked at 0.2.12.
# M3 B's kernel built in one cargo with bcachefs selected beside it.
# It prints one line per comparison with the exit code of its cmp or diff.
set -u
BASE=$1; FOLD=$2; export RUSTUP_TOOLCHAIN=$3; export TOYOS_IMAGE_KEY=$4
export TOYOS_IMAGE_FLOOR=image
unset RUSTFLAGS RUSTC CARGO_TARGET_DIR
S=$5 # a scratch directory
W=$6 # the worktree
O=$S/proof; P=$S/proof-tree
rm -rf $O $P; mkdir -p $O
KT="x86_64-unknown-none aarch64-unknown-none-softfloat"
LT="x86_64-unknown-uefi aarch64-unknown-uefi"
PROFILE='
[profile.toyos]
inherits = "dev"
opt-level = 2
debug = true
strip = "debuginfo"
debug-assertions = true
overflow-checks = true
'
tree() { rm -rf $P; mkdir -p $P; git -C $W archive $1 | tar -x -C $P; }
# build <tag> <directory under $P> <artifact> <target> <cargo args...>
build() {
tag=$1; dir=$2; art=$3; t=$4; shift 4
(cd $P/$dir && cargo build -v --profile toyos --target $t "$@" > $O/$tag-$t.log 2>&1)
code=$?
echo "build $tag $t exit $code"
[ $code -eq 0 ] && cp $art $O/$tag-$t.bin
return $code
}
# The base's flags, as the fold's root config states them per triple.
config() { mkdir -p $P/.cargo; git -C $W show $FOLD:.cargo/config.toml > $P/.cargo/config.toml; }
moved() { # the crate whose root moves
tree $BASE
cp $P/$1/Cargo.lock $P/Cargo.lock
rm -rf $P/kernel/Cargo.lock $P/bootloader/Cargo.lock $P/kernel/.cargo $P/bootloader/.cargo $P/userland/.cargo \
$P/kernel/rust-toolchain.toml $P/bootloader/rust-toolchain.toml
perl -0pi -e 's|\[profile\.toyos\].*?overflow-checks = true\n||s' $P/kernel/Cargo.toml $P/bootloader/Cargo.toml
printf '[workspace]\nresolver = "2"\nmembers = ["%s"]\nexclude = ["userland", "toyos", "tests", "rust"]\n%s' $1 "$PROFILE" > $P/Cargo.toml
config
}
tree $BASE
for t in $KT; do build A-kernel kernel $P/kernel/target/$t/toyos/kernel $t; done
for t in $LT; do build A-loader bootloader $P/bootloader/target/$t/toyos/bootloader.efi $t; done
moved kernel
for t in $KT; do build C-kernel . $P/target/$t/toyos/kernel $t -p kernel; done
moved bootloader
for t in $LT; do build C-loader . $P/target/$t/toyos/bootloader.efi $t -p bootloader; done
for b in B B2; do
tree $FOLD
for t in $KT; do build $b-kernel . $P/target/$t/toyos/kernel $t -p kernel; done
for t in $LT; do build $b-loader . $P/target/$t/toyos/bootloader.efi $t -p bootloader; done
done
# Every rustc cargo ran, with the tree's path and cargo's path-derived hashes
# taken out, and each path package's source named from the repository root.
lines() {
grep -E '^\s+Running `' $1 | sed -E "s#$P#ROOT#g; s#ROOT/(kernel|bootloader)/target#ROOT/target#g; \
s#-C metadata=[0-9a-f]+#-C metadata=H#g; s#-C extra-filename=-[0-9a-f]+#-C extra-filename=-H#g; \
s#-[0-9a-f]{16}([./ \`])#-H\1#g; s#(cd|CARGO_MANIFEST_PATH|CARGO_MANIFEST_DIR)[= ][^ ]+ ##g; \
s# (ROOT/)?(kernel/|bootloader/)?((src|pure)/[a-z]+\.rs) # \3 #; s# ROOT/([a-z0-9-]+(/[a-z]+)?/src/lib\.rs) # \1 #; \
s# (kernel/)?((dma|gicv3|pci|ps2)/src/lib\.rs) # kernel/\2 #" | sort
}
for a in kernel loader; do
[ $a = kernel ] && ts=$KT || ts=$LT
for t in $ts; do
cmp -s $O/C-$a-$t.bin $O/B-$a-$t.bin; echo "bytes control vs fold $a $t: cmp exit $? ($(shasum -a 256 < $O/B-$a-$t.bin | cut -c1-16))"
cmp -s $O/B-$a-$t.bin $O/B2-$a-$t.bin; echo "bytes fold vs fold rebuilt $a $t: cmp exit $?"
cmp -s $O/A-$a-$t.bin $O/B-$a-$t.bin; echo "bytes base vs fold $a $t: cmp exit $?"
lines $O/A-$a-$t.log > $O/a.lines; lines $O/C-$a-$t.log > $O/c.lines; lines $O/B-$a-$t.log > $O/b.lines
diff $O/a.lines $O/b.lines > /dev/null; echo "rustc base vs fold, normalised $a $t: diff exit $? ($(wc -l < $O/b.lines | tr -d ' ') units)"
grep -E '^\s+Running `' $O/C-$a-$t.log | sort > $O/c.raw; grep -E '^\s+Running `' $O/B-$a-$t.log | sort > $O/b.raw
diff $O/c.raw $O/b.raw > /dev/null; echo "rustc control vs fold, verbatim $a $t: diff exit $?"
done
done
# The mutations: each a fresh fold tree, so nothing is left to restore.
tree $FOLD
perl -0pi -e 's|\[target\.x86_64-unknown-uefi\]\nrustflags = [^\n]*\n||' $P/.cargo/config.toml
t=x86_64-unknown-uefi
if build M1-loader . $P/target/$t/toyos/bootloader.efi $t -p bootloader; then
cmp -s $O/B-loader-$t.bin $O/M1-loader-$t.bin; echo "M1 no uefi table: loader $t cmp exit $?"
lines $O/B-loader-$t.log > $O/b.lines; lines $O/M1-loader-$t.log > $O/m.lines
diff $O/b.lines $O/m.lines > /dev/null; echo "M1 no uefi table: rustc lines diff exit $? ($(wc -l < $O/m.lines | tr -d ' ') units against $(wc -l < $O/b.lines | tr -d ' '))"
fi
t=x86_64-unknown-none
tree $FOLD
(cd $P && cargo update dlmalloc@0.2.13 --precise 0.2.12 > $O/M2-update.log 2>&1; echo "M2 cargo update exit $?")
if build M2-kernel . $P/target/$t/toyos/kernel $t -p kernel; then
cmp -s $O/B-kernel-$t.bin $O/M2-kernel-$t.bin; echo "M2 dlmalloc 0.2.12: kernel $t cmp exit $?"
lines $O/B-kernel-$t.log > $O/b.lines; lines $O/M2-kernel-$t.log > $O/m.lines
diff $O/b.lines $O/m.lines > /dev/null; echo "M2 dlmalloc 0.2.12: rustc lines diff exit $?"
fi
tree $FOLD
if build M3-kernel . $P/target/$t/toyos/kernel $t -p kernel -p bcachefs; then
cmp -s $O/B-kernel-$t.bin $O/M3-kernel-$t.bin; echo "M3 bcachefs selected beside the kernel: kernel $t cmp exit $?"
lines $O/B-kernel-$t.log > $O/b.lines; lines $O/M3-kernel-$t.log > $O/m.lines
diff $O/b.lines $O/m.lines > /dev/null; echo "M3 bcachefs selected beside the kernel: rustc lines diff exit $?"
fi
rm -rf $P $O/*.lines $O/*.raw
echo DONEIts output: |
|
Review of Net lines ( BLOCKER
NOTE
What was asked to be judgedWhether the proof shows what the old exit was for. It does, for the kernel and the loader. Version: I recomputed the lock independently from git — 692 (name, version) pairs at head, identical to the union of main's five, and three source changes, the registry Whether the control and the mutations can fail. M2 turns both oracles red ( Userland is shown weaker — CI. The path lists in both workflows equal The tracked config and Beyond the brief. The eleven citation edits are owed by deleting what they cited; the issue close is right on reading (its cause, The #745 merge
SEND BACK |
|
The whole metal profile at The one red row is |
src/sysroot.rs keeps both sides: SYSROOT_SOURCES carries "sdk/std" and SYSROOT_MANIFESTS ends in ".cargo/config.toml". #745 moved no manifest and no lock, so the root lock stands as it was: `cargo metadata --locked` exits 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
…the repository root, and two issues say who owns them and why libc stays apart The fold moved the workspace root, and cargo hands rustc a member's source by its path from that root: the kernel's compiled-in source paths went from `src/...` to `kernel/src/...`. The T14's run of the metal profile at 88bcbf4 was red in one row for it, `hard_lockup_ends_a_deaf_cpu`, whose judge looked for `taken at src/hardlockup/probe.rs` in the previous boot's panic record and was given `taken at kernel/src/hardlockup/probe.rs:145:29`. It is the one reader in the tree that matches a compiled-in path by its prefix; the judge now names the path the kernel records. The stage's issue records that the root's move changes those paths, and gives the reason `userland/libc` keeps its own lock that holds: the lock is an input of the sysroot key. The SDK's clippy issue names its owner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
|
Round 2 scripts, at
#!/bin/sh
# The one-workspace fold's proof, run by hand and not part of the tree.
#
# prove.sh <base commit> <fold commit> <sysroot directory> <image key hex> <scratch directory> <worktree>
#
# Every arrangement is built at ONE absolute path, $P, from `git archive`:
# A the base, untouched: kernel/ and bootloader/ are their own roots.
# C the base with only the workspace root moved up: the crate's own base
# lock, its profile, and the fold's root .cargo/config.toml, which is
# where its flags come from: the control does not hold the flags, the
# normalised rustc row does.
# B the fold. B2 is B built again from nothing.
# M1 B without the [target.x86_64-unknown-uefi] table.
# M2 B with dlmalloc 0.2.13 locked at 0.2.12.
# M3 B's kernel built in one cargo with bcachefs selected beside it.
# It prints one line per comparison with the exit code of its cmp or diff.
set -u
BASE=$1; FOLD=$2; export RUSTUP_TOOLCHAIN=$3; export TOYOS_IMAGE_KEY=$4
export TOYOS_IMAGE_FLOOR=image
unset RUSTFLAGS RUSTC CARGO_TARGET_DIR
S=$5 # a scratch directory
W=$6 # the worktree
O=$S/proof; P=$S/proof-tree
rm -rf $O $P; mkdir -p $O
KT="x86_64-unknown-none aarch64-unknown-none-softfloat"
LT="x86_64-unknown-uefi aarch64-unknown-uefi"
PROFILE='
[profile.toyos]
inherits = "dev"
opt-level = 2
debug = true
strip = "debuginfo"
debug-assertions = true
overflow-checks = true
'
tree() { rm -rf $P; mkdir -p $P; git -C $W archive $1 | tar -x -C $P; }
# build <tag> <directory under $P> <artifact> <target> <cargo args...>
build() {
tag=$1; dir=$2; art=$3; t=$4; shift 4
(cd $P/$dir && cargo build -v --profile toyos --target $t "$@" > $O/$tag-$t.log 2>&1)
code=$?
echo "build $tag $t exit $code"
[ $code -eq 0 ] && cp $art $O/$tag-$t.bin
return $code
}
# The base's flags, as the fold's root config states them per triple.
config() { mkdir -p $P/.cargo; git -C $W show $FOLD:.cargo/config.toml > $P/.cargo/config.toml; }
moved() { # the crate whose root moves
tree $BASE
cp $P/$1/Cargo.lock $P/Cargo.lock
rm -rf $P/kernel/Cargo.lock $P/bootloader/Cargo.lock $P/kernel/.cargo $P/bootloader/.cargo $P/userland/.cargo \
$P/kernel/rust-toolchain.toml $P/bootloader/rust-toolchain.toml
perl -0pi -e 's|\[profile\.toyos\].*?overflow-checks = true\n||s' $P/kernel/Cargo.toml $P/bootloader/Cargo.toml
printf '[workspace]\nresolver = "2"\nmembers = ["%s"]\nexclude = ["userland", "toyos", "tests", "rust"]\n%s' $1 "$PROFILE" > $P/Cargo.toml
config
}
tree $BASE
for t in $KT; do build A-kernel kernel $P/kernel/target/$t/toyos/kernel $t; done
for t in $LT; do build A-loader bootloader $P/bootloader/target/$t/toyos/bootloader.efi $t; done
moved kernel
for t in $KT; do build C-kernel . $P/target/$t/toyos/kernel $t -p kernel; done
moved bootloader
for t in $LT; do build C-loader . $P/target/$t/toyos/bootloader.efi $t -p bootloader; done
for b in B B2; do
tree $FOLD
for t in $KT; do build $b-kernel . $P/target/$t/toyos/kernel $t -p kernel; done
for t in $LT; do build $b-loader . $P/target/$t/toyos/bootloader.efi $t -p bootloader; done
done
# Every rustc cargo ran, with the tree's path and cargo's path-derived hashes
# taken out, and each path package's source named from the repository root.
lines() {
grep -E '^\s+Running `' $1 | sed -E "s#$P#ROOT#g; s#ROOT/(kernel|bootloader)/target#ROOT/target#g; \
s#-C metadata=[0-9a-f]+#-C metadata=H#g; s#-C extra-filename=-[0-9a-f]+#-C extra-filename=-H#g; \
s#-[0-9a-f]{16}([./ \`])#-H\1#g; s#(cd|CARGO_MANIFEST_PATH|CARGO_MANIFEST_DIR)[= ][^ ]+ ##g; \
s# (ROOT/)?(kernel/|bootloader/)?((src|pure)/[a-z]+\.rs) # \3 #; s# ROOT/([a-z0-9-]+(/[a-z]+)?/src/lib\.rs) # \1 #; \
s# (kernel/)?((dma|gicv3|pci|ps2)/src/lib\.rs) # kernel/\2 #" | sort
}
for a in kernel loader; do
[ $a = kernel ] && ts=$KT || ts=$LT
for t in $ts; do
cmp -s $O/C-$a-$t.bin $O/B-$a-$t.bin; echo "bytes control vs fold $a $t: cmp exit $? ($(shasum -a 256 < $O/B-$a-$t.bin | cut -c1-16))"
cmp -s $O/B-$a-$t.bin $O/B2-$a-$t.bin; echo "bytes fold vs fold rebuilt $a $t: cmp exit $?"
cmp -s $O/A-$a-$t.bin $O/B-$a-$t.bin; echo "bytes base vs fold $a $t: cmp exit $?"
lines $O/A-$a-$t.log > $O/a.lines; lines $O/C-$a-$t.log > $O/c.lines; lines $O/B-$a-$t.log > $O/b.lines
diff $O/a.lines $O/b.lines > /dev/null; echo "rustc base vs fold, normalised $a $t: diff exit $? ($(wc -l < $O/b.lines | tr -d ' ') units)"
grep -E '^\s+Running `' $O/C-$a-$t.log | sort > $O/c.raw; grep -E '^\s+Running `' $O/B-$a-$t.log | sort > $O/b.raw
diff $O/c.raw $O/b.raw > /dev/null; echo "rustc control vs fold, verbatim $a $t: diff exit $?"
done
done
# What the normalisation above takes out, reported instead of hidden: the
# source path cargo hands rustc for each crate, and the source paths the
# artifact carries. `lines` has to rewrite the first, or every path crate's
# line would differ by the root's move and the row could show nothing else;
# these two rows say what that rewrite absorbed. Both are expected to differ.
srcs() { grep -E '^\s+Running `' $1 | sed -E "s#$P#ROOT#g" | sed -nE 's#.*rustc --crate-name ([a-z0-9_]+) (--edition=[0-9]+ )?([^ ]+\.rs) .*#\1 \3#p' | sort -u; }
named() { strings -a $1 | grep -oE '[A-Za-z0-9_./~-]+\.rs' | sed -E "s#^$P/#ROOT/#; s#^$HOME/#~/#" | sort -u; }
for a in kernel loader; do
[ $a = kernel ] && ts=$KT || ts=$LT
for t in $ts; do
srcs $O/A-$a-$t.log > $O/A-$a-$t.srcs; srcs $O/B-$a-$t.log > $O/B-$a-$t.srcs
diff $O/A-$a-$t.srcs $O/B-$a-$t.srcs > /dev/null
echo "paths base vs fold, rustc's source argument $a $t: diff exit $? ($(join $O/A-$a-$t.srcs $O/B-$a-$t.srcs | awk '$2 != $3' | wc -l | tr -d ' ') of $(wc -l < $O/B-$a-$t.srcs | tr -d ' ') crates renamed)"
named $O/A-$a-$t.bin > $O/A-$a-$t.named; named $O/B-$a-$t.bin > $O/B-$a-$t.named
diff $O/A-$a-$t.named $O/B-$a-$t.named > /dev/null
echo "paths base vs fold, .rs paths in the artifact $a $t: diff exit $? (base $(wc -l < $O/A-$a-$t.named | tr -d ' ') paths, $(grep -c '^ROOT/' $O/A-$a-$t.named) under the tree's absolute path, $(grep -c '^src/\|^pure/' $O/A-$a-$t.named) from the crate's own root; fold $(wc -l < $O/B-$a-$t.named | tr -d ' '), $(grep -c '^ROOT/' $O/B-$a-$t.named), $(grep -c '^src/\|^pure/' $O/B-$a-$t.named))"
named $O/C-$a-$t.bin | diff - $O/B-$a-$t.named > /dev/null; echo "paths control vs fold, .rs paths in the artifact $a $t: diff exit $?"
done
done
# The mutations: each a fresh fold tree, so nothing is left to restore.
tree $FOLD
perl -0pi -e 's|\[target\.x86_64-unknown-uefi\]\nrustflags = [^\n]*\n||' $P/.cargo/config.toml
t=x86_64-unknown-uefi
if build M1-loader . $P/target/$t/toyos/bootloader.efi $t -p bootloader; then
cmp -s $O/B-loader-$t.bin $O/M1-loader-$t.bin; echo "M1 no uefi table: loader $t cmp exit $?"
lines $O/B-loader-$t.log > $O/b.lines; lines $O/M1-loader-$t.log > $O/m.lines
diff $O/b.lines $O/m.lines > /dev/null; echo "M1 no uefi table: rustc lines diff exit $? ($(wc -l < $O/m.lines | tr -d ' ') units against $(wc -l < $O/b.lines | tr -d ' '))"
fi
t=x86_64-unknown-none
tree $FOLD
(cd $P && cargo update dlmalloc@0.2.13 --precise 0.2.12 > $O/M2-update.log 2>&1; echo "M2 cargo update exit $?")
if build M2-kernel . $P/target/$t/toyos/kernel $t -p kernel; then
cmp -s $O/B-kernel-$t.bin $O/M2-kernel-$t.bin; echo "M2 dlmalloc 0.2.12: kernel $t cmp exit $?"
lines $O/B-kernel-$t.log > $O/b.lines; lines $O/M2-kernel-$t.log > $O/m.lines
diff $O/b.lines $O/m.lines > /dev/null; echo "M2 dlmalloc 0.2.12: rustc lines diff exit $?"
fi
tree $FOLD
if build M3-kernel . $P/target/$t/toyos/kernel $t -p kernel -p bcachefs; then
cmp -s $O/B-kernel-$t.bin $O/M3-kernel-$t.bin; echo "M3 bcachefs selected beside the kernel: kernel $t cmp exit $?"
lines $O/B-kernel-$t.log > $O/b.lines; lines $O/M3-kernel-$t.log > $O/m.lines
diff $O/b.lines $O/m.lines > /dev/null; echo "M3 bcachefs selected beside the kernel: rustc lines diff exit $?"
fi
rm -rf $P $O/*.lines $O/*.raw
echo DONE
#!/bin/sh
# One-off: the cold wall clock of the kernel's and the loader's x86_64 builds,
# the base's two cargos side by side against the fold's one after the other.
# wall.sh <base commit> <fold commit> <sysroot directory> <image key hex> <scratch directory> <worktree>
set -u
BASE=$1; FOLD=$2; export RUSTUP_TOOLCHAIN=$3; export TOYOS_IMAGE_KEY=$4
export TOYOS_IMAGE_FLOOR=image
unset RUSTFLAGS RUSTC CARGO_TARGET_DIR
S=$5; W=$6; P=$S/wall-tree; O=$S/wall; rm -rf $P $O; mkdir -p $O
tree() { rm -rf $P; mkdir -p $P; git -C $W archive $1 | tar -x -C $P; }
tree $BASE
echo "load before base: $(uptime | sed 's/.*load averages: //')"
t0=$(date +%s)
(cd $P/kernel && cargo build --profile toyos --target x86_64-unknown-none > $O/base-kernel.log 2>&1; echo "base kernel exit $?") &
(cd $P/bootloader && cargo build --profile toyos --target x86_64-unknown-uefi > $O/base-loader.log 2>&1; echo "base loader exit $?") &
wait
t1=$(date +%s); echo "base, side by side: $((t1 - t0)) s"
tree $FOLD
echo "load before fold: $(uptime | sed 's/.*load averages: //')"
t0=$(date +%s)
(cd $P && cargo build --profile toyos --target x86_64-unknown-none -p kernel > $O/fold-kernel.log 2>&1; echo "fold kernel exit $?")
(cd $P && cargo build --profile toyos --target x86_64-unknown-uefi -p bootloader > $O/fold-loader.log 2>&1; echo "fold loader exit $?")
t1=$(date +%s); echo "fold, one after the other: $((t1 - t0)) s"
rm -rf $P
echo DONE |
|
The metal profile at So every row of the profile is green at |
…workspace Git merged every file without a conflict. #752's two `env:` lines (`CARGO_PROFILE_DEV_DEBUG: line-tables-only` in both workflows' `host` jobs) and its shortened `carry()` survive as it wrote them. No manifest and no lock moved, so `Cargo.lock` is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
The fold dropped `--target <host triple>` from the `userland/*` test steps, which no longer need it to keep a guest triple out, and left it on the apps step. On `main` both carried it and shared `userland/target/<host triple>`; after the fold the tests filled `target/debug` and the apps `target/<host triple>`, so the apps step compiled every dependency a second time. Counted from the nightly logs: 282 units in "the apps for linux" at 88bcbf4 (run 37685714260) against 47 on main (run 37717000719), 226 of its 256 distinct crates already compiled by an earlier step of the same run, and the sealed tree 740,395,570 B larger than main's on the same runner image. The step now names a triple only where it checks another host's. Measured cold on an aarch64-apple-darwin host, after the fourteen test steps' builds (271 units): the ten apps with `--target` compile 270 units into 751,680 KiB; without it 47 units into 107,856 KiB, the same 47 crates main's step compiles. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
|
Round 3, at
#!/bin/sh
# One-off: which arrangement of the host's own apps step shares compiled units
# with the userland test steps. Cold, in a target of its own.
# share.sh <worktree> <scratch directory>
set -u
W=$1; S=$2; T=$S/share-target; rm -rf $T
export CARGO_TARGET_DIR=$T CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=line-tables-only
HOST=$(rustc -vV | sed -n 's/^host: //p')
cd $W
count() { grep -cE '^ +(Compiling|Checking) ' $1; }
: > $S/share-tests.log; : > $S/share-target.log; : > $S/share-own.log
for c in acpiserver acpiserver/aml calc compositor/desktop diskserver fileserver logkeeper netstack netstack/mdns pkg soundserver soundserver/mixer sshserver symbolize; do
cargo test --no-run --manifest-path userland/$c/Cargo.toml >> $S/share-tests.log 2>&1; echo "tests $c exit $?"
done
echo "userland test steps: $(count $S/share-tests.log) units; target/debug $(du -sk $T/debug | cut -f1) KiB"
APPS="calc editor filepicker files host paint pkg snake sshserver symbolize"
for a in $APPS; do
cargo build --manifest-path userland/$a/Cargo.toml --target $HOST >> $S/share-target.log 2>&1; echo "apps --target $a exit $?"
done
echo "apps, cargo build --target $HOST: $(count $S/share-target.log) units; target/$HOST $(du -sk $T/$HOST | cut -f1) KiB; target/debug $(du -sk $T/debug | cut -f1) KiB"
for a in $APPS; do
cargo build --manifest-path userland/$a/Cargo.toml >> $S/share-own.log 2>&1; echo "apps own $a exit $?"
done
echo "apps, cargo build: $(count $S/share-own.log) units; target/debug $(du -sk $T/debug | cut -f1) KiB"
rm -rf $T
echo DONEThe 47 units of the last row: |
Git merged every file without a conflict. #750 moves `userland/acpiserver/aml`'s sources and tests; #753 and #755 move issues alone. No manifest, no lock, no workflow and nothing under `src/` moved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
|
Review of Net lines ( Round 1's BLOCKERs
Round 1's NOTEs: the seal's byte count is measured; What changed since
|
#749 wrote its new dependency edges into `kernel/Cargo.lock` and `userland/Cargo.lock`, which this branch deletes: both modify/delete conflicts are resolved by deleting the file. Git merged the root `Cargo.lock` without a conflict into a lock `cargo metadata --locked` refuses (exit 101): it took `toyos-userbound`'s edges to `toyos-abi` and `toyos-bootmap`, which #749 also wrote into the root lock, and not `acpiserver`'s to `toyos-acpi` and `toyos-aml`, which it wrote into userland's alone. `cargo metadata --offline` re-resolved it; the only change against git's merge is those two lines, no package is added and no version moves, and `cargo metadata --locked` exits 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
…ts two stages landed `issues/the-tree-resolves-in-five-cargo-locks-not-one.md` named one thing left, the T14's run of the metal profile on the folded build. It ran green at `db55db96a`, and the review ruled no boot owed for what followed, so the exit is met and the file goes. Stages 2 and 3 of `issues/the-tree-says-who-uses-each-thing.md` cited it: the alignments landed in #724, #732 and #738, the workspace in #746. What the file carried that is still true is at its site: the root manifest's `exclude` says why `userland/libc` and the guest test crates keep their own resolution. Two facts go with the file. libc's lock resolves `toyos`, `toyos-abi`, `toyos-elf`, `toyos-osrelease` and `dlmalloc` a second time and nothing holds it to the root's; both carry `dlmalloc` 0.2.13. `Cargo.lock` carries `miniz_oxide` 0.8.9 for `png` 0.18.1 beside 0.9.1 for `flate2` 1.1.10 until `png` takes 0.9. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
|
Round 4, measured at
#!/bin/sh
# pairs.sh <worktree> <main commit> <scratch>: the root lock's (name, version)
# pairs against the union of main's five locks.
W=$1; M=$2; S=$3
pairs() { awk '/^\[\[package\]\]/{p=1;next} p&&/^name = /{n=$3} p&&/^version = /{print n, $3; p=0}' | tr -d '"'; }
for l in Cargo.lock kernel/Cargo.lock bootloader/Cargo.lock userland/Cargo.lock toyos/Cargo.lock; do git -C $W show $M:$l | pairs; done | sort -u > $S/pairs-five.txt
pairs < $W/Cargo.lock | sort -u > $S/pairs-one.txt
wc -l $S/pairs-five.txt $S/pairs-one.txt
diff $S/pairs-five.txt $S/pairs-one.txt; echo "pairs diff EXIT=$?"Git's merged root lock against the re-resolved one (
The merge's added lines under the five reader directories that match the path search ( |
|
Review of Net lines ( Round 2's BLOCKER
Ruling (5) of round 2, each owed item against its log
The merge of #749
BLOCKER
NOTE
The landingArming. It may be armed now. The ruleset on The landings ahead. No merge and no re-measure is owed here for #757, #759, #762 or #758. Read, not assumed:
The rule for anything else that gets ahead: a landing that touches a The check that says the lock was right. It runs before the landing, not after: the merge group's 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
Clean. This branch names no dependency and no lockfile, so the root lock is main's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A
Stage 3 of
issues/the-tree-says-who-uses-each-thing.md. The root,kernel/,bootloader/,userland/andtoyos/were five Cargo resolutions; they are one workspace with oneCargo.lock, one[profile.toyos], one[patch]table and one tracked.cargo/config.toml. No directory moves.Head
dd12c0b32, onorigin/main6f87cdb9c(#749; none of #757, #759 or #762 had landed when it was merged and measured). It is9ef866436, where the CI readings of the fold itself were taken, plus two merges ofmainand the close of the stage's issue. Everything owed at the merged head is in the next section, measured atdd12c0b32.The merge of #749, measured at
dd12c0b32#749 wrote its new dependency edges into
kernel/Cargo.lockanduserland/Cargo.lock, which this branch deletes. Both modify/delete conflicts are resolved by deleting the file and re-resolving the root lock. Git merged the rootCargo.lockwithout a conflict into a lock that is wrong, as the review found:cargo metadata --lockedon it exits 101 (cannot update the lock file … because --locked was passed). It hadtoyos-userbound's edges totoyos-abiandtoyos-bootmap, which #749 also wrote into the root lock, and notacpiserver's totoyos-acpiandtoyos-aml, which #749 wrote into userland's alone.cargo metadata --offlinere-resolved it.diffof git's merged lock against the re-resolved one is those two lines underacpiserverand nothing else: no package added, no version moved.cargo metadata --locked --format-version 1cargo metadata --lockedfor every shipped crate's manifest and is green inhost.logand in run 37757675374; the hand run's empty stderr (metadata-locked.err) predates the merge commit and recorded no exitmain's fivepairs.sh <worktree> 6f87cdb9c: the pairs ofCargo.lock,kernel/,bootloader/,userland/andtoyos/Cargo.lockat6f87cdb9c,sort -u, against the root lock'sdiffexit 0 (pairs.out)prove.sh 6f87cdb9c dd12c0b32 …, the round 3 script unchangedcontrol vs foldbyte rowscmpexit 0; every row in "The checks" below (prove.out)git diff -U0 e3bdff8af dd12c0b32 -- tests src toyos-blackbox toyos-symbols userland/symbolize, its added lines searched for\.rs,taken at,panicked at,Location,file(),PREVIOUS_PANIC,strip_prefix,src/,pure/tests/; 13 hits, of which 4 are diff headers and 9 the fieldinfo.rsdp; none reads a path.tests/common/power.rs:429is still the one reader outside fixtures, and readstaken at kernel/src/hardlockup/probe.rs(readers-merge.diff,readers-hits.txt)cargo run -- --ci host, once, on the development machinedd12c0b32,cargo run -- --ci host > host.log 2>&1; echo EXIT=$?[ci] Host: 77 step(s), all green; 1-minute load 26.60 when it started (host.log)The logs are in the round's scratch directory (
orch/oneworkspace-r4/), which a reader of this pull request cannot reach;prove.outandpairs.share in the round 4 comment.What changed, per decision
kernel,bootloader,toyosand userland's 40 packages join the root[workspace].userland/Cargo.toml, four locks, threerust-toolchain.tomland three per-directory.cargo/config.tomlare deleted. The toolchain files chose nothing the build read: every guestcargoalready runs underRUSTUP_TOOLCHAINnaming its sysroot.build.targetis gone, since every guest build already passes--target. The root config holds one[target.<triple>]table per guest triple, six, each with the flags its directory's config gave it. A host build takes none, as before. Two things do change:tests/toyos-rust-testsand itstls-*crates) now take-Dwarnings, because cargo reads the tracked root config from above them. On a checkout without a local config they took no flags.RUSTFLAGSitself (the test binaries linked against acdylib,src/build.rs) takes none of the table: the variable replaces it.[profile.dev]isopt-level = 2. The kernel library's host tests, its model controls, the SDK's tests and every surveyed userland crate's host tests used to resolve in their own workspaces and ran atopt-level = 0; they now run at 2.excludesays why at each entry):rust/;tests/toyos-rust-testsand itstls-*crates andtests/ssh-client-host, because[patch]is workspace-wide and they patch or refuse what the root patches; anduserland/libc. libc keeps its own lock because that lock is an input of the sysroot key: as a member it would be resolved by the root lock, and every dependency change of any member would move the key and rebuild every sysroot. The price is a sixth resolution oftoyos,toyos-abi,toyos-elf,toyos-osreleaseanddlmallocthat nothing holds to the root's (both carrydlmalloc0.2.13 today).[[package]]of the five locks, deduplicated and resolved bycargo metadata. Nothing wascargo updated. Since the lock reviewed at88bcbf4d3it has changed by The acpi claim's mediated access and the Global Lock, and acpiserver loading the machine's tables through them #749's four edges alone (see the section above);cargo metadata --lockedexits 0 at this head.-pintotarget/. A stale sysroot used tocargo cleana crate's own target; that would now empty the build system's own, soStale::Allremovestarget/toyosand the guest triples' directories instead, and thecargo cleanpath, its member assertion and its test are deleted.Blocking waiting for file lock on artifact directory), so the thread scope is deleted.--workspace: the kernel binary, the loader and most of userland do not build for a host.src/hostws.rssays which members a host tests, and the workspace test and clippy runs--excludethe rest by package name..cargo/local.tomlwhen it exists, andimplementer.mdnames it.src/sysroot.rskeeps both sides:SYSROOT_SOURCEScarries"sdk/std"andSYSROOT_MANIFESTSends in".cargo/config.toml"; its test keeps both loops;issues/toyos-has-its-own-allocator.mdkeepssdk/std/sys/alloc.rsand "from the kernel's graph inCargo.lock". Git merged all three without a conflict.src/ci.rs's apps step passes--targetonly where it checks another host's triple. Onmaintheuserland/*test steps and the host's apps step both named the host triple and shareduserland/target/<host triple>. The fold took--targetoff the test steps, which no longer need it to keep a guest triple out, and left it on the apps step: the tests filledtarget/debug, the appstarget/<host triple>, and every dependency was compiled twice. That is what made the sealed tree larger thanmain's (see CI).main. UserSafe is proved by the compiler: user_safe! declares a struct, its impl and its no-padding assertion, and usersafe::bytes is the one view of its bytes #747, Every write to SMI_CMD is made on the boot processor, by one function that reads its CPU beside the out #748, The AML interpreter's 16 MiB counts the heap it holds, and a refused load gives its memory back #750, The press issue records the on-demand measurement: three lost presses left nothing in what the scout read #751, The press issue records the controller's memory under ToyOS and under Linux: fifteen bytes differ, and at 0x05 it is the bit the firmware's _INI clears #753 and Three audit claims traced: a BAR asked for twice panics the kernel, netstack keeps a dead client's socket, and a PCI call's slot is not its claim #755 merged without a conflict. The acpi claim's mediated access and the Global Lock, and acpiserver loading the machine's tables through them #749 did not: see the section above.hostjobs keepCARGO_PROFILE_DEV_DEBUG: line-tables-onlyinenv:, andcarry()no longer sets it. No manifest and no lock moved in the merge.issues/the-tree-resolves-in-five-cargo-locks-not-one.mdis deleted: the one thing it named as left, the T14's run of the metal profile on the folded build, ran green atdb55db96a, and review round 2 ruled no boot owed for what followed on two conditions, both in the section above. Stages 2 and 3 ofissues/the-tree-says-who-uses-each-thing.mdnow read "Landed in The root and kernel locks take the per-range maxima the five main locks already carry, the first stage of the one-workspace track #724, The userland lock takes the per-range maxima the five main locks already carry, the second alignment of the one-workspace track #732 and The loader lock takes the per-range maxima and its profile strips debuginfo, the last alignment of the one-workspace track #738" and "Landed in One workspace, one lock: the root, the kernel, the loader, userland and the SDK resolve together #746". What the file carried that stays true is the root manifest'sexclude, which says why each excluded directory keeps its own resolution; the deleting commit's message carries the rest (libc's second resolution of five crates, andminiz_oxide0.8.9 beside 0.9.1 untilpngtakes 0.9).issues/cargo-run-inside-kernel-loom-or-kernel-sim-builds-for-a-bare-target.mdis closed on the two in-directory runs at9ef866436.issues/the-sdk-is-linted-by-no-clippy-run.mdis filed and names its owner, the build system.The fold changed the kernel's source paths, and the proof did not see it
The T14's run of the whole metal profile at
88bcbf4d3exited 1: 295 passed, 1 failed, 30 boots. The red row washard_lockup_ends_a_deaf_cpu. Its judge looked fortaken at src/hardlockup/probe.rsin the previous boot's panic record, and the readback's loader log saystaken at kernel/src/hardlockup/probe.rs:145:29.What changed in the kernel's strings. Cargo hands rustc a workspace member's source by its path from the workspace root, and rustc writes that path into every panic and
Location. The kernel's root waskernel/; it is now the repository. Sosrc/...becamekernel/src/..., and a path dependency outside the old root, which the base named by the checkout's absolute path, is now named from the repository root (toyos-abi/src/...). Read from the actuator kernel staged at this head: 254 distinct.rspaths, 158 underkernel/, 38 under atoyos-*crate orbcachefs, none baresrc/orpure/, none naming the worktree.Why the proof did not see it. Both of its oracles were blind to it by construction:
rustc-lines row compared base against fold after asedthat rewrites(kernel/|bootloader/)?(src|pure)/x.rsandROOT/<crate>/src/lib.rsto one form. That rewrite is needed, or every path crate's line differs and the row can show nothing else; but it absorbed the change without reporting it.prove.shnow reports what that rewrite absorbs: per artifact, how many crates' source arguments were renamed, and a diff of the.rspaths the artifact carries, base against fold and control against fold. The script is in the round 3 comment and has run twice since, at9ef866436and at this head.Every reader of a compiled-in path. I searched the harness, the guest tests, the build system,
toyos-blackbox,toyos-symbols,userland/symbolize, the loader and the kernel's panic path for path literals, prefix strips andLocationreaders. One reader matches a compiled-in path by its prefix:tests/common/power.rs, the red row's judge, now fixed to the path the kernel records. Everything else is prefix-blind (panicked at, a file name with its line) or a synthetic fixture. The kernel's panic slot keeps the last 96 bytes of a path; the longest kernel path is 46, so nothing is cut. Userland's panic sites gain auserland/prefix the same way; no test reads one.The record rows. The judging asked to record three
boot.testcases-bounds.*rows. They are not this change's: that boot was already staged on the base and unrecorded, andmainrecorded it in #745. They arrive with the merge and nothing is committed here.What the fold changes in what is built
The lock row was measured at
dd12c0b32against6f87cdb9c, therustcrow byprove.shat the same pair; the twocargo treerows at88bcbf4d3, and were not taken again.origin/main's fivediffexit 0getrandom0.2.17, 0.3.4, 0.4.2 are gone; the forks at the same versions remainrustccommand line ofcargo build -v, base against fold, path and cargo's path-derived hashes taken outdiffexit 0: 31 units per kernel, 55 and 37 per loadercargo tree -e featuresover every program, base against foldcmpexit 0diffexit 1, ongetrandom's source aloneSo one resolved crate changes: the build system and the other host members compile the ToyOS forks of
getrandom0.2.17, 0.3.4 and 0.4.2 instead of the registry's, same versions, same features. And every source path compiled into the kernel and the loader changes, as above.The checks (high-risk: build system)
Measured at
dd12c0b32againstorigin/main6f87cdb9cbyprove.sh(the script of the round 3 comment, unchanged), exit 0; its output is in the round 4 comment. Round 3 measured the same rows at9ef866436againstb432ed21c, round 1 at88bcbf4d3againste7010129f.Negative control. The whole change reverted is the base. A second control is the base with only its workspace root moved up, keeping the crate's own base lock and its profile. It is given the fold's root
.cargo/config.toml, so the control does not hold the flags: the one row that does is base against fold on normalisedrustclines.Oracle. Bytes and cargo's own command lines. Each cell is its own
cmpordiffexit:rustclines normalisedrustclines verbatimWhat the normalisation absorbs, reported by the three
pathsrows: base against fold, cargo hands rustc another source path for 29 of 31 crates of each kernel and for 35 of 50 and 13 of 35 crates of the loaders (diffexit 1 each, as expected); the.rspaths the x86-64 kernel carries are 250 on both sides, of which the base has 39 under the tree's absolute path and 150 from the crate's own root and the fold none of either (diffexit 1); control against fold the artifacts' paths are identical (diffexit 0, all four).Mutations, each
on a fresh copy of the fold: M1 (drop the
[target.x86_64-unknown-uefi]table) loader build exit 101; M2 (lockdlmallocat 0.2.12)cmpexit 1 and linesdiffexit 1; M3 (selectbcachefsbeside the kernel in onecargo) kernel build exit 101.Gates
The rows of the section "The merge of #749" were read at
dd12c0b32. Every row below was read at9ef866436unless it says otherwise, each once, the narrowest that judges it.ci.ymlruns on the push ofdd12c0b32; its result is not in this body.cargo run -- --ci hostdd12c0b32, development machine: exit 0,[ci] Host: 77 step(s), all green. Linux runner at9ef866436:ci.ymlrun 37740454881hostsuccess; cold inside--ci seal, nightly run 37740449787:[ci] Seal: 80 step(s), all green; on macOS, the same nightly'sportability-macos: successcargo test --lib ci::tests(the changed step's own test)9ef866436, run 37740454881:toolchain / buildandguest / suitesuccess (KVM); run 37740449787:toolchain / buildandtcg / suitesuccess. Ate3bdff8af, run 37755369755:hostandtoolchain / buildsuccess,guest / suitestill running when read. Not run locally, and not read atdd12c0b32prove.sh 6f87cdb9c dd12c0b32 …cargo testinsidekernel/loomcargo testinsidekernel/simwall.sh, one run)db55db96a(comment 6048782042). Since then the branch changedsrc/ci.rsand the root lock's twoacpiserveredges; the kernel sources that moved aremain's own landings (#747, #748, #749), merged in. Review round 2, ruling (3), owes no boot for the merge of #749 on two conditions, both met abovecargo test --manifest-path userland/acpiserver/aml/Cargo.tomlate3bdff8afgit status --porcelain --ignore-submodules=noneatdd12c0b32issues/cargo-run-inside-kernel-loom-or-kernel-sim-builds-for-a-bare-target.md's close now stands on the two in-directory runs at9ef866436.The logs of these rows are files in the scratch directory of the round that took them (
orch/oneworkspace-r3/), which a reader of this pull request cannot reach; the proof's and the measurements' outputs are in the round 3 comment.CI
Why the sealed tree was larger than
main's, measured. Aworkflow_dispatchofnightly.ymlat88bcbf4d3(run 37685714260) sealed9348536345 B in 20064 files, red. Units compiled per step, counted from that log and frommain's nightly atb432ed21c(run 37717000719, sealed18708 files, 7664839895 B):88bcbf4d3mainuserland/*Of the 256 distinct crates the apps-for-linux step compiled at
88bcbf4d3, 226 had been compiled by an earlier step of the same run; 30 by none. The cause is the target directory: the test steps built without--targetintotarget/debug, the apps step with--target x86_64-unknown-linux-gnuintotarget/x86_64-unknown-linux-gnu. Profile, features andRUSTFLAGSare the same in both.The fix, measured once on the development machine (
share.shin the round 3 comment; cold, a target of its own,aarch64-apple-darwin): after the fourteen test steps' builds (271 units), the ten apps with--target <host>compile 270 units and add 616,616 KiB undertarget/<host>and 135,064 KiB undertarget/debug; the same ten without--targetthen compile 47 units and add 107,856 KiB. The 47 are the same cratesmain's step compiles on the runner.The seal at
9ef866436, nightly run 37740449787 (conclusion success:host,portability-linux,portability-macos,toolchain / build,tcg / suite):Units per step in its log, against the two columns above:
9ef86643688bcbf4d3mainuserland/*Every other step compiles what it did at
88bcbf4d3. I expected 47 for the Linux apps: it ismain's 47 lesscrc32fast,log,memchr,smallvecandtoyos-keymap, which an earlier step had compiled. I did not expect the macOS step's 16 more: all are host-side units (syn,thiserror-impl,tokio-macros,futures-macro,autocfgand the like), which the Linux step's--targetbuild used to compile for the host and which the first--targetstep now compiles instead. The four steps together compile 771 units against 994 at88bcbf4d3and 823 onmain.main's 7,664,839,895 B was sealed on 20260927.320.1. The one pair of figures there is for the two images isf260e0b98, built with full debuginfo before The host jobs build their driver with line tables alone, and the seal's red since 2026-10-05 is accounted for #752 cut it to line tables: 8,540,783,725 B on 20260927.320.1 (run 37292450697) against 8,182,940,473 B on 20261004.327.1 (run 37601225884), 357,843,252 B or 4.2 % less on the newer. So this head's figure andmain's are not a pair, and this head is unmeasured on the older image.88bcbf4d3on 20260927.320.1.ci.ymlrun 37740454881 at9ef866436:host,toolchain / buildandguest / suitesuccess.After this lands every
hostcheck runs cold until the first nightly onmainseals and saves: the path list is the cache's version.Toolchain keys. The fold moves the sysroot key once:
userland/.cargo/config.tomlwas one of its inputs and.cargo/config.tomlreplaces it. From now on a change to any guest triple's flags moves that key. The merges of #747 and #749 movedtoyos-abiandtoyos, so the sysroot key moved withmain; the key at this head was not read here.No new gate, test or dependency
No guest test is added or changed. No dependency is added. The proof is a one-off script because its subject is this one change against its base.
Size
git diff --shortstat origin/main...HEADatdd12c0b32: 53 files, +5454 −7765. Without the locks: 48 files, +446 −704.src/,tests/toyos.rsandtests/common/: 12 files, +237 −360, of which tests are roughly +65 −115 by my reading of the hunks (an estimate, not a count).issues/: 16 files, +49 −115.What I am unsure of
9ef866436. The only pair of figures for the two isf260e0b98with full debuginfo (above): the older image sealed it 357,843,252 B larger. Carried unscaled onto this tree that leaves 148,188,464 B under the limit on the older image; scaled by the pair's ratio, about 178 MB. Both are arithmetic, not a run.dd12c0b32itself:ci.ymlrun 37757675374 hashostandtoolchain / buildsuccess at it; itsguest / suiteis what the landing waits on. A return to userland takes an entry inside the user half, and nothing is placed in its last page #757 (b6bcb9691) landed onmainafter this head was merged and measured: ten source files underkernel/src,toyos-abi/src,toyos-userbound/srcandtests/toyos-rust-tests, no manifest and no lock;git merge-tree --write-tree dd12c0b32 b6bcb9691exits 0. Nothing here was measured with it in. It differs from the sealed head bymain's The acpi claim's mediated access and the Global Lock, and acpiserver loading the machine's tables through them #749, The AML interpreter's 16 MiB counts the heap it holds, and a refused load gives its memory back #750, The press issue records the controller's memory under ToyOS and under Linux: fifteen bytes differ, and at 0x05 it is the bit the firmware's _INI clears #753 and Three audit claims traced: a BAR asked for twice panics the kernel, netstack keeps a dead client's socket, and a PCI call's slot is not its claim #755 and the root lock's two edges; the seal's byte count at this head is unmeasured.--all-featuresfor the kernel now turns on every member's features. It judges more than ships.hostat88bcbf4d3parsed the optionalinclude, so the runner's cargo accepts it.🤖 Generated with Claude Code
https://claude.ai/code/session_01RvnWQFcMuGqTHYhvSnTe8A