8000 T124 — Refuse a host-address box with no grant the proxy's address inside the VM by minimal-foundry[bot] · Pull Request #3052 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

T124 — Refuse a host-address box with no grant the proxy's address inside the VM - #3052

Merged
norrietaylor merged 5 commits into
mainfrom
agent/3047-refuse-a-host-address-box-with-no-grant-the-prox
Nov 5, 2026
Merged

norrietaylor merged 5 commits into
mainfrom
agent/3047-refuse-a-host-address-box-with-no-grant-the-prox

Conversation

@minimal-foundry
@minimal-foundry minimal-foundry Bot commented Nov 5, 2026 •
Copy link
Copy Markdown
Contributor
8000

T124 — Refuse a host-address box with no grant the proxy's address inside the VM

slice: S17
kind: task
covers: BEP-083
size: L
est: 300 code, 420 tests
executor: agent
difficulty: unknown ground
model: strongest
diagnostics: inside a host_ip box with no grant on a Mac, a TCP connect to the proxy's address on its listener port or on 443 fails at once with "No route to host", while a host_ip grant box in the same VM connects; the VM's kernel log carries the classifier's rate-limited "minimal-classifier: refused" line for the refused connect
observability: one info line per change of the classifier's proxy-lane set names the box id, its leaf and the lane members, as the UDP 443 set's change line does; the table's existing refusal counter counts each refused connect; the host gate's existing debug line for a cohort frame to the proxy's address still names the declaring members
layers:
- spec:
- docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: BEP-083 gains a sub-requirement that refuses, inside the VM, a resident member that declares no credentialed upstream the proxy's listener and TCP 443, verified by the kernel test below
- table:
- scripts/install-host-classifier.sh: a VM-guest-only --proxy-lane ADDR:PORT renders a set bep_lane_leaves of box leaves and an output rule that refuses a new TCP connection from the boxes subtree to ADDR at PORT or 443 unless the socket's leaf is in the set, with the deny chain's counter, log prefix and reject; the helper takes lane-add and lane-remove for that set as it takes add and remove for the UDP 443 set
- crates/minimald/src/net/classifier.rs: GuestRender carries the proxy's listener, and render_guest_ruleset_over passes --proxy-lane; the cohort records each member's lane bit, a member that declares a credentialed upstream has its own leaf in bep_lane_leaves while resident and stays in its own leaf when the cohort blocks UDP 443, a member that declares none is never listed, and injection_leaf answers none for a lane member
- crates/minimald/src/main.rs: the guest's render names DEFAULT_SUBNET.box_egress_proxy_address() and PROXY_LISTENER_PORT as the proxy's listener
- crates/minvmd/tests/guest_classifier_integration.rs: native_ruleset_digest passes the same --proxy-lane, so the guest's loaded table still digests equal to the native render
test: cargo nextest run -p minimald guest_render_refuses_the_proxy_address_outside_the_lane_set
- cohort:
- crates/minimald/src/box_actor/host.rs: HostMoves changes the lane set through the helper's new verbs, and join_quic443_cohort passes the record's lane bit to the cohort
test: cargo nextest run -p minimald lane_less_cohort_member_stays_out_of_the_proxy_lane_set
- kernel:
- crates/minimald/tests/netns_root_integration.rs: a leg that loads the table rendered with --proxy-lane at a namespace address, places two members in their own leaves with only the first in the lane set, and shows the first's connects to the listener port and to 443 accepted and the second's refused with EHOSTUNREACH, both while the cohort blocks UDP 443 and while it does not
- crates/minvmd/src/net/egress_gate.rs: the interim paragraph of host_ip_verdict's doc comment goes; the gate logic stays as the lane's host half
test: cargo nextest run -p minimald --run-ignored ignored-only only_the_declaring_cohort_member_reaches_the_proxy_address
produces:
- the in-VM refusal of a host-address box with no grant at the proxy's address
consumes:
- the cohort's proxy lane at the host gate
proof: On a Mac, while a GitHub grant box runs with --network host_ip, a second host-address box with no grant cannot connect to the proxy's address, and the grant box still reaches the proxy's listener.
depends on:
- blocked by #2854

Proof

The VM guest's classifier table now refuses a new TCP connection from a host-address box to the proxy's address, at the listener port and at 443, unless that box's own cgroup leaf is in the bep_lane_leaves set. The daemon puts a box's leaf in that set only when the box declares a credentialed upstream on a VM host. So on a Mac, a second host_ip box with no grant gets 'No route to host' at the proxy's address, and the GitHub grant box still connects to the proxy's listener. This branch does not show that on a real Mac: the render and cohort tests pass here, but the kernel leg and the VM path were not run.

Notes from the agent: 1) The kernel leg was not exercised. This box has no root, no sudo, no nft and no cgroup2 mount, and MINIMALD_NETNS_TEST is unset. The test line passed because the leg returned at its gate. The native lane's minimald-root-integration job owes the evidence. The minvmd guest_classifier_integration digest was changed but not run (it needs a VM).
2) The VM guest's daemon runs as root and its image has no sudo and no quic443-leaf helper. So HostMoves runs the helper's lane-add/lane-remove through sudo -n only when the daemon is not root. A root daemon runs nft add|delete element inet minimal_class bep_lane_leaves itself, with the leaf path below /sys/fs/cgroup. This is a deviation from 'through the helper's new verbs'. The existing UDP 443 blocked-leaves set has the same gap in the guest. It is filed as #3059, listed under Residuals.
3) A refused lane-set add logs a warning and the launch continues. The grant box then stays refused at the proxy's address (fails closed). It does not fail the launch, so no new refusal text was added.
4) To keep box_runtime.rs and box_runtime/tests.rs out of the diff, CohortQuic443::admit keeps its signature and is now #[cfg(test)]. The new admit_with_lane carries the lane bit. join_quic443_cohort takes a paths::HostKind, and the lane bit is credentialed_u…[truncated]

Tests

line exit tail
cargo nextest run -p minimald guest_render_refuses_the_proxy_address_outside_the_lane_set 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-7bee... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald lane_less_cohort_member_stays_out_of_the_proxy_lane_set 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-7697... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.
cargo nextest run -p minimald --run-ignored ignored-only only_the_declaring_cohort_member_reaches_the_proxy_address 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-8763... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify

min task run agent-verify passed ([tasks.verify]).

Closes #3047

Residuals

The VM guest's classifier table now carries a bep_lane_leaves set and a
proxy_lane chain. A host-address box whose own leaf is not in the set is
refused a new TCP connection to the proxy's address, at the listener
port or at 443. The cohort lists the own leaf of each member that
declares a credentialed upstream, and keeps that member in its own leaf
while the cohort blocks UDP 443 (BEP-083).
A root kernel leg loads the table with --proxy-lane, places two
host-address members in their own leaves with only one in the lane set,
and checks that the other is refused with EHOSTUNREACH, with and without
the UDP 443 block. BEP-083 gains the matching sub-requirement, and the
interim note on the VM host's gate goes.
@coderabbitai
coderabbitai Bot commented Nov 5, 2026 •
Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9021b043-d332-44b1-80d5-b463437fa122

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@github-actions
github-actions Bot commented Nov 5, 2026
Copy link
Copy Markdown
Contributor

Spec lint

docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md — 11 finding(s)

docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:117: P004 BEP-003 names test 'bep_second_box_needs_no_sign_in', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:174: P004 BEP-007 names test 'bep_box_env_holds_sealed_value_only', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:218: P004 BEP-011 names test 'bep_root_ca_present_in_box_trust_store', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:234: P004 BEP-012 names test 'bep_proxy_env_and_no_proxy_are_set', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:290: P004 BEP-015 names test 'bep_git_and_gh_against_private_repo', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:354: P004 BEP-081 names test 'vm_host_admits_dns_and_both_for_own_ip_and_host_ip', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:382: P004 BEP-084 names test 'cohort_delivery_names_no_box', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:401: P004 BEP-086 names test 'host_ip_grant_box_steered_names_resolve_to_proxy', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:410: P004 BEP-087 names test 'bep_host_ip_git_and_gh_under_dns_steering', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:722: P004 BEP-043 names test 'bep_destroyed_box_values_refused_within_60s', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:731: P004 BEP-044 names test 'bep_logout_refuses_every_reference_at_next_request', which was not found in the repository

Advisory. None of this blocks the merge; the review decides.

Advisory, and never a merge gate. Linter: gominimal/foundry@fb5932b8, spec format: How Minimal Writes Specs.

@minimal-foundry
minimal-foundry Bot commented Nov 5, 2026 •
Copy link
Copy Markdown
Contributor Author

Approved: every review thread resolved at d51bbbafe2a4.

@norrietaylor resolved the last thread, which releases the approval this review had withheld.

Nothing to do.

@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — approved

Verdict APPROVE — No findings.

Panel: 3 of 3 personas ran (correctness, security, supply-chain).

