8000 feat(bep): carry the handle jti into the audit record (T68) by minimal-foundry[bot] · Pull Request #2596 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

feat(bep): carry the handle jti into the audit record (T68) - #2596

Merged
norrietaylor merged 7 commits into
mainfrom
agent/2576-carry-the-handle-jti-into-the-audit-record
Oct 26, 2026
Merged

norrietaylor merged 7 commits into
mainfrom
agent/2576-carry-the-handle-jti-into-the-audit-record

Conversation

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

T68 — Carry the handle jti into the audit record

slice: S10
kind: task
covers: BEP-067
size: M
est: 110 code, 100 tests
executor: agent
difficulty: routine
model: standard
diagnostics: min box audit <box> shows the handle's jti on each store-handle record, empty when the handle does not parse
observability: the audit record carries jti
layers:
- audit:
- crates/bep/src/audit.rs: Decision and Record gain jti: String, empty when the handle does not parse
- crates/bep/src/redeemer.rs: facts() carries handle::Read::jti into the verdict (Gatehouse §6.10 line 842)
- crates/bep/src/forward.rs: Verdict::Admit and Verdict::Refuse carry the jti, and record and audit_refusal write it into the Decision (stale layers amended 2026-10-26 by the epic owner's rule)
- crates/bep/src/control.rs: its Decision literal sets an empty jti
- crates/bep/src/proxy.rs: its Decision literal sets an empty jti
- crates/minimal/src/cmd/box_audit.rs: min box audit shows the jti, and the test helper's Decision sets it
test: cargo nextest run -p bep a_store_handle_audit_record_carries_its_jti
produces: none
consumes: none
proof: A refused store member (store_handle_invalid) and a redeemed one both write an audit record that carries the handle's jti.
depends on:
- blocked by #2540

Proof

A refused store member (store_handle_invalid) now writes an audit record that carries the handle's jti. A redeemed sign-in member does the same. The min/v1 line has a jti field, and min box audit shows jti=<value> at the end of the row when the record has one. A value that does not open, or a request with no sealed value, writes an empty jti.

Notes from the agent: Deviation from the forward.rs layer note: Verdict::Refuse keeps its shape Refuse(&'static str), and Verdict::Admit gains no field. A field on Refuse breaks test code in crates/bep/src/revoke.rs and crates/bep/src/main.rs, which match Verdict::Refuse(marker) and Verdict::Refuse("no_live_box"). The layers do not name those files. The jti travels instead through a new provided trait method Redeemer::redeem_with_jti, which returns (Verdict, String). Its default gives an empty jti. BoxRedeemer overrides it with the jti from handle::Read::jti through Facts, and its redeem returns the verdict alone. Flow::decide calls redeem_with_jti and passes the jti to record. The task names audit_refusal under forward.rs, but it is in proxy.rs. Its Decision literal sets an empty jti because it refuses before any sealed value is read. Record.jti has #[serde(default)], so min box audit still reads lines written before the field existed. The hash chain hashes the line bytes, so old lines still verify. Printed text: min box audit text rows add jti=<value> after the marker, only when the jti is not empty. The existing columns do not change. An earlier test, audit::tests::every_decision_appends_one_audit_record, pins the record's key set. I added jti to it in a second commit. Extra runs: cargo nextest run -p bep (187 passed) and cargo nextest run -p minimal box_audit (8 passed). I did not run just ci or just clippy-strict.

Tests

line exit tail
cargo nextest run -p bep a_store_handle_audit_record_carries_its_jti 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-f506... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 12.81s ──────────── Nextest run ID 2ee844fd-3ed8-40ee-9fe0-79275a55882f with nexte

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

Base

The base branch moved while the coder worked and was merged in before the tests ran. These files changed on BOTH sides since the branch point — read them first, because a rewrite from a stale reading can undo a merge without a conflict:

  • crates/bep/src/forward.rs

Residuals

Closes #2576


Generated by Claude Code

The forwarder asks the redeemer for the handle's jti beside its verdict,
and writes it into each decision record. min box audit shows it. The
jti is empty when the request carries no handle or the handle does not
parse.
…handle-jti-into-the-audit-record

# Conflicts:
#	crates/bep/src/forward.rs
@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: 960af946-77a7-4463-88e1-cea5bca19f5e

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 26, 2026 •
Copy link
Copy Markdown
Contributor Author

Approved: every review thread resolved at 95d6b6f4961b.

@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 — 1 finding, 1 inline.

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

Comment thread crates/bep/src/redeemer.rs Resolved
@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

The code does what Gatehouse §6.10 line 842 asks. Every decision about a sealed value records the handle's jti, and a store_handle_invalid refusal records it too. The gap is in spec 24. The task covers BEP-067, but BEP-067 is the mint and revocation record. BEP-039's field list and BEP-040's property do not name jti, but this PR widens the BEP-039 key-set test to include it. C1 amends the spec so that it records the field, or files an issue for the amendment.

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

Comment thread crates/bep/src/audit.rs Resolved
Comment thread crates/bep/src/audit.rs Resolved
Only an admitted record's jti is verified, since decide admits only a
verified handle. A refusal keeps the claimed jti so a forged handle
still correlates.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p bep a_store_handle_audit_record_carries_its_jti 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-f989... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 14.61s ──────────── Nextest run ID 44cec125-ed3e-411f-8520-44fc5941a94b with nexte

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) -
8000
> &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 — crates/bep/src/redeemer.rs: Documented on Decision::jti, Record::jti and in facts() that only an admitted record's jti is verified (decide admits only a verified handle, redeem.rs:468) and a refused record's jti is the handle's claim. Not gated on verified: the task requires the jti on store_handle_invalid refusals, so a forge

A refused store member (store_handle_invalid) and a redeemed one both write an audit record that carries the handle's jti. The docs on Decision::jti and Record::jti now say that only an admitted record's jti is verified, and that a refused record's jti is the handle's claim.

Notes from the agent: Revise round 1: this round changes only doc comments. The jti is not gated on handle.verified, because the task proof requires the jti on a store_handle_invalid refusal, and a bad signature is one cause of that refusal. redeem.rs:468 refuses every handle whose check fails, and check fails when the handle is not verified. So an admitted record's jti is always verified.

@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, 1 inline.

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

Comment thread crates/bep/src/redeemer.rs Resolved
@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown
8000

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 code conforms to Gatehouse §6.10 line 842. Each store-handle decision record carries the handle's jti, and a store_handle_invalid refusal also carries it. Spec 24 does not record the new field. BEP-039 owns the record shape, but its field list and its property at line 564 do not include jti. The task also covers BEP-067, which owns mint and revocation records. C1 amends the spec to agree with the design. The change can merge with C1 open.

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

Comment thread crates/bep/src/audit.rs Resolved
A refused handle's jti is an unverified claim, so a sender controls
it. Debug formatting escapes control characters in the log line.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 2 of 10 on the runtime's review findings, pushed as 4996b152b375.

line exit tail
cargo nextest run -p bep a_store_handle_audit_record_carries_its_jti 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-f5c5... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 11.38s ──────────── Nextest run ID 1966c303-e9f9-49c7-a83e-581fb0b957f9 with nexte

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 h
8BD0
as 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 — crates/bep/src/audit.rs:171: The code is correct as the finding says. The requested change is to spec 24 (BEP-039, BEP-040), and that file is outside this task's layers. The spec owner must amend it in a separate docs change.
  • 👎 invalid — crates/bep/src/audit.rs:830: The test follows Gatehouse section 6.10 line 842. The fix is a BEP-039 amendment in spec 24, which is outside this task's layers. The spec owner must make it in a separate docs change.
  • 👍 valid — crates/bep/src/redeemer.rs: redeem_with_jti now logs jti = ?facts.jti, so control characters in an unverified claim are escaped.

A refused store member (store_handle_invalid) and a redeemed one both write an audit record that carries the handle's jti, and min box audit shows it. The redeemer debug log now writes that jti escaped.

Notes from the agent: This round changed one line in crates/bep/src/redeemer.rs: the debug log uses ?facts.jti. The two C1 threads ask for an amendment to spec 24 (BEP-039 and BEP-040). That spec file is not in this task's layers, so this round does not change it. A docs task or the spec owner must add jti to BEP-039 and BEP-040 with the Gatehouse section 6.10 line 842 citation.

@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 code does what Gatehouse §6.10 line 842 asks. The audit record carries the handle's jti as its correlation id, on an admitted record and on a store_handle_invalid refusal. The last push only escapes the jti in a debug log, and that does not change the ruling. One item is open. Spec 24 BEP-039 lists the audit record's fields without jti, and the task names BEP-067, which is about mint and revocation records. Amend the spec as C1 says, or file an issue for it and link the issue from this PR.

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

Comment thread crates/bep/src/audit.rs Resolved
@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

minimal-review — approval withheld

Verdict COMMENT — APPROVE withheld: 6 unresolved threads — minimal-foundry[bot] crates/bep/src/redeemer.rs, minimal-arch[bot] crates/bep/src/audit.rs:171, minimal-arch[bot] crates/bep/src/audit.rs:830, minimal-foundry[bot] crates/bep/src/redeemer.rs, minimal-arch[bot] crates/bep/src/audit.rs:171, …. No findings.

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

@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 4996b152b375 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 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 4996b15: every sealed-value decision record carries the handle's jti, a mint or revocation record carries none, min box audit prints jti= only when the record has one and escapes it, and the debug line escapes an unverified claim. The spec gap (arch C1) is filed as #2600. The BEP-067 comment in box_audit.rs follows that issue's covers: move. No other findings.


Generated by Claude Code

@norrietaylor norrietaylor changed the title T68 — Carry the handle jti into the audit record feat(bep): carry the handle jti into the audit record (T68) 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 4996b15: every merge gate passes at this head (arch PASS at 4996b15, zero open threads, every lane aggregator green). Squash title feat(bep): carry the handle jti into the audit record (T68) 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

/revise

Round on #2596 after a merge-queue failure at 4996b15. No round is in flight. #2583 (T33) landed on main and added a revocation(box_id) test helper in crates/bep/src/audit.rs that builds a Decision without jti. In the queue build, clippy failed with E0063 (missing field jti in initializer of audit::Decision, at crates/bep/src/audit.rs:1366).

  1. Merge main into this branch.
  2. Add jti: String::new() to that helper's Decision, with the same comment control.rs uses ("A mint or a revocation carries no handle."). Check every other Decision { .. } that main added since this branch's base for the same field, crates/bep/src/redeemer.rs and crates/bep/src/main.rs included.
  3. Change nothing else. Run cargo nextest run -p bep and clippy on bep with --all-targets.

Generated by Claude Code

The revocation helper that main added in #2583 builds a Decision
without jti, which failed the merge-queue build with E0063.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p bep a_store_handle_audit_record_carries_its_jti 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-bc39... Compiling bep v0.0.1 (/workbench/crates/bep) Finished 'test' profile [unoptimized] target(s) in 21.42s ──────────── Nextest run ID f3805dac-ef3f-4d1d-9079-2600c9fc7908 with nexte

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

A refused store member (store_handle_invalid) and a redeemed one both write an audit record that carries the handle's jti, and the branch now builds with main merged in.

Notes from the agent: The merge of main (through a1e65c5) was already on the branch as 72e011d. The only Decision literal without jti was the revocation(box_id) test helper in crates/bep/src/audit.rs. It now sets jti: String::new() with the control.rs comment. redeemer.rs and main.rs add no Decision literal (main.rs only names Vec), so they needed no change. Nothing else changed.

@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 merge from main and commit 95d6b6f4 do not change the ruling. The new commit sets an empty jti on a revocation test record. That is correct, because a revocation carries no handle. The code still records the handle's jti as the audit correlation id, as Gatehouse §6.10 line 842 says. C1 stays open as #2600: spec 24 BEP-039 must name jti, and covers: must move to BEP-039.

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

Comment thread crates/bep/src/audit.rs Resolved
@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

minimal-review — approval withheld

Verdict COMMENT — APPROVE withheld: 1 unresolved thread — minimal-arch[bot] crates/bep/src/audit.rs:148. No findings.

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
@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 95d6b6f: a merge of main plus jti: String::new() on the revocation test record that #2583 added, which fixes the E0063 the merge queue hit. No other change since 4996b15.


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 95d6b6f4961b 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 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 95d6b6f: every merge gate passes at this head (arch PASS at 95d6b6f, zero open threads, every lane aggregator green). Squash title feat(bep): carry the handle jti into the audit record (T68) 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
Merged via the queue into main with commit e455d2d Oct 26, 2026
37 checks passed
@norrietaylor
norrietaylor deleted the agent/2576-carry-the-handle-jti-into-the-audit-record branch October 26, 2026 08:30
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.

T68 — Carry the handle jti into the audit record

1 participant

0