mirror of
https://relay.ngit.dev/npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/ngit-grasp.git
synced 2026-10-05 15:08:24 +00:00
Replace simple cascade with graph-based retention algorithm: - Build event dependency graph with nodes (events) and edges (references) - EventGraph: directed graph tracking event relationships - EventNode: tracks event ID, kind, references, and retention reasons - Address resolution: maps kind 30617 addresses to event IDs Re-evaluation engine: - reevaluate_events_without_announcement(): determines which events to keep/delete - Queries all events referencing deleted announcement - Re-runs acceptance policy WITHOUT deleted announcement - Tracks which announcements justify keeping each event - Fail-secure defaults (missing events marked for deletion) Graph traversal: - BFS traversal from kept announcements - Marks reachable events as "keep", unreachable as "delete" - Configurable max depth (default: 100) to prevent infinite loops - DFS-based circular dependency detection with recursion stack - Handles anchored vs unanchored circular dependencies Multi-maintainer logic: - Events kept if they reference OTHER valid announcements - Events deleted only when ALL referenced announcements are deleted - Handles complex scenarios: - Two maintainers, one deletes → events preserved - Two maintainers, both delete → events deleted - Three+ maintainers with partial deletions - Deep dependency chains (5+ levels) - Isolated subgraphs Integration: - Replaces simple cascade in deletion_ops.rs - determine_events_to_delete() uses graph algorithm - Comprehensive logging of graph statistics and retention reasons - Updated handle_deletion() in builder.rs Tests: 31 tests covering: - Graph building (12 unit tests) - Empty graph, single event, references - Circular references, transitive dependencies - Max depth handling - Re-evaluation engine (6 unit tests) - Single/multi-maintainer scenarios - Announcement reference handling - Fail-secure defaults - Graph traversal (7 unit tests) - Linear chains, isolated subgraphs - Circular dependency detection - Anchored vs unanchored cycles - Max depth exceeded - Multi-maintainer integration (6 tests) - Two maintainers (one/both delete) - Three maintainers with partial deletions - Deep dependency chains - Selective retention based on maintainer subsets