@minimal-foundry minimal-foundry Bot added the review:approved minimal-review approved the current head label Nov 5, 2026
@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

arch-review: CONDITIONS · 2 conditions · the full ruling

The change puts the per-box refusal in the in-VM classifier, where networking §7.1 line 253 and §4.1 line 54 put it. It fails closed. Two proofs are missing. The guest daemon is root and adds a grant box's leaf through run_lane_nft, and no test reaches that path (C1). The kernel leg did not run, and the interim removal in egress_gate.rs depends on it (C2). Make the edit in C1, and record the minimald-root-integration result for C2.

Ruled at cdd82c2 against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

Comment thread crates/minimald/src/box_actor/host.rs Resolved
Comment thread crates/minimald/src/box_actor/host.rs Resolved
@norrietaylor
Copy link
Copy Markdown
Member

/revise Arch CONDITIONS at cdd82c2 (arch_rulings 979), condition C1. The in-VM guest daemon runs as root, and it changes bep_lane_leaves through run_lane_nft in crates/minimald/src/box_actor/host.rs, which calls nft directly. No test reaches that function: the kernel leg and the render test drive the sudo helper. If it is wrong, every grant box on a Mac is refused at the proxy. Do these two things:

  1. Use the table constant. In run_lane_nft(), replace the literal "minimal_class" with crate::net::classifier::TABLE_NAME. Make that constant pub(crate) in crates/minimald/src/net/classifier.rs if it is not.
  2. Test the root path. Add a unit test in quic443_cohort_tests (host.rs). Run run_lane_nft over a recording nft stub, as recording_nft does in classifier.rs, and a stand-in cgroup mount. Assert:
    • lane-add runs nft add element inet minimal_class bep_lane_leaves { "minimald.slice/boxes/allow/<id>" }
    • lane-remove runs the same argv with delete in place of add
    • a leaf that is not below the mount returns Err with ErrorKind::InvalidInput, and the stub records no nft call

Run the three T124 test lines and the new test.

C2 needs no code. On cdd82c2 the minimald-root-integration job (run 42067384996, job 127385283623) printed minimald netns proof starte 8000 d: only_the_declaring_cohort_member_reaches_the_proxy_address with no NOT RUN line, and the leg passed. The babysitter will check that job again on the head that answers C1.

run_lane_nft names the table through TABLE_NAME, and a unit test runs it over a recording nft stub for lane-add, lane-remove and a leaf outside the mount (BEP-083).
@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — advisory review

Verdict COMMENT — 1 finding, 1 inline.

Panel: 3 of 3 personas ran (correctness, security, supply-chain).

Comment thread crates/minimald/src/box_actor/host.rs Resolved
@minimal-foundry minimal-foundry Bot removed the review:approved minimal-review approved the current head label Nov 5, 2026
@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

arch-review: PASS_WITH_CONDITIONS · 1 condition · the full ruling

The change conforms to networking §7.1. The in-VM classifier refuses the proxy's address to a host_ip box whose own leaf is not in bep_lane_leaves, and only a box with a credentialed upstream on a VM host enters that set. The change fails closed at each step. One gap stays open. On a VM guest, HostMoves::add_blocked_leaf runs sudo -n with a helper that the guest does not have, so a default GitHub grant box cannot launch on host_ip while it blocks UDP 443. The gap exists before this change, but your Mac proof depends on it and no issue tracks it. File the issue as C1 says, and list it in the PR body as a residual.

Ruled at 64ec306 against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

Comment thread crates/minimald/src/box_actor/host.rs Resolved
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 1 of 10 on a /revise note, pushed as 64ec30639899.

line exit tail
cargo nextest run -p minimald guest_render_refuses_the_proxy_address_outside_the_lane_set 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-57b2... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald lane_less_cohort_member_stays_out_of_the_proxy_lane_set 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-287e... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.
cargo nextest run -p minimald --run-ignored ignored-only only_the_declaring_cohort_member_reaches_the_proxy_address 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-ea5f... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify min task run agent-verify passed.

Review threads the coder judged:

  • 👍 valid — crates/minimald/src/box_actor/host.rs:142: Added root_lane_change_runs_nft_on_the_lane_set. It runs run_lane_nft over a recording nft stub for lane-add, lane-remove and a leaf outside the mount.
  • 👍 valid — crates/minimald/src/box_actor/host.rs: run_lane_nft now uses crate::net::classifier::TABLE_NAME, which is now pub(crate).
  • 👍 valid — crates/minimald/tests/netns_root_integration.rs:2913: No code change. On cdd82c2, job 127385283623 of run 42067384996 ran the leg with no NOT RUN line, and it passed. The job runs again on this head. The leg skipped on the agent's box because it is not root.

