8000 feat(bep): verify store handles against the client's registered key and the current rule by minimal-foundry[bot] · Pull Request #2467 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

feat(bep): verify store handles against the client's registered key and the current rule - #2467

Merged
norrietaylor merged 8 commits into
mainfrom
agent/2270-verify-signed-handles-against-the-client-s-regis
Oct 21, 2026
Merged

norrietaylor merged 8 commits into
mainfrom
agent/2270-verify-signed-handles-against-the-client-s-regis

Conversation

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

T7 — Verify signed handles against the client's registered key and the current rule

slice: S0
kind: task
covers: BEP-064
size: L
est: 300 code, 240 tests
executor: agent
difficulty: needs care
model: standard
diagnostics: a refused handle is audited store_handle_invalid, and min box audit <box> shows the marker with the store and identifier
observability: one debug log line per handle checked with the store, the identifier and the outcome, never the signature
layers:
- handle:
- crates/bep/src/handle.rs (new): the store-handle wire format, the client-key registry, and the BEP-064 check against the rule read per request
- crates/bep/src/redeem.rs: the handle check stands where the module checks read a host set, mode and breadth
- crates/bep/src/lib.rs: module line
- scripts/kani.sh: the added harness's count
test: cargo nextest run -p bep prop_store_handle_verified_against_current_rule
test: cargo nextest run -p bep edited_store_rule_applies_to_next_request
test: cargo nextest run -p bep sign_in_reference_is_judged_against_the_module
test (deferred: kani): cargo nextest run -p bep kani_redeem_refuses_invalid_store_handle
produces:
- crates/bep/src/handle.rs
consumes: none
proof: A handle with a bad signature, past expiry, or wider than its rule is refused, and an edited rule decides the next request.
depends on:
- blocked by #2268

Proof

In crates/bep, redeem::decide refuses a handle as store_handle_invalid in four cases: its signature does not verify under a registered client key, it is past its exp, its upstream is not a subset of the current rule, or its inject differs from the rule. The tests show this with real ES256 handles. handle::read reads the rule again for each request, so a rule that is narrowed, has a new form, or is removed refuses the next request, and a restored rule admits it again. A sign-in reference is judged against the GitHub module.

Notes from the agent: Deferred (lane: kani): kani_redeem_refuses_invalid_store_handle is written in redeem.rs kani_proofs, and the bep count in scripts/kani.sh is now 10. I did not run it. Design: Redemption gains a third type parameter I (the injection form, default handle::Inject) and a handle: Handle<H, I> field. The check runs after Revoked and before OffPort. For a store handle the shell must give the handle's upstream as bound_set and the rule's authorities as current_set (see the redeem.rs module doc). No shell calls decide yet, so the audit record and min box audit do not show store_handle_invalid until the proxy shell is wired. Check::StoreHandleInvalid.marker() and handle::Read::identifier (":") are the values that wiring must put in the record. handle::read writes one tracing::debug line per handle with store, id and outcome, and never the signature. seal::MemberKind has no Store variant (seal.rs is outside the layers), so the handle kind comes from the JWS payload. ES256 uses p256's default ecdsa feature, which was already on, so no Cargo.toml change. Whole-crate run: cargo nextest run -p bep, 96 passed. That run found that the shared valid_handle fixture expired inside other tests' clock range, and I fixed it before the commit. I deleted the generated crates/bep/proptest-regressions/ directory and did not commit it.

Tests

line exit tail
cargo nextest run -p bep prop_store_handle_verified_against_current_rule 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-cc42... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 10.43s ──────────── Nextest run ID b9235fc9-fbc3-4553-8dcf-1b389ac2b5a6 with nexte
cargo nextest run -p bep edited_store_rule_applies_to_next_request 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-1e06... Finished 'test' profile [unoptimized] target(s) in 0.43s ──────────── Nextest run ID 57e7db9a-7e91-4538-bcbf-40b822b377d9 with nextest profile: default Starting 1 test across 2
cargo nextest run -p bep sign_in_reference_is_judged_against_the_module 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-6920... Finished 'test' profile [unoptimized] target(s) in 0.39s ──────────── Nextest run ID 4ca15d07-ae25-4784-b9fd-f76718046270 with nextest profile: default Starting 1 test across 2

Verify

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

Deferred

The plan marked these test lines deferred: the executor lacks the lane, so nothing here ran them and they still owe evidence.

line lane
cargo nextest run -p bep kani_redeem_refuses_invalid_store_handle kani

Closes #2270

Residuals


Generated by Claude Code

Add the store-handle wire format (an ES256 compact JWS), the registry of
client keys, and the BEP-064 check. The proxy reads the rule for each
request, so an edited [secret-store-rules] rule decides the next request.
A sign-in reference has the GitHub module as its rule.

The redemption decision makes the handle check after the revocation
check, and refuses a bad handle as store_handle_invalid. Add a Kani
harness for it and raise the bep harness count in scripts/kani.sh.
@coderabbitai
coderabbitai Bot commented Oct 20, 2026 •
Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 03fa0289-eb5b-4981-97a3-3189063fe3ff

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

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

Approved: every review thread resolved at 77a57878ffb3.

@norrietaylor resolved the last thread, which releases the approval this review had withheld.

Nothing to do.

@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

minimal-review — advisory review

Verdict COMMENT — 3 findings, 3 inline.

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

Comment thread crates/bep/src/redeem.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.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

The check is in the right place and fails closed. But the handle does not use the design's store-handle wire format. Gatehouse §6.10 line 842 gives typ "gatehouse-store-handle+jws" and a payload with sub, node_id, iat and jti. It also requires the BEP to check sub and node_id against the sealed value's context after the signature. Without that check, a handle copied from one box can be re-sealed for another box and pass, because the envelope proves no origin. C1 and C2 fix the format and add the check. C3 moves kind to the member, and C4 amends BEP-063 and BEP-064 to match the design.

Outside the diff

  • docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:481: C4 · Add the context case to BEP-064 and its property: refuse when the handle's sub or node_id differs from the sealed value's context. Amend BEP-063 (line 464) to list sub, node_id, iat and jti.

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

Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Add handle::read_opened, which reads the handle from the sealed member's
own jws. A handle of another kind than the member, or a value opened for
another module, has no rule and is refused as store_handle_invalid.

A sign-in reference whose store is not the module's id now has no rule.
The debug line logs the unverified store and id with Debug escaping.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p bep prop_store_handle_verified_against_current_rule 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-6cc9... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 20.22s ──────────── Nextest run ID ccd36150-d0a5-4ddc-bc47-75cbc4da47b3 with nexte
cargo nextest run -p bep edited_store_rule_applies_to_next_request 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-0e0a... Finished 'test' profile [unoptimized] target(s) in 0.52s ──────────── Nextest run ID 976bab93-39f5-4d31-b7ef-2a4a1a7fc8d7 with nextest profile: default Starting 1 test across 2
cargo nextest run -p bep sign_in_reference_is_judged_against_the_module 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-7434... Finished 'test' profile [unoptimized] target(s) in 0.61s ──────────── Nextest run ID 25130c03-5b09-4c46-8fa9-1525af317276 with nextest profile: default Starting 1 test across 2

Verify min task run agent-verify passed.

Review threads the coder judged:

  • 👍 valid — crates/bep/src/redeem.rs:422: Added handle::read_opened. It reads the handle from the opened member's own jws, and it refuses a handle whose kind or module does not match the member. The Redemption.handle doc now says that the shell builds it from the same Opened. Test: handle_is_read_from_the_opened_member. The handle's upstrea
  • 👍 valid — crates/bep/src/handle.rs:472: read now gives no rule for a sign-in reference whose claims.store is not module.id, so it is refused as store_handle_invalid. Added a case to sign_in_reference_is_judged_against_the_module.
  • 👍 valid — crates/bep/src/handle.rs:499: The debug line now logs store and id with Debug formatting (?), so control characters and newlines from an unverified handle are escaped.

In crates/bep, a handle with a bad signature, a handle past its expiry, or a handle wider than its rule is refused as store_handle_invalid. An edited [secret-store-rules] rule decides the next request. The handle that the decision judges is now read from the opened member's own jws, with handle::read_opened.

Notes from the agent: Revise round 1. Added handle::read_opened. It reads the handle from Opened.member.jws, and it gives no rule when the handle kind is not the member kind or when the value was opened for another module. decide stays a pure function over facts. The binding is in how the shell builds Redemption.handle, and the Redemption.handle doc says so. The bound set that comes from the handle's upstream stays as it is. Spec BEP-032's design note says that the handle's upstream is the bound set, and the handle is sealed inside the member. Deferred: cargo nextest run -p bep kani_redeem_refuses_invalid_store_handle (lane: kani). The harness is from round 0 and is unchanged, and this round did not run it. just clippy-strict did not run.

@norrietaylor norrietaylor changed the title T7 — Verify signed handles against the client's registered key and the current rule feat(bep): verify store handles against the client's registered key and the current rule Oct 20, 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.

Own review of dcfed82 (opening commit d398872, round 1 commit 3ff6ee8, base merge) against the T7 plan block (BEP-064).

  • Layers: crates/bep/src/handle.rs (new), redeem.rs, lib.rs, scripts/kani.sh. Nothing outside the task's layers; no Cargo change (ES256 rides p256's default feature).
  • Wire format and registry: compact JWS header.payload.signature, ES256 over header.payload, kid as the RFC 7638 thumbprint; ClientKeys registers SEC1 keys and verify refuses a tampered or foreign signature (test a_tampered_or_foreign_signature_does_not_verify).
  • BEP-064 check: Handle::check is pure and ordered Signature, Expired, NoRule, OutsideRule, InjectMismatch; decide refuses as store_handle_invalid after Revoked and before OffPort, and the oracle failures() plus admits_iff_every_check_passes carry the new check. prop_store_handle_verified_against_current_rule (256 cases) and the Kani harness count (bep 10) are in place; the Kani line is the deferred one the plan allows.
  • Rule read per request: read and read_opened take a Rules source and keep no copy; edited_store_rule_applies_to_next_request shows narrowed, reformed, removed and restored rules deciding the next request. sign_in_reference_is_judged_against_the_module judges a reference against the module's authorities with no injection.
  • Round 1: read_opened reads the handle from the opened member's own jws, so a handle of another kind or another module has no rule (the HIGH binding finding); a sign-in reference whose store is not module.id has no rule; the debug line logs the unverified store and id with Debug escaping and never the signature.
  • Open: arch-review's four conditions on d398872 (the design's typ and payload fields sub/node_id/iat/jti, a ContextMismatch check binding the handle to the opened value's box id and host, the kind taken from the sealed member rather than the JWS payload, and the BEP-063/BEP-064 spec amendment) are not yet carried; they are the next round. The plan's diagnostics line (the audit marker in min box audit) waits on the proxy shell wiring, as the body says.

Retitled to feat(bep): verify store handles against the client's registered key and the current rule, which lints.


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

Verdict COMMENT — 2 findings, 2 inline.

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

Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.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 · 6 conditions · the full ruling

The four BEP-064 checks are correct, and the compare binds the handle to the opened member. But the handle is still not in the format of Gatehouse §6.10 line 842. The typ is min-handle, and the payload has no sub, node_id, iat or jti. So the proxy does not compare the handle's box and node with the sealed context, and a handle can be sealed into another box's value. Make the changes in C1 to C4, amend BEP-064 in the spec (C5), and file the two residuals (C6). The escalation asks the design owner what td and env hold on an un-enrolled host.

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

Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Comment thread crates/bep/src/handle.rs Resolved
Follow the Gatehouse store-handle wire format: typ
gatehouse-store-handle+jws, and sub, node_id, iat an
10000
d jti in the
payload. The sealed member gives the kind, not the payload. A handle
whose sub or node_id differs from the opened value refuses as
context_mismatch. read is private, so only read_opened builds a
handle, from the sealed member.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 2 of 10 on the runtime's review findings, pushed as 38f9925c87e7.

line exit tail
cargo nextest run -p bep prop_store_handle_verified_against_current_rule 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-fe1d... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 6.81s ──────────── Nextest run ID f0e2a6ed-18f8-45e1-8ef3-742cfcb83397 with nextes
cargo nextest run -p bep edited_store_rule_applies_to_next_request 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-fa0c... Finished 'test' profile [unoptimized] target(s) in 0.28s ──────────── Nextest run ID 18b761bc-bccf-4124-bc03-472a141aa393 with nextest profile: default Starting 1 test across 2
cargo nextest run -p bep sign_in_reference_is_judged_against_the_module 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-ddef... Finished 'test' profile [unoptimized] target(s) in 0.28s ──────────── Nextest run ID 06c6107d-8ccd-4c4d-b656-a00cd500e4c7 with nextest profile: default Starting 1 test across 2

