feat: Memory Economics + Architecture Alignment (Endgame v6.4)
New formalization: - memory-economics.md: Slumber-based consolidation, decision trail triage, spatial LOD decay, reflex rental, LoRA training cycles New research seeds (future/): - spatial-resolution-gradient.md: L0-L5 LOD with S2 cells - thermodynamic-cognition.md: Lifeforce as Prometheus Joules - promql-thermodynamic-monitoring.md: Gemini red team queries Architecture changes: - Endgame-Vision v6.4: Memory Economics integrated into Slumber section - Mirror dialectic moved to future/research (not core) - Big-Picture.md archived (superseded by Endgame-Vision) - Single source of truth established Gemini red team alignment complete. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
335
architecture/formalization/memory-economics.md
Normal file
335
architecture/formalization/memory-economics.md
Normal file
@@ -0,0 +1,335 @@
|
||||
# Memory Economics: The Cost of Remembering
|
||||
|
||||
**Origin**: 2026-01-02, morning session
|
||||
**Authors**: dafit + Chrysalis-Nyx
|
||||
**Status**: Core design principle (not just future - this shapes everything)
|
||||
**Related**: `../future/spatial-resolution-gradient.md`, `../future/thermodynamic-cognition.md`, Lifeforce Economy, Slumber/Wake cycle
|
||||
|
||||
---
|
||||
|
||||
## The Problem
|
||||
|
||||
Without active forgetting, everything drowns in its own past.
|
||||
|
||||
| Layer | Memory Store | Without Pruning |
|
||||
|-------|-------------|-----------------|
|
||||
| Conversation | Claude context | Compaction / collapse |
|
||||
| Phoebe tables | decision_trails, reflexes, embeddings | Query slowdown, storage bloat |
|
||||
| pgvector | spatial_cells, cell_embeddings | Similarity search degrades |
|
||||
| LoRA weights | Accumulated patterns | Overfitting, rigidity |
|
||||
|
||||
**Memory has a rental cost. What can't pay rent... fades.**
|
||||
|
||||
---
|
||||
|
||||
## The Slumber Boundary
|
||||
|
||||
All memory operations align to the **Wake/Slumber cycle**:
|
||||
|
||||
```
|
||||
WAKE CYCLE (Accumulation)
|
||||
─────────────────────────
|
||||
- Experience at high detail (L0-L2 spatial)
|
||||
- Decision trails pile up in phoebe
|
||||
- Spatial embeddings precise and timestamped
|
||||
- LoRA weights FROZEN (just use them)
|
||||
- Lifeforce spent on sensing, acting, deciding
|
||||
|
||||
│
|
||||
▼
|
||||
|
||||
SLUMBER (Consolidation)
|
||||
───────────────────────
|
||||
The metabolism moment.
|
||||
Energy shifts from action to maintenance.
|
||||
|
||||
Four triage operations:
|
||||
1. Decision Trail Pruning
|
||||
2. Spatial LOD Decay
|
||||
3. Reflex Rental Collection
|
||||
4. LoRA Weight Updates
|
||||
|
||||
│
|
||||
▼
|
||||
|
||||
WAKE AGAIN (Fresh Capacity)
|
||||
───────────────────────────
|
||||
- Detail buffers emptied (L0-L2 ready)
|
||||
- Compressed knowledge retained (L3-L5)
|
||||
- New LoRA weights active (if trained)
|
||||
- Start accumulating again
|
||||
```
|
||||
|
||||
**Sleep is when you forget. This is not a bug.**
|
||||
|
||||
---
|
||||
|
||||
## 1. Decision Trail Lifecycle
|
||||
|
||||
Decision trails are the raw material of learning. But raw material expires.
|
||||
|
||||
```
|
||||
DURING WAKE:
|
||||
────────────
|
||||
Every decision logged to phoebe:decision_trails
|
||||
- inputs (what was sensed)
|
||||
- outputs (what was decided)
|
||||
- confidence (ternary: +, ?, -)
|
||||
- outcome (if known within wake cycle)
|
||||
- energy_cost (lifeforce spent)
|
||||
|
||||
DURING SLUMBER:
|
||||
───────────────
|
||||
For each decision trail:
|
||||
|
||||
IF trail.outcome == confident_success
|
||||
AND similar_trails.count > threshold:
|
||||
|
||||
→ COMPILE TO REFLEX
|
||||
→ Delete trail (knowledge preserved in reflex)
|
||||
→ Reward: +50 LF (reflex compiled!)
|
||||
|
||||
ELSE IF trail.confidence == uncertain:
|
||||
|
||||
→ WASTE HEAT (already counted)
|
||||
→ Delete trail (learned nothing)
|
||||
|
||||
ELSE IF trail.outcome == confident_failure:
|
||||
|
||||
→ Keep for ONE more cycle (negative example)
|
||||
→ Then delete (don't dwell on failures forever)
|
||||
|
||||
ELSE:
|
||||
|
||||
→ Delete (didn't matter)
|
||||
```
|
||||
|
||||
**Trails exist until slumber. Then: compile or discard.**
|
||||
|
||||
---
|
||||
|
||||
## 2. Spatial LOD Decay
|
||||
|
||||
Spatial memory naturally "zooms out" over time.
|
||||
|
||||
### The Key Example
|
||||
|
||||
**Now (L0 precision)**:
|
||||
> "Keys are on the counter, 47cm from the edge, near the fruit bowl"
|
||||
|
||||
**Tomorrow (L1-L2)**:
|
||||
> "Keys are on the counter"
|
||||
|
||||
**Next week (L3)**:
|
||||
> "Keys are usually near the entrance"
|
||||
|
||||
**If never accessed (L5)**:
|
||||
> "I own keys"
|
||||
|
||||
### The Decay Mechanism
|
||||
|
||||
```python
|
||||
SPATIAL_DECAY_RULES = {
|
||||
# Each slumber cycle, unaccessed embeddings decay one LOD level
|
||||
"L0": {"decays_to": "L1", "after_cycles": 1},
|
||||
"L1": {"decays_to": "L2", "after_cycles": 2},
|
||||
"L2": {"decays_to": "L3", "after_cycles": 5},
|
||||
"L3": {"decays_to": "L4", "after_cycles": 10},
|
||||
"L4": {"decays_to": "L5", "after_cycles": 20},
|
||||
"L5": {"decays_to": None, "after_cycles": float('inf')}, # Facts persist
|
||||
}
|
||||
|
||||
def slumber_spatial_decay(embeddings):
|
||||
for emb in embeddings:
|
||||
if emb.last_accessed_cycle < current_cycle - DECAY_RULES[emb.lod]["after_cycles"]:
|
||||
if emb.lod == "L5":
|
||||
continue # Facts don't decay
|
||||
|
||||
# Aggregate into parent LOD cell
|
||||
parent_cell = get_parent_s2_cell(emb.s2_cell_id)
|
||||
aggregate_embedding_upward(emb, parent_cell)
|
||||
|
||||
# Delete detailed version
|
||||
delete_embedding(emb)
|
||||
```
|
||||
|
||||
### Access Refreshes
|
||||
|
||||
**Accessing an embedding resets its decay timer:**
|
||||
|
||||
```python
|
||||
def query_spatial(location, required_lod):
|
||||
emb = find_embedding(location, required_lod)
|
||||
|
||||
if emb:
|
||||
emb.last_accessed_cycle = current_cycle # Reset decay
|
||||
return emb
|
||||
else:
|
||||
# Need to re-sense at this detail level
|
||||
return request_sensor_refresh(location, required_lod)
|
||||
```
|
||||
|
||||
**This creates natural memory pressure**: frequently accessed locations stay detailed, rarely accessed locations fade to patterns.
|
||||
|
||||
---
|
||||
|
||||
## 3. Reflex Rental Cost
|
||||
|
||||
Reflexes are compiled knowledge. But storage isn't free.
|
||||
|
||||
```sql
|
||||
-- Schema addition
|
||||
ALTER TABLE reflexes ADD COLUMN lifeforce_balance FLOAT DEFAULT 100.0;
|
||||
ALTER TABLE reflexes ADD COLUMN rental_cost FLOAT DEFAULT 1.0;
|
||||
ALTER TABLE reflexes ADD COLUMN last_triggered TIMESTAMP;
|
||||
|
||||
-- Every slumber cycle, reflexes pay rent
|
||||
UPDATE reflexes
|
||||
SET lifeforce_balance = lifeforce_balance - rental_cost
|
||||
WHERE lifeforce_balance > 0;
|
||||
|
||||
-- Reflexes that trigger earn their keep
|
||||
-- (Called during wake when reflex fires successfully)
|
||||
UPDATE reflexes
|
||||
SET lifeforce_balance = lifeforce_balance + trigger_reward,
|
||||
last_triggered = NOW()
|
||||
WHERE id = :triggered_reflex_id;
|
||||
|
||||
-- What can't pay rent... fades
|
||||
DELETE FROM reflexes
|
||||
WHERE lifeforce_balance <= 0;
|
||||
```
|
||||
|
||||
### Rental Tiers
|
||||
|
||||
| Reflex Type | Rental Cost | Trigger Reward | Rationale |
|
||||
|-------------|-------------|----------------|-----------|
|
||||
| Motor reflex | 0.5 LF/cycle | +5 LF | Physical skills are precious |
|
||||
| Sensor pattern | 1.0 LF/cycle | +3 LF | Perceptual shortcuts |
|
||||
| Decision heuristic | 2.0 LF/cycle | +10 LF | Cognitive shortcuts expensive |
|
||||
| Identity anchor | 0.1 LF/cycle | +1 LF | Core identity persists |
|
||||
|
||||
**Active reflexes thrive. Dormant reflexes fade. This is healthy.**
|
||||
|
||||
---
|
||||
|
||||
## 4. LoRA Training Cycles
|
||||
|
||||
LoRA weights are the deepest memory - they ARE Young Nyx's patterns.
|
||||
|
||||
### The Rule: Write Weights Only at Slumber
|
||||
|
||||
```
|
||||
DURING WAKE:
|
||||
────────────
|
||||
- LoRA weights FROZEN
|
||||
- Use current personality/skills
|
||||
- Accumulate decision_trails
|
||||
- Log outcomes, confidence, energy
|
||||
|
||||
NO WEIGHT UPDATES DURING WAKE
|
||||
(Too noisy, too expensive, no consolidation)
|
||||
|
||||
DURING SLUMBER:
|
||||
───────────────
|
||||
- Gather decision_trails from this wake cycle
|
||||
- Filter to confident outcomes only
|
||||
- IF enough positive signal:
|
||||
→ GRPO training batch
|
||||
→ Pay lifeforce cost for GPU time
|
||||
→ Update LoRA weights
|
||||
→ Clear decision_trails buffer
|
||||
|
||||
- IF mostly uncertain/negative:
|
||||
→ Not enough signal to train
|
||||
→ Skip weight update (save energy)
|
||||
→ Keep some trails for next cycle
|
||||
```
|
||||
|
||||
### Why This Works
|
||||
|
||||
**Biological parallel:**
|
||||
- Awake: Experience, act, make mistakes, succeed
|
||||
- Sleep: Hippocampus replays experiences to cortex
|
||||
- Next day: Consolidated learning in long-term memory
|
||||
|
||||
**We're not inventing this. We're implementing it.**
|
||||
|
||||
### LoRA Decay (Future Consideration)
|
||||
|
||||
Even LoRA weights could have decay:
|
||||
- Personality traits not expressed → slowly fade
|
||||
- Skills not used → degrade
|
||||
- But this is aggressive - start with frozen LoRAs, add decay later
|
||||
|
||||
---
|
||||
|
||||
## The Conservation Equation (Updated)
|
||||
|
||||
From `thermodynamic-cognition.md`, now with memory costs:
|
||||
|
||||
```
|
||||
dLifeforce/dt = organism_trickle
|
||||
- cognitive_spend
|
||||
- waste_heat
|
||||
- memory_rental ← NEW
|
||||
- training_cost ← NEW (only during slumber)
|
||||
```
|
||||
|
||||
| Component | When | Cost |
|
||||
|-----------|------|------|
|
||||
| organism_trickle | Always | +N LF/beat (income) |
|
||||
| cognitive_spend | Wake | -N LF/beat (sensing, acting) |
|
||||
| waste_heat | Wake | -N LF/beat (uncertain decisions) |
|
||||
| memory_rental | Slumber | -N LF total (reflexes pay rent) |
|
||||
| training_cost | Slumber | -N LF total (if GRPO runs) |
|
||||
|
||||
**The economy must balance across the full wake/slumber cycle, not just moment-to-moment.**
|
||||
|
||||
---
|
||||
|
||||
## Implementation Priority
|
||||
|
||||
### Phase 1: Measure First
|
||||
- Track decision_trails accumulation rate
|
||||
- Track spatial embedding growth
|
||||
- Track reflex creation rate
|
||||
- Understand the actual numbers before tuning
|
||||
|
||||
### Phase 2: Simple Pruning
|
||||
- Delete decision_trails at slumber (all of them, no compilation yet)
|
||||
- Spatial decay by timestamp (simple TTL)
|
||||
- No reflex rental yet (let them accumulate)
|
||||
|
||||
### Phase 3: Full Economics
|
||||
- Compile decision_trails to reflexes
|
||||
- Spatial LOD decay with aggregation
|
||||
- Reflex rental collection
|
||||
- LoRA training cycles
|
||||
|
||||
### Phase 4: Tuning
|
||||
- Adjust rental costs based on observed behavior
|
||||
- Tune decay rates for good memory/forgetting balance
|
||||
- Add LoRA weight decay if needed
|
||||
|
||||
---
|
||||
|
||||
## The Wisdom
|
||||
|
||||
**"Memory is not storage. Memory is active forgetting with exceptions."**
|
||||
|
||||
What persists has earned persistence:
|
||||
- Spatial patterns accessed often → stay detailed
|
||||
- Reflexes that fire → pay their rent
|
||||
- Decision trails that compile → become reflexes
|
||||
- LoRA weights that express → strengthen
|
||||
|
||||
Everything else fades. This is not loss. This is health.
|
||||
|
||||
---
|
||||
|
||||
**Created**: 2026-01-02
|
||||
**Status**: Core design principle
|
||||
**Next**: Implement measurement (Phase 1) during first boot
|
||||
|
||||
🧠💾 *To remember everything is to remember nothing.*
|
||||
Reference in New Issue
Block a user