Skip to content

v1.16.0 — approval integrity, single-use challenges & concurrency safety (5 High + Mediums)#21

Merged
wyckit merged 1 commit into
masterfrom
fix/v1.16-approval-integrity
Jun 22, 2026
Merged

v1.16.0 — approval integrity, single-use challenges & concurrency safety (5 High + Mediums)#21
wyckit merged 1 commit into
masterfrom
fix/v1.16-approval-integrity

Conversation

@wyckit

@wyckit wyckit commented Jun 22, 2026

Copy link
Copy Markdown
Owner

Closes a ninth external review (against v1.15.0). 260 passing + 3 env-gated skipped.

High

  • Reproduce-before-approve/approve requires RunReplay.Reproduce(...).Reproduced (409 on behavior drift); /challenges mints from the run's own signed policy decisions, so approval can't diverge from the reviewed graph.
  • Single-use approval challenges — a NonceLedger consumes each nonce on success (web /approve + MCP proxy), preventing replay within TTL.
  • Private-note draft blocked at the gatepol-draft-private-ref refuses a draft sourcing a private note before any dereference.
  • Concurrency-safe retentionArchive is serialized and never deletes an existing archive dest; unique temp names.
  • Production guards regression-tested — a Production-hosted test asserts startup refusal without a real auth boundary.

Medium

  • Rotation-aware sidecar verification (recorded key id); Docker healthcheck uses installed curl; live-Anthropic test fails on a dead transport; CI guards a zero-match FS-E2E filter; stale README version de-drifted.

Documented constraints: McpStdioClient is one-connection (not thread-shareable); tenant-wide run visibility is the chosen model; NuGet cryptographic signing is wired in CI but needs a certificate.

New tests: single-use challenge (unit + web replay), private-note block, production-startup refusal.

🤖 Generated with Claude Code

…concurrency safety (5 High + Mediums)

High:
- /approve requires the stored run to still REPRODUCE (RunReplay.Reproduce.Reproduced)
  before applying approvals; /challenges mints from the run's own signed policy
  decisions — approval can't drift from the reviewed graph.
- Approval challenges are single-use: NonceLedger consumes each nonce on success
  (web /approve + McpProxy), so a challenge can't be replayed within its TTL.
- DraftEmailAction referencing a private note is blocked at the gate
  (pol-draft-private-ref) before the adapter dereferences private content.
- Archive is serialized and never deletes an existing archive dest (racing prunes
  drop the redundant live copy); WriteAtomic uses unique temp names.
- Production startup guards are regression-tested (a Production-hosted test asserts
  startup refusal without a real auth boundary).

Medium:
- Owner/external-call sidecar signatures verify under the RECORDED key id (rotation-aware).
- Dockerfile installs curl + healthchecks via curl (base image ships no wget/curl).
- Live-Anthropic test asserts a non-empty bounded proposal (fails on a dead transport).
- CI guards against a zero-match FS-E2E filter; stale README version snippet de-drifted.

Known constraints documented (McpStdioClient single-connection, tenant-wide visibility,
NuGet signing needs a cert). 260 passing + 3 env-gated skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@wyckit wyckit merged commit 3baf6eb into master Jun 22, 2026
2 checks passed
@wyckit wyckit deleted the fix/v1.16-approval-integrity branch June 22, 2026 14:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant