8000 feat(minimal): mint sealed GitHub sign-in references and register the box with the proxy by minimal-foundry[bot] · Pull Request #2490 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

feat(minimal): mint sealed GitHub sign-in references and register the box with the proxy - #2490

Merged
norrietaylor merged 22 commits into
mainfrom
agent/2273-mint-a-sealed-sign-in-reference-for-each-github
Oct 22, 2026
Merged

norrietaylor merged 22 commits into
mainfrom
agent/2273-mint-a-sealed-sign-in-reference-for-each-github

Conversation

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

T14 — Mint a sealed sign-in reference for each GitHub grant and register the box with the proxy

slice: S0
kind: task
covers: BEP-003, BEP-005
size: L
est: 360 code, 360 tests
executor: agent
difficulty: needs care
model: strongest
diagnostics: creating a grant box with no sign-in held exits with code github_sign_in_required and prints "This box declares a GitHub grant, and no GitHub sign-in is held on this machine. Run min auth login, then create the box again." on stderr, pinned by creation_without_sign_in_fails_with_defined_error
observability: one info log line per mint naming the box id, the module and the member's expiry, never the handle or the sealed value; one debug line per register_box naming the box id and the count of its declared authorities
layers:
- publish:
- crates/bep/src/publish.rs: the published identity carries the root's validity end (root_not_after), the root key's creation time plus the fixed default validity in one constant (OQ3), until gominimal/arch#85 rules otherwise
test: cargo nextest run -p bep published_identity_carries_the_root_validity_end
- mint:
- crates/minimal/src/mint.rs (new): the BEP-005 sign-in reference under the client's key, registered over the control socket, sealed from the published identity, with the member's expiry read from the identity's root_not_after
- crates/minimal/src/lib.rs: module line
- crates/minimal/src/tests.rs: the mint and registration tests
- crates/minimal/src/cmd/boxes/create.rs: refuses creation with no sign-in held and never prompts; mints and seals per grant; sends register_box over the proxy's control socket with the box id, its declared egress and its own_ip or host_ip stance (T41)
- crates/bep/src/main.rs: drops the "no creator registers a box's declared egress" sentence from the bep serve startup warning and the matching interim comment in wire, since this task is the create half of that flip (the destroy half is T20)
test: cargo nextest run -p minimal local_member_is_a_sign_in_reference_expiring_with_the_root
test: cargo nextest run -p minimal grant_box_registers_its_declared_egress_with_the_proxy
- refuse:
- crates/boxes/src/core/bep.rs: the defined error github_sign_in_required
test: cargo nextest run -p boxes creation_without_sign_in_fails_with_defined_error
- e2e:
- scripts/session-e2e.sh: adds the case
test: ./scripts/session-e2e.sh bep_second_box_needs_no_sign_in
produces:
- crates/minimal/src/mint.rs
consumes:
- crates/bep/src/signin.rs
- crates/bep/src/handle.rs
- crates/bep/src/publish.rs
- crates/bep/src/control.rs
- crates/boxes/src/core/bep.rs
proof: A grant box is created with no prompt, each grant's sealed value is minted under the client's key with the root's expiry, and the proxy holds the box's declared egress.
depends on:
- blocked by T2
- blocked by T7
- blocked by T10
- blocked by T12
- blocked by T13
- blocked by T41
- assumes OQ3

Proof

A box that declares a GitHub grant is refused at creation with the defined github_sign_in_required text when no sign-in is held, and it never prompts. With a sign-in held, min mints one sealed sign-in reference for each grant after the create. The reference is signed under a client key that min registers with the proxy, it carries no token, and its expiry is the root's validity end from ~/.minimal/bep/identity.json. min then sends register_box with the box id, the declared egress and the own_ip or host_ip stance. The minimal tests open the sealed value with the proxy key, verify the handle against the registered key, and read the box's egress and stance back from the proxy's registry. The live two-box e2e case is written but not observed (see notes).

Notes from the agent: Out-of-scope files: crates/minimal/Cargo.toml adds base64, getrandom and p256 (workspace deps) for the client key and the handle, and Cargo.lock follows. The e2e test line exited 1 in the script's preflight because this box has no minimald on PATH. The case itself runs only on macOS, because bep serve is macOS-only, and it records NOT RUN elsewhere or when no sign-in or no control socket is present. It is also in the whole-lane order. So the macOS lane owes the live evidence. Design points: (1) The key store keeps no creation time, so bep start and key replacement stamp root_not_after = now + ROOT_VALIDITY_SECS (10 years, OQ3), and keep the previous value while the root kid is unchanged. ca.rs keeps its own ROOT_VALIDITY with the same value; it is not linked because ca.rs is outside the layers. (2) The client key is made for each creation and held in memory, because no keychain-held client key exists yet. (3) A mint or proxy failure ends the creation and withdraws the box row. A creation with no box id (native host or older daemon) or a network mode with no stance skips the mint with a debug log. Nothing in the repo starts bep serve, so a grant box on a host that gets a box id now fail…[truncated]

Tests

