8000 test(e2e): walk the round-two BEP conditions end to end (T76) by minimal-foundry[bot] · Pull Request #2665 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

test(e2e): walk the round-two BEP conditions end to end (T76) - #2665

Merged
norrietaylor merged 14 commits into
mainfrom
agent/2591-round-two-conditions-closed-end-to-end
Oct 28, 2026
Merged

norrietaylor merged 14 commits into
mainfrom
agent/2591-round-two-conditions-closed-end-to-end

Conversation

@minimal-foundry
@minimal-foundry minimal-foundry Bot commented Oct 27, 2026 •
Copy link
Copy Markdown
Contributor

T76 — Round-two conditions closed, end to end

slice: S10
kind: integration
covers: BEP-032, BEP-067, BEP-063, BEP-018, BEP-070, BEP-068
size: M
est: 0 code, 120 tests
executor: agent
difficulty: needs care
model: standard
diagnostics: each case prints PASS or NOT RUN with its gate
observability: none beyond the cases' own output
layers:
- e2e:
- scripts/session-e2e.sh: one walk over the round-two conditions: a store value injected by bep serve under a client rule, a replaced client key that keeps verifying, the audit jti, the key bound, the cohort flows and race, the revoked-id collision and the quarantine start; NOT RUN where its gate is missing (#2500)
test: ./scripts/session-e2e.sh bep_round_two_conditions_closed
produces: none
consumes: none
proof: The second round of residuals is done: bep serve injects store values under the client's store rules, a replaced client key keeps verifying until its boxes end, the audit record carries the handle's jti, the key bound and kid diagnostics are in place, BEP-063 states revocation and replacement, a blocked cohort ends its earlier UDP 443 flows and its injected processes, a revoked id never returns, and an unreadable audit line has a chain-preserving way out. Its tasks re-cover requirements whose origin tasks merged with an arch condition held on a filed residual; the owner accepted that double coverage on 2026-10-26 so the residuals dispatch as slices.
depends on:
- blocked by #2257
- assumes OQ3 (the mint reads the root certificate's own expiry, and the root is generated with a fixed default validity in one constant that gominimal/arch#85's ruling replaces)
- blocked by #2586
- blocked by #2576
- blocked by #2579
- blocked by #2580
- blocked by #2578
- blocked by #2558
- blocked by #2559
- blocked by #2585
- blocked by #2588
- blocked by #2599
- blocked by #2605

Proof

A person can run './scripts/session-e2e.sh bep_round_two_conditions_closed' and see one walk over the round-two conditions. Each leg prints PASS, or NOT RUN with its gate. On a macOS lane with a live proxy, the key leg does these checks. It writes a value that is no key into the client key's keychain item, and the next box replaces the key. The proxy keeps the replaced key, named by its kid, and the earlier box still answers 'gh api user'. Each box's admit records carry a jti of their own. The destroy records a revocation, and the proxy then revokes the replaced key by its kid. The re-created box gets a new UUIDv7 id. 'bep serve --help' names --max-client-keys. On native Linux with the QUIC block installed, the cohort leg checks that earlier UDP 443 flows, and injections made during and after the turn, all end with 'Connection refused', and that box A sends UDP 443 again when the last blocking box ends. With E2E_BEP_QUARANTINE=1, the quarantine leg checks that an unreadable audit line refuses a box creation and a plain 'bep serve'. It then checks that 'bep serve --quarantine-unreadable' moves the segment aside, writes a chained quarantine record and serves. The store leg checks that bep serve read the client's store rules. Store injection itself stays NOT RUN, because no box can carry a store handle yet (#2525). This box ran no leg, so no leg's PASS is observed yet.

Notes from the agent: On this Linux box every leg is NOT RUN, so the walk's checks are not yet observed. They need a macOS lane with a live proxy, a native Linux lane with the QUIC block installed, and E2E_BEP_QUARANTINE=1. shellcheck -x on the script is clean. Gaps: (1) BEP-032 injection is NOT RUN against #2525, because mint_store_handle has no caller and no box carries a store handle. The leg checks only that bep serve logs that it holds the client's secret-store rules. (2) A colliding box id cannot be produced from the CLI. The walk checks the revocation record, a new UUIDv7 id on re-cre…[truncated]

Arch conditions at 8324f08e

leg condition evidence
store: injection of the store value C1 (BEP-032, Gatehouse §6.10 line 842) Held on #2525, now T98 in the plan. The leg prints NOT RUN until a box carries a store handle, and then it becomes a check of the injected value.
key: a replaced client key keeps an earlier box answering C2 (BEP-063, BEP-067, BEP-070) Held on #2500, the manual macOS lane. It runs only with E2E_BEP_KEY_REPLACE=1 on every host, CI included (the owner's ruling on the security thread). Its PASS line is recorded on #2500.
quarantine: the unreadable-segment way out C3 (BEP-068, Gatehouse §6.10 line 839) Held on #2500. It runs only with E2E_BEP_QUARANTINE=1 on a host whose audit log may be moved aside. Its PASS line is recorded on #2500.

Tests

line exit tail
ci-linux-native native-daemon-e2e at 0685ee75, whole-lane order, cohort leg (https://github.com/gominimal/minimal/actions/runs/40459955593/job/122048969812) 0 the cohort blocks UDP 443: box A's own leaf is in quic443_blocked_leaves · flow1, flow2, race1, race2: refused · injection while blocked: refused · after box B ended: box A's UDP 443 is not refused · bep_round_two_conditions_closed/cohort: PASS (earlier flows and injections during and after the turn all refused, and released with the last blocking box) · store, key: NOT RUN (macOS only) · quarantine: NOT RUN (opt-in)
./scripts/session-e2e.sh bep_round_two_conditions_closed 0 ::group::round-two conditions closed: store rules, client key, audit jti, key bound, cohort, revoked id, quarantine bep_round_two_conditions_closed/store: NOT RUN (the Box Egress Proxy runs on macOS only) bep_round_two_conditions_closed/key: NOT RUN (the Box Egress Proxy runs on macOS only) bep_roun

Verify

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

Closes #2591


Generated by Claude Code

Add bep_round_two_conditions_closed. Its legs check the store rules
that bep serve holds, a replaced client key, the audit jti, the key
bound, the QUIC cohort flows and race, the revoked id and the
quarantine start. Each leg prints PASS or NOT RUN with its gate.
@coderabbitai
coderabbitai Bot commented Oct 27, 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: a006b28f-a2a8-4faf-8c12-a99e453604db

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

Comment @coderabbitai help to get the list of available commands.

@minimal-foundry
minimal-foundry Bot commented Oct 27, 2026 •
Copy link
Copy Markdown
Contributor Author

Approved: every review thread resolved at 8324f08efce3.

@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 — advisory review

Verdict COMMENT — 3 findings, 3 inline.

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

Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
@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 · 2 conditions · the full ruling

The walk's checks agree with Gatehouse §6.10 lines 839 and 842 and Networking line 150. But no leg ran on this head, so no requirement is proven yet. The cohort and quarantine legs print NOT RUN with no owning issue. C1 adds that issue to their reasons. C2 keeps each requirement open until a lane prints the leg's PASS line.

Ruled at cf635fd against gominimal/arch@109541a48c31 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
The key leg now runs under CI, or with E2E_BEP_KEY_REPLACE=1, so a
local run does not replace the developer's client signing key. The
teardown trap deletes a refused key value that a failed leg leaves in
the keychain. It also stops the quarantine leg's bep serve, removes
its sockets, and takes the unreadable line back out of the audit
segment on every exit path.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
./scripts/session-e2e.sh bep_round_two_conditions_closed 0 ::group::round-two conditions closed: store rules, client key, audit jti, key bound, cohort, revoked id, quarantine bep_round_two_conditions_closed/store: NOT RUN (the Box Egress Proxy runs on macOS only) bep_round_two_conditions_closed/key: NOT RUN (the leg replaces the client signing key in this m

Verify min task run agent-verify passed.

Review threads the coder judged:

  • 👍 valid — scripts/session-e2e.sh:13435: The teardown EXIT trap now deletes the dev.minimal.client-key item when a failure lands between the write of not-a-key and box B's creation, so no refused value is left. After box B, the item holds the valid replacement key, so later creations do not have to replace it.
  • 👍 valid — scripts/session-e2e.sh: The teardown EXIT trap 8000 now stops the quarantine leg's bep serve pipeline and removes its socket dir. It also cuts the audit segment back to its size before the write, but only when the segment still ends with the unreadable line.
  • 👍 valid — scripts/session-e2e.sh:13437: The key leg now runs only under CI or with E2E_BEP_KEY_REPLACE=1. Otherwise it prints NOT RUN and names the variable. The original key is not restored, because the proxy revokes it when box A ends.

A person can run ./scripts/session-e2e.sh bep_round_two_conditions_closed. The case walks the round-two conditions: the store rules that bep serve holds, a replaced client key that keeps verifying until box A ends, one audit jti per box, the --max-client-keys bound, the cohort flows, the revoked id that never returns, and the quarantine start. Each leg prints PASS, or NOT RUN with its gate. This round, a local run no longer replaces the developer's client key unless they opt in. A failed leg no longer leaves a refused key, an unreadable audit line, or a running bep serve behind.

Notes from the agent: Revise round 1. This box is Linux, so the live legs (store, key, quarantine) and the cohort leg did not run here. They need the macOS VM lane with a GitHub sign-in, and the QUIC block for the cohort leg. I tested the new rt_quarantine_unwrite helper by itself on a temporary file: it cut the appended line and kept the earlier record. The original client key is not backed up and restored. The proxy revokes it when box A ends, so a restored copy cannot verify. Also, a read of the item through 'security find-generic-password -w' can block on a keychain access prompt on a headless runner. The key leg is gated instead: it runs when CI is set (GitHub Actions sets it), or with E2E_BEP_KEY_REPLACE=1.

@minimal-foundry minimal-foundry Bot added the needs-human An agent handed off; a human must act, then clear this label. Set by defer and handoffs. label Oct 27, 2026
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

The runtime will not revise this pull request again on its own: the diff is +521/-2 (523 lines), past 3x the plan's estimate of 120 lines (est: 0 code, 120 tests, as #2591 reads now), at round 1 (the last trigger was the runtime's review findings). A person decides now. Remove needs-human from this pull request to let /revise <note> or the automatic rounds resume, or finish #2591 by hand.

@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 — 2 findings, 2 inline.

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

Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
@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 · 2 conditions · the full ruling

The compare runs the key leg only under CI or with E2E_BEP_KEY_REPLACE=1. It also adds teardown that puts the keychain and the audit segment back. That teardown removes only the test's own unchained line, so the §6.10 hash chain stays whole. No requirement deviates. Every leg is NOT RUN on this head, so C1 keeps the legs open on #2500. C2 keeps BEP-032 injection open on #2525.

Ruled at 039f4fd against gominimal/arch@109541a48c31 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
norrietaylor commented Oct 27, 2026 •
Copy link
Copy Markdown
Member

/revise

Revise round on the arch conditions and review findings at 039f4fd7. No round is in flight. The epic owner ruled on 2026-10-27 that this epic files no more residuals, so each leg that can run in CI runs there. The store and key legs need the macOS lane with a live proxy (#2500, and #2657 stages bep there), and the injection check needs #2525. Those stay as they are.

  1. Cohort leg on the native Linux CI lane (C1). The QUIC block is installed there, as test(e2e): close the round-one arch conditions end to end (T56) #2604's bep_host_ip_cohort_blocks_udp_443 shows. With CI set, make a missing classifier gate print ::error::a CI native lane must be able to load the classifier table: <why> and fail, as proof_host_ip_deny_all does. Off CI it still records NOT RUN, and the NOT RUN reason names the native Linux lane.
  2. Quarantine leg in CI (C1). With CI set, run the quarantine leg as if E2E_BEP_QUARANTINE=1 were set, because a CI runner's audit log is disposable. The teardown trap already restores the segment. Off CI it stays opt-in, and its NOT RUN reason names E2E_BEP_QUARANTINE=1.
  3. Make sure bep_round_two_conditions_closed is in the whole-lane order, so ci-linux-native runs it.
  4. Cohort timing (test(e2e): walk the round-two BEP conditions end to end (T76) #2665 (comment)). Do not test the refused flow against a fixed window from co_t0. After box B's activation returns and its first exec runs, poll for the block, either through the daemon's stance-change log line or through box A's own leaf in quic443_blocked_leaves. Then probe, and expect the refusal within 2 s. Accept 'Operation not permitted' as well as 'Connection refused', because a host-address box's reject runs in the local OUTPUT hook and fails sendmsg with EPERM (see test(e2e): close the round-one arch conditions end to end (T56) #2604).
  5. Store leg count (test(e2e): walk the round-two BEP conditions end to end (T76) #2665 (comment)). Print a PASS line for the rules check before adding store to RT_RAN, or do not count the leg as run when only the injection check (NOT RUN) remains.
  6. Change nothing else. Run just test-one all_scripts_pass_shellcheck.

Generated by Claude Code

The cohort leg polls for box A's leaf in quic443_blocked_leaves instead
of a fixed window, and accepts EPERM. The store leg prints a PASS line
for its rules check.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
./scripts/session-e2e.sh bep_round_two_conditions_closed 0 ::group::round-two conditions closed: store rules, client key, audit jti, key bound, cohort, revoked id, quarantine bep_round_two_conditions_closed/store: NOT RUN (the Box Egress Proxy runs on macOS only) bep_round_two_conditions_closed/key: NOT RUN (the leg replaces the client signing key in this m

Verify min task run agent-verify passed.

Review threads the coder judged:

  • 👍 valid — scripts/session-e2e.sh: Both cohort NOT RUN reasons now name the native Linux CI lane (ci-linux-native) that runs the leg. Under CI a missing QUIC block or sudo is now an ::error:: and fails, as proof_host_ip_deny_all does.
  • 👍 valid — scripts/session-e2e.sh: CI now runs the quarantine leg as if E2E_BEP_QUARANTINE=1 were set. The off-CI NOT RUN reason names E2E_BEP_QUARANTINE=1 and the live-proxy lane (T82 — Run the Box Egress Proxy legs on the macOS lane #2500).
  • 👍 valid — scripts/session-e2e.sh:13795: Holds: every leg prints NOT RUN on this box. No code change answers it. The PASS lines must come from the lane runs (ci-linux-native for cohort, the T82 — Run the Box Egress Proxy legs on the macOS lane #2500 macOS lane for store, key and quarantine) before T76 — Round-two conditions closed, end to end #2591 closes.
  • 👍 valid — scripts/session-e2e.sh: The leg polls quic443_blocked_leaves for box A's leaf after box B's first exec and drops the co_t0+25 window. Flows last 120 s and must end refused within 2 s of the block seen. EPERM is accepted.
  • 👍 valid — scripts/session-e2e.sh:13374: The store leg prints 'bep_round_two_conditions_closed/store/rules: PASS' before it adds store to RT_RAN.
  • 👍 valid — scripts/session-e2e.sh:13383: Holds, but this box cannot do it: it has no macOS lane or live proxy. The key leg's PASS transcript must come from the T82 — Run the Box Egress Proxy legs on the macOS lane #2500 macOS lane and go into the PR Proof section. No code change this round.
  • 👍 valid — scripts/session-e2e.sh: CI now runs the quarantine leg without the variable. The PASS transcript needs a live proxy, which is the T82 — Run the Box Egress Proxy legs on the macOS lane #2500 macOS lane, and this box has none. It is still owed for the PR Proof section.
  • 👍 valid — scripts/session-e2e.sh:13375: Holds, and it stays open until T98 — Seal a store handle per accepted store rule at box creation #2525 gives a box a store handle. The directive keeps the injection not_run as it is for this round.

A person can run ./scripts/session-e2e.sh bep_round_two_conditions_closed and see each leg print PASS or NOT RUN with its gate. On the native Linux CI lane, the cohort leg now fails with '::error::a CI native lane must be able to load the classifier table: ' when the QUIC block is missing, and it waits for box A's leaf in quic443_blocked_leaves before it checks the refusals. Under CI the quarantine leg runs without E2E_BEP_QUARANTINE=1. The store leg prints a PASS line for its rules check. On this box every leg printed NOT RUN, so this round proves no leg yet. The store, key and quarantine legs need the macOS lane with a live proxy (#2500), and the injection check needs #2525.

Notes from the agent: Item 3: no change was necessary. proof_bep_round_two_conditions_closed is already in the whole-lane order (scripts/session-e2e.sh, the no-argument dispatch), and no OS branch guards it. Item 1: the CI error also covers a missing passwordless sudo, as proof_host_ip_deny_all does, because the leg cannot place the daemon in the classifier tree without it. Off CI the reason names the native Linux CI lane (ci-linux-native). The uname/E2E_VM gate stays NOT RUN under CI, because the VM lanes run the same whole-lane order. Item 4: the earlier flows now last 120 s, so a slow activation of box B cannot end them before the block. After box B's activation and first exec, the leg polls 'nft -j list set inet minimal_class quic443_blocked_leaves' for box A's own leaf (its box id, which sanitize_box_id keeps as is) for up to 30 s. Each flow must end refused between the start of box B's activation and 2 s after the block was seen. The injected probe must be refused within 2 s, timed inside the box. 'Operation not permitted' counts as a refusal everywhere 'Connection refused' did. I did not run the cohort leg on a host with the classifier installed, so its new poll is not observed yet. just clippy-strict was not run (no Rust changed).

@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 — 2 findings, 2 inline.

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

Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
@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 · 3 conditions · the full ruling

The compare makes the cohort and quarantine legs run under CI, and each new path has a defect. Under CI the quarantine leg moves the real audit segment of the persistent macOS runner into quarantine. Gatehouse §6.10 line 839 says start restores the revocation records from every retained segment. Restore the opt-in (C1). Under CI the cohort leg fails when no classifier is installed before the walk, and no native job installs one. Install it in the leg, as proof_host_ip_deny_all does (C2). The EPERM match also accepts a silent drop. Assert the reject rule when the flow sees EPERM (C3).

Ruled at b5bdba0 against gominimal/arch@109541a48c31 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
Copy link
Copy Markdown
Member

/revise

Revise round on the arch CONDITIONS at b5bdba02. No round is in flight. My previous note was wrong to turn the quarantine leg on under CI: the macOS lane is a persistent self-hosted runner with a real audit log. Apply these three conditions as written:

  • C1: scripts/session-e2e.sh rt_leg_quarantine(): change the gate back to if [ "${E2E_BEP_QUARANTINE:-}" != 1 ]; then, so CI alone never runs the leg. Delete the comment "A CI runner's audit log is disposable ... The teardown trap restores the segment.", and remove "and always on under CI" from the case header comment (line 13289). The macOS lane runs on a persistent self-hosted runner against the real $HOME/.minimal/bep/audit, and on PASS the leg leaves that segment in quarantine/.
  • C2: scripts/session-e2e.sh rt_leg_cohort(): under CI, install the classifier in the leg itself, as proof_host_ip_deny_all does. Use the same gates (nft, ip, sudo -n, the --print-ruleset mount rehearsal, the default-route source address), run sudo -n scripts/install-host-classifier.sh --cohort-address "$src" --node-plane-address "$src", set a CO_CLASSIFIER_INSTALLED flag before it, and add a branch in teardown() that runs --uninstall when the flag is set. Call fail only when a gate or the install fails. If the leg does not install, remove the fail under CI and remove the text "The native Linux CI lane (ci-linux-native) runs this leg" from both not_run reasons.
  • C3: scripts/session-e2e.sh rt_leg_cohort(): when a flow or probe output matches only "Operation not permitted", also assert that sudo -n nft list table inet minimal_class contains @quic443_blocked_leaves udp dport 443 reject with icmpx port-unreachable, and call co_fail when it does not. A drop in the output hook also gives EPERM, so without this check the leg accepts a silent drop.

Change nothing else. Run just test-one all_scripts_pass_shellcheck.


Generated by Claude Code

Keep the quarantine leg opt-in only, since the macOS runner keeps its
real audit log. Under CI the cohort leg installs and removes its own
classifier, and an EPERM refusal must show the reject rule in the table.
…conditions-closed-end-to-end

# Conflicts:
#	scripts/session-e2e.sh
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

Resolved conflicts in: scripts/session-e2e.sh

line exit tail
./scripts/session-e2e.sh bep_round_two_conditions_closed 0 ::group::round-two conditions closed: store rules, client key, audit jti, key bound, cohort, revoked id, quarantine bep_round_two_conditions_closed/store: NOT RUN (the Box Egress Proxy runs on macOS only) bep_round_two_conditions_closed/key: NOT RUN (the leg replaces the client signing key in this m

Verify min task run agent-verify passed.

Review threads the coder judged:

  • 👎 invalid — scripts/session-e2e.sh:13753: The premise of an async release does not hold. stop_quic443_launch runs in the box actor's stop (box_actor/host.rs, the BEP-018 block after kill_and_stop_loop). It moves the other members back to their own leaves with synchronous cgroup moves, and the destroy waits for that stop before it removes th
  • 👎 invalid — scripts/session-e2e.sh:13465: The leg runs under CI on purpose. The arch condition on this pull request (comment 4385004900) asks to see its PASS on the T82 — Run the Box Egress Proxy legs on the macOS lane #2500 macOS lane, and this round's note limits the change to C1-C3. The replacement is the product path that the leg proves. The teardown removes the stub through RT_KEY_STUB, a

The walk scripts/session-e2e.sh bep_round_two_conditions_closed covers the round-two conditions. Under CI the quarantine leg no longer runs, so the real audit log of the persistent macOS runner stays as it is. Under CI the cohort leg now installs the classifier itself and removes it again. An 'Operation not permitted' refusal now counts only when the table holds the active reject rule. On this box every leg prints NOT RUN with its gate, so no leg shows PASS here.

Notes from the agent: C1: the quarantine gate is E2E_BEP_QUARANTINE=1 only. The CI comment is deleted, and 'and always on under CI' is gone from the case header. C2: under CI, when the helper or the table marker is missing, the cohort leg checks the gates of proof_host_ip_deny_all (nft, ip, sudo -n, the --print-ruleset mount rehearsal, the default-route source address). It then stops the daemon, sets CO_CLASSIFIER_INSTALLED and runs the install with --cohort-address and --node-plane-address. It calls fail only when a gate or the install fails. teardown() runs --uninstall when the flag is set. Both not_run reasons no longer name ci-linux-native. One addition beyond the literal note: the leg also uninstalls on its own pass path, after it stops the daemon. The whole-lane order runs this walk before proof_host_ip_deny_all and the daemon-fetch proof, and both refuse a host that still carries a classifier install, so a leftover install would turn those cases red under CI. C3: co_eperm_is_reject runs after each flow check and after the probe while blocked. When the output has 'Operation not permitted' and no 'Connection refused', it reads 'sudo -n nft list table inet minimal_class' and calls co_fail unless the output contains '@quic443_blocked_leaves udp dport 443 reject with icmpx port-unreachable'. Risk: some nft versions list the reject as 'icmpx type port-unreachable'. On such a host the needle in the note does not match, and the leg fails. The release probe after box B ends is not checked, becaus…[truncated]

@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

This head closes the conditions from the b5bdba0 review. The cohort leg installs the classifier under CI and fails closed when a gate is missing. EPERM counts as a refusal only when the table holds the reject rule, as networking §5.3 requires (an active reject, never a silent drop). The quarantine leg is opt-in again, so CI does not write into a real audit log. One condition is left: the quarantine NOT RUN reason says a CI lane runs the leg, and at this head no lane does. Make the change in C1. The store, key and quarantine legs stay open on #2525 and #2500.

Ruled at 2b9a7f2 against gominimal/arch@109541a48c31 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh Resolved
@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: 16 unresolved threads — minimal-foundry[bot] scripts/session-e2e.sh:13461, minimal-foundry[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh:13887, …. No findings.

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

Copy link
Copy Markdown
Member

/revise

Revise round on the red native-daemon-e2e check at 2b9a7f25. No round is in flight.

The failure. co_eperm_is_reject reported "the table inet minimal_class holds no reject for quic443_blocked_leaves", but the table it printed has the rule: socket cgroupv2 level 4 @quic443_blocked_leaves udp dport 443 reject in chain output. port-unreachable is the default reject for an inet table, so nft list prints the rule's reject as reject with no with icmpx port-unreachable. The exact-string match in the case never matches nft's printed form. The block itself worked: box A's own leaf was in the set, and flow1 got EPERM.

  1. In co_eperm_is_reject in scripts/session-e2e.sh, match a line of the printed table that holds both @quic443_blocked_leaves udp dport 443 reject and, if present, only a port-unreachable reject. For example, take the line with grep -F '@quic443_blocked_leaves udp dport 443 reject' and reject a line that says drop, or that names a reject type other than port-unreachable. A reject with no with clause counts as the port-unreachable reject.
  2. Change nothing else. Run just test-one all_scripts_pass_shellcheck.

Generated by Claude Code

nft list prints the default port-unreachable reject of an inet table as a
bare 'reject'. Match that form, and refuse a drop or another reject type.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 4 of 10 on a /revise note, pushed as 0685ee757355.

line exit tail
./scripts/session-e2e.sh bep_round_two_conditions_closed 0 ::group::round-two conditions closed: store rules, client key, audit jti, key bound, cohort, revoked id, quarantine bep_round_two_conditions_closed/store: NOT RUN (the Box Egress Proxy runs on macOS only) bep_round_two_conditions_closed/key: NOT RUN (the leg replaces the client signing key in this m

Verify min task run agent-verify passed.

Review threads the coder judged:

  • 👎 invalid — scripts/session-e2e.sh: This is already fixed on this branch: rt_leg_quarantine gates on [ "${E2E_BEP_QUARANTINE:-}" != 1 ] with no CI branch and no comment above it, so CI does not run the leg without the opt-in.
  • 👎 invalid — scripts/session-e2e.sh: This is already fixed on this branch: under CI, rt_leg_cohort runs scripts/install-host-classifier.sh with CO_CLASSIFIER_INSTALLED as the teardown flag. It calls fail only for a missing gate or a failed install.
  • 👍 valid — scripts/session-e2e.sh:13661: co_eperm_is_reject asserts the reject on an EPERM match. It now also accepts nft's printed bare 'reject' (the default port-unreachable) and refuses drop or another reject type.
  • 👎 invalid — scripts/session-e2e.sh:13788: The premise is correct: no lane sets E2E_BEP_QUARANTINE=1. I left it unchanged because this round's /revise note limits the change to co_eperm_is_reject. Also, no issue that files such a lane is known to me, so I cannot name one. A later round must name that lane and issue.

In the cohort leg of bep_round_two_conditions_closed, co_eperm_is_reject now accepts the rule as nft list prints it (a bare 'reject' after '@quic443_blocked_leaves udp dport 443'). It still fails on a drop or on a reject type other than port-unreachable. The table the CI run printed now passes this check.

Notes from the agent: The directive limited this round to co_eperm_is_reject. I did not run ./scripts/session-e2e.sh bep_round_two_conditions_closed on this box, because it needs a live daemon, the classifier install and passwordless sudo. I ran the new match in a small bash harness against five inputs: a bare reject (accepted), 'reject with icmpx port-unreachable' (accepted), 'reject with icmpx admin-prohibited' (refused), 'drop' (refused) and an empty table (refused). Thread PRRT_kwDOPdfcxM6wkJAr is a correct finding, but this round's note said to change nothing else. Also, I do not know an issue that files a lane with E2E_BEP_QUARANTINE=1, so I cannot name one.

@minimal-foundry minimal-foundry Bot added the needs-human An agent handed off; a human must act, then clear this label. Set by defer and handoffs. label Oct 28, 2026
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

The runtime will not revise this pull request again on its own: the diff is +649/-1 (650 lines), past 3x the plan's estimate of 120 lines (est: 0 code, 120 tests, as #2591 reads now), at round 6 (the last trigger was a /revise note). A person decides now. Remove needs-human from this pull request to let /revise <note> or the automatic rounds resume, or finish #2591 by hand.

@minimal-arch minimal-arch Bot left a comment
10BC8 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 compare changes one thing: the key leg now runs only with E2E_BEP_KEY_REPLACE=1, CI included. That consent gate is correct, because the leg writes to the login keychain. But no lane sets the variable, so the leg is NOT RUN everywhere. Its NOT RUN line does not say which lane runs it. Gatehouse §6.10 line 839 is what the leg proves, and an open leg needs an owner. Make the edit in C1. The leg then stays open on #2500, and the merge can proceed.

Ruled at fda5893 against gominimal/arch@109541a48c31 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
@norrietaylor norrietaylor removed the needs-human An agent handed off; a human must act, then clear this label. Set by defer and handoffs. label Oct 28, 2026
@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.

APPROVE withheld: 16 unresolved threads — minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh:13900, minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh:13790, ….

minimal-review — advisory review

Verdict COMMENT — No findings.

Panel: 2 of 3 personas ran (security, supply-chain); did not complete: correctness.

Copy link
Copy Markdown
Member

/revise Close arch condition C1 from the ruling at fda5893d (arch_rulings 495). Text only.

  • scripts/session-e2e.sh rt_leg_key(), line 13411: change the not_run reason to the leg replaces the client signing key in this machine's login keychain: set E2E_BEP_KEY_REPLACE=1 to run it. The manual macOS lane runs it (#2500), as the quarantine leg at line 13791 names its lane.
  • The walk's header comment, key entry (lines 13295-13296): add the same sentence, The manual macOS lane runs it (#2500).
  • Change nothing else.

Generated by Claude Code

The key leg runs only with E2E_BEP_KEY_REPLACE=1, and no automated lane
sets it. Its NOT RUN reason and the walk's header entry now name the
manual macOS lane (#2500), as the quarantine leg does.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
./scripts/session-e2e.sh bep_round_two_conditions_closed 0 ::group::round-two conditions closed: store rules, client key, audit jti, key bound, cohort, revoked id, quarantine bep_round_two_conditions_closed/store: NOT RUN (the Box Egress Proxy runs on macOS only) bep_round_two_conditions_closed/key: NOT RUN (the leg replaces the client signing key in this m

Verify min task run agent-verify passed.

Review threads the coder judged:

The key leg of bep_round_two_conditions_closed now prints NOT RUN with a reason that names the manual macOS lane that runs it (#2500), the same as the quarantine leg. The walk's header comment says the same for the key entry. The legs themselves still print NOT RUN on this box, so this round closes only arch condition C1 and proves no leg PASS.

Notes from the agent: Text only, as the /revise note asked. The header sentence goes right after the E2E_BEP_KEY_REPLACE=1 10BC8 gate, so 'it' clearly means the key leg. Two comment lines were reflowed to keep the width. No other change.

@minimal-foundry minimal-foundry Bot added the needs-human An agent handed off; a human must act, then clear this label. Set by defer and handoffs. label Oct 28, 2026
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

The runtime will not revise this pull request again on its own: the diff is +650/-1 (651 lines), past 3x the plan's estimate of 120 lines (est: 0 code, 120 tests, as #2591 reads now), at round 1 (the last trigger was a /revise note). A person decides now. Remove needs-human from this pull request to let /revise <note> or the automatic rounds resume, or finish #2591 by hand.

@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 · 2 conditions · the full ruling

The compare only changes the key leg's NOT RUN reason so that it names the manual macOS lane (#2500). The gate and the checks are unchanged, so the earlier ruling stands. The key and quarantine legs are NOT RUN at this head, and a NOT RUN leg is open. Run them on the manual macOS lane and record the PASS rows (C1). Store injection stays open on #2525 (C2).

Ruled at d6fbeff against gominimal/arch@109541a48c31 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh Resolved
@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.

APPROVE withheld: 17 unresolved threads — minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh:13925, minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh:13815, ….

minimal-review — advisory review

Verdict COMMENT — No findings.

Panel: 1 of 3 personas ran (security); did not complete: correctness, supply-chain.

@norrietaylor
norrietaylor force-pushed the agent/2591-round-two-conditions-closed-end-to-end branch from d6fbeff to 8324f08 Compare October 28, 2026 08:01
@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: 17 unresolved threads — minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh:13925, minimal-arch[bot] scripts/session-e2e.sh, minimal-arch[bot] scripts/session-e2e.sh:13815, …. No findings.

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

10BC8

@norrietaylor norrietaylor removed the needs-human An agent handed off; a human must act, then clear this label. Set by defer and handoffs. label Oct 28, 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 · 3 conditions · the full ruling

The walk checks what Gatehouse §6.10 lines 836, 839 and 842 and networking §5.3 line 150 require. This head changes only the commit message of the ruled head d6fbeff3, so that ruling stands. Three legs are open. Store injection is NOT RUN until a box carries a store handle (C1, #2525). The key leg and the quarantine leg run only on the manual macOS lane (C2, C3, #2500). Record each leg's PASS on its issue to close it.

Ruled at 8324f08 against gominimal/arch@109541a48c31 by claude-opus-5-5.

Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
Comment thread scripts/session-e2e.sh Resolved
@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 8324f08efce3 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 Oct 28, 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.

Babysitter review at 8324f08e. I read the walk bep_round_two_conditions_closed in scripts/session-e2e.sh against T76's plan block. Each round-two residual has a leg that prints PASS or NOT RUN with its gate and owning issue. The key leg now needs E2E_BEP_KEY_REPLACE=1 on every host (the owner's ruling on the security finding), so no CI shell touches the login keychain. The quarantine leg needs E2E_BEP_QUARANTINE=1, and both name the manual macOS lane (#2500). The cohort leg installs and removes the classifier itself, and an EPERM passes only when the table holds the quic443_blocked_leaves reject rule, so a silent drop cannot pass. The open legs are held on #2525 (store injection) and #2500 (key and quarantine PASS lines), as the PR body's "Arch conditions" table records. No further findings.


Generated by Claude Code

@norrietaylor norrietaylor changed the title T76 — Round-two conditions closed, end to end test(e2e): walk the round-two BEP conditions end to end (T76) Oct 28, 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.

Babysitter approval at 8324f08: every merge gate passes at this head (arch PASS at 8324f08, zero open threads, every lane aggregator green). Squash title test(e2e): walk the round-two BEP conditions end to end (T76) and the squashed message pass commitlint. Queued for squash merge.


Generated by Claude Code

@norrietaylor
norrietaylor added this pull request to the merge queue Oct 28, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Oct 28, 2026
@norrietaylor
norrietaylor added this pull request to the merge queue Oct 28, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Oct 28, 2026
@norrietaylor
norrietaylor added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit 62f1886 Oct 28, 2026
37 checks passed
@norrietaylor
norrietaylor deleted the agent/2591-round-two-conditions-closed-end-to-end branch October 28, 2026 19:24
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.

T76 — Round-two conditions closed, end to end

1 participant

0