Initial commit

This commit is contained in:
Michilis
2025-12-19 23:56:07 -03:00
commit 23f716255e
48 changed files with 14834 additions and 0 deletions

207
starter-docs/logic.md Normal file
View File

@@ -0,0 +1,207 @@
# Cashumints.space API Logic
This document defines exactly how the system behaves internally.
---
## URL Normalization
All URLs are normalized before storage:
- force https if available
- lowercase hostname
- remove trailing slashes
- strip default ports
Normalized URLs are used for identity resolution.
---
## Mint Resolution
If request uses mint_id:
- direct lookup
If request uses URL:
- normalize
- lookup in mint_urls
- resolve mint_id
If URL unknown:
- return 404
---
## Probing Logic
### Probe Execution
- HTTP GET to mint endpoints
- strict timeout
- record RTT
- record status code or error
### State Transitions
On success:
- last_success_at = now
- consecutive_failures = 0
- status = online or degraded
- offline_since = null
On failure:
- last_failure_at = now
- consecutive_failures += 1
- if threshold reached:
- status = offline
- offline_since = now (if not set)
If offline longer than ABANDONED_AFTER:
- status = abandoned
---
## Metadata Fetch Logic
- Only fetch metadata after successful probe
- Only fetch if last_fetched_at older than 1 hour
Steps:
1. GET /v1/info
2. Validate against NUT06
3. Normalize payload
4. Compute hash
5. If hash changed:
- store history record
- update snapshot
Metadata is never deleted on failure.
---
## URL Discovery
URLs are discovered from:
- metadata.urls
- Nostr review references
- user submissions
New URLs:
- linked to existing mint
- marked active
Removed URLs:
- marked inactive
- never deleted
---
## Uptime Rollups
Raw probes are aggregated into windows:
- 1h, 24h, 7d, 30d
Computed values:
- uptime_pct
- avg_rtt
- p95_rtt
- downtime_seconds
- incident count
Rollups are recomputable at any time.
---
## Incident Detection
Incident starts when:
- status transitions online → offline
Incident ends when:
- first successful probe after offline
Incident data:
- start
- end
- duration
- severity
---
## Trust Score Calculation
Score range: 0100
Components:
- uptime (max 40)
- speed (max 25)
- reviews (max 20)
- identity (max 10)
- penalties (up to 15)
Total score = sum, clamped.
Scores are recomputed:
- after rollups
- after new reviews
- periodically
---
## Review Aggregation
- One review per pubkey per mint per window
- Raw reviews stored forever
- Aggregates computed separately
---
## Pageviews
- Recorded per mint page load
- Sessionbased
- No IP storage
Aggregated into:
- daily counts
- rolling windows
---
## Job System
Jobs stored in database:
- type
- payload
- run_at
- status
- retries
Workers:
- poll jobs
- lock atomically
- execute
- retry with backoff
---
## Failure Handling
- All failures are recorded
- No silent drops
- History preserved
---
## Determinism Guarantees
- Same input data always produces same rollups
- Same rollups always produce same trust score
- System can be fully rebuilt from raw tables
---
## Final Rule
If data is not stored, it does not exist.
If it exists, it must be explainable.