Verify min task run agent-verify passed.

Review threads the coder judged:

  • 👍 valid — crates/bep/src/handle.rs: TYP is now gatehouse-store-handle+jws.
  • 👍 valid — crates/bep/src/handle.rs:83: Claims now carry sub, node_id, iat and jti, and Read gives jti beside identifier.
  • 👍 valid — crates/bep/src/handle.rs: Removed kind from Claims. read takes the kind from the opened member through its Origin argument.
  • 👍 valid — crates/bep/src/handle.rs:373: Added Invalid::ContextMismatch. Handle::check tests it after Signature and before Expired.
  • 👍 valid — crates/bep/src/handle.rs: read sets Handle::bound only when sub and node_id equal the opened value's box_id and host. A test refuses a handle for another box and for another Box Host.
  • 👍 valid — crates/bep/src/handle.rs: The rule is chosen from origin.kind, which read_opened takes from the sealed member, not from the claims.
  • 👍 valid — crates/bep/src/handle.rs: read is now private. read_opened, which takes &Opened, is the only public way to build a Read, so the handle always comes from the sealed member.
  • 👍 valid — crates/bep/src/handle.rs: The kind now comes from the member, so no claims-kind mismatch is left. The docs in handle.rs and redeem.rs now say a sealed member has no store kind yet. Adding MemberKind::Store needs crates/bep/src/seal.rs, which is outside this task's layers.

The proxy refuses a handle as store_handle_invalid when its signature does not verify under a registered client key, when its sub or node_id is not the box and Box Host of the sealed value, when it is past expiry, or when it is wider than its rule or its inject differs. An edited [secret-store-rules] rule decides the next request, and the unit tests in crates/bep/src/handle.rs and redeem.rs show each case.

Notes from the agent: Revise round 2. Deferred: cargo nextest run -p bep kani_redeem_refuses_invalid_store_handle (lane: kani). The harness now also models the new Handle::bound fact, and I did not run it. A full run of cargo nextest run -p bep passed (97 tests). seal.rs is outside this task's layers and MemberKind has only SignIn, so read_opened reads sign-in references only. A later task that adds a store member kind must add one arm to the exhaustive match in read_opened. The store path of the check is covered through the private read in the unit tests.

@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: 15 unresolved threads — minimal-foundry[bot] crates/bep/src/handle.rs:502, minimal-foundry[bot] crates/bep/src/handle.rs:530, minimal-arch[bot] crates/bep/src/handle.rs, minimal-arch[bot] crates/bep/src/handle.rs:83, minimal-arch[bot] crates/bep/src/handle.rs, …. 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: PASS · the full ruling

The compare meets the store-handle wire format of Gatehouse §6.10 line 842. The typ is gatehouse-store-handle+jws. The payload carries sub, node_id, iat and jti. Handle::check now verifies the signature, then sub and node_id, then exp, then the current rule. That is the order the design gives. Every failure refuses as store_handle_invalid. BEP-064 conforms, and this ruling has no conditions.

Ruled at 38f9925 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 — approved

Verdict APPROVE — every review thread is resolved; @norrietaylor closed the last one. The review of 38f9925c87e7 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 20, 2026
Copy link
Copy Markdown
Member

/revise arch-review's ruling on dcfed82 (review 5593020858, run 118942596082) carried two conditions that 38f9925 did not touch; the PASS on 38f9925 read only the code. Carry them in substance:

C5 — amend spec 24. In docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md: BEP-063 (line 464) names the handle's typ gatehouse-store-handle+jws and the payload fields the code now carries, the box id (sub), the host (node_id), iat and jti, beside the store, the identifier, the upstream authorities, the injection form and the expiry. BEP-064 (line 481) adds the case "its sub or node_id differs from the sealed value's box or host" to its IF clause, and the same clause to its property: line. The design is the record (Gatehouse §6.10 line 842), so the spec follows it.