On a Mac, while a GitHub grant box runs with --network host_ip, a second host-address box with no grant cannot connect to the proxy's address, and the grant box still reaches the proxy's listener. This round adds a unit test for the root guest daemon's path. That path puts the grant box's leaf in bep_lane_leaves, so the grant box is not refused at the proxy.

Notes from the agent: C1 is done. run_lane_nft now names the table through crate::net::classifier::TABLE_NAME, which is now pub(crate). I also made the cfg(test) helpers recording_nft and nft_calls in classifier.rs pub(crate), so that the host.rs test can use them. The new test is quic443_cohort_tests::root_lane_change_runs_nft_on_the_lane_set. It checks the argv for lane-add and for lane-remove ('delete'). It also checks that a leaf outside the mount gives InvalidInput and that nft is not called. C2 needs no code. On this box the kernel leg skipped, because it runs as uid 1000 and MINIMALD_NETNS_TEST is not set. The minimald-root-integration job must prove it again on the new head. cargo clippy -p minimald --all-targets shows no warnings.

@norrietaylor
Copy link
Copy Markdown
Member

/revise Review finding PRRT_kwDOPdfcxM60L_7z at 64ec306 (crates/minimald/src/box_actor/host.rs ~148, run_lane_nft). The function maps every verb that is not lane-add to nft delete, so a wrong verb deletes a lane element and reports no error. The sudo helper refuses unknown verbs. Do these two things:

  1. Match lane-add to add and lane-remove to delete. Return Err with ErrorKind::InvalidInput for any other verb, and run no nft for it. You can use an enum in place of the string if that is simpler.
  2. Extend root_lane_change_runs_nft_on_the_lane_set: an unknown verb returns InvalidInput, and the recording stub records no nft call.

Change nothing else. Keep each commit message line at 100 characters or fewer: commitlint's body-max-line-length fails on 64ec306 because a body line is 164 characters. Run the three T124 test lines and the extended test.

run_lane_nft now maps lane-add to add and lane-remove to delete.
Any other verb returns InvalidInput and runs no nft, as the sudo
helper refuses a verb it does not know (BEP-083).
@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — approval withheld

Verdict COMMENT — APPROVE withheld: 1 unresolved thread — minimal-foundry[bot] crates/minimald/src/box_actor/host.rs. No findings.

Panel: 3 of 3 personas ran (correctness, security, supply-chain).

@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

arch-review: PASS_WITH_CONDITIONS · 1 condition · the full ruling

The in-VM classifier now refuses the proxy's address to a host-address box with no credentialed upstream, at the listener port and at 443. This is the per-box gate inside the VM that networking §7.1 line 253 assigns to the classifier, and the change conforms to it. The kernel leg that the spec names as the proof did not run on this branch. The guest digest test did not run either. C1 is open until the native lane and the VM lane run them green on this head.

Ruled at d51bbba against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 2 of 10 on a /revise note, pushed as d51bbbafe2a4.

line exit tail
cargo nextest run -p minimald guest_render_refuses_the_proxy_address_outside_the_lane_set 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-8c03... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald lane_less_cohort_member_stays_out_of_the_proxy_lane_set 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-16b5... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.
cargo nextest run -p minimald --run-ignored ignored-only only_the_declaring_cohort_member_reaches_the_proxy_address 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-6c56... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling mlog v0.0.1 (/workbench/crates/mlog) Compiling decode v0.0.

Verify min task run agent-verify exited 100 under rustc 1.99.0, which the repository does not pin (1.99.1 in rust-toolchain.toml); the PR is not a draft on that alone — CI, which honours the pin, is the gate.

