Repository navigation
row 130 E2: net_guard leaves busbar-kernel; the kernel resolves no name itself (stacked on #796) - #800
Conversation
…o-socket pin armed (E7) The inbound listener's accept/serve loop (hyper-util's auto builder, graceful shutdown, the body read bounds, the accept backoff and the connection-placement balancer) moves verbatim from busbar-kernel/src/tls.rs into the composition root, crates/busbar/src/root/listener.rs. The connector binds every listener (Listening::bind_stream) and hands each admitted stream up; the accept-source trait (Admits, Admitted) moves to busbar-core-connector's listen.rs beside the listener that implements it. tls.rs keeps read_pem for its outbound callers. The kernel drops tokio-util. BUSBAR-1.6.0.md l.475-483 (INBOUND-LISTEN: the root's stream hand-up) and the ARCHITECT ruling on #710 (2026-10-10). This is #741's change on current predev; it supersedes #741. Tests move with the code: the kernel's tls_tests.rs and busbar/tests/tls_listener_h2.rs become root/tests/listener_tests.rs and listener_h2_tests.rs; the connector's TLS-listener rows join them (their scratch PEM name keeps predev's unique-per-call suffix). Ledgers: law0 busbar-kernel x transport 285 -> 268 and busbar x transport 208 -> 225 (the move, total flat, per the #710 ruling); population floor 947 -> 948 (root/listener.rs is a new file; tls.rs stays). E7: crates/busbar-kernel/tests/no_socket.rs holds busbar-kernel to a drain-only pin of every (file, needle) naming a socket, resolver or HTTP client/server stack, and every manifest ask for one; tls.rs is not in it. A new offender is RED, a drained pin left standing is RED, and the RED arm plants a dial, a resolver and a server stack and sees each.
…me itself busbar-kernel/src/net_guard.rs was a glob re-export of the egress unit's guard (busbar_kernel_egress::trust::net) plus SystemResolver, a getaddrinfo on a thread of its own: the one piece of the guard that touched the network. Deleted. - The kernel's call sites name the guard in its homes: the pure host atoms from busbar_contract::net (observability, config_validate, plane_host/guard), the pre-dial guard from busbar_kernel_egress::trust::net (plane_host/egress, egress/duplex_ws, config_validate's ssrf_blocked_host re-export). Same items, same answers. - The name lookup is the connector's. busbar_core_connector::process::SystemNames is the deleted SystemResolver, verbatim, implementing the unit's Resolver seam. The root installs it behind the egress-trust capability (GuardedEgressTrust's third field) with the guard and the TLS wrap, at the same boot step. The kernel's two resolve-then-pin dials (the plane-host egress open and the duplex_ws dial) ask plane_host::egress_trust::InstalledResolver, which reads the capability. With no guarded capability, a production kernel refuses the name (fail closed); a test build resolves through egress::fixtures::system_names, the same body, in test scaffolding. No new static. - The connector reads split_url from the unit instead of through the shim, and depends on busbar-kernel-egress (kind-isolation [[dep]] row, cleanliness -> kernel, allowed). core-oauth2 reads parse_url from busbar_contract::net. busbar-a2a and busbar-voice (legacy, deleted by #787 and #503) reach the unit through the kernel's existing busbar_kernel::proxy::egress_unit re-export, so no new legacy edge. - Tests: the shim suites' four rows the unit's suite did not already hold move to busbar-kernel-egress trust/tests/net_tests.rs; the other 32 were duplicates of it. egress_trust_tests gains the_guarded_seam_resolves_by_the_resolver_behind_it. The root's net_guard_one_judge compares config_validate's re-exports with the unit. no_socket strikes ("src/net_guard.rs", "lookup_host"). - Population floor 948 -> 947 (one non-test file deleted, reviewed).
promote into
|
| crate | test | step | first panic |
|---|---|---|---|
no_io_outside_hostio |
a_dial_planted_outside_the_hosts_io_is_named |
test:no-default-features | crates/busbar-core-connector/tests/no_io_outside_hostio.rs:132:5: assertion 'left == right' failed: [("compose.rs", 1652, "TcpStream::connect"), ("process.rs", 389, "tokio::net")] |
no_io_outside_hostio |
no_source_file_but_the_hosts_io_touches_an_os_handle |
test:no-default-features | crates/busbar-core-connector/tests/no_io_outside_hostio.rs:116:5: assertion 'left == right' failed |
-p busbar-core-connector --test no_io_outside_hostio |
test target failed |
test:no-default-features | |
| `` | nextest busbar-core-connector::no_io_outside_hostio::a_dial_planted_outside_the_hosts_io_is_named |
test:workspace | |
| `` | nextest busbar-core-connector::no_io_outside_hostio::no_source_file_but_the_hosts_io_touches_an_os_handle |
test:workspace |
Denied because (2)
- shard 2/4: gate:test:no-default-features: green at base, red now (test: no_io_outside_hostio (tests/no_io_outside_hostio.rs)::a_dial_planted_outside_the_hosts_io_is_named, test: no_io_outside_hostio (tests/no_io_outside_hostio.rs)::no_source_file_but_the_hosts_io_touches_an_os_handle, test: target -
- shard 3/4: gate:test:workspace: green at base, red now (nextest: busbar-core-connector::no_io_outside_hostio::a_dial_planted_outside_the_hosts_io_is_named, nextest: busbar-core-connector::no_io_outside_hostio::no_source_file_but_the_hosts_io_touches_an_os_handle)
Judged against base 0f49f8375: 2 new red, 0 worse, 6 standing (excused).
New reds: gate:test:no-default-features: green at base, red now (test: no_io_outside_hostio (tests/no_io_outside_hostio.rs)::a_dial_planted_outside_the_hosts_io_is_named, test: no_io_outside_hostio (tests/no_io_outside_hostio.rs)::no_source_file_but_the_hosts_io_touches_an_os_handle, test: target -p busbar-core-connector --test no_io_outside_hostio), gate:test:workspace: green at base, red now (nextest: busbar-core-connector::no_io_outside_hostio::a_dial_planted_outside_the_hosts_io_is_named, nextest: busbar-core-connector::no_io_outside_hostio::no_source_file_but_the_hosts_io_touches_an_os_handle)
Already red on predev, not this PR's: 14
| gate | row | detail |
|---|---|---|
| test:xtask-selftest | ::xtask selftest kind-isolation |
|
| test:xtask-selftest | ::xtask selftest plane-purity |
|
| test:xtask-selftest | ::xtask selftest no-deferral-strict-done |
|
| test:xtask-selftest | ::xtask selftest plane-purity-strict |
|
| test:xtask-selftest | ::xtask selftest unconstructed |
|
| test:xtask-selftest | ::xtask selftest plane-transport-neutrality |
|
| construction | one-pick-site |
3 production call site(s) of 'pick_among(' (ceiling 2): crates/busbar-kernel-egress/src/walk.rs:358; crates/busbar-llm/src/engine/exhaustion/fallback.rs:120; crates/busbar-llm/src/engine/pipeline.rs:8 |
| kind-isolation | kind-isolation:deps |
3 finding(s), 93 shipped edge instance(s) over 29 class(es), 93 declaration(s); 56 '[[dep]]' row(s), 0 question(s): unlisted-dep-edge legacy -> plane busbar-llm -> busbar-plane-llm is a shipped edge w |
| kind-isolation-ship | kind-isolation:deps |
8 finding(s) over 93 shipped edge(s): ship-edge kernel -> store busbar-kernel -> busbar-store-memory is 'not-allowed': the architecture grants no kernel -> store edge, and the ship criterion is the ar |
| kind-isolation-ship | kind-isolation:test-deps |
5 finding(s) over 31 test edge(s): ship-edge cleanliness -> export busbar-core-admin -> busbar-export-prometheus is 'not-allowed': the architecture grants no cleanliness -> export edge, and the ship c |
| kind-isolation-ship | kind-isolation:faces |
2 finding(s) over 40 crate(s): foreign-entry crates/busbar busbar is kind 'root' and implements 'Transport' 1 time(s) in shipped source — the entry face of kind 'transport'. A trait implementation is |
| kind-isolation-ship | kind-isolation:legacy-drain |
3 finding(s): transitional-live qa/kind-isolation.toml 'busbar-a2a -> busbar-core-admin' (legacy drain: the retiring A2A engine's tests drive the admin surface that drained into the cleanliness tier) |
| ship-ready | ship-ready:ship-twin |
'kind-isolation-ship' is not green: kind-isolation:deps (a dependency the architecture does not grant is still in the graph); kind-isolation:test-deps (a dependency the architecture does not grant is |
| structure-lint | structure-lint:plane-dup:unledgered |
22 finding(s): PLANE-DUPLICATE (module): 'config.rs' — a2a:crates/busbar-a2a/src/a2a/config.rs decisions:crates/busbar-plane-decisions/src/config.rs voice:crates/busbar-voice/src/config.rs (the ledger |
tests passed: 36299, failed: 2. Run: https://github.com/GetBusbar/busbar/actions/runs/38346116048 . Artifact verdict-028c1d7352e846dcd57b5e3b7ad7eb88fbe0bd33 (failures.json, junit.xml, raw.log; 90 days).
- design bindings PB-68: the shared-predicate row names its surviving copy in the egress unit's suite (crates/busbar-kernel-egress/src/trust/tests/net_tests.rs, same test), not the deleted kernel suite; qa-names and design-bindings:regen-clean follow. - law0 busbar-kernel x plane 1172 -> 1166: the shim and its suites carried six plane words. - The moved NAT64 row's doc names no plane (busbar-kernel-egress x plane stays at 5).
…ener # Conflicts: # xtask/src/gates/population.rs
# Conflicts: # xtask/src/gates/population.rs
…guard # Conflicts: # qa/kind-isolation.toml # xtask/src/gates/population.rs
…guard # Conflicts: # xtask/src/gates/population.rs
no_io_outside_hostio holds that no connector file but the host's I/O touches the OS, and SystemNames (the system name lookup the kernel's remaining resolve-then-pin dials ask through the egress-trust capability) called tokio::net::lookup_host from process.rs. It moves, unchanged, into hostio.rs, the host's I/O; the root installs busbar_core_connector::hostio::SystemNames. The test's allowlist is unchanged.
#798 (row 157) deleted plane_host/guard.rs and the guard_url slot, and moved the egress-trust capability to egress::trust: the kernel's resolve-then-pin dials ask egress::trust::InstalledResolver. Ledger by the merge rule (theirs + ours - base): busbar-kernel x plane 1168/1162/1141 -> 1135, busbar-kernel x transport 285/268/284 -> 267.
#741 landed the same E1 listener move on predev (7fe0203, 5f189a7), so every E1 conflict takes predev's side: crates/busbar/src/root/listener.rs and crates/busbar-kernel/src/tls.rs (predev's comments name a plane's outbound identity, not busbar-a2a), xtask/src/gates/population.rs (predev replaced the hand-pinned FLOOR with the tracked-set reconciliation). qa/kind-isolation.toml: busbar x transport and busbar-kernel x transport each carry the same +17/-17 move on both sides, so theirs (224, 266) is taken, count and cite: adding both deltas would count the move twice. What this branch still adds over predev is crates/busbar-kernel/tests/no_socket.rs (the kernel's no-socket pin, E7); its PINNED list matches predev's kernel exactly (no new pair, none drained).
… into lane-egress-e2-net-guard qa/kind-isolation.toml: predev's rows, plus this branch's own E2 drain. busbar x transport and busbar-kernel x transport: this branch carries the same E1 +17/-17 move #741 landed on predev, so theirs (224, 266) is taken, count and cite. busbar-kernel x plane: predev 1128 (row 156 and #674 drains since this branch's last predev, 1141) minus E2's own six (net_guard.rs and its two suites deleted: 1141 -> 1135 here) = 1122, predev's cite kept with E2's clause renumbered 1128 -> 1122. Every other row is predev's.
qa/kind-isolation.toml busbar-kernel x plane: base 1128, ours 1124 (E5a's proxy-tunnel drain), theirs 1122 (E2's net_guard deletion): different drains, so theirs + ours - base = 1118, predev's cite kept with E5a's clause renumbered 1122 -> 1118. The kernel no-socket pin (#796) stays exact on the merged tree.
- crates/busbar-plane-a2a/src/a2a/config.rs: this branch's wording kept (the cloud-metadata refusal is the host's destination guard's); predev's edit was a doc-link repoint in the deleted engine's copy of the same file. - crates/busbar-a2a/**: predev's edits (net_guard -> busbar_contract::net doc and path repoints) land in files this branch deletes with the crate. - crates/busbar-kernel/src/net_guard.rs: deleted, as predev deletes it (this branch's edit there was one comment). - qa/kind-isolation.toml busbar-kernel x plane: B 1128, predev 1122 (E2: net_guard.rs and its two suites, -6), ours 1105 (FLIP-A2A, -23) -> 1100, not T + O - B = 1099: one of this branch's 23 was net_guard.rs's `busbar-a2a` comment, a hit E2's deletion of the file also drains, so the two drains overlap by one. Predev's cite kept whole; this branch's clause appended as 1122 -> 1100.
The six conflicts are modify/delete in busbar-voice: predev's row 130 E2 (bc8fb93) re-pointed the crate's GuardPolicy imports from busbar_kernel::net_guard to the egress unit's re-export, and #503 deletes the crate. Settled as deleted: the crate is gone, so the re-point has nothing to land on, and no surviving file names busbar_kernel::net_guard. #800's egress move (net_guard out of the kernel, the root's listener serve loop) and #503's flip merge without overlap in the other shared files (Cargo.toml, Cargo.lock, the kernel and root manifests, main.rs, linked.rs, router.rs, duplex_ws_tests.rs); the lock resolves under --locked. qa/kind-isolation.toml, settled by hand: no count row was moved by both sides. #503 keeps its busbar x plane 810 and its struck busbar-voice rows; predev keeps busbar x transport 224, the kernel's auth 48 / instance:secret 114 / plane 1122 / store 1 / transport 266, the plugin loader's auth 2 / instance:secret 107, and the struck kernel -> busbar-store-memory row.
…ress::trust::net, where #800 left them #800 (E2) deleted the kernel's net_guard re-export, so the merge of predev left this stack's crate::net_guard / busbar_kernel::net_guard paths naming a module that no longer exists. They now name busbar_kernel_egress::trust::net directly, as predev's own callers do (plane_host/egress.rs, core-connector guard.rs/process.rs). No behaviour change.
/status row 130 (E2):
net_guardleaves busbar-kernel, and the kernel no longer resolves names itself. Stacked on the E1 PR (#796): its diff includes E1's commit until that lands.busbar-kernel/src/net_guard.rswas two things: a glob re-export of the egress unit's guard (busbar_kernel_egress::trust::net), andSystemResolver, which rangetaddrinfoon its own thread. The resolver was the only part that touched the network. This PR deletes the file. The design rule it follows is THE DESIGN §5: "Every scattered check (net_guard, the SSRF helpers, per-plugin checks) is deleted"; the connector holds the network.busbar_contract::net: observability, config_validate andplane_host/guard.busbar_kernel_egress::trust::net:plane_host/egress,egress/duplex_ws, and config_validate'sssrf_blocked_hostre-export.trust::netglob-re-exportscontract::netand shadows none of these names, so every call reaches the same function as before.busbar_core_connector::process::SystemNamesis the deletedSystemResolver, moved verbatim, implementing the unit'sResolverseam.GuardedEgressTrust's third field), at the same boot step as the guard and the TLS wrap.plane_host::egress_trust::InstalledResolver, which reads that capability.egress::fixtures::system_namesinstead: the same body, kept in test scaffolding.door-only:static-seamforbids one.split_urlfrom the unit and depends onbusbar-kernel-egress. This adds a kind-isolation[[dep]]row (cleanliness -> kernel, allowed).parse_urlfrombusbar_contract::net.busbar_kernel::proxy::egress_unitre-export, so no new edge.busbar-kernel-egresstrust/tests/net_tests.rs. The other 32 were duplicates of it.the_guarded_seam_resolves_by_the_resolver_behind_it.net_guard_one_judgenow compares config_validate's re-exports with the unit.no_socketstrikes("src/net_guard.rs", "lookup_host").Behaviour: the same guard and the same resolution body give the same answers. #780 touches other parts of the same two connector files (
guard.rs,process.rs); the hunks do not overlap.Proof: ModernCI (owner rule 2026-10-12, no hand runs on the M3). The kernel-egress suite gains four rows; the root's
net_guard_one_judgeand the kernel'sno_socketcover the moved paths.