| Age | Commit message (Collapse) | Author |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Add SyncMetrics with full Prometheus integration
- Track sync gaps via catchup events
- Update Grafana dashboard with sync panels
- Document all sync configuration options
- Update design doc with implementation notes
|
|
- Add NegentropyService for set reconciliation
- Implement startup catchup with warm-up delay
- Implement reconnect catchup (last 3 days)
- Add daily catchup schedule with stagger
|
|
- Add SubscriptionManager for per-connection tracking
- Trigger subscription updates on new repo/PR events
- Implement consolidation when filter count > 150
|
|
- Add RelayHealthTracker with DashMap
- Implement exponential backoff (5s -> 1h max)
- Handle dead relays (24h failures -> daily retry)
- Add startup jitter to prevent thundering herd
- Add NGIT_SYNC_MAX_BACKOFF_SECS config
|
|
- Add relay discovery from stored announcements
- Implement FilterService with three-layer strategy
- Support multiple simultaneous relay connections
- Filter batching for large tag sets
|
|
- Add src/sync/ module with SyncManager
- Add NGIT_SYNC_RELAY_URL config option
- Subscribe to kind 30617 on configured relay
- Validate synced events through Nip34WritePolicy
- Integration test with two TestRelay instances
|
|
|
|
- Added CRITICAL warning section to AGENTS.md about treating architecture
docs as living documents
- Mark 'Keep Architecture Docs Updated' item as fixed in grasp-01 learnings
- Mark 'Document actual architecture' technical debt item as fixed
This addresses a key learning from GRASP-01 where docs described plans
rather than implementation, causing confusion.
|
|
Split the ~900 line Nip34WritePolicy into focused sub-policies for improved
testability and maintainability:
- AnnouncementPolicy - Repository announcement validation
- StatePolicy - State event validation + ref alignment
- PrEventPolicy - PR/PR Update validation
- RelatedEventPolicy - Forward/backward reference checking
The main Nip34WritePolicy now delegates to these sub-policies via a shared
PolicyContext that provides domain, database, and git_data_path.
Also updates:
- README.md: Accurate project structure reflecting actual implementation
- docs/learnings: Marks this technical debt item as complete
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Add nostr-lmdb dependency (v0.44) for persistent storage
- Create SharedDatabase type alias for database abstraction
- Update all database-related functions to use trait object
- Support runtime selection via NGIT_DATABASE_BACKEND env var
Database backends:
- memory: In-memory (default, fastest, no persistence)
- lmdb: LMDB backend (persistent, general purpose)
All 34 tests pass with the new implementation.
|
|
|
|
|
|
Breaking change: Renamed AuditMode enum variants for clarity:
- AuditMode::CI -> AuditMode::Isolated (fresh fixtures per test)
- AuditMode::Production -> AuditMode::Shared (reuse fixtures across tests)
Config constructors renamed (with deprecated aliases):
- AuditConfig::ci() -> AuditConfig::isolated()
- AuditConfig::production() -> AuditConfig::shared()
CLI default changed from 'ci' to 'shared' mode, which enables
fixture caching across tests. This fixes the issue where fixtures
were being re-created for every test in CLI mode.
Fixture caching behavior:
- Shared mode (CLI default): Uses client's cache, fixtures reused
- Isolated mode (for cargo test): Local cache per TestContext
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test_non_maintainer_state_rejected
|
|
|
|
|
|
|
|
|
|
|
|
if we have the OIDs
|
|
currently failing as branch isn't pushed (we should auto create this branch as we have the ref)
|
|
|
|
incorrect ref on event receive
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Previously get_or_create_repo() and get_or_create_issue() always checked
the client cache first, bypassing the mode-based caching logic. This
caused fixture leaking across test suites when using the same AuditClient.
With this fix:
- In Isolated mode: helpers skip the cache, creating fresh fixtures
- In Shared mode: helpers use the cache for fixture reuse (unchanged)
This restores proper test isolation for push authorization tests that
were failing because they shared the same ValidRepo fixture.
|
|
|
|
|
|
|
|
|
|
allow-tip-sha1-in-want
|
|
|
|
no events were allowed to be published which broke most tests
|
|
|
|
|
|
|
|
|
|
- Added send_and_verify_accepted to lib.rs exports
- Added send_and_verify_rejected to lib.rs exports
- Organized exports into logical groups with comments:
* Git operation helpers
* Verification helpers
* Repo setup helpers
* Types and constants
- Build succeeds: cargo build
|
|
- All uses of send_and_verify_accepted/rejected import from crate::fixtures
- Removed duplicate implementations from event_acceptance_policy.rs (lines 519-597)
- Updated 15 call sites from Self::send_and_verify_* to send_and_verify_*
- Build succeeds: cargo build
|
|
- test_send_receive_event uses TestContext + FixtureKind::ValidRepo
- test_create_subscription uses TestContext + FixtureKind::ValidRepo
- Tests remain functionally equivalent (same verification logic)
- Pure connectivity tests like test_websocket_connection unchanged
- Tests pass: cargo test --lib nip01_smoke
- Added fixture-first pattern documentation to test docstrings
|
|
- Deprecated setup_repo_for_recursive_maintainer helper in fixtures.rs
- test_push_authorized_by_recursive_maintainer_state now creates own TestContext
- Uses FixtureKind chain: RepoState, MaintainerAnnouncement, MaintainerState, RecursiveMaintainerRepoAndState
- Uses git helpers from fixtures.rs (clone_repo, create_deterministic_commit_with_variant, try_push)
- Updated imports to include RECURSIVE_MAINTAINER_DETERMINISTIC_COMMIT_HASH
- All unit tests pass: cargo test --lib
|
|
- Deprecated setup_repo_for_maintainer helper
- test_push_authorized_by_maintainer_state_only now creates own TestContext
- Uses FixtureKind::RepoState and FixtureKind::MaintainerState
- Uses git helpers from fixtures.rs (clone_repo, create_deterministic_commit_with_variant, try_push)
- Uses CommitVariant::Maintainer and MAINTAINER_DETERMINISTIC_COMMIT_HASH
- Test compiles and passes: cargo test --lib (25 passed, 0 failed)
|
|
- Refactored test_push_authorized_by_owner_state to use fixture-first pattern
- Test now creates its own TestContext and uses FixtureKind::RepoState
- Uses git helper functions from fixtures.rs (clone_repo, create_deterministic_commit, try_push)
- Follows the 3-step pattern: Generate fixtures → Send to relay → Verify behavior
- Deprecated setup_repo_with_deterministic_commit with migration guide
- Test passes: cargo test --test push_authorization test_push_authorized_by_owner_state
- No API changes required for main project tests
|
|
|
|
Updated get_maintainers_recursive() to properly handle maintainers listed
in accepted repository announcements:
1. Separated 'visited' set (cycle prevention) from 'maintainers' set (result)
2. Maintainers listed in an announcement's 'maintainers' tag are now added
to the maintainer set immediately, even without their own announcement
3. Recursively traverse maintainer chains to handle multi-level delegation
Also fixed RecursiveMaintainerRepoAndState fixture to publish the
maintainer's announcement (which lists the recursive maintainer) before
publishing the recursive maintainer's announcement, establishing the
proper trust chain: Owner -> Maintainer -> RecursiveMaintainer
Test results: 7/7 push authorization tests passing
|
|
|
|
|
|
|
|
Fixtures now reuse their prerequisites in Shared (production) mode,
significantly reducing events published to production relays:
Before: Each fixture created its own prerequisite events
- ValidRepo: 1 event
- RepoWithIssue: 2 events (repo + issue)
- RepoWithComment: 3 events (repo + issue + comment)
- RepoState: 2 events (repo + state)
After: Fixtures share prerequisites via caching
- ValidRepo: 1 event
- RepoWithIssue: 1 new event (issue), reuses cached repo
- RepoWithComment: 1 new event (comment), reuses cached repo+issue
- RepoState: 1 new event (state), reuses cached repo
Total for all 4 fixtures: 8 events → 4 events (50% reduction)
In CI/Isolated mode, each test still gets fresh fixtures for
test isolation - behavior unchanged.
Implemented via get_or_create_repo() and get_or_create_issue()
helpers that handle mode-aware caching without async recursion.
|
|
|