8000 T58 — Steer a dns or both box's credentialed names through the relay's gate in production · Issue #2538 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content
8000

T58 — Steer a dns or both box's credentialed names through the relay's gate in production #2538

Closed

Description

@norrietaylor

Task

slice size difficulty model who estimated lines
Conditions closed L needs care standard an agent 560 (260 code, 300 tests)

In a running daemon with the proxy stopped, a dns-steered box resolving github.com gets SERVFAIL and never a real address; once the listener is live the same lookup gets the proxy's address; on a native host, which runs no proxy, a steered name always gets SERVFAIL.

Covers:

  • BEP-062, BEP-078

Layers:

  • host:
    • crates/minimald-rpc/src/lib.rs: a BoxControlRequest::ProxyListening ask and its BoxControlReply::ProxyListening { listening } answer, admitted on the guest reports door beside RowStanding (re-planned 2026-10-25 by the epic owner: the listener state lives in minvmd on the host and the guest relay cannot link bep_host, so it asks over the report door)
    • crates/minvmd/src/control.rs: the guest reports door answers ProxyListening from the proxy's listening flag, and answers false when no proxy runs
    • crates/minvmd/src/cmd/run.rs: hands BepProxy::listening to the control server so the guest door can read it
    • cargo nextest run -p minvmd guest_door_answers_proxy_listening
  • relay:
    • crates/minimald/src/net/listeners.rs: proxy_listening asks over the report door the way host_row_standing does; None (a native host, which runs no proxy, or a door that does not answer within its deadline) reads as not live, so steered names fail closed with SERVFAIL
    • crates/minimald/src/net/dns.rs: ProxyListenerState refreshes from proxy_listening with a short cached answer; the allow(dead_code) interim goes
    • crates/minimald/src/net/dns_gate.rs: the allow(dead_code) interims on with_steering go, and the comment stops naming T113 — Admit dns and both steering where the host's switch resolves box names #2523
    • crates/minimald/src/net/switch.rs: BoxGate::for_session calls DnsGate::with_steering(policy, <credential module hosts>, <proxy address on the switch>, <shared ProxyListenerState>) for every box whose steering resolves to dns or both
    • crates/minimald/src/net/gvproxy_network.rs: passes the shared ProxyListenerState and the control channel it asks over into BoxGate::for_session
    • scripts/session-e2e.sh: in bep_dns_steering_fails_closed_end_to_end, leg 1's known_gap for the steered A lookup becomes an ::error:: line and ds_fail, and ds_a_gap with its known-gap branch goes, so the leg is a hard assertion of Networking §5.3 line 147 once steering is wired (arch C1 on test(minimald): prove DNS steering fails closed end to end (T32) #2550, widened 2026-10-25)
    • cargo nextest run -p minimald a_dns_steered_box_gets_servfail_while_the_proxy_is_down
    • cargo nextest run -p minimald a_steered_name_resolves_to_the_proxy_once_its_listener_is_live
    • cargo nextest run -p minimald a_native_host_steered_name_gets_servfail

Waits on:

Implements the filed residual #2523; those issues close with this task and do not block it.

