Conversation
Closes the adversarial gap named in crate::ops's own docs and the 2026-09-05 nightly run's Next Research: the ADR-345 eviction-witness chain's FNV-1a linking is tamper-evident against accidental corruption only, not against a log-writing adversary who can relink the whole chain. EvictionAnchorLog periodically signs the chain head with rvf_types' Ed25519 (already an unconditional dependency of this crate, no new signature scheme), reusing the interval/staleness anchor shape ADR-342 proved out for a different chain. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01DBMdqRntfcDC5Hwhvota67
…bench Sweeps 12 anchor intervals over a real 4,096-record compact_witnessed chain, measuring signing/verify cost and memory overhead, and runs a real relink-attack simulation (111 sampled tamper positions) proving 100% detection once a covering anchor exists vs. 0% for FNV-1a chaining alone. Raw output reproduced in the accompanying nightly research doc and ADR-346. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01DBMdqRntfcDC5Hwhvota67
Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01DBMdqRntfcDC5Hwhvota67
Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01DBMdqRntfcDC5Hwhvota67
Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01DBMdqRntfcDC5Hwhvota67
CI's clippy runs --all-targets (test code included), unlike the --lib --examples scope validated locally before the initial push. Rewrite `max_seen <= interval - 1` as the equivalent `max_seen < interval`. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01DBMdqRntfcDC5Hwhvota67
|
CI status on Looked at its log: it was still compiling workspace dependencies (last line before cancellation was Re-ran the failed job via Generated by Claude Code |
Hypothesis
Continues the 2026-09-05 nightly run's ("mincut-gated forgetting", ADR-345) "Next Research" item 4: wire an Ed25519
WitnessSignerintoruvector-agent-memory's eviction-witness chain so eviction receipts are signed, not just FNV-1a hash-chained. Bothcrate::ops's own module docs and ADR-134 name this as an explicit follow-up gate ("MUST land before WP8 cross-repo anchoring makes this log load-bearing").Full formal statement: ADR-346.
Architecture
ruvector-agent-memory::eviction_witness_signing: signs/verifies a(sequence, chain_head)commitment viarvf_types::ed25519_sign/ed25519_verify(already an unconditional crate dependency, used elsewhere forAtomicObservation, ADR-320 — no new signature scheme).ruvector-retrieval-receipt::state_anchor(ADR-342) already proved out for a different chain.relink_tampered_suffix, a real attack-simulation utility (not asserted-only) used by both unit tests and the benchmark.Cargo.tomlchanges, no new feature flag.Files Changed
crates/ruvector-agent-memory/src/eviction_witness_signing.rs(new module, 7 unit tests)crates/ruvector-agent-memory/src/lib.rs(registers + re-exports the module)crates/ruvector-agent-memory/examples/signed_eviction_witness_bench.rs(new benchmark)docs/adr/ADR-346-signed-eviction-witness-anchoring.mddocs/research/nightly/2026-09-09-signed-eviction-witness-anchoring/README.md(full methodology + raw output)docs/research/nightly/2026-09-09-signed-eviction-witness-anchoring/gist.mdBenchmark Command
Real Benchmark Results (4 independent runs)
SigningKeyre-derivation inrvf_types::ed25519_signis the likely dominant cost — flagged as next research, not fixed here).verify_chain() == true.Acceptance Result
ACCEPT — both fixed, pre-registered thresholds (100% detection once covered; 0 false positives) held on all 4 runs.
Darwin Result
Not executed. No applicable, wired Darwin CLI was found for this crate/domain (verified, not assumed — see the research README's "Capabilities Actually Discovered" table). A 12-point exhaustive interval sweep (K = 1..4096) served the analogous parameter-search role and is reported as a benchmark result, not an evolutionary promotion, to avoid overclaiming.
Flywheel Result
No automated Flywheel tooling was invoked (same reason as Darwin — verified not present/applicable for this task shape in this environment). This PR itself is the retained evidence: hypothesis, sources, decisions, benchmark config/output, and rejected alternatives are all in the ADR and research README, continuing the previous run's named gap rather than starting a new island.
Security Review
Threat model: a log-writing adversary without the Ed25519 secret key. Domain-separated signed statements prevent cross-purpose replay. Key management (who holds the signing key, rotation, public-key distribution) is explicitly unaddressed — this ships the primitive, not a deployment (see ADR-346 Open Questions). No existing test, gate, or acceptance threshold was weakened to reach ACCEPT.
Main Limitations
rvf_types, not isolated by a dedicated micro-benchmark this run.compact_witnesseddoesn't call this yet) — deliberately deferred pending a key-management decision.Production Recommendation
Module: ship as additive, default-compiled-in code (done, this PR). Production integration: not yet — first needs (1) a key-management decision and (2) ideally closing the signing-cost gap (Open Question 2) before running on any hot eviction path.
K≈16recommended as the interval once integration happens.Research Document
docs/research/nightly/2026-09-09-signed-eviction-witness-anchoring/README.mdADR
docs/adr/ADR-346-signed-eviction-witness-anchoring.mdGist
docs/research/nightly/2026-09-09-signed-eviction-witness-anchoring/gist.md🤖 Generated with claude-flow
https://claude.ai/code/session_01DBMdqRntfcDC5Hwhvota67
Generated by Claude Code