Files
ngit-grasp/docs
DanConwayDev 86d19b75f1 fix(sync): adapt query starts after rate-limit exhaustion
Production startup against relay.ngit.dev exhausted its 120-query-per-minute token bucket, cooled down for 65 seconds, then replayed the entire recovered workload fast enough to exhaust the bucket again. This repeated every roughly 67 seconds even though the subscription ledger correctly bounded simultaneous open subscriptions: turnover, rather than concurrency, was the missing dimension.

Teach each connection session to recognise the specific too-many-queries refusal, unwind queued starts during the existing cooldown, and pace subsequent live REQs, transient REQs, exact-ID fetches, and negentropy round starts through one shared gate. Recovery begins at 100 starts per minute, leaves slack below the ngit-grasp 120/minute serving default, and doubles its interval only after a distinct later refusal, capped at ten seconds.

The first production candidate showed that rust-nostr can send several charged NEG-MSG frames inside one admitted NIP-77 round and caused a later refusal despite paced round starts. Because the application cannot pace those internal frames, any query-rate refusal now selects paced REQ fallback for the remainder of that connection session. Reconnect resets both lessons.

Correctness assumes the refusal identifies a per-connection query-start budget; NIP-11 has no standard query-rate field from which to learn proactively. Concurrent-REQ and subscription-byte refusals remain separate because pacing them would conceal different capacity problems. This does not change the serving-side limit or add configuration.

Validation: cargo test --lib (657 passed); cargo test --test sync (89 passed, 1 ignored), including the standalone startup request-concurrency scenario; nix build .#ngit-grasp on both substantive candidate designs; a real LocalRelay CLOSED scenario; and production evidence that identified the otherwise invisible SDK-managed NIP-77 traffic.
2026-08-08 08:49:17 +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