line exit tail
cargo nextest run -p bep published_identity_carries_the_root_validity_end 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-4973... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 13.90s ──────────── Nextest run ID f066a956-9733-479d-861b-599cc116d076 with nexte
cargo nextest run -p minimal local_member_is_a_sign_in_reference_expiring_with_the_root 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-4093... Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling stdlib v0.0.22 (/workbenc
cargo nextest run -p minimal grant_box_registers_its_declared_egress_with_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-7130... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.
cargo nextest run -p boxes creation_without_sign_in_fails_with_defined_error 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-ed94... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling common v0.0.1 (/workbench
./scripts/session-e2e.sh bep_second_box_needs_no_sign_in 0 ::group::GitHub grant boxes: the second box needs no sign-in bep_second_box_needs_no_sign_in: NOT RUN (the Box Egress Proxy runs on macOS only) ::endgroup:: session e2e: 1 case(s) NOT RUN: bep_second_box_needs_no_sign_in session e2e OK Applying loadouts: default Running task runtime-implement-test-4

Verify

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

the sandbox ran rustc (1.98.1), the repository pins 1.97.0 in rust-toolchain.toml; a failure here may be the newer toolchain's, not this change's
Applying loadouts: default
Running task runtime-implement-verify in session task-runtime-implement-verify-75a2...
    Checking ot v0.0.1 (/workbench/crates/ot)
    Checking args v0.0.1 (/workbench/crates/args)
    Checking paths v0.0.1 (/workbench/crates/paths)
   Compiling stdlib v0.0.22 (/workbench/crates/stdlib)
   Compiling version v0.8.0 (/workbench/crates/version)
    Checking switch v0.0.1 (/workbench/crates/switch)
    Checking bep v0.0.1 (/workbench/crates/bep)
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
    Checking common v0.0.1 (/workbench/crates/common)
    Checking diagnostics v0.0.1 (/workbench/crates/diagnostics)
    Checking mlog v0.0.1 (/workbench/crates/mlog)
    Checking async-dialog v0.0.1 (/workbench/crates/async-dialog)
    Checking boxes v0.0.1 (/workbench/crates/boxes)
    Checking sandbox v0.0.1 (/workbench/crates/sandbox)
    Checking mfile v0.0.1 (/workbench/crates/mfile)
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking checkouts v0.0.1 (/workbench/crates/checkouts)
    Checking decode v0.0.1 (/workbench/crates/decode)
    Checking graph v0.0.1 (/workbench/crates/graph)
error: using `chunks_exact` with a constant chunk size
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    |
help: consider using `as_chunks::<2>()` instead
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#chunks_exact_to_as_chunks
    = note: `-D clippy::chunks-exact-to-as-chunks` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::chunks_exact_to_as_chunks)]`

error: could not compile `minimald-rpc` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

Layer exception

Accepted by the epic owner on 2026-10-19 under the rule recorded for #2361, #2363 and #2365 (required one-line changes outside the planned layers), applied by the babysitter on 2026-10-22:

  • crates/minimal/Cargo.toml: the base64, getrandom and p256 workspace dependencies that mint.rs needs for the handle-signing key, the handle id and the key's encoding on the proxy's control socket.
  • crates/bep/src/ca.rs: ROOT_VALIDITY is derived from publish::ROOT_VALIDITY_SECS, so one constant gives the root's validity and each member's expiry (BEP-005, OQ3), per arch-review condition at deda556 (thread 4344725159).

Residuals

Filed by the babysitter from the arch and review rulings on this PR; each may stay open at merge.

Out of scope

These files are outside the task's layers:, so this PR is a draft:

  • crates/minimal/Cargo.toml

Closes #2273


Generated by Claude Code

The identity carries root_not_after, the root key's creation time plus
the fixed default validity (OQ3, gominimal/arch#85). A start or a key
replacement keeps the end while the root key stays the same. A mint
reads it as the expiry of each sign-in reference (BEP-005).

The bep serve startup warning no longer says that no creator registers
a box's declared egress: min now sends register_box at create.
A box spec with a GitHub grant is refused when no GitHub sign-in is
held (BEP-003). The refusal carries the defined error
github_sign_in_required, exits 3 as a refused box spec, and tells the
person to run min auth login. Nothing here asks for a sign-in.
A box with GitHub grants is refused at creation when no sign-in is held,
with no prompt. After the create, min mints one sign-in reference for
each grant under a client key it registers with the proxy, seals it to
the proxy's published key with the root's validity end as its expiry,
and registers the box's declared egress and address stance.

The sealed value is not yet delivered into the box (BEP-007).
The case starts two grant boxes headless on macOS with a sign-in held
and the proxy running. Elsewhere it records NOT RUN.
A shared CARGO_TARGET_DIR can hold a 'min' with no 'minimald' beside it.
The fallback took that dir, skipped the build, and failed the daemon gate.
Accept a dir only when both halves of the pair are in it.
@coderabbitai
coderabbitai Bot commented Oct 22, 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: 3513ecf5-bb3e-49f5-be29-4ea41d540a55

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.

@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 of T14 at f744a67 (round 0, draft). Not an approval yet.

Verified line by line against spec 24: a box with a GitHub grant and no held sign-in is refused at creation with the defined error and the fixed text, after a metadata-only read that asks for nothing (BEP-003); each grant's member is a sign-in reference signed under a per-creation client key that the mint registers with the proxy before any handle is sealed, with the module's authorities as its upstream set, no injection form, no token in any part, and the root's validity end as its expiry, carried in the published identity from one start to the next while the root key is unchanged (BEP-005, OQ3); the Box Host it binds is the sealing key's fingerprint, the same name bep serve redeems under; and register_box follows the mint with the declared egress and the box's stance. All five commits lint.

One design point for the arch ruling before any round: register_box is sent only for a box with a GitHub grant. A box steered at the proxy with no grant is then never registered, so every request from it is refused outside_declared_egress and the BEP-030 passthrough never works for it. Either registration follows steering, with the mint staying grant-only, or T40 (#2334) carries it when it points the box at the proxy. I will carry whichever the ruling says.

Low, for the same round or none: on a mint failure after the create, the box row is withdrawn, and it needs saying whether the created box is destroyed or left; main.rs drops the whole "no creator registers" warning sentence although nothing sends forget_box until #2277, which the warning should still say; and the e2e case records NOT RUN on every lane without a person's sign-in, the macOS runner included, so the PR body should say the unit tests carry the proof in CI.


Generated by Claude Code

The connection inventory matches ControlClient::connect, so the mint
path and its tests count as connections. They reach the Box Egress
Proxy, not the daemon, so they carry no version gate.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 1 of 10 on a failed check suite, pushed as 52711734f95f.

line exit tail
cargo nextest run -p bep published_identity_carries_the_root_validity_end 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-6465... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 14.30s ──────────── Nextest run ID a2a23bd4-55c8-4ec0-87eb-ba6f90b72c45 with nexte
cargo nextest run -p minimal local_member_is_a_sign_in_reference_expiring_with_the_root 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-9b58... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling stdlib v0.0.22 (/workbenc
cargo nextest run -p minimal grant_box_registers_its_declared_egress_with_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-0a19... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.
cargo nextest run -p boxes creation_without_sign_in_fails_with_defined_error 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-99b9... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling common v0.0.1 (/workbench
./scripts/session-e2e.sh bep_second_box_needs_no_sign_in 0 no usable 'min' and 'minimald' pair on PATH or under target/; building the pair this run drives (cargo build --locked -p minimal --bin min -p minimald --bin minimald) built the pair: /work/build-cache/target/debug/min and /work/build-cache/target/debug/minimald ::group::GitHub grant boxes: the secon

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

fault
Running task runtime-implement-verify in session task-runtime-implement-verify-ef99...
    Checking rustls-webpki v0.103.16
    Checking args v0.0.1 (/workbench/crates/args)
    Checking ot v0.0.1 (/workbench/crates/ot)
    Checking paths v0.0.1 (/workbench/crates/paths)
   Compiling stdlib v0.0.22 (/workbench/crates/stdlib)
   Compiling version v0.8.0 (/workbench/crates/version)
    Checking switch v0.0.1 (/workbench/crates/switch)
    Checking rustls v0.23.46
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
    Checking diagnostics v0.0.1 (/workbench/crates/diagnostics)
    Checking async-dialog v0.0.1 (/workbench/crates/async-dialog)
    Checking wait-timeout v0.2.1
    Checking quick-error v1.2.3
    Checking bit-vec v0.8.0
    Checking rand_xorshift v0.4.0
    Checking rusty-fork v0.3.1
    Checking tokio-rustls v0.26.5
    Checking rustls-platform-verifier v0.7.0
    Checking bit-set v0.8.0
    Checking unarray v0.1.4
    Checking proptest v1.11.0
    Checking hyper-rustls v0.27.9
    Checking tonic v0.14.6
    Checking bep v0.0.1 (/workbench/crates/bep)
    Checking reqwest v0.13.5
    Checking tonic-prost v0.14.6
    Checking google-cloud-auth v1.17.0
    Checking opentelemetry-http v0.33.0
    Checking opentelemetry-otlp v0.33.0
    Checking google-cloud-gax-internal v0.7.20
    Checking mlog v0.0.1 (/workbench/crates/mlog)
    Checking google-cloud-longrunning v1.14.0
    Checking google-cloud-iam-v1 v1.13.0
    Checking google-cloud-lro v1.11.0
    Checking google-cloud-storage v1.20.0
    Checking common v0.0.1 (/workbench/crates/common)
    Checking boxes v0.0.1 (/workbench/crates/boxes)
    Checking sandbox v0.0.1 (/workbench/crates/sandbox)
    Checking mfile v0.0.1 (/workbench/crates/mfile)
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking decode v0.0.1 (/workbench/crates/decode)
    Checking checkouts v0.0.1 (/workbench/crates/checkouts)
    Checking graph v0.0.1 (/workbench/crates/graph)
    Checking lcache v0.0.1 (/workbench/crates/lcache)
    Checking rcache v0.0.1 (/workbench/crates/rcache)
error: using `chunks_exact` with a constant chunk size
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    |
help: consider using `as_chunks::<2>()` instead
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#chunks_exact_to_as_chunks
    = note: `-D clippy::chunks-exact-to-as-chunks` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::chunks_exact_to_as_chunks)]`

error: could not compile `minimald-rpc` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

Outside the task's layers::

  • crates/minimal/Cargo.toml

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

A grant box is created with no prompt. Each grant's sealed value is minted under the client's key with the root's expiry, and the proxy holds the box's declared egress. The tests check this, and the minimal crate's connection inventory test now passes again.

Notes from the agent: The CI 'tests' job failed on minimal tests::every_daemon_connection_is_classified. Its scanner matches any Client::connect(, so it found the new ControlClient::connect calls to the Box Egress Proxy control socket (create.rs::mint_grants and four mint tests). These calls do not go to the daemon, so no version gate applies. I recorded them as ungated in the inventory, with a comment. ci-linux-native-success is the lane aggregator, and it failed only because 'tests' failed. I did not run ./scripts/session-e2e.sh bep_second_box_needs_no_sign_in, because this box has no /dev/kvm. I did not run a full crate suite again after the fix. clippy -p minimal --all-targets gives no warnings in the changed crates.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Revise round 1 ran against ci-linux-native-success, tests and left it red; a coder round cannot clear it, a person should look. No round was started for the failed suite on 52711734f95f.

Copy link
Copy Markdown
Member

/revise

Carry the one failure left on ci-linux-native-success at 5271173: common::shell_lint::all_scripts_pass_shellcheck fails on this PR's addition to scripts/session-e2e.sh, and nothing else in the job fails.

shellcheck reports SC2031 (HOME was modified in a subshell) at lines 11515 and 11516, the two $HOME/.minimal/bep/control.sock uses in proof_bep_second_box_needs_no_sign_in. The script exports HOME inside the installer and keychain proofs' subshells, so every later read of $HOME at top level trips the check, which is why the file already carries # shellcheck disable=SC2031 with a reason at line 822. Do the same here: compute the socket path once at the top of the proof, bep_control="$HOME/.minimal/bep/control.sock", with a # shellcheck disable=SC2031 line above it and a one-line comment that this proof reads the real home, which no earlier subshell export changes, then use $bep_control in both places. Run shellcheck on the script before pushing.


Generated by Claude Code

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p bep published_identity_carries_the_root_validity_end 0 1 Downloaded serial_test v4.0.1 Downloaded termtree v0.5.1 Downloaded tonic-build v0.14.6 Downloaded tonic-prost-build v0.14.6 Downloaded unarray v0.1.4 Downloaded universal-hash v0.5.1 Downloaded wait-timeout v0.2.1 Downloaded x25519-dalek v2.0.1 Compiling subtle v2.6.1 Compil
cargo nextest run -p minimal local_member_is_a_sign_in_reference_expiring_with_the_root 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-4011... Compiling tokio v1.53.1 Compiling paths v0.0.1 (/workbench/crates/paths) Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/versi
cargo nextest run -p minimal grant_box_registers_its_declared_egress_with_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-35a4... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) 8000 Compiling mlog v0.
cargo nextest run -p boxes creation_without_sign_in_fails_with_defined_error 0 chacha v0.9.0 Compiling chacha20 v0.10.2 Compiling sha2 v0.11.0 Compiling unicode-xid v0.2.6 Compiling tokio-util v0.7.19 Compiling tokio-rustls v0.26.5 Compiling crossbeam-epoch v0.9.20 Compiling lalrpop v0.23.1 Compiling malachite-base v0.9.2 Compiling h2 v0.4.18 Comp
./scripts/session-e2e.sh bep_second_box_needs_no_sign_in 0 ::group::GitHub grant boxes: the second box needs no sign-in bep_second_box_needs_no_sign_in: NOT RUN (the Box Egress Proxy runs on macOS only) ::endgroup:: session e2e: 1 case(s) NOT RUN: bep_second_box_needs_no_sign_in session e2e OK Applying loadouts: default Running task runtime-implement-test-4

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

0.33.0
    Checking hash32 v0.3.1
    Checking kasuari v0.4.12
    Checking pem v4.0.0
    Checking yasna v0.6.0
    Checking module-lattice v0.2.3
    Checking lru v0.18.2
    Checking kem v0.3.0
    Checking data-encoding v2.11.1
    Checking size v0.5.0
    Checking sponge-cursor v0.1.0
    Checking compression-core v0.4.33
    Checking op v0.0.1 (/workbench/crates/op)
    Checking sha3 v0.12.0
    Checking ml-kem v0.3.2
    Checking compression-codecs v0.4.45
    Checking ratatui-core v0.1.2
    Checking rcgen v0.14.10
    Checking heapless v0.9.3
    Checking mlog v0.0.1 (/workbench/crates/mlog)
    Checking ssh-key v0.7.0-rc.11
    Checking signal-hook-mio v0.2.5
    Checking generic-array v1.4.4
    Checking derive_more v2.1.1
    Checking russh-cryptovec v0.62.0
    Checking num-bigint v0.5.1
    Checking russh-util v0.52.0
    Checking bitflags v1.3.2
    Checking tagptr v0.2.0
    Checking managed v0.8.0
    Checking hex-literal v1.1.0
    Checking tinyvec_macros v0.1.1
    Checking constcat v0.6.1
    Checking smoltcp v0.14.0
    Checking tinyvec v1.12.0
    Checking russh v0.63.3
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking moka v0.12.16
    Checking crossterm v0.29.0
    Checking async-compression v0.4.50
    Checking async-tar v0.6.1
    Checking line-clipping v0.3.8
    Checking object v0.40.0
    Checking is_executable v1.0.6
    Checking ratatui-widgets v0.3.2
    Checking clap_complete v4.6.11
    Checking check v0.0.1 (/workbench/crates/check)
    Checking switch v0.0.1 (/workbench/crates/switch)
    Checking hickory-proto v0.26.3
    Checking orchestrator v0.0.1 (/workbench/crates/orchestrator)
    Checking bep v0.0.1 (/workbench/crates/bep)
    Checking sysinfo v0.39.6
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
    Checking ratatui-macros v0.7.2
    Checking mctx v0.0.1 (/workbench/crates/mctx)
    Checking diagnostics v0.0.1 (/workbench/crates/diagnostics)
    Checking ratatui-crossterm v0.1.2
    Checking fuzzy-matcher v0.3.7
    Checking hashbrown v0.14.5
    Checking inquire v0.9.4
