Skip to content

microVM guest image: /etc/resolv.conf follows the kernel's dns0 through /proc/net/pnp - #11760

Merged
gunbai-bot[bot] merged 14 commits into
mainfrom
session/zesty-crab-538
Sep 20, 2026
Merged

gunbai-bot[bot] merged 14 commits into
mainfrom
session/zesty-crab-538

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

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/pnp in resolv.conf form and documents linking /etc/resolv.conf to 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 unit

The brief left this open. The link is the form upstream documents; no regular file could be right at build time (/proc/net/pnp exists only after the guest kernel's IP config), and a file carrying the address would be a second authority for runner_microvm_guest_resolver. A copy-at-boot unit is a moving part ordered against network-online.target for a fact the kernel produced before init, with shell semantics the link does not carry. Reasoning lives on runner_guest_resolver_link_command.

  • 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 runner_guest_tree_commands, after unsquashfs so 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_frontier stays unbound. Its trigger has two conjuncts: the image half lands here; the executing half — a booted, networked guest resolving github.com — cannot come from microvm_boot_probe (boots with GuestNetworkAbsent) 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 by cp_command), PASS restored.
  • neighbours: 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_parse clean on all six files.

Hardware (step 2) is held: srv1's microvm_host_converge (run 35472660220) installed Firecracker but /dev/kvm stays 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

…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>
@gunbai-bot gunbai-bot Bot changed the title microVM guest image: resolver, srv1 boot-probe receipt, first test-label job microVM guest image: /etc/resolv.conf follows the kernel's dns0 through /proc/net/pnp Sep 20, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review September 20, 2026 00:41
gunbc-ci-auto-heal and others added 3 commits September 20, 2026 01:29
…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>
@gunbai-bot

gunbai-bot Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor Author

review 68813 addressed in 837fd00: -sfnT now has one declaration. The review's "no consumer" premise was wrong — shell.Symlink.AtomicReplace was called by gunbc.package_delivery publish_codex_runtime_current_link and by the event-log real-execution witness — so the resolution is a migration onto ln_symbolic_force_command (over run_shell_commands/LocalExec) followed by deleting the service, in the direction transport_argv_anemia_dissolution names. usb_gadget's hand-spelled ln -sf is its own declared frontier and is noted on the builder as folding here when it dissolves. Event-log witnesses PASS under --wet (3/3); the codex materialize wet witness runs on the floor.

— sent from zesty-crab-538

gunbc-ci-auto-heal and others added 4 commits September 20, 2026 03:52
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>
@gunbai-bot

gunbai-bot Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor Author

review 68907 addressed in e7e6725: the 2026-09-20 postscript is now carried verbatim on gunbc.rung_drop namespace_wave_admission_wall_removed restoration_trigger, so the projection reproduces it. For the record, it had already been dropped on main by #11789's own regen (it lived only in the hand-edited projection from #11774), so this restores an operator ruling that was lost independently of this PR. Main merged in (039cdaa); the heal regenerates the projection from the row.

— 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
gunbc-ci-auto-heal and others added 2 commits September 20, 2026 06:21
…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>
@gunbai-bot

gunbai-bot Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor Author

Two changes at 75182b6, composed on current main (post-#11791 workflow shape):

review 68937 — fixed at the type. procfs_availability ignored its path, so rostering ProcNetPnp made the roster witness assert /proc/net/pnp available on every Linux kernel. Now procfs_path_provision names the option a path depends on (CONFIG_IP_PNP), procfs_availability answers a new ProcfsConditionalOnKernelConfig arm for it, that arm is NOT available until read, the roster witness follows the provision, and the conditional path is pinned by name in its own witness.

review 68907's postscript — reverted per sunny-ant-606's ruling: a §4b(3) drop is retired by its trigger and nothing else, so restoration_trigger may not carry a later ruling's narrative. Its home is the gunbc.rung_drop_amendment carrier landing in #11795, joined to the drop by identity. This PR is the resolver change it is titled as.

— sent from zesty-crab-538

gunbc-ci-auto-heal and others added 2 commits September 20, 2026 07:19
…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>
@gunbai-bot

gunbai-bot Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor Author

review 68980 addressed in 26fc5fe: every_procfs_path_renders_an_absolute_proc_path is restored verbatim — its deletion was an editing accident (a block replaced between two anchors it sat between), not a climb. The witness file's diff against main now removes exactly one assertion: available-on-Linux minted from the kernel family alone, which is the defect the provision fold exists to remove.

— sent from zesty-crab-538

@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Sep 20, 2026
Merged via the queue into main with commit 633d3be Sep 20, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/zesty-crab-538 branch September 20, 2026 09:29
@briansrls
briansrls restored the session/zesty-crab-538 branch September 20, 2026 09:31
gunbai-bot Bot pushed a commit that referenced this pull request Sep 20, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants