Home / Ops / Housekeeping and Process
Updated May 21, 2026 · Affirmology_SessionHandoff_v1.md
Purpose: Single-document context dump so the next Cowork session picks up where this one left off. Read this first when starting a new chat about Affirmology.
Status as of this handoff: Phase 1 accuracy verified across three real charts (Jeff, Josh, Soledad). Phase 2 script generation working. Phase 4 voice synthesis and music mix working. Jeff's own demo audio renders cleanly at speed 1.1 with the Heavenly Circuit music bed, 6:15 final length, alchemist content verified by audio report.
Affirmology is a system that takes a person's name + birth date + birth time + birth location and produces a verifiably accurate personalized affirmation audio. The product is a personalized "sacred audio" mp3 that plays a meditation script tailored to the person's astrology, Human Design, Gene Keys, and numerology, layered over an instrumental music bed via ElevenLabs voice synthesis.
The competitive moat is accuracy. GPTs hallucinate astrology by default. Affirmology computes the chart deterministically via Swiss Ephemeris, then has Claude write the affirmations from the verified JSON. Every chart claim in the final audio traces back to a tool-computed value.
/Users/jeffreyparker/CLAUDE/AFFIRMOLOGY/affirmology-agent/
affirmology-agent/
├── README.md install + usage walkthrough
├── pyproject.toml Python deps
├── .env API keys (Anthropic, ElevenLabs)
├── .env.example template
├── .gitignore
├── music/
│ └── Heavenly Circuit.mp3 the music bed for demos
├── src/affirmology/
│ ├── __init__.py
│ ├── cli.py command-line entry point
│ ├── models.py dataclasses (Chart, Planet, GeneKey, etc.)
│ ├── chart/ the four deterministic calculation engines
│ │ ├── geocode.py
│ │ ├── astrology.py
│ │ ├── human_design.py
│ │ ├── gene_keys.py
│ │ └── numerology.py
│ ├── agents/
│ │ ├── orchestrator.py Claude agent for prose reports
│ │ ├── verifier.py regex pass that catches hallucination
│ │ ├── script_generator.py Phase 2 affirmation script generator
│ │ ├── audio_synthesis.py ElevenLabs voice synthesis
│ │ └── audio_mix.py FFmpeg voice+music mix
│ ├── reports/render.py deterministic markdown reports
│ └── verification/
│ ├── known_charts.py Jeff and Josh fixtures
│ └── external_check.py cross-check helpers
├── tests/
│ ├── test_numerology.py
│ ├── test_astrology_jeff.py
│ └── test_human_design_josh.py
└── out/ per-person rendered output folders
Activate the venv before any command:
cd "/Users/jeffreyparker/CLAUDE/AFFIRMOLOGY/affirmology-agent"
source .venv/bin/activate
All 29 tests passing. Run with pytest -v.
Affirmology_AstrologyChart_v1.md to within 10 arc-minutes on every planet, ascendant, and midheaven.Affirmology_JoshParini_HumanDesignProfile_v1.md) at every gate, line, channel, type, profile, authority, definition, and center.These were derived experimentally over the session. Do not change without re-running the test suite.
src/affirmology/chart/astrology.py:
- Ephemeris flag: swe.FLG_MOSEPH | swe.FLG_SPEED (Moshier built-in, no .se1 data files needed)
- North Node uses TRUE_NODE not MEAN_NODE (Beaumont uses true)
- Chiron is in OPTIONAL_BODIES with try/except (requires asteroid data files; skipped silently if missing)
- Planet list: Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, North Node (true), Earth (Sun + 180), South Node (NN + 180)
src/affirmology/chart/human_design.py:
- GATE_WHEEL_OFFSET = 358.2425 degrees. Calibrated against all 13 of Josh's Beaumont positions.
- Gate wheel order is the canonical Rave Mandala sequence (preserved in GATE_WHEEL list).
src/affirmology/agents/audio_synthesis.py:
- Default voice: Charlotte (Meditation and Relaxation), looked up by name via /v1/voices API
- Default model: eleven_turbo_v2_5 (half the cost of multilingual_v2, very high quality for meditation)
- Output format: mp3_44100_128
- Default voice settings:
- stability: 0.65
- similarity_boost: 0.85
- style: 0.0
- use_speaker_boost: True
- speed: 0.95
src/affirmology/agents/script_generator.py:
- Effective rate at speed 0.95: ~146 words per minute (Jeff v5 calibration: 920 words = 6:17)
- Effective rate at speed 1.1: ~157 wpm (Jeff v5 calibration: 861 cleaned words = 5:28 voice)
- Default target: 6.3 minutes ≈ 900 words
src/affirmology/agents/audio_mix.py:
- Default voice volume: 1.0
- Default music volume: 0.20 (about -14 dB under voice)
- Default voice offset: 5.0s (override to 8.0s for demos)
- Default music fade in: 3.0s
- Default fade out: 5.0s
- Sidechain ducking: opt-in via --duck flag (not default)
Jeff's hand-crafted Affirmology_Script_v5.md is the canonical style template embedded directly into the script generator's system prompt. Any future auto-generated script should pattern-match its structure:
Hard rules baked into the prompt: - 800 to 950 words max - Never second person - Never em dashes - Never markdown section headers in script body - Do not reference Expression, Soul Urge, or Personality numerology (those depend on name input which users often fudge)
Files confirmed working as of this session, all in out/ subfolders:
out/jeff_speed_11_v2/ Jeff's v5 hand-crafted script rendered at speed 1.1 with Heavenly Circuit music. Final mp3 6:15. Audio report verified clean. This is the reference render.out/jeff_speed_11_v2/JEFF_ALCHEMIST_FRESH.mp3 is the renamed copy Jeff used for final verification.out/josh_parini_1985-10-21/ Josh's chart facts + earlier auto-generated script + earlier audio render (older render, has metadata bleed because rendered before the cleaning function was hardened).out/soledad_gabriela_ballard_1986-01-23/ Soledad's facts files (no audio yet).Output folders auto-version per person via _slug(name)_birth-date so re-running doesn't overwrite.
# Facts only (free, fast, no API calls)
python -m affirmology.cli --name "Name" --date YYYY-MM-DD --time HH:MM --location "City, State" --facts-only
# Cross-check format (for verifying against Astro.com, MyBodyGraph, GeneKeys.com)
python -m affirmology.cli ... --cross-check
# Generate affirmation script via Claude
python -m affirmology.cli ... --script --minutes 6.3
# Render audio (voice via ElevenLabs, then mix with music)
python -m affirmology.cli ... --audio \
--script-file "/path/to/script.md" \
--music "/path/to/music.mp3" \
--voice-offset 8.0 \
--speed 1.1 \
--out "./out/named_folder"
# Available flags for audio:
# --music PATH music bed mp3
# --voice-offset 8.0 seconds of music alone before voice (default 5)
# --music-volume 0.20 music level during voice (default 0.20)
# --duck sidechain ducking instead of fixed level
# --speed 1.1 ElevenLabs voice speed (0.7 to 1.2)
# --script-file PATH use a specific script file instead of auto script.md
Every --audio run writes an audio_report.md alongside the mp3s showing exactly what Charlotte was voiced. This is the receipts file. If the audio sounds wrong, read the report first.
Affirmology_Script_v5.md and Affirmology_JoshParini_Script_v2.md is now stripped by the hardened clean_script_for_tts function. New scripts should still use YAML frontmatter to be safest.At Creator tier with Turbo v2.5: - Chart calculation: $0 - Claude script generation: $0.10 to $0.30 - ElevenLabs voice (Turbo): about $0.50 - FFmpeg mix: $0 - Total: about $0.60 to $0.80 per audio
At Scale tier with Flash v2.5 (production economics): - Total: about $0.20 to $0.35 per audio
When you start the new chat, paste this entire document. The new agent will have all the context it needs to keep building.
Suggested next steps in priority order:
audio_report.md that becomes the receipts document a customer can read after the audio. Format follows Affirmology_JoshParini_SacredAudio_v1.pdf style.When all that lands, Phase 4 demo is investor-ready and Phase 3 (web intake, repository, Google geocoding) becomes the next focus.