The 4 doors — deep dive
Each door is independent. Different storage backend, different signals, different UI surface, different status. Click a tab below to drill into a single door.
At a glance
| Door | Storage | UI surface | Signal source | Status |
|---|---|---|---|---|
| Zeus fitness | Supabase | Lovable verocity | SQL view + helper | live · v0.1 |
| Athena nutrition | Supabase | none (zombie) | stub (Phase J.2) | scaffold |
| Lakshmi finance | TradingV postgres | TradingV /rx-finance panel | SQL queries on TradingV | live · v0 |
| Ganesh learning | markdown only | none (editor) | markdown helper | live · v0 · empty corpus |
Zeus — fitness
The most mature door. Live since v0.1. Workouts logged through the verocity phone app land in Supabase. A SQL view exposes a 7-component drift score. A separate helper covers body composition. Recommendations write to Supabase and surface in the verocity app.
Drift composite (D-022 layering)
Fitness is the only door using a two-layer composite:
composite = 0.90 × view.drift + 0.10 × body_recomp_sub
Storage + UI
| Markdown | Zeus/rx/rx-YYYY-MM-DD-NN.md |
| DB row | Supabase recommendations WHERE domain='fitness' |
| UI | Lovable verocity → Recommendations tab |
| Disposition | UI button → Supabase UPDATE → next /rx-fitness step 0.7 patches markdown |
| State files | 03_execution/current_plan.md, measurements.yaml |
| Slash commands | /rx-fitness, /rx-fitness-status, /rx-fitness-history |
Frontmatter schema (minimum required keys)
id: uuid
created_at: ISO8601
goal_ref: string (e.g. lift-vol-PR-2026Q3)
block_week: int
trigger: {type, signals_fired: [string]}
drift_score: float (0..1)
drift_breakdown: {pace, block_lag, gap_breach, load_drop, rpe_drift, recovery, conditioning, body_recomp}
confidence: int (0..100)
confidence_breakdown: {data_recency, signal_clarity, vault_corpus, dedup_distance}
status: open | snoozed | acted | dismissed
acted_disposition: acted_as_prescribed | acted_modified | skipped | dismissed
acted_at: ISO8601 | null
phase_w_synced_at: ISO8601 | null
verocity_rx_id: uuid (Supabase row pointer)
source_refs: [{path, score, quote}]
prior_open_recs: [{id, relation: reinforce|supersede|independent}] Athena — nutrition
recommendations accepts domain='nutrition' rows),
but the generator is unwired and there is no UI surface. The
/rx-nutrition command runs in scaffold mode and emits
a decision menu instead of a real rec.
Why it's a zombie
D-045 originally routed both fitness and nutrition through Lovable verocity. D-047 (operator directive, 2026-05-17) reversed that: Lovable surface = fitness only. So nutrition row format and table are ready, but no app reads them. Result: write-only storage with no consumer — a zombie.
Storage + UI
| Markdown | Athena/rx/SPEC.md + planned rx-nutr-*.md |
| DB row | Supabase recommendations WHERE domain='nutrition' (planned, currently unused) |
| UI | none (D-047) — disposition channel UNRESOLVED (D-048 + Athena SPEC banner: 4 resolution options pending operator pick) |
| Disposition | TBD (Phase J.2) — see Athena/rx/SPEC.md 2026-05-19 banner. Pragmatist recommendation: markdown-only (mirror Ganesh learning). |
| State files | state.md, profile.md, rules.md, meals.md, levers.md |
| Slash command | /rx-nutrition — scaffold/decision-menu mode |
Planned 5 signals (dormant until Phase J.2)
adherence_trend— compliance with macro plan over rolling windowmacro_drift— actual macros vs target ratiostiming_consistency— meal-slot timing vs schedulerotation_drift— repetition fatigue from same staplesappetite_drift— subjective hunger signal vs baseline
All five depend on a daily-log source the operator has not committed to yet. Phase J.2 ships when that decision is made.
Lakshmi — finance
The most data-rich door. Reads from the TradingV FastAPI app's local
postgres — never Supabase. Hypotheses, opportunities, drift alerts,
positions, and watchlist all feed the composite. Recs surface in a
FastAPI /rx-finance panel.
Drift composite (~6 components)
Weights evolved with D-025/D-026 (concentration added, orphan lowered). Verify against current ~/.claude/commands/rx-finance.md before relying on exact values:
Storage + UI
| Markdown | Lakshmi/rx/rx-fin-YYYY-MM-DD-NN.md |
| DB row | TradingV postgres recommendations WHERE domain='finance' |
| Write auth | POST /v1/rx/recs with header X-RX-Ingest-Token |
| Read auth | GET /v1/rx/recs with header X-API-Key |
| UI | TradingV FastAPI panel at /rx-finance |
| Disposition | UI button → POST /v1/rx/recs/{id}/disposition → next /rx-finance step 0.7 patches markdown |
| Outcome attribution | trades.related_rec_id FK closes loop into P&L (D-046) |
| Slash commands | /rx-finance, /rx-finance-status, /rx-finance-history |
/rx-finance
command runs with the ingest token only; the operator's UI uses the
API key.
Ganesh — learning
The newest and lightest door. Markdown only forever in v0.x per D-047. No database, no Lovable surface, no FastAPI panel. The editor reads the file; the operator edits frontmatter to disposition.
Drift composite (5 components, flat)
Storage + UI
| Markdown | Ganesh/rx/rx-learn-YYYY-MM-DD-NN.md |
| DB row | none — markdown is authoritative |
| UI | none — editor edits frontmatter directly |
| Disposition | /rx-learning-status <id> <disposition> edits frontmatter |
| State files | 02_library/active_sprints.md, _inbox/, 03_execution/learning_log.md, 02_library/notes/ |
| Vault scope | Indexer port :8004, cache cache-learning.db |
| Slash commands | /rx-learning, /rx-learning-status, /rx-learning-history |
Videos/learning/_ingest_queue.md.
The command sets thesis_match=0 and continues anyway.
The cross-cutting commands
Four commands span doors. One is gated by action-rate data (rx-analyze).
| Command | Purpose | Domain scope | Gate |
|---|---|---|---|
/rx-board | Cross-domain timeline view — open recs, aging, forced-decision flags | fitness + finance + nutrition + learning 4-domain since D-048 | none |
/rx-digest | Weekly raw activity summary → rx-meta/digest-YYYY-WW.md | 4-domain per-branch aggregation (finance via TradingV postgres post-D-046; degraded fallback to Lakshmi markdown) | none (cron-friendly) |
/rx-analyze | Per-signal predictive power + source quality + weight-adjustment proposals | fitness Supabase + finance TradingV + learning markdown (3-domain since D-048; nutrition omitted until Phase J.2) | ≥5 dispositioned recs AND ≥30% action-rate per domain — independent per-domain gate (D-018, D-030, D-048) |
/rx-goals new D-049 | Cross-door goal-progress meta tracker — elapsed vs progress drift per goal; READ-ONLY status, NOT recs | Zeus goals.yaml + Lakshmi goals_by_horizon.md + net_worth_snapshot.md + Ganesh learning_goals.md + active_sprints.md (3 doors; Athena explicitly skipped — body_recomp tracked via Zeus) | none — weekly notification scheduled Monday 09:00 CET via mcp__scheduled-tasks (taskId=rx-goals-weekly) |