research(agent-memory): canonical-cactus-cut forgetting — mixed result, evidence retained (ADR-346) - #976
research(agent-memory): canonical-cactus-cut forgetting — mixed result, evidence retained (ADR-346)#976ruvnet wants to merge 5 commits into
Conversation
Attacks the rejection root cause of ADR-345's MincutGatedForgetting: swaps RuVectorGraphAnalyzer::partition() (measured non-deterministic, 50% degenerate results; 1800-2700x baseline latency) for ruvector-mincut's canonical feature (CactusGraph::canonical_cut(), deterministic dense Stoer-Wagner), behind a new default-off mincut-forget-cactus feature. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01EREM53aWt5uo42K2d5NAEE
…getting Direct, same-process comparison against ADR-345's own policies on the identical 84-memory corpus, plus determinism and scaling probes comparable to ADR-345's mincut_determinism_probe/mincut_scaling_probe. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01EREM53aWt5uo42K2d5NAEE
…ting Informational follow-up (not a redefinition of the pre-registered acceptance test): characterizes whether the single-seed survival-gap result generalizes. It does not: 0/10 additional seeds meet the 15pp bar for either min-cut backend. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01EREM53aWt5uo42K2d5NAEE
Full methodology, raw benchmark output, and honest mixed acceptance result (determinism and speed confirmed; bridge-survival benefit falsified across 11 seeds) for the 2026-09-10 nightly run. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01EREM53aWt5uo42K2d5NAEE
Regenerated docs/adr/INDEX.md via scripts/adr-index.mjs. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01EREM53aWt5uo42K2d5NAEE
CI status: pre-existing, unrelated hang in
|
Hypothesis
ADR-345 (
docs/research/nightly/2026-09-05-mincut-gated-forgetting) rejected a mincut-gated agent-memory compaction policy because its min-cut backend (RuVectorGraphAnalyzer::partition()) was measured non-deterministic (50% degenerate results) and slow (1,800–2,700x a scalar baseline). This run attacks that specific bottleneck instead of picking a new topic:ruvector-mincutseparately ships acanonicalfeature (CactusGraph::canonical_cut(), deterministic dense Stoer-Wagner) that nobody had measured against ADR-345's own rejection criteria.Architecture
ruvector-agent-memory::graph_forget_cactus::CactusGatedForgettingmirrors ADR-345'sMincutGatedForgettingfield-for-field; the only change is the min-cut backend used to compute the boundary vertex set. New default-off feature:mincut-forget-cactus = ["mincut-forget", "ruvector-mincut/canonical"].flowchart TD A[84-memory corpus] --> B["k-NN cosine graph (k=8)"] B --> C1["RuVectorGraphAnalyzer::partition() (ADR-345)"] B --> C2["CactusGraph::canonical_cut() (this PR)"] C1 --> D1[boundary set] --> E1[MincutGatedForgetting] C2 --> D2[boundary set] --> E2[CactusGatedForgetting] E1 --> F[select_survivors] --> G[compact_witnessed] E2 --> FFiles changed
crates/ruvector-agent-memory/src/graph_forget_cactus.rs— new policy, 3 unit testscrates/ruvector-agent-memory/{Cargo.toml,src/lib.rs}— newmincut-forget-cactusfeaturecrates/ruvector-agent-memory/examples/cactus_{gated_forgetting_bench,determinism_probe,scaling_probe,seed_sensitivity_probe}.rs— reproducible benchmarksdocs/adr/ADR-346-canonical-cactus-cut-forgetting.md,docs/adr/INDEX.md(regenerated viascripts/adr-index.mjs)docs/research/nightly/2026-09-10-canonical-cactus-forgetting/{README.md,gist.md}Benchmark command & real results
cargo test --release -p ruvector-agent-memory --features mincut-forget-cactus: 34/34 pass. Default-feature build/test unaffected (verified separately).Acceptance result: REJECT (mixed, evidence-backed)
RuVectorGraphAnalyzerat the same corpus, but still 39–40x the scalar baseline (bar was 20x).Root cause: a single global min-cut on a many-cluster graph finds one structurally weakest point in the entire graph, not all of the semantically-engineered bridge vertices a multi-cluster corpus constructs. Making the computation faster and deterministic doesn't change what it's fundamentally computing.
Darwin / Flywheel / MetaHarness
Re-verified not available as in-repo, callable orchestration (same finding as ADR-345, nine days apart):
npx metaharness --helpresolves to a generic project scaffolding CLI, not in-repo research orchestration;npx ruvector harness doctor --jsonhas no such executable. Roles were performed serially in one session; this PR's documents are the durable evidence record in place of a Flywheel store.Security review
No new attack surface: pure in-memory graph computation, no I/O, no new unsafe code. Reused
EvictionWitnessChainre-verified at 20/20 tamper detections, unchanged from ADR-134/ADR-345.Main limitations
Softpolicy variant was swept across the 10 additional seeds (kept runtime bounded);Hardwas only checked at the single pre-registered seed.tree_packing::canonical_mincut_fast(Gomory-Hu) or local/community-cut alternatives.Production recommendation
Do not enable. Keep
mincut-forget-cactusas an opt-in, default-off experimental feature alongside ADR-345'smincut-forget, retained as (1) a validated fact thatruvector-mincut'scanonicalfeature is correct/fast/deterministic for future reuse, and (2) stronger, multi-seed evidence that "protect the global min-cut boundary" is not a viable signal for this eviction task — closing that path so a future nightly run doesn't reopen it without new information. The concrete next experiment (community/local cuts) is recorded in ADR-346's Open Questions and the research README's Next Research section.Research document / ADR / gist
docs/adr/ADR-346-canonical-cactus-cut-forgetting.mddocs/research/nightly/2026-09-10-canonical-cactus-forgetting/README.mddocs/research/nightly/2026-09-10-canonical-cactus-forgetting/gist.md🤖 Generated with claude-flow
https://claude.ai/code/session_01EREM53aWt5uo42K2d5NAEE
Generated by Claude Code