Files
ngit-grasp/docs
DanConwayDev 04b93c9a1d fix(sync): separate transient terminal accounting
Production diagnostics at b55d2de showed watchdog-expired REQs were already absent from rust-nostr's active subscription map. An initial 4,096-message queue removed watchdogs from a 36,054-ID relay.ngit.dev burst but only moved the five-per-cycle signature first to ngit.danconwaydev.com and then git.shakespeare.diy. Empty expired responses disproved event volume as the complete explanation: terminal accounting depended both on a congestible EVENT lane and on permit registration after subscribe returned.

Give transient lifecycle messages an independent control lane by registering a second rust-nostr broadcast receiver before subscriptions can begin. It handles EOSE/CLOSED and connection terminal status without waiting for the bounded processor data queue. Pre-generate transient subscription IDs and register generation-scoped ownership before sending REQ, passing the same ID into rust-nostr and rolling it back on subscribe failure. Keep the original 1,000-message queue; correctness no longer depends on sizing it for traffic.

The terminal listener is the sole transient-release path during a connected session, while the processor listener retains ordered EVENT delivery, pagination signals, and live CLOSED restoration. EOSE still enqueues CLOSE before returning the slot; peer CLOSED and connection teardown are definitive terminal boundaries. Relay notifications are broadcast, so the control listener cannot steal messages from processing.

This deliberately leaves concurrency, filters, pagination, retries, watchdog duration, live lifecycle, and configuration unchanged. It assumes rust-nostr preserves broadcast terminal notifications and that a failed exact-target subscribe sends no REQ; the latter path rolls ownership back.

Validation: a deterministic LocalRelay test blocks a capacity-one EVENT lane behind 1,200 events and still releases all transient permits within three seconds; 25 immediate empty queries prove terminals cannot precede permit registration. All 648 library tests pass, and startup_historic_sync_stays_within_relay_req_concurrency_limit passes standalone with zero proxy REQ rejections. Production acceptance will be repeated on this exact tip.
2026-08-07 15:34:07 +00:00
..
2025-11-04 10:25:53 +00:00
2025-11-04 10:25:53 +00:00

ngit-grasp Documentation

Welcome to the ngit-grasp documentation! We use the Diátaxis framework to organize our documentation into four types, each serving a different purpose.

                    PRACTICAL          THEORETICAL
                    ─────────          ───────────
                    
LEARNING      │   Tutorials    │    Explanation   │
              │                │                  │
              │  Getting       │   Architecture   │
              │  Started       │   Decisions      │
              │                │                  │
              ├────────────────┼──────────────────┤
              │                │                  │
WORKING       │  How-To        │    Reference     │
              │  Guides        │                  │
              │                │   API Docs       │
              │  Deployment    │   Protocols      │
              │  Testing       │                  │
              │                │                  │

📚 Documentation Types

🎓 Tutorials - Learning by Doing

Purpose: Learn the basics through practical steps
For: Newcomers getting started
Style: Step-by-step lessons with guaranteed outcomes

🔧 How-To Guides - Solving Problems

Purpose: Accomplish specific tasks
For: Users with basic knowledge solving real problems
Style: Practical recipes and solutions

📖 Reference - Technical Information

Purpose: Look up technical details
For: Users who know what they're looking for
Style: Dry, factual, comprehensive

💡 Explanation - Understanding Concepts

Purpose: Understand the "why" and design decisions
For: Users wanting deeper understanding
Style: Discussion, context, alternatives


🚀 Quick Start Paths

I'm brand new to ngit-grasp

  1. Read README.md for project overview
  2. Follow Getting Started Tutorial
  3. Understand Architecture Overview

I want to deploy ngit-grasp

  1. Review Configuration Reference
  2. Follow Deployment How-To
  3. Set up monitoring and backups

I want to develop on ngit-grasp

  1. Follow Getting Started Tutorial
  2. Read Architecture Overview
  3. Check Nix Flakes How-To
  4. Review Test Strategy

I want to understand the design

  1. Read Inline Authorization Explanation
  2. Review Design Decisions
  3. Compare with ngit-relay Comparison

I'm looking for specific information


📂 Additional Resources

Archive

Historical session notes and completed work. Useful for understanding project evolution but not required reading.

Learnings

DEPRECATED - Being migrated to Diátaxis structure:

  • Gotchas → How-To Guides
  • Patterns → Reference or Explanation
  • Notes → Appropriate category

🤝 Contributing to Documentation

When adding documentation, ask yourself:

Is it a tutorial?

  • Does it teach a beginner?
  • Is it a complete lesson with guaranteed outcome?
  • → Add to tutorials/

Is it a how-to guide?

  • Does it solve a specific problem?
  • Is it a recipe for accomplishing a task?
  • → Add to how-to/

Is it reference material?

  • Is it technical information?
  • Will people look it up when needed?
  • → Add to reference/

Is it explanation?

  • Does it explain "why"?
  • Does it discuss alternatives or design?
  • → Add to explanation/

See Diátaxis documentation for more guidance.


📊 Project Status

ALPHA - Under active development. Core functionality working, API may change.

Completed

  • ✅ grasp-audit compliance testing tool
  • ✅ Nix flake development environment
  • ✅ nostr-sdk 0.43 upgrade
  • ✅ Documentation restructure (Diátaxis)

In Progress

  • 🔄 Core ngit-grasp server implementation
  • 🔄 GRASP-01 compliance

Planned

  • 🔜 GRASP-02 (Proactive Sync)
  • 🔜 GRASP-05 (Archive)


Documentation structure based on Diátaxis
Last updated: November 4, 2025