error: using `chunks_exact` with a constant chunk size
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    |
help: consider using `as_chunks::<2>()` instead
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#chunks_exact_to_as_chunks
    = note: `-D clippy::chunks-exact-to-as-chunks` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::chunks_exact_to_as_chunks)]`

error: could not compile `minimald-rpc` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

Outside the task's layers::

  • crates/minimal/Cargo.toml

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

A grant box is created with no prompt, each grant's sealed value is minted under the client's key with the root's expiry, and the proxy holds the box's declared egress. This round only makes scripts/session-e2e.sh pass shellcheck, so the e2e case that shows this no longer fails the Linux lint lane.

Notes from the agent: Revise round 2: proof_bep_second_box_needs_no_sign_in now computes bep_control="$HOME/.minimal/bep/control.sock" once, under a '# shellcheck disable=SC2031' line and a one-line reason, and uses $bep_control in both places. The cargo test lines were not re-run because no Rust file changed this round. The e2e case is NOT RUN on this Linux box, as the script itself reports, so its evidence still comes from the macOS lane.

Copy link
Copy Markdown
Member

/revise

Carry the commitlint check, red at e71670c. No code changes.

The body of fix(e2e): read the proxy control socket path once in the BEP proof is one line of 157 characters, and docs/commit-conventions.md caps body lines at 100 (body-max-line-length). The merge queue folds every commit body into the landed squash message, so the landed message would fail the same rule. Amend that commit's message so the body wraps at 72 columns, keep the subject as it is, and force-push this branch (it is the runtime's own branch, so the rewrite is allowed). Run commitlint on the message before pushing; the other seven commits already pass.


Generated by Claude Code

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 3 of 10 on a /revise note: the coder changed nothing. I did not do the revise note on purpose. The note asks for an amend of commit e71670c and a force-push. My instructions forbid both: never rewrite commits already on the branch, and never force-push. I also hold no push credential. A new commit cannot fix this failure, because commitlint checks each commit on the branch, and e71670c stays in the history. The body of e71670c is one line of 156 characters, over the body-max-line-length limit of 100. The other commits pass; the footer-leading-blank result on the bafb2c7-era feat(bep) commit is a warning only. A person with push rights can fix it with these steps: git rebase -i e71670c~1, reword e71670c, and keep the subject 'fix(e2e): read the proxy control socket path once in the BEP proof'. Wrap the body at 72 columns, for example: 'shellcheck reports SC2031 on $HOME at top level, because earlier' / 'proofs export HOME in subshells. Compute the path once under a' / 'disable line, as mnl() does.' Then run npx commitlint…[truncated]

shellcheck reports SC2031 on $HOME at top level, because earlier
proofs export HOME in subshells. Compute the path once under a
disable line, as mnl() does.
@norrietaylor
norrietaylor force-pushed the agent/2273-mint-a-sealed-sign-in-reference-for-each-github branch from e71670c to 3c15cca Compare October 22, 2026 04:50
Copy link
Copy Markdown
Member

Reworded e71670cd as 3c15cca4 at the person's instruction: the same tree and author, with the body wrapped at 72 columns so commitlint passes on every commit and on the squash message the queue will build. No code changed. The force-push is the babysitter's, under the person's standing rule that a commit message failing commitlint is reworded and pushed rather than left to block the merge.


Generated by Claude Code

@norrietaylor
norrietaylor marked this pull request as ready for review October 22, 2026 04:55
@norrietaylor
norrietaylor requested a review from a team as a code owner October 22, 2026 04:55
@minimal-foundry
minimal-foundry Bot commented Oct 22, 2026 •
Copy link
Copy Markdown
Contr 10000 ibutor Author

Reviewed: 1 finding, none blocking at 3b907a896ccd.

Address the comments on the diff.

Clobber: not checked in depth. If that was not intentional, restore the earlier change.

@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 crates/bep/src/publish.rs Resolved
Comment thread crates/bep/src/publish.rs Resolved
Comment thread crates/minimal/src/mint.rs 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 · 7 conditions · the full ruling

The member shape, the key registration order and the placement conform to Gatehouse §6.10 lines 839 and 842. The refusal path does not conform to §6.2 line 580. The sign-in error must print only when a node-local proxy exists, and a grant box with no proxy or no box id must be refused with gatehouse_unenrolled_node. C1 and C2 fix this. C3, C4 and C5 make three interims honest: the dropped forget_box warning, the per-creation client key and the undelivered sealed value. C6 puts the root validity in one constant. C7 records an observed macOS run of the BEP-003 e2e case.

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

Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
Comment thread crates/bep/src/main.rs Resolved
Comment thread crates/minimal/src/mint.rs Resolved
Comment thread crates/minimal/src/mint.rs Resolved
Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
Comment thread crates/bep/src/publish.rs Resolved
Comment thread scripts/session-e2e.sh Resolved
An identity that an older bep published names the root key with no
end. Counting ten years from the restart can outlive the real root, so
the end stays unset and the refusal names bep --replace-key root.
A failed box registration left the client key registered with the
proxy, and no box used it. The key now goes last, before any handle
leaves the process.
@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 crates/minimal/src/mint.rs Resolved
Comment thread crates/minimal/src/cmd/boxes/create.rs 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 · 4 conditions · the full ruling

Two fix commits conform. The client key now registers last, and an upgraded identity with an unknown root age fails closed. Two deviations stay open. Gatehouse §6.2 line 580 keeps gatehouse_unenrolled_node as the refusal where no node-local proxy exists. This change refuses with github_sign_in_required on every host, and it lets a grant box with no box id start with nothing behind its grant (C1). with_root_validity still gives a root key of unknown age a fresh ten-year end when the identity file is absent (C2). C3 and C4 make the dropped sealed values and the NOT RUN e2e leg honest.

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

Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
Comment thread crates/bep/src/publish.rs Resolved
Comment thread crates/bep/src/main.rs Resolved
Comment thread crates/bep/src/main.rs Resolved
Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
Comment thread crates/minimal/src/mint.rs Resolved
Comment thread scripts/session-e2e.sh Resolved
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 4 of 10 on the runtime's review findings, pushed as deda556a8309.

line exit tail
cargo nextest run -p bep published_identity_carries_the_root_validity_end 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-9a36... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 10.73s ──────────── Nextest run ID 5e7dfecd-e87c-4891-ae35-6ffff7953864 with nexte
cargo nextest run -p minimal local_member_is_a_sign_in_reference_expiring_with_the_root 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-7720... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling stdlib v0.0.22 (/workbenc
cargo nextest run -p minimal grant_box_registers_its_declared_egress_with_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-6e71... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.
cargo nextest run -p boxes creation_without_sign_in_fails_with_defined_error 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-7c0f... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling common v0.0.1 (/workbench
./scripts/session-e2e.sh bep_second_box_needs_no_sign_in 0 ::group::GitHub grant boxes: the second box needs no sign-in bep_second_box_needs_no_sign_in: NOT RUN (the Box Egress Proxy runs on macOS only) ::endgroup:: session e2e: 1 case(s) NOT RUN: bep_second_box_needs_no_sign_in session e2e OK Applying loadouts: default Running task runtime-implement-test-4

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

the sandbox ran rustc (1.98.1), the repository pins 1.97.0 in rust-toolchain.toml; a failure here may be the newer toolchain's, not this change's
Applying loadouts: default
Running task runtime-implement-verify in session task-runtime-implement-verify-bde5...
    Checking ot v0.0.1 (/workbench/crates/ot)
    Checking args v0.0.1 (/workbench/crates/args)
    Checking paths v0.0.1 (/workbench/crates/paths)
   Compiling stdlib v0.0.22 (/workbench/crates/stdlib)
   Compiling version v0.8.0 (/workbench/crates/version)
    Checking switch v0.0.1 (/workbench/crates/switch)
    Checking bep v0.0.1 (/workbench/crates/bep)
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
    Checking common v0.0.1 (/workbench/crates/common)
    Checking diagnostics v0.0.1 (/workbench/crates/diagnostics)
    Checking async-dialog v0.0.1 (/workbench/crates/async-dialog)
    Checking boxes v0.0.1 (/workbench/crates/boxes)
    Checking sandbox v0.0.1 (/workbench/crates/sandbox)
    Checking mlog v0.0.1 (/workbench/crates/mlog)
    Checking mfile v0.0.1 (/workbench/crates/mfile)
    Checking checkouts v0.0.1 (/workbench/crates/checkouts)
    Checking decode v0.0.1 (/workbench/crates/decode)
    Checking graph v0.0.1 (/workbench/crates/graph)
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking lcache v0.0.1 (/workbench/crates/lcache)
    Checking rcache v0.0.1 (/workbench/crates/rcache)
    Checking op v0.0.1 (/workbench/crates/op)
    Checking check v0.0.1 (/workbench/crates/check)
    Checking orchestrator v0.0.1 (/workbench/crates/orchestrator)
error: using `chunks_exact` with a constant chunk size
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    |
help: consider using `as_chunks::<2>()` instead
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#chunks_exact_to_as_chunks
    = note: `-D clippy::chunks-exact-to-as-chunks` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::chunks_exact_to_as_chunks)]`

error: could not compile `minimald-rpc` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

Outside the task's layers::

  • crates/minimal/Cargo.toml

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

Review threads the coder judged:

  • 👍 valid — PRRT_kwDOPdfcxM6vDXJn: with_root_validity now leaves root_not_after unset when the previous identity names the same root key with no end. The refusal now names bep --replace-key root, and the test pins both the restart and the replacement. (not posted on the thread: not an open thread on the pull request)
  • 👍 valid — PRRT_kwDOPdfcxM6vDXJr: Same fix as the thread on line 153: an upgraded identity keeps no end across a restart, so no member can outlive the root. A root replacement starts a known end. (not posted on the thread: not an open thread on the pull request)
  • 👍 valid — PRRT_kwDOPdfcxM6vDXJu: mint_and_register now registers the client key last, after register_box. A refused box registration leaves no key, and the registration test pins this. A revoke for failures after the mint needs a control.rs request, which is outside this task. (not posted on the thread: not an open thread on the pull request)

A grant box is created with no prompt. Each grant's sealed value is minted under the client's key, with the root's expiry. The proxy holds the box's declared egress. This round, an identity with no known root start gets no invented expiry, and a failed box registration leaves no client key registered with the proxy.

Notes from the agent: Revise round 4. publish.rs: when the previous identity names the same root key with no root_not_after, the end now stays unset. A mint refuses that identity with NoRootValidity. The text of that refusal changed from 'Start bep to publish it again.' to 'Run bep --replace-key root to make a new root key with a known expiry, then start bep serve again.' The reason is that a restart no longer fixes it. Nothing else pins the old text. Trade-off: an install upgraded from an older bep must replace its root key once before it can create grant boxes, and boxes created before that must be re-created. mint.rs: the client key is now registered after register_box, as the last step before the function returns. A failure after mint_and_register returns (later in create.rs) still leaves the key registered. A real revoke needs a new control request in crates/bep/src/control.rs, which is outside this task's layers. A related case is out of scope: if the identity file is deleted while the store keeps its root key, the next start still counts the end from now. The e2e case reported NOT RUN on this Linux box, because bep runs only on macOS. The script exited 0. clippy -p bep -p minimal --all-targets gave warnings only in minimald and minimald-rpc, which this round did not touch. just clippy-strict was not run.

@minimal-foundry
minimal-foundry Bot marked this pull request as draft October 22, 2026 05:17
A reply that fails after the proxy stored the box left it registered.
The mint now forgets the box over a new connection. The inventory of
connection sites drops the stale mint.rs::drop entry and adds the test.
The interrupt handler exits with no destructor, so the forget does not
run. The box's destroy forgets it (#2277).
The store already holds the new root key, and a later bep start gives
it no validity end. Only a new replacement fixes it.
@minimal-foundry
8 < 10BC8 a class="author Link--primary text-bold css-overflow-wrap-anywhere " show_full_name="false" href="/apps/minimal-foundry">minimal-foundry Bot commented Oct 22, 2026
Copy link
Copy Markdown
Contributor Author

Round 9 of 10 on a /revise note, pushed as 174d8d09b1e1.

line exit tail
cargo nextest run -p bep published_identity_carries_the_root_validity_end 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-5140... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 10.06s ──────────── Nextest run ID e5de1583-f227-417c-8122-c7aa7bd9d4af with nexte
cargo nextest run -p minimal local_member_is_a_sign_in_reference_expiring_with_the_root 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-b521... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling stdlib v0.0.22 (/workbenc
cargo nextest run -p minimal grant_box_registers_its_declared_egress_with_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-14fa... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.
cargo nextest run -p boxes creation_without_sign_in_fails_with_defined_error 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-e39e... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling common v0.0.1 (/workbench
./scripts/session-e2e.sh bep_second_box_needs_no_sign_in 0 no usable 'min' and 'minimald' pair on PATH or under target/; building the pair this run drives (cargo build --locked -p minimal --bin min -p minimald --bin minimald) built the pair: /work/build-cache/target/debug/min and /work/build-cache/target/debug/minimald ::group::GitHub grant boxes: the secon

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

the sandbox ran rustc (1.98.1), the repository pins 1.97.0 in rust-toolchain.toml; a failure here may be the newer toolchain's, not this change's
Applying loadouts: default
Running task runtime-implement-verify in session task-runtime-implement-verify-bf30...
    Checking args v0.0.1 (/workbench/crates/args)
    Checking ot v0.0.1 (/workbench/crates/ot)
    Checking paths v0.0.1 (/workbench/crates/paths)
   Compiling stdlib v0.0.22 (/workbench/crates/stdlib)
   Compiling version v0.8.0 (/workbench/crates/version)
    Checking switch v0.0.1 (/workbench/crates/switch)
    Checking common v0.0.1 (/workbench/crates/common)
    Checking bep v0.0.1 (/workbench/crates/bep)
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
    Checking diagnostics v0.0.1 (/workbench/crates/diagnostics)
    Checking mlog v0.0.1 (/workbench/crates/mlog)
    Checking async-dialog v0.0.1 (/workbench/crates/async-dialog)
    Checking boxes v0.0.1 (/workbench/crates/boxes)
    Checking sandbox v0.0.1 (/workbench/crates/sandbox)
    Checking mfile v0.0.1 (/workbench/crates/mfile)
    Checking checkouts v0.0.1 (/workbench/crates/checkouts)
    Checking decode v0.0.1 (/workbench/crates/decode)
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking graph v0.0.1 (/workbench/crates/graph)
    Checking lcache v0.0.1 (/workbench/crates/lcache)
    Checking rcache v0.0.1 (/workbench/crates/rcache)
    Checking op v0.0.1 (/workbench/crates/op)
    Checking check v0.0.1 (/workbench/crates/check)
    Checking orchestrator v0.0.1 (/workbench/crates/orchestrator)
error: using `chunks_exact` with a constant chunk size
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    |
help: consider using `as_chunks::<2>()` instead
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#chunks_exact_to_as_chunks
    = note: `-D clippy::chunks-exact-to-as-chunks` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::chunks_exact_to_as_chunks)]`

error: could not compile `minimald-rpc` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

Outside the task's layers::

  • crates/bep/src/ca.rs
  • crates/minimal/Cargo.toml

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

Review threads the coder judged:

  • 👍 valid — crates/minimal/src/mint.rs: A failed register_box (any error but NotRunning) now forgets the box over a new connection. Pinned by a_failed_box_reply_forgets_the_box_again.
  • 👍 valid — crates/minimal/src/mint.rs: cmd/mod.rs is outside this task's layers, so the comments in mint.rs (doc and drop) and create.rs now say a Ctrl-C leaves the box at the proxy until its destroy forgets it (T20 — Record a revocation when a live box is destroyed and refuse its values within a minute #2277).
  • 👍 valid — crates/bep/src/main.rs: The root clock-error message now says: Set the system clock, then run bep --replace-key root again. The clock error line before it is unchanged.

A grant box is created with no prompt. Each grant's sealed value is minted under the client's key with the root's expiry, and the proxy holds the box's declared egress. A registration whose reply fails no longer leaves the box at the proxy.

Notes from the agent: Round 9. (1) mint_and_register now forgets the box when register_box fails with any error other than NotRunning. The forget goes over a new connection, because the old one can still carry the late reply. ControlClient keeps its socket path for this. The new test a_failed_box_reply_forgets_the_box_again uses a socket that stores the box and closes with no reply. (2) cmd/mod.rs (arm_activation_interrupt) is outside the layers, so the three comments (mint.rs ProxyRegistration doc, mint.rs drop, create.rs) now say a Ctrl-C leaves the box at the proxy until its destroy forgets it (#2277). (3) bep replace_key: on a clock error for the root, the message now says to set the system clock and run bep --replace-key root again. No existing test pins replace_key output, so the text is not pinned. every_daemon_connection_is_classified failed at ab6c705: its inventory listed mint.rs::drop, but no line in mint.rs matches the scanner's needle since 6ba1890. I removed that entry and added the new test's entry. The mint.rs comment hunks landed in the first commit (b079b10), not in the docs commit. Not run: ./scripts/session-e2e.sh bep_second_box_needs_no_sign_in. This box is Linux with no /dev/kvm, the leg runs on macOS only, and it records NOT RUN until #2275 starts bep serve. just clippy-strict was not run.

@norrietaylor
norrietaylor marked this pull request as ready for review October 22, 2026 10:14
@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

minimal-review — advisory review

Verdict COMMENT — 1 finding, 1 inline.

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

Comment thread crates/minimal/src/mint.rs 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 closes the failed-reply gap. A register_box reply that fails now forgets the box over a new connection, and the new test proves it. Gatehouse §6.2 line 580 and §6.10 line 839 govern the change, and the refusals, the mint and its placement conform. Two items stay open, and their issues are filed. C1: the live e2e leg is NOT RUN until T18 starts bep serve. C2: the sealed value is dropped until T42 delivers it.

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

Comment thread scripts/session-e2e.sh Resolved
Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
A failed register_client_key reply, such as a read timeout, can leave
the late reply on the control connection. A forget_box on that same
connection then reads the stale reply as its own answer. Send the
forget over a new connection, as the register_box failure path does.
@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

minimal-review — advisory review

Verdict COMMENT — 1 finding, 1 inline.

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

Comment thread crates/minimal/src/mint.rs Resolved
@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 22, 2026
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

The runtime will not revise this pull request again on its own: round 11 would exceed the cap of 10; 0 base merges were not counted (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 #2273 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 · 1 condition · the full ruling

The compare conforms. The forget after a refused client key now goes over a new connection, so a late reply cannot read as its answer. The test proves the new connection. BEP-003 and BEP-005 conform to §6.2 line 580 and §6.10 line 839. C1 stays open because the e2e leg bep_second_box_needs_no_sign_in records NOT RUN on every lane. Record it as PASS on the macOS lane after #2275 starts the proxy.

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

Comment thread scripts/session-e2e.sh Resolved
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 10 of 10 on the runtime's review findings, pushed as 3b907a896ccd.

line exit tail
cargo nextest run -p bep published_identity_carries_the_root_validity_end 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-90e0... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 9.22s ──────────── Nextest run ID c799c0d0-e578-46e5-9e74-eccf9c30c88f with nextes
cargo nextest run -p minimal local_member_is_a_sign_in_reference_expiring_with_the_root 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-c7f3... Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling stdlib v0.0.22 (/workbenc
cargo nextest run -p minimal grant_box_registers_its_declared_egress_with_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-2130... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.
cargo nextest run -p boxes creation_without_sign_in_fails_with_defined_error 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-9d06... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling common v0.0.1 (/workbench
./scripts/session-e2e.sh bep_second_box_needs_no_sign_in 0 no usable 'min' and 'minimald' pair on PATH or under target/; building the pair this run drives (cargo build --locked -p minimal --bin min -p minimald --bin minimald) built the pair: /work/build-cache/target/debug/min and /work/build-cache/target/debug/minimald ::group::GitHub grant boxes: the secon

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

/crates/ot)
    Checking args v0.0.1 (/workbench/crates/args)
    Checking paths v0.0.1 (/workbench/crates/paths)
   Compiling stdlib v0.0.22 (/workbench/crates/stdlib)
   Compiling version v0.8.0 (/workbench/crates/version)
    Checking rustls v0.23.46
    Checking switch v0.0.1 (/workbench/crates/switch)
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
    Checking diagnostics v0.0.1 (/workbench/crates/diagnostics)
    Checking async-dialog v0.0.1 (/workbench/crates/async-dialog)
    Checking wait-timeout v0.2.1
    Checking bit-vec v0.8.0
    Checking tokio-rustls v0.26.5
    Checking rustls-platform-verifier v0.7.0
    Checking quick-error v1.2.3
    Checking bit-set v0.8.0
    Checking hyper-rustls v0.27.9
    Checking tonic v0.14.6
    Checking bep v0.0.1 (/workbench/crates/bep)
    Checking rusty-fork v0.3.1
    Checking reqwest v0.13.5
    Checking rand_xorshift v0.4.0
    Checking tonic-prost v0.14.6
    Checking unarray v0.1.4
    Checking google-cloud-auth v1.17.0
    Checking opentelemetry-http v0.33.0
    Checking opentelemetry-otlp v0.33.0
    Checking proptest v1.11.0
    Checking google-cloud-gax-internal v0.7.20
    Checking mlog v0.0.1 (/workbench/crates/mlog)
    Checking google-cloud-longrunning v1.14.0
    Checking google-cloud-iam-v1 v1.13.0
    Checking google-cloud-lro v1.11.0
    Checking google-cloud-storage v1.20.0
    Checking common v0.0.1 (/workbench/crates/common)
    Checking boxes v0.0.1 (/workbench/crates/boxes)
    Checking sandbox v0.0.1 (/workbench/crates/sandbox)
    Checking mfile v0.0.1 (/workbench/crates/mfile)
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking decode v0.0.1 (/workbench/crates/decode)
    Checking checkouts v0.0.1 (/workbench/crates/checkouts)
    Checking graph v0.0.1 (/workbench/crates/graph)
    Checking lcache v0.0.1 (/workbench/crates/lcache)
    Checking rcache v0.0.1 (/workbench/crates/rcache)
    Checking op v0.0.1 (/workbench/crates/op)
    Checking check v0.0.1 (/workbench/crates/check)
    Checking orchestrator v0.0.1 (/workbench/crates/orchestrator)
error: using `chunks_exact` with a constant chunk size
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    |
help: consider using `as_chunks::<2>()` instead
   --> crates/minimald-rpc/src/trace.rs:199:46
    |
199 |     for (byte, pair) in out.iter_mut().zip(s.chunks_exact(2)) {
    |                                              ^^^^^^^^^^^^^^^
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#chunks_exact_to_as_chunks
    = note: `-D clippy::chunks-exact-to-as-chunks` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::chunks_exact_to_as_chunks)]`