Plan block
### T58 — Steer a dns or both box's credentialed names through the relay's gate in production
  slice: S9
  kind: task
  covers: BEP-062, BEP-078
  size: L
  est: 260 code, 300 tests
  executor: agent
  difficulty: needs care
  model: standard
  diagnostics: with the proxy stopped, a dns-steered box resolving github.com gets SERVFAIL, and the daemon log names the box and the name once per minute
  observability: one info line when the proxy's listener is reported live and the steered names resolve to it again
  layers:
    - host:
      - crates/minimald-rpc/src/lib.rs: a `BoxControlRequest::ProxyListening` ask and its `BoxControlReply::ProxyListening { listening }` answer, admitted on the guest reports door beside `RowStanding` (re-planned 2026-10-25 by the epic owner: the listener state lives in minvmd on the host and the guest relay cannot link `bep_host`, so it asks over the report door)
      - crates/minvmd/src/control.rs: the guest reports door answers `ProxyListening` from the proxy's `listening` flag, and answers `false` when no proxy runs
      - crates/minvmd/src/cmd/run.rs: hands `BepProxy::listening` to the control server so the guest door can read it
      test: cargo nextest run -p minvmd guest_door_answers_proxy_listening
    - relay:
      - crates/minimald/src/net/listeners.rs: `proxy_listening` asks over the report door the way `host_row_standing` does; `None` (a native host, which runs no proxy, or a door that does not answer within its deadline) reads as not live, so steered names fail closed with SERVFAIL
      - crates/minimald/src/net/dns.rs: `ProxyListenerState` refreshes from `proxy_listening` with a short cached answer; the `allow(dead_code)` interim goes
      - crates/minimald/src/net/dns_gate.rs: the `allow(dead_code)` interims on `with_steering` go, and the comment stops naming #2523
      - crates/minimald/src/net/switch.rs: `BoxGate::for_session` calls `DnsGate::with_steering(policy, <credential module hosts>, <proxy address on the switch>, <shared ProxyListenerState>)` for every box whose steering resolves to `dns` or `both`
      - crates/minimald/src/net/gvproxy_network.rs: passes the shared `ProxyListenerState` and the control channel it asks over into `BoxGate::for_session`
      - scripts/session-e2e.sh: in `bep_dns_steering_fails_closed_end_to_end`, leg 1's `known_gap` for the steered A lookup becomes an `::error::` line and `ds_fail`, and `ds_a_gap` with its known-gap branch goes, so the leg is a hard assertion of Networking §5.3 line 147 once steering is wired (arch C1 on #2550, widened 2026-10-25)
      test: cargo nextest run -p minimald a_dns_steered_box_gets_servfail_while_the_proxy_is_down
      test: cargo nextest run -p minimald a_steered_name_resolves_to_the_proxy_once_its_listener_is_live
      test: cargo nextest run -p minimald a_native_host_steered_name_gets_servfail
  produces: none
  consumes: none
  proof: In a running daemon with the proxy stopped, a dns-steered box resolving github.com gets SERVFAIL and never a real address; once the listener is live the same lookup gets the proxy's address; on a native host, which runs no proxy, a steered name always gets SERVFAIL.
  depends on:
    - blocked by T30

Generated by Claude Code

Activity

  1. added
    kind:taskA task the plan skill rendered; the body carries ## Task
    size:M200 to 500 net lines; one PR
    model:standardA standard model: work that needs care, or routine work that is large
    on Oct 25, 2026
  2. minimal-foundry commented on Oct 25, 2026

    @minimal-foundry
    Contributor

    Done. #2567 merged.

    branch agent/2538-steer-a-dns-or-both-box-s-credentialed-names-thr · epic #1501 · PR #2567

    round outcome job
    1 pushed cd36401c
    2 pushed 060b1ac1

    Updated 2026-10-26T01:52:37.299Z.

  3. added
    needs-humanAn agent handed off; a human must act, then clear this label. Set by defer and handoffs.
    on Oct 25, 2026
  4. added
    size:L500 to 900 net lines; one PR, and the ceiling
    and removed
    size:M200 to 500 net lines; one PR
    on Oct 25, 2026
  5. norrietaylor commented on Oct 25, 2026

    @norrietaylor
    MemberAuthor

    Re-planned on 2026-10-25 by the epic owner's decision. The last run reported that the layers could not work: ProxyListenerState is in minimald, bep_host runs in minvmd on the host behind the switch crate's stack-peer feature, and the guest relay cannot link it. The new layers carry the listener state over the guest reports door, the way RowStanding already works: minimald-rpc gains a ProxyListening ask, minvmd's guest door answers it from BepProxy::listening, and the relay's proxy_listening reads None (no answer, or a native host that runs no proxy) as not live, so steered names fail closed with SERVFAIL. The relay caches the answer briefly. crates/switch/src/bep_host.rs is no longer a layer. Size moves from M to L (260 code, 300 tests), with a native-host test and a minvmd guest-door test added. needs-human is removed so the runtime walks T58 again.


    Generated by Claude Code

  6. 67B3
    removed
    needs-humanAn agent handed off; a human must act, then clear this label. Set by defer and handoffs.
    on Oct 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind:taskA task the plan skill rendered; the body carries ## Taskmodel:standardA standard model: work that needs care, or routine work that is largesize:L500 to 900 net lines; one PR, and the ceiling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      0