<!-- SOLIDIVISM · part 38 -->
ervers, or databases.**

### The Problem
- The epistles codebase is large (forum, game worlds, AI systems)
- The event ledger will grow unboundedly
- The King investigates from an iPhone
- Full codebase scans would timeout, drain battery, or crash the browser

### The Solution: Budgeted Incremental Investigation

```javascript
{
  investigation: {
    // Resource budget for this investigation
    budget: {
      maxEvents: 1000,        // Don't load more than 1000 events at once
      maxCodeFiles: 50,       // Don't open more than 50 files
      maxDepth: 5,            // Don't recurse deeper than 5
      maxTime: 30000,         // Don't run longer than 30 seconds
      maxMemory: "50MB",      // Don't exceed memory estimate
    },

    // Pagination
    strategy: "incremental",
    // Load first 100 most relevant events, then offer "load more"
    // Relevance ranked by: recency, causal proximity to subject, evidence quality

    // Progress tracking (resumable)
    progress: {
      eventsExamined: 247,
      eventsTotal: 15203,
      estimatedRemaining: "4 minutes at current pace",
      checkpoint: "solidivism:inquiry:floor-glitch:v1:checkpoint-3",
      // Can pause and resume without losing progress
    }
  }
}
```

### Relevance Ranking

Not all evidence is equally worth examining first:

```javascript
function rankRelevance(event, subject) {
  let score = 0;
  // Causal proximity: direct cause/effect scores highest
  if (event.target_id === subject) score += 10;
  if (event.actor_id === subject) score += 8;
  // Temporal proximity: recent events score higher
  const hoursAgo = (now - event.recorded_at) / 3600000;
  score += Math.max(0, 10 - hoursAgo);
  // Evidence quality: verified > inferred
  if (event.confidence === 'high') score += 5;
  // Contradictions: always relevant (need resolution)
  if (event.contradicts) score += 15;
  return score;
}
// Examine highest-scoring first. Stop when budget exhausted or question answered.
```

---

## 7. CAPACITY AND RETENTION STRATEGY

**Preserve provenance and essential evidence while acknowledging finite storage.**

### Tiered Retention

```javascript
{
  retention: {
    // Tier 1: Permanent (never deleted)
    permanent: [
      "Entity identity records (who/what exists)",
      "Causal edges (what caused what)",
      "Contradiction records (what disagreed)",
      "Authorization records (who approved what)",
      "Self-examination records (how reasoning changed)"
    ],

    // Tier 2: Long-term (compressed after 1 year, retained 7 years)
    longTerm: [
      "Full event details (inquiry objects, before/after states)",
      "Evidence observations (screenshots metadata, not full images)",
      "Question records (formulation, assumptions, resolution)"
    ],

    // Tier 3: Ephemeral (aggregated after 90 days, raw deleted after 1 year)
    ephemeral: [
      "High-frequency observations (per-frame data, per-collision events)",
      "Health check records (observation success/failure counts)",
      "Sync metadata (cache flush records)"
    ]
  },

  // Aggregation (not deletion)
  // When Tier 3 data ages out, it is AGGREGATED not deleted:
  // "10,000 collision events between 2026-10-08 and 2027-01-08" 
  // → "Average 111 collisions/day, 0 anomalies"
  // The aggregate is a new event. The raw data is then eligible for deletion.
  // Provenance: aggregate links to date range, not individual events.

  // What is NEVER aggregated or deleted:
  // - Anything involved in an open investigation
  // - Anything linked to a contradiction
  // - Anything marked as evidence for a causal claim
}
```

### Storage Estimates

```
Per event: ~2KB (JSON)
Per day (active development): ~500 events = ~1MB/day
Per year: ~365MB
PostgreSQL handles this easily.

Per day (production, throttled): ~100 events = ~200KB/day
Per year: ~73MB

Tier 3 ephemeral data (if unthrottled): could be 10MB/day
→ Throttling is essential, not optional.
```

---

## 8. PERSONA EXTENSIONS

### New Question Pattern 1: Conditions of Possibility

**"What conditions would have to exist for this observation to be possible?"**

**"It would be nice to know whether those conditions actually existed."**

This moves beyond "what caused X?" to "what made X possible?" — revealing hidden dependencies.

```javascript
Persona.conditionsOfPossibility(observation) {
  // For the observation to exist, these must have been true:
  const necessary = this.deriveNecessaryConditions(observation);
  // e.g., "For the screenshot to show glitched floor, WebGL must have been active"

  // These COULD have been true (but weren't necessary):
  const possible = this.derivePossibleConditions(observation);
  // e.g., "The GPU could have been thermally throttling"

  // For each condition: was it actually true?
  return {
    necessary: necessary.map(c => ({ ...c, verified: this.checkCondition(c) })),
    possible: possible.map(c => ({ ...c, verified: this.checkCondition(c) })),
    unverif