Repository navigation
Where everything lives: the layout as ruled, and its first stage - #531
Conversation
… HOME from init The owner ruled where everything lives on 2026-09-26, and issues/filesystem/where-everything-lives.md records it: the tree, the rules (no dotfiles, English names, a path is one file in every view with /tmp the one exception, locations through environment variables init sets), and the stages with their exits. The storage track's `## Paths` and the users track now point at it instead of carrying their own `.config/<app>` layout. The first stage, the part that needs no isolation: - `/config` and `/state` are two more names DATA answers to (`ROOT_ENTRIES`, `DATA_PATHS`). - The kernel makes no home. init makes `/home/toy` and Apps, Desktop, Documents, Downloads, Fonts, Music, Pictures and Videos at boot, and a service's `/state/<name>` before each start. - A `system.toml` row says `service = true` for a system service, the manifest carries it as a `service` record, and `Program::home` answers `/state/<name>` for one and `/home/toy` for every other row. init sets `HOME` from it on every start, over whatever a launching caller carried. - std's `home_dir` answers `$HOME`, or `None` when it is unset or empty. The runtime used to overwrite `HOME` with `/home/root` and set `XDG_CONFIG_HOME` at every process start, so nothing a parent passed could survive; that seeding is gone (fork commits on wt-toyos-layout). - The keyboard layout is `/config/keyboard-layout`, a machine setting in no user's home (`surface::LAYOUT_CONFIG`; toyos 0.14.0 and toyos-window 0.15.0, every pin and lockfile with them). - sshd keeps its identity and key list in its own `HOME`, `/state/sshd`. - The shell keeps its history in `$HOME/Apps/shell/State/history` and invents no `HOME`; the files app starts in `home_dir()`. - JetBrains Mono ships as a TTF in `/system/share/fonts`, where the toolkits look, with its OFL text in `/system/share/licenses`; NOTICE says so. - The 26 SDK doc lines naming `/bin` name `/system/bin`, and the Rights::LOG doc gate strips that prefix: the issue that tracked them is closed. `/log/lease.txt` does not move. It is not netd's lease but the `--exit-with-lease` bench report the metal loop reads off the stick's FAT log volume, which cannot read DATA; the track says so. Found on the way and filed: a directory on DATA is the VFS's in-memory record, absent from every listing of its parent and from the next boot, and it is taken with no parent — which is why init makes each level in turn. `layout_fresh_boot` boots tests/sshdcase on a blank DATA volume and asks a session program's child where everything is. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
A std whose `home_dir` answers `None` makes sshd refuse before it says anything, and waiting on a line it never prints turned that red into a 300 s STALL the harness reads as saying nothing about the tree. The kernel's `exit: sshd` record comes however sshd fares, so the wait ends on the event and the mint line is then asserted by name. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
The fast tier on this branch, after merging origin/main at e48604c, reds lan_mdns_answer wide and alone on a 104-byte socket path under the new toyos-tmpdir scratch root. Nothing on this branch touches the lane or the tap; filed for its owner. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
|
Review of #531 at Readiness. CI run 36254168573: Net lines (
The production growth is the feature. Nothing larger could be deleted in its place. BLOCKER
NOTE
REMOVE
SEND BACK |
… is asked over ssh The review of 1b8d459 found four blockers and a fast-tier question. HOME on the direct path. std's direct spawn handed a child the parent's whole environment, so an ssh exec of an undeclared binary ran with HOME=/state/sshd. init now answers a launch of an undeclared program with the session's HOME (MSG_NOT_DECLARED carries it; toyos::launch's Outcome::NotDeclared has it), and std's direct spawn carries only a HOME its caller named or init answered, never its own (fork commit 957f1426, merged with toyos-inbox at 7a809b75, #520's pin, in 80ea645f). The layout, asked over the cable. layout_fresh_boot boots tests/layoutcase (sshdcase plus a declared shell and the locale applet) with a staged key, then over ssh: `shell -c 'echo $HOME'` must print /home/toy (a launched row's HOME is init's, over sshd's); `locale de` and an interactive shell write /config/keyboard-layout and the shell's history; and test_rs_layout_paths, declared nowhere so sshd spawns it directly, asserts its HOME, both files by literal path, and the exact listings of /home/toy and /state. An empty directory is listed. Vfs::list names the directories the VFS carries in created_dirs, so an empty dot-folder is in its parent's listing and the dotfile walk sees it. The filed DATA-directory issue loses that bullet and its slug says what is left. Also: a manifest row that serves a port and is not marked a service is refused at render, and every config is rendered by a host test; init's folder failure no longer says the whole session home is missing; the shell's history finds its own folder whether HOME is the session's or, at stage 2, the folder itself; the track records the owner's rulings, gains a time-zone, a language and a fonts stage, and no longer ships JetBrains Mono here, which leaves src/assets.rs and NOTICE to #528; the sshd fail-closed issue is closed, its exit met by the blank DATA volume every image-less boot gets. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
Vfs::list now adds the directories created_dirs carries, which could take a listing past MAX_LIST_ENTRIES, the bound the files it lists already respect. It refuses there as every FileSystem::list does, rather than growing the answer past what the bound was derived for. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
|
Answer to the review of BLOCKERs
NOTEs
REMOVE: the lines in Exits
|
# Conflicts: # issues/filesystem/storage-is-layers-and-a-role-is-a-filesystem.md # tests/toyos-rust-tests/Cargo.lock # userland/Cargo.lock
PR #525 landed on main at the same 0.13.0/0.14.0/0.15.0 this branch's toyos-abi, toyos and toyos-window sources had already moved past, so the abi-split gate now judges this branch's changes against those taken versions rather than the old base. Bump each to the next free minor (0.14.0/0.15.0/0.16.0), move every in-tree pin, and re-lock every tracked lockfile in its own workspace with `cargo update -w`. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
The owner's rule on wrong prose is delete, not correct — the exit condition of the deleted issues/build/twenty-seven-sdk-doc-lines-name-a-path-that-is-gone.md said so. Correcting each `/bin/x` to `/system/bin/x` would only make the same 26 lines wrong again at the next layout change; a bare-lined comment line owed the same rewrite, so the path itself goes, leaving the program name each sentence actually needed. `cargo doc --no-deps` still builds clean on toyos-abi, toyos and toyos-window. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
|
Merged Co-Authored-By: Claude Opus 5.5 (1M context) noreply@anthropic.com |
|
Round-1 BLOCKERs closed and judged at 542f00e (HOME decided by init on every spawn path, the override pinned by an ssh echo, empty dot-folders seen via a kernel listing fix, keyboard-layout and history paths pinned, each red under its mutation); final round fd45490 takes toyos-abi 0.14.0 / toyos 0.15.0 / toyos-window 0.16.0 after #525 and deletes the 26 stale SDK doc paths. --ci host, abi-split and layout_fresh_boot exit 0. Landing. |
The fork pins meet in c34ecdf0ab6, a merge of this branch's 851c6bfcaa8 and #531's 80ea645f83b, itself merged into toyos-inbox as 2434fb9d1bc. #531 moved toyos-window to 0.16.0, the number this branch had taken, so this branch's toyos-window, whose scanout drain lives in arch modules, is 0.17.0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
#531 landed issues/build/a-lane-s-tap-socket-path-is-past-sun-len-on-the-dev-host.md for the same defect this branch had filed as lan-sockets-under-the-suite-s-tmpdir-pass-the-unix-socket-limit.md, so this branch's copy goes. Its measurements, for the record: a same-session A/B with main at 17eb66a reddened lan_mdns_answer on every run with a verdict, 4 of 4 on main and 5 of 5 on the branch, each on `path must be shorter than SUN_LEN`; the pid in the path is what makes the harness's ALONE line call two readings of it "a DIFFERENT failure". Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
#531 (17eb66a) gave daemons a `service` row and moved their state under /state; this branch gave `update` a `slots` row and `swap` its own row. Every conflict is the two additions side by side: - src/build.rs, toyos-manifest/src/lib.rs: `ProgramConfig` and `Program` carry both `slots` and `service`; `render` and `parse` write and read both records, and the doc table lists both. - system.toml and tests/{e1000talk,flrswap,lantalk,swap}case/system.toml: sshd is `service = true` (main) and receives `netd` and `launcher` only, since `swap` is its own row here, which receives `swap`. - userland/Cargo.lock: init keeps `toyos-gpt` (this branch); sshd depends on neither `toyos` nor `toyos-swap` (its subsystem is deleted here, and main's sshd change uses neither). - tests/updatecase/system.toml, new on this branch: logd, netd and sshd marked `service = true` as main marks them in every other config. - issues/build/a-lane-socket-path-overruns-sun-len.md deleted: main filed the same defect as a-lane-s-tap-socket-path-is-past-sun-len-on-the-dev-host.md. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
#531 landed toyos-abi 0.14.0, toyos 0.15.0 and toyos-window 0.16.0, the versions this branch had taken for its change to toyos_abi::boot. The second to land bumps again: every manifest pin moves, and every tracked lockfile carrying them is re-resolved with `cargo update -w --offline` in its own workspace, which moved those three crates' versions and nothing else. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
main landed #525 (storage stage 3) and #531 (the layout), which moved the SDK to toyos-abi 0.14.0, toyos 0.15.0 and toyos-window 0.16.0 and the rust pin to 80ea645f83b. - SDK versions: this branch's ABI and SDK changes move past main's to 0.15.0, 0.16.0 and 0.17.0; every tracked lockfile re-locked in its own workspace with `cargo update -w`. - rust: pinned at 23783dc3524, main's 80ea645f83b merged with this branch's 39c642fe04f; it is on the fork's toyos-inbox (merged there as 26f662d303a), and its compiler/ is main's. - tests/logholdcase/system.toml: deleted here, and main's one hunk (`service = true` on logd) has no file to go to — log_hold runs on tests/testcases now, whose logd main marks a service. ALL_CONFIGS drops it. - src/build.rs: both tests kept (main's `every_config_renders_its_manifest`, this branch's shipped-config derivation), and ALL_CONFIGS carries main's layoutcase and this branch's logkeepcase, whose logd is marked `service`. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
…sions Merging origin/main (#531) collided this branch's toyos/wake.rs and toyos-window/wait.rs additions with main's own bump of the same two crates to identical version numbers (0.15.0, 0.16.0) for different content. Move both one minor past main's landed pins and re-lock every tracked workspace with `cargo update -w`, which also drains the dead winit 0.31.0-beta.2 subgraph and the stale getrandom/mio/socket2 fork pins the split-version gate (added on this branch before the merge) then caught: real crates.io toyos/toyos-abi 0.1.0/0.2.0 resolving beside the tree's own path versions because those pins predated the tree's `-sdk-0.12` branch renames and the getrandom `toyos-0.4` branch fix already at its head. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
…, #531, #534) into the Netstack3 netd Two conflicts. tests/common/origin.rs: main added `volumes` to the imports this branch had split to name `segment`'s NEIGHBOUR and NEIGHBOUR_MAC; both kept. userland/Cargo.lock: main's lock taken whole and re-locked against this branch's manifests (`cargo metadata`), which adds the mirrored crates and their dependencies and drops smoltcp and its defmt. The rust gitlink fast-forwarded to main's fbf6ad143d8; this branch's pin (7a809b7591f) is its ancestor, and the branch made no fork commit of its own. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
The owner ruled on 2026-09-26 where everything in ToyOS lives. This PR records that ruling as a track and builds its first stage, the part that needs no isolation work.
What changed, and why
The layout is recorded in one place.
issues/filesystem/where-everything-lives.md(a track) holds the tree, the rules and the stages with their exits. Every line in it is the owner's ruling, including the five the review asked about, which the orchestrator confirmed as owner-approved:/configoverrides/system/etc;current_exe());/systemis signed, because the self-update track signs the image. The track now says that nothing verifies it until that lands.The stages are: 1 (this PR); 2, an app's
HOMEis its folder; 3, users; 4, the time zone (one file in/config, one writer, local time read through it, and no zone recovered by subtraction); 5, the language (one file in/config, one writer, init sets it on every program); 6, fonts ship as files (below); 7, the upstream arms. Each stage has an exit./configand/stateexist. They are two more names DATA answers to. init makes/home/toyand its eight folders at boot, and makes a service's/state/<name>before each start. The kernel makes no home. A folder that fails now says which folder, not that the whole home is missing.HOMEis init's on every spawn path. This is the review's first blocker.HOMEfrom the row on every start (Program::home), over whatever the caller carried:/state/<name>for a row markedservice = true, the session's/home/toyfor everything else.launcher, or by one that endowed a handle. Before, it handed the child the parent's whole environment, so an ssh exec of an undeclared binary ran withHOME=/state/sshd. Now init answers the launch of an undeclared program with the session'sHOME(MSG_NOT_DECLAREDcarries it as its payload, andtoyos::launch::Outcome::NotDeclared { home }holds it). std's direct spawn carries aHOMEin only two cases: its caller named one, or init answered one. It never carries the parent's own. A direct spawn that init was not asked about carries noHOME.issues/isolation/every-program-sees-only-the-files-it-was-given.md) puts every location and every session in init's hands. A child's view is at most its parent's. At stage 3 a login authority asks init's launcher for a session instead of spawning one. Refusing the spawn would end the metal loop's andsshd_exec's runs of undeclared test binaries over ssh. Stripping the variable alone would give such a binary noHOME. Letting init answer is the one choice that keeps "a location reaches a program only from init" true today and that stage 3 needs no change to. The program's authority on the direct path is still inheritance, as before; only itsHOMEmoved.A serving row must be a service.
toyos_manifest::renderrefuses a row that serves a port but is not markedservice = true(ServesWithoutService).every_config_renders_its_manifestrenders every config. A service that serves nothing, such as sshd, cannot be told apart from its row, so it is still marked by hand, and nothing in the build can refuse an unmarked sshd.std answers
$HOME. These are fork commits onToyOSOrg/rustwt-toyos-layout:home_diranswers$HOME, and the runtime stops seedingHOME/XDG_CONFIG_HOMEat every start (a0534feb,e1acded3);HOMErule (957f1426);toyos-inboxat7a809b75, netd, std: the TCP client path holds up — resets, half-close, loss, clients that leave, peers that vanish, replies that flood #520's pin, into this branch (80ea645f).The pin is
80ea645f.An empty directory is listed.
Vfs::listnow names the directories the VFS carries increated_dirs, so an empty.configis in its parent's listing and the dotfile walk sees it. The listing still refuses pastMAX_LIST_ENTRIES, as everyFileSystem::listdoes. The filed DATA issue loses that bullet and is renamedissues/filesystem/a-directory-on-data-survives-no-reboot.md.Machine settings leave the user's home. The keyboard layout is
/config/keyboard-layout. sshd keeps its identity and key list in/state/sshd. The shell keeps its history in its own folder'sState:$HOME/Apps/shellwhileHOMEis the session's, and$HOMEitself once stage 2 makes that folder itsHOME(OWN_FOLDER), so the path does not double. Stage 2's exit names that line.The SDK doc lines are now deleted, per the owner's rule. The prior state of this branch had corrected the 26 lines (
/bin/xto/system/bin/x) instead, flagged as a deviation for the orchestrator to confirm. The owner's rule stands:/binand/system/binare both deleted from these sentences, leaving each program named by itself (`init`,`logd`,`toybox`,`ps`,`sshd`,`ls`,`terminal`,`console`) rather than by a path that names ToyOS's own tree inside a crate three external forks (winit, softbuffer, cpal) resolve by version — the concrete deployment path is exactly the free text that just rotted once and would rot again at the next layout move.cargo doc --no-depsontoyos-abi,toyosanduserland/toyos-windowbuilds clean (pre-existing unrelated warnings only, unchanged from before this edit).This PR no longer ships JetBrains Mono.
src/assets.rsandNOTICEare back tomain's, which ends the collision with #528 (see below)./log/lease.txtdoes not move. It is the metal loop's bench report on the FAT log volume, not netd's lease, and the track records this.#528 and
src/assets.rsThe resolution the track records (stage 6) is:
/system/share/fontsfromassets/fonts/;/system/share/licenses.This branch no longer touches
src/assets.rsorNOTICE, so the two branches share no hunk there, and neither has to change anything in those files to land after the other. At #528's head (42059f54, and5fc53dbcin its worktree),the_system_fonts_ship_with_their_licenceputs the Open Sans OFL atshare/fonts/ofl.txt. That meets stage 6's "every OFL text in/system/share/licenses" only onceassets/fonts/OFL.txtmoves underassets/licenses/and that test asserts the new path. JetBrains Mono as a file,assets/fonts/JetBrainsMono-Regular.ttf(the same blob as the top-level one), is stage 6's too. Whoever builds stage 6 owns both. Neither is a landing condition for either PR.Tests
layout_fresh_boot(Fast, Parallel) bootstests/layoutcaseon a blank DATA volume with a staged key:tests/sshdcase, plus a declaredshelland thelocaleapplet. Over ssh it checks:shell -c 'echo $HOME'prints/home/toy. The shell is a declared row, so itsHOMEcomes from init'sstart, over sshd's/state/sshd.locale desets the layout, and an interactive shell runsecho layout history.test_rs_layout_paths de 'echo layout history'runs. Nothing declares it, so sshd spawns it directly. It asserts:HOMEandhome_dir()are/home/toy, and/home/rootis absent;/home/toylists exactly the eight folders and/statelists exactlylogd netd sshd;/state/sshd/host_ed25519is a file;/config/keyboard-layoutreadsdeand/home/toy/Apps/shell/State/historyholds the typed line, both asked for by literal path;/apps /config /home /log /state /tmpstarts with a dot.The host also checks sshd's
minted a new host identity at /state/sshd/host_ed25519line.Negative controls
Each control was a checked patch against the committed green arm. The script applied it, ran
layout_fresh_boot, reverse-applied it, and showed the tree clean. Every red names the mutated behaviour, which shows the mutated tree built and ran. The rows through m4b were measured at75942e24; the kernel rows were measured again at542f00ed.957f1426reversed inrust/,toyos/src/launch.rsto base, init'sMSG_NOT_DECLAREDback to a bare signal)HOME is Ok("/state/sshd"),home_dir() is Some("/state/sshd")command.env("HOME", &home)deleted fromstart, boot path givenHOMEat its call site (the reviewer's)a launched shell's HOME is "/state/sshd\n"".config"added to init'sHOME_FOLDERS(the reviewer's)/home/toy lists [".config", …],a dotfile on a fresh boot: ["/home/toy/.config"]LAYOUT_CONFIG = "/home/toy/.config/keyboard-layout"(the reviewer's)/config/keyboard-layout: NotFound, a dotfile/home/toy/.config$HOME/.shell_history(the reviewer's;OWN_FOLDERdeleted with it so it builds)…/Apps/shell/State/history: NotFound, a dotfile/home/toy/.shell_historyVfs::listchange reverted/home/toy lists ["Apps"],/state lists ["sshd"].config, which is the review's finding75942e24(twice) and at542f00edHost:
toyos-manifest'sa_row_that_serves_a_port_and_is_no_service_is_refusedpins the render refusal.Independent oracle. For the
HOMErouting and the layout, the owner's ruling is the specification, and the test is written against the ruling, not against the code. Forhome_dir, the fork follows upstream std's unix idiom (var_os("HOME")filtered for empty), without the passwd fallback. For the listing, the oracle is the kernel's owncreated_dirscontract (cdandlistalready treat an entry there as a directory). No second implementation reads the DATA volume. The oracle stays partial.Gates (exit codes)
cargo run -- --ci hostat75942e24(39 steps; the loom controls' FAILED lines are their expected verdicts)cargo run -- --ci hostat542f00edcargo run -- --ci abi-splitat542f00edtoyos0.13.0 -> 0.14.0,toyos-window0.14.0 -> 0.15.0)cargo testintoyos-manifestlayout_fresh_bootat542f00ed542f00ed, oncecargo run -- --ci abi-splitatfd454902(after mergingorigin/mainand the version bumps above)cargo run -- --ci hostatfd454902layout_fresh_bootatfd454902The fast tier's reds:
lan_mdns_answerfailed withpath must be shorter than SUN_LEN, both wide and alone. This isissues/build/a-lane-s-tap-socket-path-is-past-sun-len-on-the-dev-host.md, from Every test's scratch goes with it, and a killed run's with the next #529's scratch root.quiesce_wakes_on_the_last_parkfailed withQEMU died before ===READY=== (status 0), red wide and GREEN alone. Its boot log shows the machine rebooting on purpose:test_rs_quiesce_lastexits 0, thenSyncing filesystems…,stop: 4 of 4 userland thread(s) stopped,Rebooting., all before test-runner's ready marker. That is not a kernel death.--known-redsays it is not quarantined.quiesce_leaves_the_volume_wholeandmetal_job_reboot, the two the review asked about, were green in this run.--known-redsays neither is quarantined.The same-session A/B against
mainawaits disk space. It needs a second worktree, anddf -h /Usersread 23 GiB free, then 28 GiB, both under the 30 GiB the brief requires. None of the three quiesce/metal reds is adjudicated.ABI
#525 landed on
mainat7345e3fe, takingtoyos-abito 0.13.0,toyosto 0.14.0 andtoyos-windowto 0.15.0 — the same versions this branch had independently bumped to, which collide. This branch has since mergedorigin/main(799f94bd) and moved each of the three past main's landed versions to the next free minor:toyos-abi0.13.0 -> 0.14.0,toyos0.14.0 -> 0.15.0,toyos-window0.15.0 -> 0.16.0. Every in-tree pin (toyos/Cargo.toml,userland/toyos-window/Cargo.toml) moved with it, and every tracked lockfile was re-locked withcargo update -win its own workspace (git diffon each shows only these three crates' version strings moving — no third-party drift).cargo run -- --ci abi-splitis green at the head below.The rust fork
The pin
80ea645fiswt-toyos-layout(pushed). It contains #520's pin7a809b75, so whichever of #520 and #531 lands second pins a commit that already holds both, or a merge of the two, and never a cherry-pick. It is not based ontoyos-inbox's current headf3492d92. That head's aarch64 commits movecompiler/(tree734f975fagainst the7641f053every pin onmainhas), andsrc/sysroot.rs'scheck_compilerrefuses a worktree build over acompiler/that the primary's compiler was not built from. So that merge waits until the aarch64 compiler change lands and the primary rebuilds.wt-toyos-layoutmust not be deleted untiltoyos-inboxcontains80ea645f.What I am unsure of
service = trueis my spelling of "a system service".filepickerandcompositorare marked because they serve machine-wide ports. The render rule now enforces that for every serving row.launchernow gives its child noHOMEat all. No program in the tree relies on the old inheritance: the tests that readHOMEare run over ssh or launched.OWN_FOLDERrule compares path components. It answers the same file at stage 1 and stage 2, but it is one small piece of stage-2-aware code in stage 1.🤖 Generated with Claude Code
https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK