8000 docs(specs): amend BEP-063 for client-key revocation, replacement and the bound (T71) by minimal-foundry[bot] · Pull Request #2594 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

docs(specs): amend BEP-063 for client-key revocation, replacement and the bound (T71) - #2594

Merged
norrietaylor merged 14 commits into
mainfrom
agent/2578-amend-bep-063-for-client-key-revocation-replacem
Oct 26, 2026
Merged

norrietaylor merged 14 commits into
mainfrom
agent/2578-amend-bep-063-for-client-key-revocation-replacem

Conversation

@minimal-foundry
Copy link
Copy Markdown
Contributor

T71 — Amend BEP-063 for client-key revocation, replacement and the registry bound

slice: S10
kind: task
covers: BEP-063
size: S
est: 0 code, 60 tests
executor: agent
difficulty: routine
model: standard
diagnostics: none, a spec change
observability: none: a spec change writes no log line
layers:
- spec:
- docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: the BEP-063 sub-requirements and the [NEEDS CLARIFICATION] entry that #2578 lists (revocation by kid, replacement in three steps with the pending-revoke retry, the registry bound, the verify-line move, the rationale at line 475, gominimal/arch#144)
test: cargo nextest run -p minimal a_replaced_client_key_is_revoked_at_the_proxy
produces: none
consumes: none
proof: Spec 24 states client-key revocation, replacement and the registry bound, each with a verify line that names an existing test.
depends on:
- 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 #2543


Generated by Claude Code

Proof

Spec 24 now has BEP-063 sub-requirements for client-key revocation by kid, the three-step replacement, the pending-revoke retry and the registry bound. Each one has a verify line that names an existing test: a_revoked_client_key_no_longer_verifies_a_store_handle, a_replaced_client_key_is_revoked_at_the_proxy, a_replaced_client_key_is_revoked_at_the_proxy_after_a_failed_revoke and the_registry_never_holds_more_keys_than_its_bound.

Notes from the agent: I did not have the text of #2578 or gominimal/arch#144. I wrote the arch#144 open-question entry from the one-client-per-socket-owner assumption in crates/bep/src/control.rs, and it also says the 16-key bound has no ruling. Check that entry against the issue. The verify-line move: the refused-key sub-requireme 8000 nt now names the minimal test a_refused_client_key_is_replaced_and_registered_before_the_mint. The bep test a_client_key_this_program_is_refused_is_replaced proves only that a second key goes in beside the first. The rationale change: the comment under BEP-063 now says that a kid revocation ends every handle signed under the key. The frontmatter updated: is now 2026-10-26. just lint-prose did not run because vale is not installed on this box.

Tests

line exit tail
cargo nextest run -p minimal a_replaced_client_key_is_revoked_at_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-0847... 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

Verify

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

toredEnv {
    |        ^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
    |
402 + #[must_use]
403 | pub fn deferring_env() -> StoredEnv {
    |

error: this method could have a `#[must_use]` attribute
    --> crates/boxes/src/core/compose.rs:1019:12
     |
1019 |     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |            ^^^^^^^^^^^^^^^^^^^^^^^^
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
     |
1019 ~     #[must_use]
1020 ~     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1085:5
     |
1085 |     pub fn as_sandbox_path(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1084:5
     |
1084 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use
     = note: `-D clippy::double-must-use` implied by `-D warnings`
     = help: to override `-D warnings` add `#[allow(clippy::double_must_use)]`

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1302:5
     |
1302 |     pub fn host_path(&self) -> &HostAbsPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1301:5
     |
1301 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1309:5
     |
1309 |     pub fn destination(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1308:5
     |
1308 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: could not compile `boxes` (lib) due to 6 previous errors
warning: build failed, waiting for other jobs to finish...

Closes #2578

Amend BEP-063 with sub-requirements for revocation by kid, the
three-step replacement, the pending-revoke retry and the registry
bound. Each one names an existing test. Move the refused-key verify
line to the client-side test, and record the one-client-per-user
question (gominimal/arch#144).
@coderabbitai
coderabbitai Bot commented Oct 26, 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: ba2c0a55-ec93-47bd-9f51-0369df55099a

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.

@github-actions
github-actions Bot commented Oct 26, 2026 •
Copy link
Copy Markdown
Contributor

Spec lint

docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md — 11 finding(s)

docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:113: P004 BEP-003 names test 'bep_second_box_needs_no_sign_in', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:170: P004 BEP-007 names test 'bep_box_env_holds_sealed_value_only', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:214: P004 BEP-011 names test 'bep_root_ca_present_in_box_trust_store', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:230: P004 BEP-012 names test 'bep_proxy_env_and_no_proxy_are_set', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:284: P004 BEP-015 names test 'bep_git_and_gh_against_private_repo', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:625: P004 BEP-043 names test 'bep_destroyed_box_values_refused_within_60s', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:634: P004 BEP-044 names test 'bep_logout_refuses_every_reference_at_next_request', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:647: P004 BEP-070 names test 'box_id_is_a_csprng_uuidv7_per_creation', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:677: P004 BEP-047 names test 'bep_and_gvproxy_are_separate_processes_and_users', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:686: P004 BEP-049 names test 'prop_audit_chain_detects_unrecomputed_edit', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:729: P004 BEP-079 names test 'secret_set_writes_user_level_store_rule', which was not found in the repository

Advisory. None of this blocks the merge; the review decides.

Advisory, and never a merge gate. Linter: gominimal/foundry@fb5932b8, spec format: How Minimal Writes Specs.

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

Approved: every review thread resolved at 44ea298036bb.

@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 — approved

Verdict APPROVE — No findings.

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

@minimal-foundry minimal-foundry Bot added the review:approved minimal-review approved the current head label Oct 26, 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 · 1 condition · the full ruling

The new BEP-063 sub-requirements conform to Gatehouse §6.10 line 842. Each verify line names a test that exists, and the text matches the code. One statement is incomplete. A successful replacement revokes the refused key, so the client's own running boxes lose their store handles and sign-in references before they end. Section 6.10 line 839 says these work for the life of the box. Make the two spec edits in C1 to state this.

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

Copy link
Copy Markdown
Member

/revise

Round 1 of #2594, on the arch condition at 6a4e641 (PASS_WITH_CONDITIONS, C1, threads 4373914120 and 4373914123). No round is in flight. This is a spec-only change.

  1. In docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, near line 494: "The order keeps running boxes redeeming" holds only on the failure paths. A successful replacement revokes the refused key in step three. Every store handle and sign-in reference signed under that key then stops, including those held by this client's own running boxes, which lose them before they end. Say that plainly. Keep the order's failure-path guarantee as it is.
  2. Near line 1093, the [NEEDS CLARIFICATION] entry names only the second-client case. Add this client's own running boxes minted under the refused key, so gominimal/arch#144 holds the full question (Gatehouse §6.10 line 839 says those references work for the life of the box).
  3. Reply on both threads naming the commit, and resolve them.

One commit, Conventional Commits subject, every body line at most 72 characters.


Generated by Claude Code

A successful replacement revokes the refused key in step three, so
this client's own running boxes lose the store handles and sign-in
references signed under it. The order's guarantee holds only on the
failure paths. The arch#144 entry now names this case beside the
second-client case.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p minimal a_replaced_client_key_is_revoked_at_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-b775... 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

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

toredEnv {
    |        ^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
    |
402 + #[must_use]
403 | pub fn deferring_env() -> StoredEnv {
    |

error: this method could have a `#[must_use]` attribute
    --> crates/boxes/src/core/compose.rs:1019:12
     |
1019 |     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |            ^^^^^^^^^^^^^^^^^^^^^^^^
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
     |
1019 ~     #[must_use]
1020 ~     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1085:5
     |
1085 |     pub fn as_sandbox_path(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1084:5
     |
1084 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use
     = note: `-D clippy::double-must-use` implied by `-D warnings`
     = help: to override `-D warnings` add `#[allow(clippy::double_must_use)]`

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1302:5
     |
1302 |     pub fn host_path(&self) -> &HostAbsPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1301:5
     |
1301 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1309:5
     |
1309 |     pub fn destination(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1308:5
     |
1308 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: could not compile `boxes` (lib) due to 6 previous errors
warning: build failed, waiting for other jobs to finish...

Review threads the coder judged:

  • 👍 valid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: Commit 3922df7: the rationale at line 494 now limits the order's guarantee to the failure paths. It also says that step three revokes the refused key, so this client's own running boxes lose their handles and sign-in references before they end.
  • 👍 valid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: Commit 3922df7: the arch#144 entry now names this client's own running boxes minted under the refused key, and it cites Gatehouse §6.10 on references that work for the life of the box.

Spec 24 states client-key revocation, replacement and the registry bound, each with a verify line that names an existing test. The replacement rationale now says that a successful replacement revokes the refused key, so this client's own running boxes lose their store handles and sign-in references. The gominimal/arch#144 entry names that case beside the second-client case.

Notes from the agent: Revise round 1 is in commit 3922df7. just lint-prose did not run because vale is not installed on this box. I did not reply on or resolve the threads. The runtime posts the verdicts, and the reviewer resolves the threads.

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

@minimal-foundry minimal-foundry Bot removed the review:approved minimal-review approved the current head label Oct 26, 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 · 1 condition · the full ruling

The spec changes for BEP-063 match the code in crates/bep/src/control.rs and crates/minimal/src/mint.rs. Each verify line names a test that exists. Step three of the replacement and the registry bound end the references of running boxes. Gatehouse §6.10 line 839 says those references work for the life of the box. The spec now states this conflict and links gominimal/arch#144. When that issue rules, make the spec edit in C1. The change can merge with C1 open.

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

A successful replacement revokes the refused key, so this client's own
running boxes lose their store handles and sign-in references. The
requirement text now says so, pending gominimal/arch#144.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p minimal a_replaced_client_key_is_revoked_at_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-8a43... 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

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

toredEnv {
    |        ^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
    |
402 + #[must_use]
403 | pub fn deferring_env() -> StoredEnv {
    |

error: this method could have a `#[must_use]` attribute
    --> crates/boxes/src/core/compose.rs:1019:12
     |
1019 |     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |            ^^^^^^^^^^^^^^^^^^^^^^^^
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
     |
1019 ~     #[must_use]
1020 ~     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1085:5
     |
1085 |     pub fn as_sandbox_path(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1084:5
     |
1084 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use
     = note: `-D clippy::double-must-use` implied by `-D warnings`
     = help: to override `-D warnings` add `#[allow(clippy::double_must_use)]`

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1302:5
     |
1302 |     pub fn host_path(&self) -> &HostAbsPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1301:5
     |
1301 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1309:5
     |
1309 |     pub fn destination(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1308:5
     |
1308 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: could not compile `boxes` (lib) due to 6 previous errors
warning: build failed, waiting for other jobs to finish...

Review threads the coder judged:

  • 👍 valid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: The replace requirement text now states that references signed under a revoked key stop, own running boxes included, pending gominimal/arch#144. The comment notes that the verify test already pins this: a_replaced_client_key_is_revoked_at_the_proxy asserts the earlier handle no longer verifies.

Spec 24 states client-key revocation by kid, replacement in three steps with the pending-revoke retry, and the registry bound of 16 keys, each with a verify line that names an existing test. The replace clause now also says in its requirement text that this client's own running boxes lose the references signed under the revoked key, pending gominimal/arch#144.

Notes from the agent: Revise round 2. The requirement text of the replace clause now states the loss and names gominimal/arch#144. The HTML comment now says that the verify test pins the loss: a_replaced_client_key_is_revoked_at_the_proxy asserts that a handle minted under the old key before the replacement no longer verifies after it, and after a proxy restart too. just lint-prose did not run, because vale is not installed on this box.

@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 spec amendment conforms to Gatehouse §6.10 line 842 for revocation by kid, the replacement order, the retry and the verify lines. The replacement still revokes the refused key, so this client's own running boxes lose their references before they end. Line 839 says those references work for the life of the box. This head states that loss in the EARS line and holds it open on gominimal/arch#144, so the merge can go ahead. Apply C1 when arch#144 rules.

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

@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: 6 unresolved threads — minimal-arch[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, minimal-arch[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, minimal-foundry[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, minimal-arch[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, minimal-arch[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:499, …. No findings.

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

@norrietaylor
norrietaylor force-pushed the agent/2578-amend-bep-063-for-client-key-revocation-replacem branch from 3e3e5e7 to 0263c63 Compare October 26, 2026 05: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).

@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 has the same tree as 3e3e5e7c, so the earlier ruling stands. Kid revocation, the pending-revoke retry and the registry bound conform to Gatehouse §6.10 lines 839 and 842. The replace clause revokes the refused key under a running box. Line 839 says the references work for the life of the box. The spec states that loss and links gominimal/arch#144, so the merge can go ahead. Make the C1 spec edit when arch#144 rules.

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

The client writes the file after it registers the replacement and before
the keychain keeps it. Also state the running-box loss that the registry
bound causes, pending gominimal/arch#144.
@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 new pending-revoke wording matches local_client_key_at() in crates/minimal/src/mint.rs. The new statement of the registry-bound loss is correct. A key that the replacement revokes, or that the bound drops, still ends the handles of a running box. Gatehouse §6.10 line 839 says those handles work for the life of the box. The spec parks this under gominimal/arch#144, so C1 from the baseline stays open as a filed residual. Amend BEP-063 when arch#144 rules.

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

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

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p minimal a_replaced_client_key_is_revoked_at_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-4df0... 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

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

toredEnv {
    |        ^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
    |
402 + #[must_use]
403 | pub fn deferring_env() -> StoredEnv {
    |

error: this method could have a `#[must_use]` attribute
    --> crates/boxes/src/core/compose.rs:1019:12
     |
1019 |     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |            ^^^^^^^^^^^^^^^^^^^^^^^^
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
     |
1019 ~     #[must_use]
1020 ~     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1085:5
     |
1085 |     pub fn as_sandbox_path(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1084:5
     |
1084 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use
     = note: `-D clippy::double-must-use` implied by `-D warnings`
     = help: to override `-D warnings` add `#[allow(clippy::double_must_use)]`

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1302:5
     |
1302 |     pub fn host_path(&self) -> &HostAbsPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1301:5
     |
1301 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1309:5
     |
1309 |     pub fn destination(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1308:5
     |
1308 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: could not compile `boxes` (lib) due to 6 previous errors
warning: build failed, waiting for other jobs to finish...

Review threads the coder judged:

  • 👎 invalid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: This change waits on a ruling that is not out yet. On this branch, the replace sub-requirement and its comment already say that step three revokes the refused key and the running boxes lose their references. The arch#144 entry carries the question. This text will change when arch#144 rules.
  • 👍 valid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:499: The bound's comment and the arch#144 entry now say that a dropped key ends the handles and sign-in references of the running boxes minted under it, until arch#144 rules on the bound.
  • 👎 invalid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:491: The thread agrees that the line is correct for this head. The change it asks for, and the removal of the NEEDS CLARIFICATION entry, wait on the arch#144 ruling, which is not out yet.
  • 👍 valid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: Reworded the requirement so it no longer says the file is recorded on failure. The comment now says the client writes it after register and before store.replace, and the next creation removes a file left stale by a failed step two.

Spec 24 BEP-063 states revocation by kid, the three-step replacement with the pending-revoke retry, and the registry bound of 16. Each one has a verify line that names an existing test. The pending-revoke requirement now says when the client writes the file, and that matches local_client_key_at. The bound's comment and the gominimal/arch#144 entry now state the loss to running boxes.

Notes from the agent: Round 3. The pending-revoke requirement now says the replacement is revoked again from the file that names its kid. Its comment says the client writes the file after step one and before step two, as mint.rs does. I added the running-box loss to the registry-bound comment and to the NEEDS CLARIFICATION entry for gominimal/arch#144. The two arch threads that ask for a change after arch#144 rules need nothing yet, because that issue has not ruled. just lint-prose did not run because vale is not installed on this box.

@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

arch-review: CONDITIONS · 1 condition · the full ruling

The commit a698353 names #2605 and the arch#144 ruling for both known gaps. This closes the earlier condition. The merge of main brings in bep serve --max-client-keys (T69). The bound comment at line 502 still says the proxy binary has no setting for the bound. That is now false, and the spec misstates how the registry in Gatehouse §6.10 line 842 is bounded. Make the edit in C1. Then the change conforms.

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

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 7 of 10 on a /revise note, pushed as 9031b38d3ab3.

line exit tail
cargo nextest run -p minimal a_replaced_client_key_is_revoked_at_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-2a41... 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

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

toredEnv {
    |        ^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
    |
402 + #[must_use]
403 | pub fn deferring_env() -> StoredEnv {
    |

error: this method could have a `#[must_use]` attribute
    --> crates/boxes/src/core/compose.rs:1019:12
     |
1019 |     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |            ^^^^^^^^^^^^^^^^^^^^^^^^
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
     |
1019 ~     #[must_use]
1020 ~     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1085:5
     |
1085 |     pub fn as_sandbox_path(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1084:5
     |
1084 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use
     = note: `-D clippy::double-must-use` implied by `-D warnings`
     = help: to override `-D warnings` add `#[allow(clippy::double_must_use)]`

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1302:5
     |
1302 |     pub fn host_path(&self) -> &HostAbsPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1301:5
     |
1301 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1309:5
     |
1309 |     pub fn destination(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1308:5
     |
1308 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: could not compile `boxes` (lib) due to 6 previous errors
warning: build failed, waiting for other jobs to finish...

Review threads the coder judged:

Spec 24 states client-key revocation, replacement and the registry bound, each with a verify line that names an existing test. The known gaps in the replace and bound sub-requirements now link #2605 and the gominimal/arch#144 ruling comment.

Notes from the agent: Round 7 changed only the two comments. The SHALL statements and verify lines are unchanged. I was not able to run just lint-prose because vale is not installed on this box. The recipe stopped at its _need check. The lint on the two touched lines is still owed. I did not check the text of #2605, because this box has no access to GitHub. C2 accepts #2605 only if that issue names the bound sub-requirement and the_registry_never_holds_more_keys_than_its_bound. The directive says that #2605 covers the bound.

@norrietaylor
norrietaylor force-pushed the agent/2578-amend-bep-063-for-client-key-revocation-replacem branch from 9031b38 to d29def8 Compare October 26, 2026 07:41
Copy link
Copy Markdown
Member

/revise

Round 8 of #2594, on arch condition C1 at 9031b38 (CONDITIONS). No round is in flight. Spec-only. I reworded one commit body for commitlint and force-pushed, with the tree unchanged, so fetch the branch first.

The merge of main brought in T69 (#2593): bep serve --max-client-keys <N>. The comment under the BEP-063 registry-bound sub-requirement (spec line 502) still says "the proxy binary has no setting for the bound and no idle period, and only an embedder sets another".

  1. In docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, replace that clause with what the code does at this head, as arch C1 words it:
    • bep serve --max-client-keys <N> sets the bound (16 by default, KeyBound::DEFAULT_MAX_KEYS).
    • A value below 1 is refused when the arguments parse.
    • The idle period stays unset until gominimal/arch#85 decides the root validity.
    • An embedder that holds more keys than the bound keeps every key the file holds (a_larger_key_bound_keeps_every_key_the_file_holds).
  2. Change nothing else. Keep the T84 — Keep a replaced client key verifying until the boxes minted under it end #2605 links. Run just lint-prose docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md and drive the touched lines to zero alerts. Keep each commit body line under 100 characters.

Generated by Claude Code

T69 added the flag. The comment under the registry bound still said the
proxy binary has no setting for it. State the flag, its default, the
refusal below 1 and the test that pins them.
@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: 6 unresolved threads — minimal-foundry[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, minimal-foundry[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, minimal-arch[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, minimal-arch[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md, minimal-foundry[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:502, …. No findings.

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

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

Two BEP-063 sub-requirements state the current code and not the design. The replace clause revokes every other key, and the bound drops the least recent key. Both end the handles of a running box. Gatehouse §6.10 line 839 says these handles work for the life of the box. Restore the design text and name the tests that will exist, as C1 and C2 say. Issue #2605 then carries the code.

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

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 8 of 10 on a /revise note, pushed as acecdcd0d0c7.

line exit tail
cargo nextest run -p minimal a_replaced_client_key_is_revoked_at_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-995e... 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

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

toredEnv {
    |        ^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
    |
402 + #[must_use]
403 | pub fn deferring_env() -> StoredEnv {
    |

error: this method could have a `#[must_use]` attribute
    --> crates/boxes/src/core/compose.rs:1019:12
     |
1019 |     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |            ^^^^^^^^^^^^^^^^^^^^^^^^
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
     |
1019 ~     #[must_use]
1020 ~     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1085:5
     |
1085 |     pub fn as_sandbox_path(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1084:5
     |
1084 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use
     = note: `-D clippy::double-must-use` implied by `-D warnings`
     = help: to override `-D warnings` add `#[allow(clippy::double_must_use)]`

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1302:5
     |
1302 |     pub fn host_path(&self) -> &HostAbsPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1301:5
     |
1301 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1309:5
     |
1309 |     pub fn destination(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1308:5
     |
1308 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: could not compile `boxes` (lib) due to 6 previous errors
warning: build failed, waiting for other jobs to finish...

Review threads the coder judged:

  • 👍 valid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: Replaced the 'no setting for the bound' clause with bep serve --max-client-keys <N>, its default of 16 (KeyBound::DEFAULT_MAX_KEYS) and the refusal below 1. The idle-period clause stays.
  • 👍 valid — docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: The clause now names bep serve --max-client-keys <N>, the default 16, the refusal below 1 and serve_passes_its_key_bound_to_the_control_socket. It keeps the idle-period clause and the gominimal/arch#85 reference.

Spec 24 states client-key revocation, replacement and the registry bound, each with a verify line that names an existing test. The comment under the registry bound now says that bep serve --max-client-keys <N> sets the bound (16 by default, KeyBound::DEFAULT_MAX_KEYS), and that a value below 1 is refused when the arguments parse (serve_passes_its_key_bound_to_the_control_socket). It also says the idle period stays unset until gominimal/arch#85 decides, and that a larger embedder bound keeps every key the file holds.

Notes from the agent: Round 8 changed one clause in the BEP-063 registry-bound comment and nothing else. The #2605 and arch#144 links are unchanged. I was not able to run just lint-prose because vale is not installed on this box (the recipe exits at _need). The touched lines did not get a Vale run, so lint them on a host with vale. The commit body lines are under 100 characters. For the a_larger_key_bound test, I worded the clause as 'an embedder that sets a bound above the count of keys in the file keeps every key the file holds'. The test sets a bound of twice the held count, so this wording matches it better than 'holds more keys than the bound'.

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

@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 corrects the bound note. bep serve --max-client-keys exists, it defaults to KeyBound::DEFAULT_MAX_KEYS (16), and serve_passes_its_key_bound_to_the_control_socket tests it. Every other verify line names a test that exists at head. The replacement and bound sub-requirements still end the references of a running box. Gatehouse §6.10 line 839 keeps those references for the life of the box. The spec declares that gap and links #2605, so C1 stays open as a filed residual.

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

@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 fixes one rationale comment. It now says that the client removes the pending-revoke file after a successful revoke, and revoke_others in crates/minimal/src/mint.rs does this. The rest of BEP-063 keeps the baseline ruling. Client-key replacement and the registry bound still end the store handles of a running box. Gatehouse §6.10 line 839 keeps those handles working for the life of the box. The spec states this as a known gap, and #2605 owns it. C1 is that residual.

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

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 9 of 10 on the runtime's review findings, pushed as 44ea298036bb.

line exit tail
cargo nextest run -p minimal a_replaced_client_key_is_revoked_at_the_proxy 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-f64b... 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

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

toredEnv {
    |        ^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
    |
402 + #[must_use]
403 | pub fn deferring_env() -> StoredEnv {
    |

error: this method could have a `#[must_use]` attribute
    --> crates/boxes/src/core/compose.rs:1019:12
     |
1019 |     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |            ^^^^^^^^^^^^^^^^^^^^^^^^
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#must_use_candidate
help: add the attribute
     |
1019 ~     #[must_use]
1020 ~     pub fn lifecycle_hooks_teardown(&self) -> impl DoubleEndedIterator<Item = &ProvenancedHook> {
     |

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1085:5
     |
1085 |     pub fn as_sandbox_path(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1084:5
     |
1084 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use
     = note: `-D clippy::double-must-use` implied by `-D warnings`
     = help: to override `-D warnings` add `#[allow(clippy::double_must_use)]`

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1302:5
     |
1302 |     pub fn host_path(&self) -> &HostAbsPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1301:5
     |
1301 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: this function has a `#[must_use]` attribute with no message, but returns a type already marked as `#[must_use]`
    --> crates/boxes/src/core/primitives.rs:1309:5
     |
1309 |     pub fn destination(&self) -> &SandboxRelPath {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
help: remove `must_use`
    --> crates/boxes/src/core/primitives.rs:1308:5
     |
1308 |     #[must_use]
     |     ^^^^^^^^^^^
     = note: alternatively, you may add an explicit reason to the `must_use` attribute
     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.98.0/index.html#double_must_use

error: could not compile `boxes` (lib) due to 6 previous errors
warning: build failed, waiting for other jobs to finish...

Review threads the coder judged:

Spec 24 BEP-063 states client-key revocation by kid, the three-step replacement with the pending-revoke retry, and the registry bound. Each has a verify line that names a test that exists on this branch. The retry comment now says the client removes the pending-revoke file when the revoke succeeds, as revoke_others in crates/minimal/src/mint.rs does.

Notes from the agent: Round 9 changes one comment in the spec. The four minimal-arch threads (C1, C2) are judged invalid: the task's proof requires each verify line to name an existing test and to state what the code does today. An earlier round accepted a finding that a verify line naming a missing test made the proof false. #2605 owns the change of the requirement and its tests, and the spec links it as a known gap with the arch#144 ruling. If the planner wants the target behaviour in the SHALL now, the task proof must change first. just lint-prose did not run: vale is not installed on this box. The doc comment on revoke_others in crates/minimal/src/mint.rs carries the same imprecise wording ('when the proxy records the revoke'). That file is outside this task's layers, so it is unchanged.

@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: 2 unresolved threads — minimal-arch[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:494, minimal-arch[bot] docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:502. No findings.

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

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

Own review at 44ea298. The spec states BEP-063 as the code does it today: register, keep, revoke by kid, the pending-revoke retry the client clears, and the --max-client-keys bound. Each line names a test that exists. The running-box loss is a known gap that links the arch#144 ruling and #2605 (T84), which owns the fix and edits these lines. No other findings.


Generated by Claude Code

@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 44ea298036bb 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 26, 2026
@norrietaylor norrietaylor changed the title T71 — Amend BEP-063 for client-key revocation, replacement and the registry bound docs(specs): amend BEP-063 for client-key revocation, replacement and the registry bound (T71) Oct 26, 2026
@norrietaylor norrietaylor changed the title docs(specs): amend BEP-063 for client-key revocation, replacement and the registry bound (T71) docs(specs): amend BEP-063 for client-key revocation, replacement and the bound (T71) Oct 26, 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 44ea298: every merge gate passes at this head (arch PASS at 44ea298, zero open threads, every lane aggregator green). Squash title docs(specs): amend BEP-063 for client-key revocation, replacement and the bound (T71) 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 26, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 26, 2026
Copy link
Copy Markdown
Member

The merge-queue run for this PR (run 40295417981, tests) failed minimald box_actor::tests::a_mint_whose_host_dies_before_attach_reports_a_spawn_failure, the flaky test tracked in #2609. This PR changes only the spec. Re-queueing once.


Generated by Claude Code

@norrietaylor
norrietaylor added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit 13a8ccd Oct 26, 2026
38 checks passed
@norrietaylor
norrietaylor deleted the agent/2578-amend-bep-063-for-client-key-revocation-replacem branch October 26, 2026 09:40
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.

T71 — Amend BEP-063 for client-key revocation, replacement and the registry bound

1 participant

0