<feed xmlns='http://www.w3.org/2005/Atom'>
<title>npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/Cargo.lock, branch master</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/atom?h=master</id>
<link rel='self' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/'/>
<updated>2026-04-10T20:39:10+00:00</updated>
<entry>
<title>release: v1.0.2</title>
<updated>2026-04-10T20:39:10+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-04-10T20:15:58+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=dd9a69e6fe79e866004ed7366093bf82030b02eb'/>
<id>urn:sha1:dd9a69e6fe79e866004ed7366093bf82030b02eb</id>
<content type='text'>
</content>
</entry>
<entry>
<title>release: v1.0.1</title>
<updated>2026-02-27T18:05:03+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-27T18:05:03+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=05b7edb5f5797100d8e0f59905e16488680928ec'/>
<id>urn:sha1:05b7edb5f5797100d8e0f59905e16488680928ec</id>
<content type='text'>
</content>
</entry>
<entry>
<title>release: v1.0.0</title>
<updated>2026-02-26T09:27:13+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-26T09:26:01+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=fd6b098f41baf8621551f15114c50891642b5872'/>
<id>urn:sha1:fd6b098f41baf8621551f15114c50891642b5872</id>
<content type='text'>
</content>
</entry>
<entry>
<title>hide read-only mode skips from human and JSON probe output</title>
<updated>2026-02-25T13:43:13+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-25T13:43:13+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=1de74ce840ab45e0d6f6aa2d75f70be8076fe476'/>
<id>urn:sha1:1de74ce840ab45e0d6f6aa2d75f70be8076fe476</id>
<content type='text'>
</content>
</entry>
<entry>
<title>remove unused dependencies from ngit-grasp and grasp-audit</title>
<updated>2026-02-24T12:02:30+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-24T12:02:30+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=319c1c7e524bfb78a3f686041e5af2ed60ea182d'/>
<id>urn:sha1:319c1c7e524bfb78a3f686041e5af2ed60ea182d</id>
<content type='text'>
</content>
</entry>
<entry>
<title>chore: upgrade nostr-* packages to rev 4767ad13</title>
<updated>2026-01-08T10:57:51+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-01-08T10:57:51+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=075307804bf66bba10f5bc55cb40e2e6a98a65ee'/>
<id>urn:sha1:075307804bf66bba10f5bc55cb40e2e6a98a65ee</id>
<content type='text'>
- Update nostr-relay-builder, nostr-sdk, nostr-lmdb to latest revision
- Update grasp-audit nostr-sdk dependency
- Fix clippy warnings:
  - Replace .clone() with std::slice::from_ref() in src/git/sync.rs
  - Change &amp;PathBuf to &amp;Path in tests/common/git_server.rs
  - Replace vec![] with array literal in src/purgatory/sync/functions.rs
- Update PR_TEST_COMMIT_HASH in grasp-audit due to event generation changes

All 249 tests passing, no breaking changes required.
</content>
</entry>
<entry>
<title>Add SyncContext trait and MockSyncContext for purgatory sync</title>
<updated>2026-01-07T11:40:41+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-01-07T11:40:41+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=5bd6b9b93cd52da2075bc00a08cf7feca4b85d5c'/>
<id>urn:sha1:5bd6b9b93cd52da2075bc00a08cf7feca4b85d5c</id>
<content type='text'>
Implement the abstraction layer for purgatory sync operations:

- SyncContext trait: defines interface for repository data fetching,
  OID existence checks, git fetch operations, and event processing
- ProcessResult: captures outcomes when releasing events from purgatory
- MockSyncContext: test mock with builder pattern for configuring:
  - Clone URLs and which OIDs each URL provides
  - Needed OIDs (simulates purgatory state)
  - URL failure simulation
  - Fetch logging for assertions

The trait uses async_trait for async method support and requires
Send + Sync for use in concurrent sync operations.

This abstraction enables unit testing of sync logic without I/O,
while the real implementation (to be added later) will connect
to actual database, git, and relay systems.
</content>
</entry>
<entry>
<title>Add DomainThrottle for per-domain rate limiting</title>
<updated>2026-01-07T11:26:48+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-01-07T11:26:48+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=08eba888fe510896f1863be6f2b5a72a91616975'/>
<id>urn:sha1:08eba888fe510896f1863be6f2b5a72a91616975</id>
<content type='text'>
Implement per-domain throttling for purgatory sync operations:
- Concurrent request limit (max in-flight requests per domain)
- Rate limit (max requests per minute via sliding window)
- Fair round-robin queue processing across identifiers
- In-progress tracking to prevent duplicate fetches
- Tried URL tracking per identifier

Add indexmap dependency for ordered iteration in round-robin queue.

Includes 6 unit tests covering:
- Concurrent limit enforcement
- Rate limit enforcement (sliding window)
- Round-robin fair processing
- In-progress identifier skipping
- Round-robin index adjustment on removal
- Tried URL merging on re-enqueue
</content>
</entry>
<entry>
<title>chore: bump rust-nostr to latest master</title>
<updated>2025-12-22T21:02:03+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2025-12-22T21:02:03+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=1df90c609399c675e629b97294aee81a0b1e66dd'/>
<id>urn:sha1:1df90c609399c675e629b97294aee81a0b1e66dd</id>
<content type='text'>
so we can more easily support grasp purgatory feature
</content>
</entry>
<entry>
<title>feat(sync): Phase 6 - observability and production readiness</title>
<updated>2025-12-04T18:43:49+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2025-12-04T18:43:49+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=dd403b17e7c74db9443d0891a9de1f0f0f9f89eb'/>
<id>urn:sha1:dd403b17e7c74db9443d0891a9de1f0f0f9f89eb</id>
<content type='text'>
- 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
</content>
</entry>
</feed>
