<feed xmlns='http://www.w3.org/2005/Atom'>
<title>npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/docs/explanation, 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-02-25T15:14:46+00:00</updated>
<entry>
<title>docs: remove comparison doc and update architecture to reflect announcement purgatory</title>
<updated>2026-02-25T15:14:46+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-25T15:14:46+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=8cd232727ae31613abba7a3d0485a1cb94fda2f3'/>
<id>urn:sha1:8cd232727ae31613abba7a3d0485a1cb94fda2f3</id>
<content type='text'>
</content>
</entry>
<entry>
<title>drop nostr-db backend support, keep only lmdb and memory</title>
<updated>2026-02-25T15:07:40+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-25T15:07:40+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=5ad9d9093fcbe7037e5474a9d8fa20a0b64fb79a'/>
<id>urn:sha1:5ad9d9093fcbe7037e5474a9d8fa20a0b64fb79a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Merge master into 3ca0-announcements-purgatory</title>
<updated>2026-02-23T15:20:59+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-23T15:20:59+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=113928aa84894ea8f65c247d9987527e792b32a9'/>
<id>urn:sha1:113928aa84894ea8f65c247d9987527e792b32a9</id>
<content type='text'>
</content>
</entry>
<entry>
<title>persist and restore announcement events across graceful restarts</title>
<updated>2026-02-23T15:08:37+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-23T15:08:37+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=26f608e5011b9d1ad6036da75b89272835e69695'/>
<id>urn:sha1:26f608e5011b9d1ad6036da75b89272835e69695</id>
<content type='text'>
Extends purgatory persistence to include announcement purgatory entries.
On graceful shutdown, non-soft-expired announcements are serialised to
purgatory-state.json alongside state/PR/expired events; on startup they
are restored, skipping any entry whose bare repo path no longer exists.

Updates purgatory-design.md to reflect that purgatory persists through
graceful shutdown and documents the new PurgatoryState disk format.

Adds create_announcement_event helper to purgatory_helpers and three new
integration tests in purgatory_persistence covering the full save/restore
cycle, missing-repo skip, and the combined roundtrip with all entry types.
</content>
</entry>
<entry>
<title>docs: update purgatory docs to reflect announcements purgatory implementation</title>
<updated>2026-02-23T14:49:30+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-23T14:49:30+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=4848c4029fc58f6f310a2babeae1ee82a7e41656'/>
<id>urn:sha1:4848c4029fc58f6f310a2babeae1ee82a7e41656</id>
<content type='text'>
Remove the pre-implementation planning docs (announcements-purgatory-design.md
and announcements-purgatory-implementation.md) now that the feature is built.

Update the three living docs to reflect what was actually implemented:

- purgatory-design.md: expanded to cover all three purgatory stores
  (announcement, state, PR), including AnnouncementPurgatoryEntry structure,
  two-phase soft expiry lifecycle, expiry extension triggers, promotion flow,
  and updated integration points and file structure

- grasp-02-proactive-sync.md: added SyncLevel enum (Full/StateOnly) to
  RepoSyncNeeds, documented the purgatory announcement sync timer as the
  registration path for purgatory announcements, updated filter building
  to describe build_sync_level_aware_filters() and StateOnly behaviour

- grasp-02-proactive-sync-purgatory-git-data.md: expanded to cover
  announcement purgatory as a third entry type, added Timeline E showing
  soft-expiry and revival, replaced the single expiry section with separate
  hard-expiry (state/PR) and two-phase soft-expiry (announcements) sections
  with full justification for the 24-hour extended retention window
</content>
</entry>
<entry>
<title>docs: annocunment purgatory clarify soft expiry rationale</title>
<updated>2026-02-12T09:11:38+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-12T09:11:38+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=0a1908bd6ee19f7079bb2914c0009bea1fc1db37'/>
<id>urn:sha1:0a1908bd6ee19f7079bb2914c0009bea1fc1db37</id>
<content type='text'>
now we have added announcement purgatory to the protocol spec
</content>
</entry>
<entry>
<title>docs: complete high-level announcements purgatory design</title>
<updated>2026-02-05T17:03:37+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-05T17:03:37+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=603c87fabda70145b967579b9338051ea9f00704'/>
<id>urn:sha1:603c87fabda70145b967579b9338051ea9f00704</id>
<content type='text'>
- Integrate sync-only-state-events decision (SyncLevel concept)
- Add authorization must check purgatory decision
- Add soft expiry design (delete repo, retain event for 24h)
- Add purgatory lifecycle diagram
- Create separate implementation details document
- Remove inline questions (now resolved)
</content>
</entry>
<entry>
<title>add notes to announcment purgatory design</title>
<updated>2026-02-05T15:25:14+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-05T15:25:14+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=854484813dfe45f882fe66ff866621f9a21186fe'/>
<id>urn:sha1:854484813dfe45f882fe66ff866621f9a21186fe</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: accept no-op pushes where old_oid == new_oid</title>
<updated>2026-02-03T17:05:16+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-03T16:13:59+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=c163d717147b92b16d89da2fbccef775647b5a07'/>
<id>urn:sha1:c163d717147b92b16d89da2fbccef775647b5a07</id>
<content type='text'>
Fixes race condition where user's push becomes no-op after state event
is applied between fetch and push. Now accepts these as successful
no-ops, matching Git's 'Everything up-to-date' behavior.

- Add early detection in get_state_authorization_for_specific_owner_repo
- Return success for all-noop pushes without requiring purgatory event
- Document behavior in inline-authorization.md
</content>
</entry>
<entry>
<title>docs: add announcements purgatory design document</title>
<updated>2026-01-23T17:42:13+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-01-23T17:42:13+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-grasp-mirror/commit/?id=2be44c604062c7579e08c0d37b2f32ea8b6c4fcf'/>
<id>urn:sha1:2be44c604062c7579e08c0d37b2f32ea8b6c4fcf</id>
<content type='text'>
Addresses the problem of empty bare repos misleading clients and sync
downloading refs to deleted repos. Key design points:

- Bare repo created immediately so git pushes can succeed
- Git data arrival triggers promotion to active status
- Expiry extended in two places: state event arrival and git auth
- Indexed by (pubkey, identifier) for correct uniqueness
- Handles replacement announcements and service changes
</content>
</entry>
</feed>