d_holders_shared_port_is_bound_for_the_running_box_that_takes_it
        PASS [   5.487s] (  43/2099) minimald box_actor::tests::a_destroyed_holders_shared_port_is_not_bound_for_a_box_that_is_not_running
        PASS [   2.630s] (  44/2099) minimald box_actor::tests::a_handed_box_pending_at_finalize_publishes_the_interim_when_the_verdict_lands_absent
        PASS [   2.584s] (  45/2099) minimald box_actor::tests::a_hook_launched_shell_of_a_registered_box_is_kept_for_a_terminal
        PASS [   0.696s] (  46/2099) minimald box_actor::tests::a_hook_launched_shell_takes_the_attaching_terminals_term
        PASS [   0.529s] (  47/2099) minimald box_actor::tests::a_launch_whose_record_cannot_be_written_kills_its_box
        PASS [   5.295s] (  48/2099) minimald box_actor::tests::a_hand_over_bind_the_switch_refuses_leaves_the_election_standing
        PASS [   0.552s] (  49/2099) minimald box_actor::tests::a_mint_whose_host_dies_before_attach_reports_a_spawn_failure
        PASS [   3.265s] (  50/2099) minimald box_actor::tests::a_listen_port_whose_move_failed_releases_its_hold_where_it_was_bound
        PASS [   3.853s] (  51/2099) minimald box_actor::tests::a_listen_port_does_not_move_onto_a_port_another_box_holds
        PASS [   7.891s] (  52/2099) minimald box_actor::tests::a_handed_reserved_address_waits_for_the_verdict_before_it_publishes
        FAIL [   3.052s] (  53/2099) minimald box_actor::tests::a_present_landing_moves_a_running_interim_boxs_forward_to_its_hand
  stdout ───

    running 1 test
    test box_actor::tests::a_present_landing_moves_a_running_interim_boxs_forward_to_its_hand ... FAILED

    failures:

    failures:
        box_actor::tests::a_present_landing_moves_a_running_interim_boxs_forward_to_its_hand

    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 1373 filtered out; finished in 3.03s

  stderr ───

    thread 'box_actor::tests::a_present_landing_moves_a_running_interim_boxs_forward_to_its_hand' (6430) panicked at crates/minimald/src/box_actor/tests.rs:7361:5:
    the attach's teardown asks nothing more of the forward unbound here
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   7.319s] (  54/2099) minimald box_actor::tests::a_mint_whose_host_wedges_reports_busy_instead_of_death
        PASS [   4.895s] (  55/2099) minimald box_actor::tests::a_present_landing_starts_no_actor_for_a_box_without_one
        PASS [   6.068s] (  56/2099) minimald box_actor::tests::a_present_landing_moves_a_running_interim_boxs_runtime_publications_to_its_hand
────────────
     Summary [  23.791s] 56/2099 tests run: 55 passed, 1 failed, 27 skipped
        FAIL [   3.052s] (  53/2099) minimald box_actor::tests::a_present_landing_moves_a_running_interim_boxs_forward_to_its_hand
warning: 2043/2099 tests were not run due to test failure (run with --no-fail-fast to run all tests, or run with --max-fail)
error: test run failed

Review threads the coder judged:

  • 👍 valid — crates/minimald/src/box_actor/host.rs: run_lane_nft now matches lane-add to add and lane-remove to delete, and returns InvalidInput with no nft call for any other verb. root_lane_change_runs_nft_on_the_lane_set checks the refusal and that the stub records no nft call.

On a Mac, while a GitHub grant box runs with --network host_ip, a second host-address box with no grant cannot connect to the proxy's address, and the grant box still reaches the proxy's listener. This round adds that the root daemon's lane set change refuses a verb other than lane-add or lane-remove and runs no nft for it.

Notes from the agent: Revise round 2 changed only run_lane_nft and its unit test in crates/minimald/src/box_actor/host.rs. The commitlint failure is on commit 64ec306, which is already on the branch. The rules forbid a rewrite of existing commits or a force-push, so that body line stays at 164 characters and commitlint stays red until a person squashes or rewords it on merge. The new commit d51bbba has every line at 100 characters or fewer. The kernel test only_the_declaring_cohort_member_reaches_the_proxy_address reported a pass, but it printed 'skipping netns proof: MINIMALD_NETNS_TEST not set'. This box is not root, so the kernel leg is not proved here.

@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — approved

Verdict APPROVE — every review thread is resolved; @norrietaylor closed the last one. The review of d51bbbafe2a4 withheld this approval on the threads open then. Posted as a comment: the App cannot approve its own pull request; the check and the label carry it.

@minimal-foundry minimal-foundry Bot added the review:approved minimal-review approved the current head label Nov 5, 2026
@norrietaylor norrietaylor left a comment
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gate passed at d51bbba under the standing gate-4 rule.

@norrietaylor
norrietaylor added this pull request to the merge queue Nov 5, 2026
Merged via the queue into main with commit 938b2a4 Nov 5, 2026
36 of 37 checks passed
@norrietaylor
norrietaylor deleted the agent/3047-refuse-a-host-address-box-with-no-grant-the-prox branch November 5, 2026 20:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review:approved minimal-review approved the current head

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T124 — Refuse a host-address box with no grant the proxy's address inside the VM

1 participant

0