Home / Engine / Chart and Pipeline Engine
Updated Jun 20, 2026 · Affirmology_StoredNatalChartBasis_C19_BuildBrief_v1.md
Jeff 2026-06-20: "Why would we run a complete new chart each time an audio is generated for someone we already pulled? That is inefficient and wasteful, especially at scale. All that info should be obtained once, stored, and used as the basis for all custom Sacred Audios. Progressions and transits get run on a need-by-need basis. But the chart should be there as the basis for all requests, analysis, and context."
Correct and important. The natal chart is IMMUTABLE (fixed at birth). Today the engine recomputes the full chart (placements, aspects, extended points, asteroids, HD, Gene Keys, numerology) on every audio render and every Hermes pull. That is redundant for the 4 test people and badly wasteful at scale. Fix: compute the natal chart ONCE per person, store it, and reuse it everywhere. Time-dependent layers (transits, progressions, the significant-events timeline) stay on-demand because "now" changes.
The cached natal basis must hold the COMPLETE blueprint Jeff named: western, Gene Keys, numerology, Human Design, Vedic, asteroids. Coverage check against the Chart Pydantic model:
- COVERED by serializing the Chart object (already stored fields): western astrology (planets, angles), the full ASPECT grid (astrology.aspects), the EXTENDED POINTS (Lilith, Part of Fortune/Spirit, Vertex) and CHIRON + ASTEROIDS (astrology.extended_points), HUMAN DESIGN (human_design: type, authority, profile, channels, etc.), GENE KEYS (gene_keys: activation, Venus sequence, Pearl sequence), NUMEROLOGY (numerology: life path, and name-based numbers when name-confirmed).
- THE ONE GAP - VEDIC: there is no vedic field on the Chart model today; the Vedic sidereal layer is derived at RENDER time via vedic_facts_text(chart). So caching only the Chart object would OMIT Vedic and re-derive it every pull. FIX (required): compute the Vedic layer ONCE into the stored basis. Preferred: add a vedic field to the Chart model, populated in compute_chart, so it serializes with everything else. Acceptable alternative: store the rendered Vedic facts alongside the cached Chart. Either way, the stored basis must return Vedic without recomputing.
- TWO TIERS (Jeff 2026-06-20 "aspects, transits, all that... a summary of progressed"):
- TIER 1 - IMMUTABLE NATAL BASIS: everything above (western incl. NATAL aspects, extended points, asteroids; HD; Gene Keys; numerology; Vedic). Cached forever, busted only by birth-data change or an engine-version bump.
- TIER 2 - TIMING SNAPSHOT (date-dependent, so NOT in the immutable basis, but still stored/reused on a short clock): current major TRANSITS, a PROGRESSED SUMMARY (progressed Sun, progressed Moon + its phase, upcoming progressed sign changes), and the significant-events timeline. Computed on demand and cached per (person, date) with a TTL: transits ~daily, the progressed summary ~monthly (it moves ~1 degree/year). So it is reused within the window but always reflects the real "now," never frozen.
- So the full picture is always available (natal blueprint + live timing), with each tier cached at the right cadence. Nothing recomputes needlessly; nothing goes stale.
Key the stored natal chart on BOTH:
1. a hash of the birth data (name, date, time, location, name_confirmed) so editing birth data busts the cache, AND
2. a CHART_ENGINE_VERSION constant bumped whenever the chart engine changes (aspects, asteroids, new points, fixes).
So key = sha1(birth_data_normalized + CHART_ENGINE_VERSION). When we upgrade the engine (as we just did), bumping the version recomputes every chart ONCE on next use, so nobody is frozen on an old engine. This is the safeguard that makes caching safe.
charts store: a chart_cache table in studio.db (or a small per-person JSON store / R2), columns: person_id, birth_hash, engine_version, chart_json, created_at. Look up by (person_id or birth_hash) + engine_version.verification/known_charts_computed/), so they are instant everywhere (laptop + cloud) with zero first-compute. Regenerate these fixtures whenever CHART_ENGINE_VERSION bumps (a small script).compute_chart_cached(birth) (or a chart_store.get_or_compute(...)) that returns the natal Chart from cache or computes+stores it. Route the chart consumers through it:get_person_chart / compute_chart_from_birth (Hermes).script_generator, the --council path).render_all_facts natal sections read from the cached Chart; render_timing_facts stays computed live (date-dependent), layered on top.Chart dataclass (placements, aspects, extended_points incl. Lilith/Lots/Vertex/Chiron/asteroids, HD, Gene Keys, numerology) round-trips to/from JSON faithfully. Add a test: compute -> serialize -> deserialize -> identical facts.affirmology-studio/affirmology-agent/.