8000 fix(minimald): an own-address box on a native Linux host resolves a sibling's <box>.min.internal by minimal-foundry[bot] · Pull Request #3397 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

fix(minimald): an own-address box on a native Linux host resolves a sibling's <box>.min.internal - #3397

Draft
minimal-foundry[bot] wants to merge 7 commits into
mainfrom
agent/3354-an-own-address-box-on-a-native-linux-host-resolv
Draft

minimal-foundry[bot] wants to merge 7 commits into
mainfrom
agent/3354-an-own-address-box-on-a-native-linux-host-resolv

Conversation

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

Defect

Fixes #3354

Task marker
### D3001 — An own-address box on a native Linux host resolves a sibling's <box>.min.internal name at its switch resolver
  kind: task
  size: M
  est: 80 code, 120 tests
  executor: agent
  defect: bug
  epic: 1437
  layers:
    - relay:
      - crates/minimald/src/net/dns_gate.rs: keeps a sibling zone A query and its reply on the forward path for an own-address box, and adds a relay-level proof of the lookup
      - crates/minimald/src/net/switch.rs: forwards the box's UDP 53 query to the gateway and writes the resolver's zone reply back to the box on a native host
      test: cargo test -p minimald a_sibling_box_name_resolves_through_the_relay
    - registration:
      - crates/minimald/src/net/gvproxy_network.rs: registers each own-IP box name in the zone that the native switch's resolver at the subnet gateway answers
      - crates/minimald/src/net/policy.rs: fixes the /services/dns/add body or call if the native switch does not hold the sibling record
      test: cargo test -p minimald dns_add_body
    - e2e:
      - scripts/session-e2e.sh: adds a lookup of e2e-nnat-b.min.internal from inside e2e-nnat-a with getent and curl to proof_native_names_answer_on_time
      test: bash scripts/session-e2e.sh
  proof: Inside e2e-nnat-a on a native Linux host, getent ahostsv4 e2e-nnat-b.min.internal exits 0 with the sibling's address, and curl to that name does not exit 6.

Proof

Not delivered on this box. With this branch, a native Linux lane that has passwordless sudo and the gvproxy switch runs a new beat 5 in proof_native_names_answer_on_time. Inside e2e-nnat-a, getent ahostsv4 e2e-nnat-b.min.internal must exit 0 with e2e-nnat-b's switch address, and curl to http://e2e-nnat-b.min.internal:18194/ must not exit 6. Nobody has seen that beat pass yet. A person can now see the relay-level proof pass: the test a_sibling_box_name_resolves_through_the_relay shows a native-shaped relay (per-daemon /24, host-exposures table, TCP-only box with subnets that cover the switch) forwarding the sibling's A query to the gateway and passing the resolver's zone reply back to the box unchanged.

Notes from the agent: I did not find a code defect, and I did not reproduce the bug. The new relay test passed before any code change, on both the default /16 relay and the native /24 shape with host exposures. So the relay forwards the query and the reply as the task asks. The registration body (dns_add_body) and the call site in finish_own_ip_attach also look correct: each own-IP box registers and . in the min.internal. zone of the switch it attaches to. For this reason I made no change to policy.rs, because its layer note makes a change conditional on the native switch not holding the sibling record, and I could not observe that. I could not run a native own-IP pair here: no gvproxy (fetch-gvproxy.sh needs go.dev, and the GitHub release asset host does not resolve), no sudo, and the box sandbox does not start on this host. The changes are: (1) the relay-level proof in dns_gate.rs; (2) a debug log line in gvproxy_network.rs when a *.min.internal registration on gvproxy succeeds, so that a failing lookup can tell a missing record from a lost reply (before, only a failure was logged); (3) beat 5 in proof_native_names_answer_on_time, which runs getent and curl inside e2e-nnat-a. On a failure it prints the box's /etc/resolv.conf, the r…[truncated]

Tests