error: could not compile `minimald-rpc` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

Outside the task's layers::

  • crates/bep/src/ca.rs
  • crates/minimal/Cargo.toml

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

Review threads the coder judged:

  • 👍 valid — crates/minimal/src/mint.rs:541: After register_client_key fails, the forget_box cleanup now goes over a new connection through forget_on_a_new_connection, the same as the register_box path. a_refused_client_key_forgets_the_box_again now checks for the second connect.

A person can create a grant box with no prompt. The box carries one sealed sign-in reference for each grant, minted under the client's key and expiring with the root. The proxy holds the box's declared egress. When the proxy refuses the client key, it forgets the box over a new connection, so a late reply cannot hide a failed forget.

Notes from the agent: This round fixes the one open thread. mint_and_register now sends the forget_box cleanup over a new connection after both register_box and register_client_key fail. Both paths share the helper forget_on_a_new_connection. The test server serve_refusing_keys now accepts each connection on its own thread, as the real control socket does. It also records each connect, so a_refused_client_key_forgets_the_box_again proves that the forget uses a second connection. I did not run ./scripts/session-e2e.sh bep_second_box_needs_no_sign_in because this box has no /dev/kvm and no microVM host. The script records that leg as NOT RUN off macOS. cargo clippy -p minimal --all-targets shows no new warnings. The warnings it prints come from minimald and minimald-rpc and were there before this change.

@minimal-foundry
minimal-foundry Bot marked this pull request as draft October 22, 2026 10:31
@norrietaylor
norrietaylor marked this pull request as ready for review October 22, 2026 10:38
@norrietaylor norrietaylor changed the title T14 — Mint a sealed sign-in reference for each GitHub grant and register the box with the proxy feat(minimal): mint sealed GitHub sign-in references and register the box with the proxy Oct 22, 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 of T14 at 3b907a8, against the plan block on #2273 and the rounds since my review at f744a67.

Plan coverage. Every layer line is in the diff: publish.rs carries root_not_after from a known root creation time (with_root_validity(previous, root_made_at)); mint.rs mints one sealed sign-in reference per grant under a per-creation client key, registers the box and then the key over the control socket, and forgets the box over a fresh connection when either registration fails; create.rs refuses a grant box with gatehouse_unenrolled_node (exit 5) where no proxy identity or control socket exists and with github_sign_in_required where one does, mints on a blocking thread after the create settles the box id, destroys the new session and withdraws its row when the mint fails, and keeps the proxy registration only once the session is active; boxes/core/bep.rs defines the error; bep/src/main.rs drops the box-egress interim sentence; session-e2e.sh adds bep_second_box_needs_no_sign_in, NOT RUN until #2275. The five test lines of the plan ran green in every round table and in CI.

Rounds verified. Rounds 1 to 10 were read commit by commit (each message commitlint clean, one reworded under the standing rule): SC2031 precedent, the daemon-connection inventory (twice: the connect_with_timeout rename moved a site), ProxyRegistration with keep() after the interrupt guard drops, the forget on a blocking thread with a 2 s timeout, the pre-epoch clock refusals in min and bep, the best_effort_destroy on a failed mint, the corrected Ctrl-C comments, the root-replacement message, and the fresh-connection forgets. Each matched its finding.

Arch. PASS_WITH_CONDITIONS at 3b907a8 with C1 only; C1 (live leg) is filed on #2275 and C2 from 174d8d0 (delivery) on #2488, both as layer lines on the owning tasks. The review MEDIUM at this head (expired-root guard) is filed on #2288 under the revise cap.

Layer exception. crates/minimal/Cargo.toml (three workspace dependencies) and crates/bep/src/ca.rs (one constant, an arch condition) under the recorded rule.

Size. +1977/-23 against an estimate of 720: 2.8x, under the 3x cap.

Verdict: ready to merge once the lanes at this head finish and the epic owner lifts the revise-cap needs-human.


Generated by Claude Code

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

Approved at 3b907a8 by the babysitter under the epic owner's merge-on-green delegation for #1501. All twelve gates pass at this head: own review, arch pass (C1 filed on #2275, C2 on #2488), review concluded, no open threads, every bot resolution re-verified, five lane aggregators green, not a draft, no round in flight, needs-human removed by the epic owner at 16:15Z, and Closes #2273. The squash message is Conventional Commits compliant (feat(minimal): mint sealed GitHub sign-in references and register the box with the proxy).


Generated by Claude Code

@norrietaylor
norrietaylor added this pull request to the merge queue Oct 22, 2026
Merged via the queue into main with commit e55b32c Oct 22, 2026
37 checks passed
@norrietaylor
norrietaylor deleted the agent/2273-mint-a-sealed-sign-in-reference-for-each-github branch October 22, 2026 16:51
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.

T14 — Mint a sealed sign-in reference for each GitHub grant and register the box with the proxy

1 participant

0