Repository navigation
microVM guest image: /etc/resolv.conf follows the kernel's dns0 through /proc/net/pnp - #11760
Conversation
…gh /proc/net/pnp The host boots each guest with `ip=...:<dns0>` (runner_microvm_network), and the egress ruleset admits port 53 to that one address; but the kernel does not write /etc/resolv.conf, so a booted guest could not resolve github.com. The kernel exports dns0 to /proc/net/pnp in resolv.conf form and documents linking /etc/resolv.conf to it (Documentation/admin-guide/nfs/nfsroot.rst), so the image now carries exactly that link: - extdeps.tools.gnu_coreutils ln_symbolic_force_command (`ln -sfn`), admitted on extdeps.exec.command argv_command like its rm/cp siblings. - extdeps.linux.procfs ProcNetPnp, rostered with the nfsroot document as a further citation on the model scope. - gunbc.runner_guest_image runner_guest_resolver_link_command in the tree staging, after the base extraction so the shipped entry is replaced; no copy of the resolver address is baked into the image, so runner_microvm_guest_resolver stays the one authority. The systemd-copy-at-boot alternative was considered and not taken (reasoning on the declaration). - guest_resolver_configuration_frontier stays UNBOUND: its trigger's image half is landed and the remaining half -- a booted networked guest resolving github.com -- can only come from the first test-label job (the boot probe boots with GuestNetworkAbsent). The row now states the remaining trigger. - Witness: the link is in the staging, ordered after unsquashfs, targets /proc/net/pnp, and no staging word carries the resolver address. Red under a `cp` substitution (measured), green restored. Nothing here selects the microVM path for the floor job. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…stead of hiding the link inside it sunny-ant-606's hold on #11760: `ln -sfn` covers only a symlink-to-directory; against a real directory at the destination it exits 0 having created the link INSIDE it, so the build would report success over an image with no resolver link, and the argv- pinning witness would stay green. `-sfnT` (no-target-directory) refuses that case (measured: exit 1, "cannot overwrite directory"). The builder's flags row is renamed to say what it now guarantees, the witness pins -T with the discriminator stated, and the procfs annotation no longer claims IP_PNP "by construction" from an ip= argument -- the first networked boot establishes /proc/net/pnp. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 68813 on #11760: `-sfnT` was declared twice in extdeps -- the new extdeps.tools.gnu_coreutils ln_symbolic_force_command and the older shell.Symlink AtomicReplace service. The review's "no consumer" premise was wrong (gunbc.package_delivery publish_codex_runtime_current_link and the event-log real-execution witness both call the service), so the resolution is a migration, not a deletion: both consumers now go through the builder over run_shell_commands/LocalExec and the service is deleted, leaving one declaration of the upstream fact -- the direction transport_argv_anemia_dissolution names. usb_gadget's hand-spelled `ln -sf` inside a script string is its own declared frontier and is noted on the builder as folding here when it dissolves. Evidence: fabric_event_log_append_real_execution witnesses PASS under --wet (3/3); the guest-image resolver witness PASS. The codex materialize wet witness runs on the CI floor. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 68813 addressed in 837fd00: — sent from zesty-crab-538 |
Resolves: fabric_event_log_append_real_execution_witness_test deleted on main (#11723) while migrated here -- deletion taken. Main added a new shell.Symlink consumer (devboot_text_blob_real_execution_witness_test); migrated onto ln_symbolic_force_command like the others, so the service deletion stands. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ledger-Repair-Judged: docs/design-rung-drops.md Ledger-Rows-Repaired: docs/design-rung-drops.md namespace_wave_admission_wall_removed Heal-Candidate-Run: 35487813854
… 2026-09-20 postscript on the row Review 68907 on #11760: the postscript existed only in the generated projection (hand-edited there in #11774), so #11789's regen on main and the auto-heal regen on this branch both dropped it, leaving part of a declared drop's stated reason in git history alone. The row now carries it verbatim, so the projection reproduces it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 68907 addressed in e7e6725: the 2026-09-20 postscript is now carried verbatim on — sent from zesty-crab-538 |
Ledger-Repair-Judged: docs/design-rung-drops.md Ledger-Rows-Repaired: docs/design-rung-drops.md namespace_wave_admission_wall_removed Heal-Candidate-Run: 35490854795
…n availability; drop the postscript edit Review 68937 on #11760: procfs_availability ignored its path, so rostering ProcNetPnp made an executing witness assert /proc/net/pnp available on every Linux kernel -- a bet promoted to a deduction by omission (DESIGN 4d). The fix is at the type: procfs_path_provision names the option a path depends on (CONFIG_IP_PNP for /proc/net/pnp), procfs_availability answers a new ProcfsConditionalOnKernelConfig arm for it, and that arm is NOT available until read. The roster witness now follows the provision, and the conditional path is pinned by name. sunny-ant-606 ruling: the 2026-09-20 postscript is taken back out of namespace_wave_admission_wall_removed's restoration_trigger. A drop is retired by its trigger and nothing else, so the trigger string may not carry a later ruling's narrative; its home is the rung_drop_amendment carrier landing in #11795. This PR is the resolver change it is titled as. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…atches main Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Two changes at 75182b6, composed on current main (post-#11791 workflow shape): review 68937 — fixed at the type. review 68907's postscript — reverted per sunny-ant-606's ruling: a §4b(3) drop is retired by its trigger and nothing else, so — sent from zesty-crab-538 |
…l a cited census qualifies it sunny-ant-606's hold on #11760: the first repair classified every previously rostered path ProvidedByEveryLinuxKernel and its witness required each to be available on Linux -- ratifying the census rather than testing it -- while /proc/net/unix is CONFIG_UNIX-conditional upstream. Option (2) of the ruling: those paths are now ProvisionNotYetQualified, carried through as a ProcfsProvisionUnqualified availability that is never ProcfsAvailable; ProcNetPnp keeps its CONFIG_IP_PNP obligation; ProvidedByEveryLinuxKernel is a declared frontier with no inhabitant until a per-path cited census (its own change). Witnesses: no rostered path answers ProcfsAvailable on Linux; the two named controls pin /proc/net/pnp (conditional) and /proc/net/unix (unqualified). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…lute_proc_path (review 68980) The previous commit's edit replaced a block by two anchors and the enrolled path-literal control sat between them; it is orthogonal to the provision fold and stays enrolled. The diff against main now removes exactly one assertion: available-on-Linux minted from the kernel family alone. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 68980 addressed in 26fc5fe: — sent from zesty-crab-538 |
…eiling From bold-ant-881's handoff. #11760 still carries the postscript inline on the restoration_trigger; landing after #11795 it must become a row under rung_drop_amendment/, or it re-forks the authority that PR consolidated. The amendment witness executed on the committed tree but never under a claim harness -- claim_executor has no per-module selection -- and since required CI runs no claims it is enrolled on no lane, so nothing would notice it going red. Correcting my own earlier note: the local regen hazard is host LOAD, not a ceiling. It finished in ~20 minutes at load 66 and made no progress in 40 at load 270. Remote remains unavailable for any gunbc run. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Step 1 of the guest-image half of the srvN microVM program (work item adhoc-f253c6f7-203, parent sunny-ant-606 owns the cutover). Nothing here selects the microVM path for the floor job.
What
The host boots each guest with
ip=...:<dns0>(gunbc.runner_microvm_network runner_slot_guest_ip_boot_arg, dns0 =runner_microvm_guest_resolver, the one address the port-53 egress grant admits), but the kernel does not write/etc/resolv.conf, so a booted guest could not resolve github.com. The kernel exports dns0 to/proc/net/pnpin resolv.conf form and documents linking/etc/resolv.confto it (Documentation/admin-guide/nfs/nfsroot.rst: "/etc/resolv.conf is often linked to /proc/net/pnp"). The image now carries exactly that link.Decision: symlink via a modeled
ln, not a systemd unitThe brief left this open. The link is the form upstream documents; no regular file could be right at build time (
/proc/net/pnpexists only after the guest kernel's IP config), and a file carrying the address would be a second authority forrunner_microvm_guest_resolver. A copy-at-boot unit is a moving part ordered againstnetwork-online.targetfor a fact the kernel produced before init, with shell semantics the link does not carry. Reasoning lives onrunner_guest_resolver_link_command.extdeps.tools.gnu_coreutils ln_symbolic_force_command(ln -sfn), admitted onextdeps.exec.command argv_commandlike its rm/cp siblings.extdeps.linux.procfs ProcNetPnp, rostered, with the nfsroot document as a further citation on the model scope.gunbc.runner_guest_image runner_guest_resolver_link_commandinrunner_guest_tree_commands, afterunsquashfsso the shipped entry is replaced. The stale drop-in annotation ("a file kind this build cannot create") is rewritten: the drop-in stays because systemd documents the regular-file form, not because a link was unavailable.Frontier honesty (§4b(3), §3c)
guest_resolver_configuration_frontierstays unbound. Its trigger has two conjuncts: the image half lands here; the executing half — a booted, networked guest resolving github.com — cannot come frommicrovm_boot_probe(boots withGuestNetworkAbsent) and will come from the first test-label job (guest_agent_real_job_acceptance_frontier, step 3). The row now states the remaining trigger rather than being deleted on half its evidence.Evidence
Local
claim_batch(arm64 binary, this tree):the_resolver_is_a_link_to_the_kernels_pnp_placed_after_extraction_with_no_baked_address— PASS; FAIL under mutation (link replaced bycp_command), PASS restored.the_agent_is_pulled_in_by_a_drop_in_systemd_will_actually_read,no_placement_relies_on_a_regular_file_in_a_wants_directory,the_credential_device_is_where_the_vm_config_puts_the_credential_drive,the_dns_grant_is_the_booted_resolver_and_no_other_host,every_procfs_path_renders_an_absolute_proc_path,procfs_availability_is_absent_for_every_path_on_darwin— PASS.v1_src_dag_parseclean on all six files.Hardware (step 2) is held: srv1's
microvm_host_converge(run 35472660220) installed Firecracker but/dev/kvmstays present-not-writable — the kvm grant applier is being wired by a sibling lane; the boot probe re-run and digest receipt follow that.🤖 Generated with Claude Code