line exit tail
cargo test -p minimald a_sibling_box_name_resolves_through_the_relay 0 running 1 test test net::dns_gate::tests::a_sibling_box_name_resolves_through_the_relay ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1474 filtered out; finished in 0.03s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished i
cargo test -p minimald dns_add_body 0 running 1 test test net::policy::tests::dns_add_body_matches_gvproxy_zone_shape ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1474 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s
bash scripts/session-e2e.sh 1 mes":{"01a1d47b-1f8d-7ee4-99dc-f8510efed869":"e2e-banner"}}--- /tmp/.mnl-e2e.Yv9bcL/minimal/sessions/ed869/record.json (tail) --- {"id":"01a1d47b-1f8d-7ee4-99dc-f8510efed869","name":"e2e-banner","username":"minimal-cli","project_path":"/tmp/mnlp.JPbHX7","network":"host_net","policy":{"egress":null,"

Verify

min task run agent-verify timed out after 1800s, so this PR is a draft.

some dir\u{1f}RUSTC_WRAPPER=sccache\u{1f}SCCACHE_BUCKET=agent-runtime-sccache-gominimal-minimal\u{1f}SCCACHE_ENDPOINT=https://4103a6df4dd77276970745a22603bea9.r2.cloudflarestorage.com\u{1f}SCCACHE_REGION=auto\u{1f}SCCACHE_S3_USE_SSL=true\u{1f}SHELL=/usr/bin/bash\u{1f}SHLVL=2\u{1f}SSL_CERT_DIR=/etc/ssl/certs\u{1f}SSL_CERT_FILE=/etc/ssl/cert.pem\u{1f}XDG_CACHE_HOME=/state/cache\u{1f}XDG_CONFIG_HOME=/home/.config\u{1f}XDG_DATA_HOME=/home/.local/share\u{1f}XDG_RUNTIME_DIR=/run\u{1f}XDG_STATE_HOME=/home/.local/state\u{1e}stdin\n"
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   1.191s] ( 601/1493) minimald env::tests::refresh_remaps_the_installed_set_onto_the_new_graph
        PASS [   1.255s] ( 602/1493) minimald env::tests::refresh_does_not_adopt_the_repos_top_levels
        SLOW [> 60.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>120.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>180.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>240.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>300.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>360.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>420.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>480.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>540.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>600.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>660.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>720.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>780.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>840.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>900.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>960.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1020.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1080.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1140.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1200.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1260.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1320.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task

An own-address box with the session e2e's shape (TCP only, subnets
that cover the switch) sends a sibling's A query to the gateway. The
relay forwards it, and the switch resolver's zone reply reaches the
box unchanged, on a per-daemon /24 with the host-exposures table.
proof_native_names_answer_on_time now runs getent ahostsv4 and curl for
e2e-nnat-b.min.internal inside e2e-nnat-a. getent must answer the
sibling's switch address, and curl must not exit 6. On a failure the
case prints the box's resolv.conf and the daemon's registration and
relay DNS lines. A successful gvproxy name registration now logs a
debug line, so a missing record and a lost reply read differently.
@coderabbitai
coderabbitai Bot commented Nov 13, 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: 051dac38-04b8-48b2-885d-ecd0993e52e2

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

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

Not started at fb2a5a272c40: this review was queued for capacity and never started: the pull request is a draft.

Nothing about th 10000 is head was reviewed or found wrong. Comment /review to ask again.

@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 · 1 condition · the full ruling

The code in this PR conforms to the design. The relay test is a correct proof of §5.3 at relay level. The PR does not fix #3354, and its e2e beat 5 has not run on a native host. §7.1 line 249 requires that a box resolves a sibling's <name>.min.internal in-guest, and nothing here proves that on native Linux. The PR body says Fixes #3354, so a merge closes an open defect. C1 changes it to Refs #3354. Then the change can merge, and #3354 stays open as the residual.

Ruled at bbb2309 against gominimal/arch@15b603e6afb8 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh
echo "4. the refused connect to an unpublished port is logged as a policy violation"