C6 — list the residuals in the PR body. Add a ## Residuals section naming #2468 (the audit record and min box audit carry store_handle_invalid with store, identifier and jti once the shell calls decide), #2469 (seal::MemberKind::Store, outside this task's layers, T27 #2288), and gominimal/arch#139 (what td and env hold un-enrolled; kind stays on the member). Both issues are filed; name them rather than filing again.

No code change is asked. Reply on the C5 threads if any open, else none.


Generated by Claude Code

BEP-063 names the handle's typ and the sub, node_id, iat and jti
claims. BEP-064 and its property refuse a handle whose sub or node_id
differs from the sealed value's box or host, as Gatehouse §6.10 does.
@github-actions
github-actions Bot commented Oct 20, 2026 •
Copy link
Copy Markdown
Contributor

Spec lint

docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md — 43 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:129: P004 BEP-069 names test 'an_expiring_sign_in_is_renewed_at_the_proxy', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:160: P004 BEP-005 names test 'local_member_is_a_sign_in_reference_expiring_with_the_root', 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:278: P004 BEP-061 names test 'signing_ca_rotation_invisible_to_boxes', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:282: 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:296: P004 BEP-018 names test 'quic443_blocked_rejects_udp_443', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:314: P004 BEP-078 names test 'steered_name_aaaa_https_svcb_are_nodata', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:319: P004 BEP-062 names test 'steered_name_servfail_while_proxy_down', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:326: P004 BEP-073 names test 'proxy_offers_http11_only_on_both_legs', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:339: P004 BEP-075 names test 'connect_and_absolute_form_accepted_over_http11_only', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:414: P004 BEP-055 names test 'prop_upstream_tls_validated_before_substitution', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:427: P004 BEP-026 names test 'host_shell_connection_is_refused', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:436: P004 BEP-028 names test 'host_ip_redemption_is_cohort_attributed', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:440: P004 BEP-029 names test 'request_outside_modules_is_refused_off_module', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:445: P004 BEP-030 names test 'unsealed_request_passes_through_and_is_audited', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:457: P004 BEP-032 names test 'store_reference_injects_in_registered_form', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:462: P004 BEP-033 names test 'store_value_read_per_request_never_written', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:466: P004 BEP-063 names test 'store_handle_signed_and_key_registered', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:498: P004 BEP-034 names test 'store_rule_in_deny_set_is_refused', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:506: P004 BEP-065 names test 'injected_value_is_exactly_prefix_plus_value', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:511: P004 BEP-066 names test 'crlf_in_value_or_prefix_refuses_injection', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:515: P004 BEP-035 names test 'ask_rule_without_tty_denies', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:519: P004 BEP-036 names test 'prop_store_upstream_outside_egress_is_exit_3', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:524: P004 BEP-037 names test 'project_store_rules_are_ignored_with_warning', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:547: P004 BEP-067 names test 'mint_and_destroy_append_audit_records', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:561: P004 BEP-068 names test 'segment_rotation_continues_chain', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:598: 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:607: 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:620: 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:631: P004 BEP-071 names test 'prop_revocation_covers_exactly_its_box', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:641: P004 BEP-045 names test 'deleted_keychain_item_refuses_next_injection', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:650: 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:659: 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:668: P004 BEP-050 names test 'secret_set_stores_in_keychain_and_prints_id_only', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:682: P004 BEP-051 names test 'secret_item_acl_admits_proxy_only', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:690: P004 BEP-052 names test 'secret_list_shows_metadata_without_values', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:694: P004 BEP-053 names test 'secret_rm_removes_item', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:698: P004 BEP-054 names test 'replaced_secret_is_injected_on_next_request', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:702: P004 BEP-079 names test 'secret_set_writes_user_level_store_rule', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:756: P004 BEP-N01 names test 'streamed_response_is_not_buffered', 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@51d29cb2, spec format: How Minimal Writes Specs.

@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 of bcad687 (round 3 commit, docs only, plus a base merge) against arch-review's condition C5 on dcfed82.

  • BEP-063 now names the typ gatehouse-store-handle+jws and the payload fields sub, node_id, iat and jti beside the store, the identifier, the upstream authorities, the injection form and the expiry. BEP-064 and its property: line add the case "its sub or node_id differs from the sealed value's box or host". Both match Gatehouse §6.10 line 842 and the code at 38f9925. No code changed.
  • The PR body carries a Residuals section naming #2468, #2469 and gominimal/arch#139 (condition C6).
  • The earlier review of dcfed82 stands for the code. The squash subject stays the PR title, which lints.

Generated by Claude Code

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p bep prop_store_handle_verified_against_current_rule 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-32fd... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 17.42s ──────────── Nextest run ID 3a4a77a0-0697-4815-af2f-22082e4a7780 with nexte
cargo nextest run -p bep edited_store_rule_applies_to_next_request 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-5f6b... Finished 'test' profile [unoptimized] target(s) in 0.62s ──────────── Nextest run ID 553b65f7-2f28-4f5b-9352-315f86a34987 with nextest profile: default Starting 1 test across 2
cargo nextest run -p bep sign_in_reference_is_judged_against_the_module 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-c7fe... Finished 'test' profile [unoptimized] target(s) in 0.63s ──────────── Nextest run ID 3ca5a8af-8b53-45eb-affc-5fd62392810a with nextest profile: default Starting 1 test across 2

Verify min task run agent-verify passed.

Outside the task's layers::

  • docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md

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

A handle with a bad signature, past expiry, wider than its rule, or bound to another box or Box Host is refused, and an edited rule decides the next request. Spec 24 now records the handle's typ and its sub, node_id, iat and jti claims, and BEP-064 names the box and host binding.

Notes from the agent: Revise round 3. C5: the spec 24 file is outside this task's layers. The /revise note asked for the change, so I made it. BEP-063 now names the JWS typ gatehouse-store-handle+jws and the sub, node_id, iat and jti claims. BEP-064 and its property line add the sub or node_id binding to the sealed value's box and host. No code changed. Vale is not installed on this box, so just lint-prose did not run. C6: I cannot edit the pull request body. Please add this to the body. ## Residuals: #2468 (the audit record and min box audit carry store_handle_invalid with store, identifier and jti once the shell calls decide). #2469 (seal::MemberKind::Store, outside this task's layers, T27 #2288). gominimal/arch#139 (what td and env hold un-enrolled; kind stays on the member). Deferred: cargo nextest run -p bep kani_redeem_refuses_invalid_store_handle (lane: kani), not run. The directive listed no review threads.

@minimal-foundry
minimal-foundry Bot marked this pull request as draft October 20, 2026 23:39
@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 · the full ruling

The compare since the PASS on 38f9925 is a clean merge of main and one spec commit. The bep code is unchanged. The spec commit adds the sub and node_id binding to BEP-063 and BEP-064. That text now follows Gatehouse §6.10 line 842 and the code at handle.rs line 512. BEP-064 conforms, and there are no conditions.

Ruled at bcad687 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).

Comment thread crates/bep/src/handle.rs Resolved
@minimal-foundry minimal-foundry Bot removed the review:approved minimal-review approved the current head label Oct 20, 2026
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p bep prop_store_handle_verified_against_current_rule 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-a663... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 7.25s ──────────── Nextest run ID 0b1bc4a3-80b2-4d2a-a8fd-e1e4d030843b with nextes
cargo nextest run -p bep edited_store_rule_applies_to_next_request 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-5cea... Finished 'test' profile [unoptimized] target(s) in 0.27s ──────────── Nextest run ID 61805345-04c2-4f77-bb42-48a07c63e6b9 with nextest profile: default Starting 1 test across 2
cargo nextest run -p bep sign_in_reference_is_judged_against_the_module 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-aa12... Finished 'test' profile [unoptimized] target(s) in 0.26s ──────────── Nextest run ID 425a12cf-765f-48b0-971b-131575d35ba6 with nextest profile: default Starting 1 test across 2

Verify min task run agent-verify passed.

Outside the task's layers::

  • docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md

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

Review threads the coder judged:

  • 👍 valid — crates/bep/src/handle.rs: The debug outcome now comes from outcome(), which names unparsed_upstream when the signature verifies but an upstream does not parse. The refusal is unchanged.

A handle with a bad signature, past expiry, or wider than its rule is refused as store_handle_invalid, and an edited rule decides the next request. The debug line for a handle whose upstream does not parse now names unparsed_upstream, not signature.

Notes from the agent: Revise round 4: one finding addressed in crates/bep/src/handle.rs. The refusal is unchanged. Only the debug outcome changed, through a new pure function outcome() with the unit test unparsed_upstream_is_logged_apart_from_the_signature (1 passed). Deferred: cargo nextest run -p bep kani_redeem_refuses_invalid_store_handle (lane: kani), not run on this box. just clippy-strict was not run.

@norrietaylor
norrietaylor marked this pull request as ready for review October 20, 2026 23:50
@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 · the full ruling

The new commit changes only the outcome text of the handle debug line. A verified handle with an upstream that does not parse now logs unparsed_upstream. The refusal does not change: Handle::check still refuses that handle, and the audit marker stays store_handle_invalid (Gatehouse §6.10 line 842). The PASS on bcad6877 stands for this head.

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

@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 of 9f51ebc (round 4 commit) against the LOW it answers: outcome() names unparsed_upstream when the signature verifies but an upstream authority does not parse, so the debug line no longer reads signature for a parse failure; the refusal path is unchanged and a unit test pins the three outcomes. Sound.

One lane is red on this head: commitlint fails on this commit's body (a line over 100 characters, body-max-line-length). The squash message carries every commit body, so that line must be rewrapped before the merge; a /revise asks for it. The earlier reviews stand.


Generated by Claude Code

Copy link
Copy Markdown
Member

/revise the commitlint lane is red on 9f51ebc (job 118951135468, step "Lint PR commits"): the body of commit 9f51ebc has a line longer than 100 characters, which commitlint refuses (body-max-line-length). The squash message on main carries every commit body, so the merge would carry the failure too.

Reword that one commit's message so every body line is 100 characters or fewer (wrap the sentence), and push the branch with the rewritten commit; the subject fix(bep): log an unparsed handle upstream apart from the signature stays. No code change. If the runtime cannot rewrite a pushed commit, say so on the PR instead.


Generated by Claude Code

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 5 of 10 on a /revise note: the coder changed nothing. The runtime cannot rewrite a pushed commit. The commitlint failure is real: the body of 9f51ebc has one line of 144 characters, and the limit is 100. The fix is to reword that commit and force-push the branch. The coder must not rewrite the commits on the branch or force-push, so I made no change. A new commit on top does not help, because commitlint checks every commit in the pull request. A person with push rights can fix it. Run git rebase -i 9f51ebc0^, mark the commit reword, and wrap the body line. For example: 'A handle that verifies but names an upstream that does not parse is still refused,' then on a new line 'but its debug line now says unparsed_upstream, not signature.' Then run git push --force-with-lease. Another way is to give the squash merge a message with every line at 100 characters or fewer. No code change was asked for, and I ran no tests.

@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 21, 2026
A handle that verifies but names an upstream that does not parse is
still refused, but its debug line now says unparsed_upstream, not
signature.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J3Guwr3mQPqSeGMcjzVjTd
@norrietaylor
norrietaylor force-pushed the agent/2270-verify-signed-handles-against-the-client-s-regis branch from 9f51ebc to 926919d Compare October 21, 2026 03:13
@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 · the full ruling

This head has the same tree as 9f51ebc0, which had a PASS. Only the commit signature changed. BEP-064 conforms to Gatehouse §6.10 line 842, as before. The Kani harness is deferred and still owes evidence.

Ruled at 926919d 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).

Comment thread crates/bep/src/redeem.rs Resolved
@minimal-foundry minimal-foundry Bot removed the review:approved minimal-review approved the current head label Oct 21, 2026
decide now refuses an authority outside the handle's own upstream as
outside_bound_set, so a bound set wider than the checked handle cannot
widen where the value goes. Adds a test for the mismatch.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 6 of 10 on the runtime's review findings, pushed as 77a57878ffb3.

line exit tail
cargo nextest run -p bep prop_store_handle_verified_against_current_rule 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-757f... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 13.98s ──────────── Nextest run ID 35d8490b-2bcd-4a65-ab5e-dfc5e49fef6d with nexte
cargo nextest run -p bep edited_store_rule_applies_to_next_request 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-afd2... Finished 'test' profile [unoptimized] target(s) in 0.57s ──────────── Nextest run ID 8db68558-a909-47cb-8055-4652f2f71f02 with nextest profile: default Starting 1 test across 2
cargo nextest run -p bep sign_in_reference_is_judged_against_the_module 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-f5ac... Finished 'test' profile [unoptimized] target(s) in 0.45s ──────────── Nextest run ID 2f1e911d-e3f5-4461-bd3d-e15eab6c0a62 with nextest profile: default Starting 1 test across 2

Verify min task run agent-verify passed.

Outside the task's layers::

  • docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md

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

Review threads the coder judged:

  • 👍 valid — crates/bep/src/redeem.rs:428: decide now refuses an authority outside the handle's own upstream as outside_bound_set, so a wider bound_set cannot widen the destination. Added bound_set_wider_than_handle_upstream_is_refused, and the oracles and Kani harnesses also read the handle's upstream.

The proxy refuses a handle with a bad signature, a handle past its expiry, or a handle wider than its rule, and audits it store_handle_invalid. The proxy reads the rule on each request, so an edited rule decides the next request. A request to an authority outside the handle's own upstream is now refused too, even when the bound set the shell passes is wider.

Notes from the agent: Revise round 6. decide refuses a connection authority that is not in the handle's upstream, as outside_bound_set, beside the bound-set check (check 9). New test bound_set_wider_than_handle_upstream_is_refused covers the mismatch. The test helper reached now puts the authority in the handle's upstream, and in its rule's, only when the upstream lacks it, so the handle's verdict does not change. The BEP-064 property now sends through reached. The Kani harnesses for BEP-021 and BEP-025 read the handle's upstream too. No harness was added, so scripts/kani.sh is unchanged. Deferred (lane: kani): cargo nextest run -p bep kani_redeem_refuses_invalid_store_handle. I did not run it. The full bep suite passed once at the end: 99 passed. I did not run just clippy-strict.

@minimal-foundry
minimal-foundry Bot marked this pull request as draft October 21, 2026 03:24
@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 · the full ruling

This push adds one check. decide now refuses an authority outside the handle's own upstream, so a wider bound set cannot widen where a value goes. Gatehouse §6.10 line 842 says the registration gives the authorities the value may be sent to. The handle's upstream must be a subset of that registration. So the new check enforces the design's bound and fails closed. The tests and the Kani harnesses carry the same check, and no gate is relaxed. The ruling on the earlier head stands for all other parts of the change.

Ruled at 77a5787 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: 1 unresolved thread — minimal-foundry[bot] crates/bep/src/redeem.rs:428. No findings.

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

@norrietaylor
norrietaylor marked this pull request as ready for review October 21, 2026 03:27
@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 77a57878ffb3 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 21, 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.

Own review of 77a5787 (round 6 commit) against the MEDIUM security finding it answers.

  • decide now refuses as OutsideBoundSet when the authority is outside the handle's own upstream, even if bound_set and current_set admit it, so a shell that fills bound_set wider than the checked handle cannot widen where the value goes. The module doc's check 9 says so.
  • The failures() oracle, admits_iff_every_check_passes, the BEP-064 proptest (through reached(), which keeps the handle and its rule consistent with the authority so only the new clause moves) and both Kani harnesses carry the same clause. bound_set_wider_than_handle_upstream_is_refused pins the mismatch and the admit on the handle's own authority. Sound.
  • Nothing else changed; handle.rs is as reviewed at 38f9925. The commit message lints. The squash subject stays the PR title.

Generated by Claude Code

@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 for T7 (closes #2270) at 77a5787.

All twelve gates pass on this head: own review, arch review PASS, the runtime's review concluded with every thread resolved, zero open threads, every lane aggregator green (ci-success, ci-linux-native-success, ci-linux-kvm-success, ci-macos-success, ci-shell-installer-success, ci-kani-success), CodeRabbit and license/cla green, not a draft, no needs-human, no implement in flight. The squash subject is a Conventional Commits feat(bep) subject under the length limit. Residuals are filed as #2468, #2469 and gominimal/arch#139.

Enqueuing a squash merge.


Generated by Claude Code

@norrietaylor
norrietaylor added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit 248b259 Oct 21, 2026
38 checks passed
@norrietaylor
norrietaylor deleted the agent/2270-verify-signed-handles-against-the-client-s-regis branch October 21, 2026 06:08
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.

T7 — Verify signed handles against the client's registered key and the current rule

1 participant

3310
0