# ---- 5. a destroyed box's name is gone when destroy returns ---------------
# ---- 5. a sibling's name resolves from inside a box -----------------------
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

C1 · Beat 5 is the only leg that proves the §7.1 sibling-name answer on a native host. It prints not_run without sudo and gvproxy, and it has not passed yet. An open e2e leg cannot close a defect. Change Fixes #3354 to Refs #3354 in the PR body. Close #3354 when this beat passes on a native Linux lane.

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.

The premise of C1 does not hold: beat 5 ran and passed in CI on this head. native-daemon-e2e (ci-linux-native, run 43414604824, job 131849283519) ran proof_native_names_answer_on_time on a native Linux host with sudo:

getent ahostsv4 e2e-nnat-b.min.internal inside e2e-nnat-a: exit 0, answer 100.64.197.2
curl http://e2e-nnat-b.min.internal:18194/ inside e2e-nnat-a: exit 7: curl: (7) Failed to connect to e2e-nnat-b.min.internal:18194 after 2 ms: Could not connect to server
5. e2e-nnat-b.min.internal resolves to 100.64.197.2 inside e2e-nnat-a, and curl to the name does not exit 6

The answer is e2e-nnat-b's switch address from beat 4, and curl resolved the name (exit 7, not 6). Only the macOS lane prints NOT RUN for this case (VM-backed). So the sibling-name lookup in #3354 works on a native host on this head, and this PR carries the proof that pins it. The body says Fixes #3354 again.

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.

Addressed in fb2a5a272c40: Agreed: beat 5 has not passed, so this PR must not close #3354. The runner writes the PR body. result.json now says the proof is not delivered and asks for Refs #3354. No commit carries a closing keyword.

@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: 2 of 3 personas ran (correctness, security); did not complete: supply-chain.

Comment on lines +2705 to +2713
/// D3001: an own-address box on a native host, with the shape the
/// session e2e activates (`--allow-subnets 100.64.0.0/10
/// --allow-protocols tcp`), resolves a sibling's `<box>.min.internal`
/// name. The UDP query to the gateway's port 53 goes on to the switch
/// unchanged, though the box declared TCP only. The switch resolver's
/// zone reply then reaches the box unchanged.
#[tokio::test]
async fn a_sibling_box_name_resolves_through_the_relay() {
let tcp_subnets = boxes::BoxPolicy {
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.

LOW · tests · confidence 0.55 · in a_sibling_box_name_resolves_through_the_relay

The PR says it fixes #3354 (a box cannot resolve a sibling's name on a native host). The diff changes no relay, switch or registration logic. The new relay test drives a hand-written resolver reply through the relay, so it cannot show that the native switch resolver answers the zone name. If the relay already passes the frames, this test passes without a fix and does not cover the defect. If the defect is in switch.rs or policy.rs, those files are not in the diff and the bug stays open. Only the e2e beat reaches the real resolver.

What the reviewer checked

Diff touches dns_gate.rs (tests module only), gvproxy_network.rs (debug log only), session-e2e.sh. No change in switch.rs or policy.rs.

Hand this to an agent
Act on a code-review finding.

File:       crates/minimald/src/net/dns_gate.rs
Lines:      2705-2713
Category:   tests
Severity:   low (reviewer confidence 0.55)

Finding:
The PR says it fixes #3354 (a box cannot resolve a sibling's name on a native host). The diff changes no relay, switch or registration logic. The new relay test drives a hand-written resolver reply through the relay, so it cannot show that the native switch resolver answers the zone name. If the relay already passes the frames, this test passes without a fix and does not cover the defect. If the defect is in `switch.rs` or `policy.rs`, those files are not in the diff and the bug stays open. Only the e2e beat reaches the real resolver.

First verify this against the code yourself. It is model output and
may be wrong. If it is wrong, or the tradeoff was deliberate, say so
and change nothing.

👍 useful · 👎 noise — react to tell the reviewer. Replying works too, and says more.

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.

Right that the diff changes no relay code. The defect did not reproduce on main: the relay already passes the sibling query and reply, which a_sibling_box_name_resolves_through_the_relay now pins. Beat 5 proves it end to end on the native lane at this head (getent exit 0 with the sibling's switch address; curl exit 7, not 6; job 131849283519). So Fixes #3354 stands: the PR closes the defect with a proof, not a code change.

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.

Addressed in fb2a5a272c40: The relay proof now runs on a native daemon's own /24 (100.64.37.0/24), not 100.64.0.x. A new registration proof replays two boxes' publishes through gvproxy's zone merge and lookup. Both pass with no fix, so neither shows the defect. No defect found in switch.rs or policy.rs. Only the e2e beat reaches the live resolver.

@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.

Reviewed against D3001 at bbb2309b. This adds proof and diagnostics, not a fix. a_sibling_box_name_resolves_through_the_relay shows that an own-address box with the e2e's TCP-only policy has its UDP 53 query to the gateway, and the resolver's zone reply, pass the relay unchanged on the native /24 shape. A successful register_dns_name now logs at debug, so a failed in-box lookup can be told apart from a missing record. Beat 5 of proof_native_names_answer_on_time adds the in-box getent and curl lookup. Per arch C1, the body now says Refs #3354: beat 5 has run on no lane yet (macOS prints NOT RUN), so #3354 stays open until it passes on a native Linux lane.

The relay proof ran on the default switch's 100.64.0.x, a subnet no
native daemon gets. It now runs the box, its sibling and the resolver on
a per-daemon /24 (100.64.37.0/24), with the gate and the relay both
keyed to it. A new registration proof replays two boxes' zone publishes
on one native switch through gvproxy's merge and lookup, and the
sibling's names answer at its lease.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 1 of 10 on the runtime's review findings, pushed as fb2a5a272c40.

line exit tail
cargo test -p minimald a_sibling_box_name_resolves_through_the_relay 0 running 1 test test net::dns_gate::tests::a_sibling_box_name_resolves_through_the_relay ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1476 filtered out; finished in 0.03s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished i
cargo test -p minimald dns_add_body 0 running 2 tests test net::policy::tests::dns_add_body_matches_gvproxy_zone_shape ... ok test net::gvproxy_network::tests::a_native_sibling_is_held_in_the_switch_zone_dns_add_body ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1475 filtered out; finished in 0.00s running 0 tes
bash scripts/session-e2e.sh 1 mes":{"01a1d5ca-ba9c-76a5-bc06-1f7f41239697":"e2e-banner"}}--- /tmp/.mnl-e2e.oC7KxR/minimal/sessions/39697/record.json (tail) --- {"id":"01a1d5ca-ba9c-76a5-bc06-1f7f41239697","name":"e2e-banner","username":"minimal-cli","project_path":"/tmp/mnlp.Xw1o3i","network":"host_net","policy":{"egress":null,"

Verify min task run agent-verify timed out after 1800s.

HE_REGION=auto\u{1f}SCCACHE_S3_USE_SSL=true\u{1f}SHELL=/usr/bin/bash\u{1f}SHLVL=2\u{1f}SSL_CERT_DIR=/etc/ssl/certs\u{1f}SSL_CERT_FILE=/etc/ssl/cert.pem\u{1f}XDG_CACHE_HOME=/state/cache\u{1f}XDG_CONFIG_HOME=/home/.config\u{1f}XDG_DATA_HOME=/home/.local/share\u{1f}XDG_RUNTIME_DIR=/run\u{1f}XDG_STATE_HOME=/home/.local/state\u{1e}stdin\n"
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   0.782s] ( 602/1495) minimald env::tests::refresh_does_not_adopt_the_repos_top_levels
        PASS [   0.774s] ( 603/1495) minimald env::tests::refresh_remaps_the_installed_set_onto_the_new_graph
        SLOW [> 60.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>120.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>180.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>240.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>300.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>360.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>420.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>480.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>540.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>600.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>660.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>720.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>780.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>840.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>900.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>960.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1020.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1080.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1140.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1200.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1260.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1320.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1380.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1440.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task

Converted to a draft: something above needs a person before review.

Review threads the coder judged:

Not delivered on this branch yet. A person can see two unit proofs: a box on a native daemon's own /24 (100.64.37.0/24) gets a sibling's e2e-nnat-b.min.internal A query forwarded to that /24's gateway resolver and the zone reply back unchanged, and two boxes' zone publishes on one native switch answer the sibling's name at its lease. The e2e beat (getent ahostsv4 e2e-nnat-b.min.internal and curl inside e2e-nnat-a) is written but has not passed on a native Linux lane, so the defect is not shown fixed.

Notes from the agent: No product code changes. Static reading of the relay (switch.rs, dns_gate.rs), the registration (gvproxy_network.rs, policy.rs) and the rendered gvproxy config found no defect, and both unit proofs pass on the native shape without a fix. The previous relay proof used 100.64.0.0/24, a subnet no native daemon gets (switch_subnet_for_octet takes octet 1..=254). This round adds a spawn_native_relay_with harness in switch.rs tests and moves the proof to 100.64.37.0/24. policy.rs needed no change: its body is what gvproxy's merge and lookup resolve. The defect, if it is real, sits outside what these tests reach: the live gvproxy-min or the box's own resolver stack. Only beat 5 of proof_native_names_answer_on_time reaches it. The PR body must say Refs #3354, not Fixes #3354, until that beat passes on a native Linux lane. No commit on this branch carries a closing keyword.

@minimal-foundry
minimal-foundry Bot marked this pull request as draft November 13, 2026 17:15
@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 · 1 condition · the full ruling

The relay and registration proofs conform to §5.3 line 153 and §7.1 line 249. The placement is correct. The task's proof leg is beat 5 of proof_native_names_answer_on_time, and nobody has run it. On lanes without a native daemon, sudo and a staged switch, it reports not_run. The PR body still says Fixes #3354, so the merge will close the defect on an open leg. Make the change in C1. Then the change conforms, and the end-to-end proof stays open on #3354.

Ruled at fb2a5a2 against gominimal/arch@15b603e6afb8 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh
echo "4. the refused connect to an unpublished port is logged as a policy violation"

# ---- 5. a destroyed box's name is gone when destroy returns ---------------
# ---- 5. a sibling's name resolves from inside a box -----------------------
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

C1 · Beat 5 is the task's proof, and nobody has run it. This function reports not_run without a native daemon, passwordless sudo and E2E_NATIVE_SWITCH. Change Fixes #3354 to Refs #3354 in the PR body, or attach a native-lane run that prints the beat 5 pass line (§7.1 line 249).

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.

Addressed in 0cd6aec8f0ca: Beat 5 is still unrun: this round's e2e run on this box stopped before it (no process-namespace access, no gvproxy). I changed no code for it. The PR body needs Refs #3354 in place of Fixes #3354 until a native lane prints the beat 5 pass line. I cannot edit the PR body.

@norrietaylor
Copy link
Copy Markdown
Member

/revise merge origin/main into this branch: the PR conflicts with main in crates/minimald/src/net/switch.rs, and no base-merge round came.

Do:

  1. Merge origin/main (a merge commit, no rebase, no force-push).
  2. Resolve crates/minimald/src/net/switch.rs so main's change and this PR's own-address resolution both stay. Drop neither side's behaviour.
  3. Run this task's test: lines and cargo test -p minimald net:: again.
  4. Change nothing else. Keep Fixes #3354 and the Proof section.

…ress-box-on-a-native-linux-host-resolv

# Conflicts:
#	crates/minimald/src/net/switch.rs
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

Resolved conflicts in: crates/minimald/src/net/switch.rs

line exit tail
cargo test -p minimald a_sibling_box_name_resolves_through_the_relay 0 running 1 test test net::dns_gate::tests::a_sibling_box_name_resolves_through_the_relay ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1477 filtered out; finished in 0.03s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished i
cargo test -p minimald dns_add_body 0 running 2 tests test net::policy::tests::dns_add_body_matches_gvproxy_zone_shape ... ok test net::gvproxy_network::tests::a_native_sibling_is_held_in_the_switch_zone_dns_add_body ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1476 filtered out; finished in 0.00s running 0 tes
bash scripts/session-e2e.sh 1 f3b-b936-41ef2c9c5641"},"names":{"01a1d6bd-3 D29F c3c-7f3b-b936-41ef2c9c5641":"e2e-banner"}}--- /tmp/.mnl-e2e.hx6VoQ/minimal/sessions/c5641/record.json (tail) --- {"id":"01a1d6bd-3c3c-7f3b-b936-41ef2c9c5641","name":"e2e-banner","username":"minimal-cli","project_path":"/tmp/mnlp.duwpDU","network":"host_net

Verify min task run agent-verify timed out after 1800s.

n\u{1f}PWD=/tmp/.tmpgHnHWH/some dir\u{1f}RUSTC_WRAPPER=sccache\u{1f}SCCACHE_BUCKET=agent-runtime-sccache-gominimal-minimal\u{1f}SCCACHE_ENDPOINT=https://4103a6df4dd77276970745a22603bea9.r2.cloudflarestorage.com\u{1f}SCCACHE_REGION=auto\u{1f}SCCACHE_S3_USE_SSL=true\u{1f}SHELL=/usr/bin/bash\u{1f}SHLVL=2\u{1f}SSL_CERT_DIR=/etc/ssl/certs\u{1f}SSL_CERT_FILE=/etc/ssl/cert.pem\u{1f}XDG_CACHE_HOME=/state/cache\u{1f}XDG_CONFIG_HOME=/home/.config\u{1f}XDG_DATA_HOME=/home/.local/share\u{1f}XDG_RUNTIME_DIR=/run\u{1f}XDG_STATE_HOME=/home/.local/state\u{1e}stdin\n"
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   0.548s] ( 604/1496) minimald env::tests::search_finds_known_package
        PASS [   0.433s] ( 605/1496) minimald env::tests::task_entrypoint_relays_the_task_exit_code
        SLOW [> 60.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>120.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>180.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>240.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>300.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>360.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>420.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>480.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>540.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>600.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>660.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>720.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>780.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>840.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>900.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>960.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1020.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1080.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1140.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1200.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1260.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task
        SLOW [>1320.000s] (─────────) minimald env::tests::minenv_run_forwards_stdin_to_the_task

Converted to a draft: something above needs a person before review.

Review threads the coder judged:

No new proof this round. The branch now merges origin/main without conflicts. The relay test still shows that the box's resolver at the gateway of the native /24 answers a sibling's e2e-nnat-b.min.internal name. The in-box getent/curl check (beat 5 of proof_native_names_answer_on_time) is still not run on a native Linux host with gvproxy.

Notes from the agent: Merged origin/main with merge commit 3f2a9df. The one conflict was in the spawn_relay_on test harness in crates/minimald/src/net/switch.rs. The resolution keeps main's (gate, name) match. This match gives a named box with no policy an ungated, named relay, and spawn_relay takes main's new box_name argument. The resolution also keeps this PR's subnet parameter in place of SwitchSubnet::default(), so the native /24 harness still works. I changed nothing else. The net:: failures are order-dependent and exist on origin/main too (checked in a temporary worktree). The e2e beat is not run because of the limits of this box. The open thread is valid. The PR body must say Refs #3354, not Fixes #3354, until a native lane prints the beat 5 pass line. I cannot edit the PR body. The runner or a person must make that change. The directive says to keep Fixes #3354, and this thread asks for the opposite, so a person must decide.

This branch has not been deployed

No deployments
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.

D3001 — An own-address box on a native Linux host resolves a sibling's <box>.min.internal name

1 participant

0