Home / Start Here / Project State

AFFIRMOLOGY - PROJECT STATE (read me first, update me last)

Updated Jun 26, 2026 · Affirmology_PROJECT_STATE.md

Summary. THIS IS THE SINGLE SOURCE OF TRUTH ACROSS ALL CHATS.

AFFIRMOLOGY - PROJECT STATE (read me first, update me last)

STATUS (the 3-line answer to "where are we", keep current)

THIS IS THE SINGLE SOURCE OF TRUTH ACROSS ALL CHATS.

Protocol for every chat, no exceptions: 1. READ THIS FILE FIRST before doing anything or making any claim about project state. 2. Trust this file over older session notes, over scattered docs, and over your own assumptions. Where this file and another doc disagree, this file wins, or you reconcile them and fix this file. 3. UPDATE THIS FILE LAST before the session ends: what changed, what is now true, what is the next action. Keep it short and current. Delete stale lines rather than appending contradictions. 4. This file is intentionally unversioned. It is living. Do not make a v2; edit this one. 5. DELIVERING FILES TO JEFF: always surface any file as a clickable card via the present_files tool so it opens in Claude desktop. NEVER tell Jeff to find or open a file by path or filename. He will not hunt for it, and raw .md/.txt open in a hard-to-read editor. He compares quickly via links. When the point is reading or comparing, present it as a link and prefer rendered formats (PDF or HTML) over raw markdown.

Last updated: 2026-06-24 (Cowork, timing/launch session, NO code). SESSION (electional + launch planning): Jeff missed the June 20 LLC filing (no funds + Saturday). Routed the electional/timing question to Hermes live (bridge healthy, corpus ok). Council result: best LLC file date before the retrograde = THU JUN 26 morning before ~1pm EDT (Taurus Moon trines his Virgo Sun-Venus 8th-house axis, Mercury still direct); workable backup Sat Jun 28; STRONGEST overall = AUG 11-13 (Sun on his Vertex 21 Leo 7th, Jupiter building into Leo, Moon over PoF/Jupiter). Mercury retrograde verified Jun 29-Jul 23 2026 in Cancer (shadow clears ~Aug 5), sitting ON his natal Cancer Moon (6th). Guidance: cold investor outreach before Jun 29 or after Jul 23; WARM re-engagement + warm beta invites are favorable DURING the retrograde. Money squeeze = Saturn in Pisces opposing his Virgo Sun-Venus (8th) + Sun crossing natal Saturn-Mercury this week; eases Jul 24-Aug 13; big expansion bell early Nov (Sun conj natal Jupiter 10th). Move now: brief warm check-ins to each paused coaching deal before Jun 29. DELIVERABLES (project root): Affirmology_TimingAndLaunch_ActionPlan_v1.md (master plan: dates, Mercury messaging, travel/beta ops, audio), Affirmology_Kairos_ElectionalAgent_Spec_v1.md (PROPOSED new electional/timing oracle "Kairos", NOT built, awaiting Jeff's go), Affirmology_DaytimeAnchor_AudioScript_v1.md (looping daytime reassurance/wealth script), Affirmology_ElectionalTimingReading_2026-06-24.md (raw council reading). RENDER INFRA CORRECTION (Jeff-verified 2026-06-24): Jeff verified that the CLOUD renders audios laptop-independent (works with the laptop out of the loop). This supersedes the older "the whole render path runs on the laptop / only works while the laptop is awake" notes in sections 11 + 13 + the section-5 operational fact, for the STUDIO/cloud path. Net: beta testers can enroll + receive audios 24/7 without Jeff's laptop, so the travel week is NOT render-blocked. (The LOCKED DEMO laptop path is a separate matter; this correction is about the Studio/beta render infra.) NEXT: confirm whether the Hermes/agent funnel reading path is likewise cloud-served or still laptop (today's reading went through the laptop funnel macbook-pro-2:8443). OPEN: (a) Jeff to pick audio render path (RESOLVED: chart-driven engine render, ~25-30 min; render command + Code paste delivered); (b) Jeff to approve building Kairos electional agent. NEW HARD RULE ADDED TO CLAUDE.md (Jeff 2026-06-24): ALL audio, anywhere/anytime, MUST be rendered through OUR system (engine/council via funnel), NEVER a third-party TTS. AUDIO BUG FOUND: the Hermes render_sacred_audio tool does NOT honor a custom source_script, it regenerates its default natal/chart structure (verified: a custom "I am Jeff" daytime-anchor script came back as a 2nd-person natal reading, entry 5e779947...). So custom long-form affirmation tracks must currently render via the engine CLI --script-file on the Mac (reliable), OR render_sacred_audio needs a fix to actually pass source_script through. Render-ready files in project root: Affirmology_DaytimeAnchor_AudioScript_v2.md (the script: no warm-up, name woven in, all first person, smorgasbord of techniques) + Affirmology_DaytimeAnchor_RenderScript_x3.txt (same script x3 = ~40 min for a long background loop). LOCKED LAUNCH TIMELINE (2026-06-24, Jeff said "lock it in"): seven-beat electional sequence, full detail + caveats in Affirmology_LaunchTimeline_v1.md. Beats: (1) Jun 26 file the WY LLC (direct on wyobiz.wyo.gov, agent ADDRESS+consent only NOT their filing service; resolve the wyomingagents.com $163 or use a fresh RA; EIN+bank, money can come in July; NO SAFEs); (2) Jul 4 beta opens FREE (no payments/upgrades that day; beta users never pay, free + escalating incentives); (3) Aug 11-13 HARD commercial launch (app live, Meta ads, payment links, customer money) + open the angel raise ($5-50k chunks, goal ~150k); app can ship via an individual Apple acct then convert to LLC; (4) Sep 11 first in-person Miami exposure + sales test (Jeff's bday/solar return); (5) Sep 24-26 Ultimate Wellness Event (Faena MC gig, agreement in Affirmology_UltimateWellness_MC_Agreement_v1.md); (6) Nov 11 consciousness GATHERING not commerce (Scorpio Mercury Rx is an asset for depth; lock venue + promote BEFORE Oct 24; venue target = Palapa, Jeff's feelers out); (7) early Dec Art Basel OPTIONAL/LATER after an explosive UWE, join an existing event, keep it intimate. Verified Mercury Rx 2026: Jun 29-Jul 23 (Cancer) + Oct 24-Nov 13 (Scorpio). NOTE: caught + corrected a council factual slip (it claimed Mercury clear on 11/11; it is not). PRIOR SESSION BELOW. --- Earlier 2026-06-21 (Cowork, C-build session). SESSION (C29 backfill + C28 confirm + C26 STEP 3 BUILT): Audited the four-step app-changes build and found STEP 1 C29 (rule+form+scope craft schema) and STEP 2 C28 (practitioners/wisdom nightly research lane) were ALREADY built + committed (studio commits 347bc09 and 3975330 + the practitioners chain a21fbcf/e922b6e/8ce25f8/612797c); verified green (test_craft_rule_form.py + test_practitioners.py). Ran the C29 craft backfill --apply on the live corpus (corpus/corpus.db): 112 craft entries, 106 already tagged, the last 6 processed for $0.0038 (5 production/QA-craft entries correctly left untagged, 1 tagged rule=7 form=journaling_prompt,mindset_practice). BUILT + COMMITTED STEP 3 C26 (audio delivery pacing + activation), studio commit 601e7f0, Studio-only + additive + demo byte-for-byte unaffected (standard pace is a true no-op): Structure gains pace + bed_profile (before_bed + gk_single_sphere = deep; confidence_abundance = activation/driving; natal_sacred stays standard); new agents/pacing.py (pace->speed deep 0.88 / standard 0.95 / activation 1.03 under the 1.05 ceiling; mix-time silence after questions + at section breaks via new audio_mix.concat_voice_segments; synthesize_voice_paced segmented synth, standard delegates to the unchanged single-call path; target_word_count for length consistency; deterministic pacing_gate); cli.py gains --pace / --bed-profile and a paced QC-gated synthesis branch (QC gate + 1.05 ceiling preserved); council.compose takes pace/bed_profile (Hypnos sequences pacing, Orpheus writes the question + laddered arc, Apollo folds in the pacing gate); studio pipeline.py + jobs.py thread pace from the structure (a standard render still passes --speed 1.0, no --pace). Engine changes vendored into affirmology-studio/affirmology-agent (kept in sync). Tests: test_c26_pacing.py (4 acceptance, decisions + CLI args) + test_c26_pacing_render.py (real ffmpeg silence insertion passes the QC gate; QC still catches a true dropout), 6/6 green; engine pytest 46/46; full studio suite 114 pass / 1 fail = test_chart_cache::test_determinism_cached_vs_fresh, a PRE-EXISTING aspect-ordering nondeterminism proven independent of this work by a baseline run (stash-all -> still fails), unrelated to C26 and a chart-engine fix for later WITH Jeff. STOPPED before any paid ElevenLabs render per Jeff: NEXT = Jeff listen-checks one deep render (before_bed) + one activation render (confidence_abundance), then STEP 4 (C3 tones). Queue updated: C29 schema + C28 checked off, C26 marked [~] built/pending-listen-check, C3 left for after the listen-check. EARLIER SAME DAY: reconciled the Test & Change Queue (C22/C24/C25 were shipped 2026-06-20 but still showed unchecked; now checked off, PROJECT_STATE remains the source of truth). Wrote four new build docs: Affirmology_AudioPacingActivation_C26_BuildBrief_v1.md (slower deep delivery, pauses, activation questions, per-Structure pace/target_minutes/bed_profile, render-length consistency), Affirmology_FrequencySoundLayer_C3_Spec_v1.md (synthesized isochronic/binaural/tonal entrainment layer in audio_mix.py, state-to-frequency map, honesty rule, off by default), Affirmology_BeliefInstallation_C29_Kickoff_v1.md (the rule+form tagging schema for the craft/practitioners corpus, plus first wealth-journey journaling prompts + mindset practices), and Affirmology_SoundDesign_DynamicBeds_Report_v1.md (plain-language sound report: layers/stems/sections, vocabulary, do-now-vs-hire-later, Suno recipes for Sol, free/public-domain learning). Also two prompts: Affirmology_AudioStructures_CoworkSession_StarterPrompt_v1.md (launch a Cowork session to organize techniques + design structures/suites: starter kit, transformation tracks, wealth suite with affirmations/journaling/EFT/before-bed/motivational) and Affirmology_AppChanges_MasterCodePrompt_v1.md (one sequenced Code paste: C29 schema -> C28 research lane -> C26 pacing -> C3 tones, demo locked, QC kept, vendored). Added a free/public-domain sources section to the C28 plan (Neville/Wattles/Shinn/Troward/Behrend/Allen/Coue/Kybalion ingest-fully; in-copyright + RTT benchmark-only; hypnotherapy researched first). NOTE: the dedicated C28 hypnotherapy/practitioners research lane is NOT built yet; usable hypnosis craft today lives in the craft areas meditation_hypnosis (15) + breakthrough (24). NEXT for Jeff: (a) commit the test-only C24 acceptance test, (b) paste the master Code prompt or run C26 first, (c) launch the audio-structures Cowork session, (d) give C28 the add-all/trim. Prior 2026-06-20: HERMES IS NOW EFFECTIVE AND PROVEN LIVE. The agentic loop fix + two hardening fixes are deployed on studio.affirmology.ai (commits ca3a055/eb6c075): FIX A front-end polls /api/hermes/history so there is no more "could not reach my model" flash on a slow read; FIX B keeps tools=HERMES_TOOLS in the forced-synthesis call so heavy multi-oracle reads no longer 400. T1 PASSED: a live two-person (Jeff+Sol) wealth-codes reading returned a full mechanism-level answer (Pearls 45.5/49.5, channels, Lilith/Chiron blocks, live transits), and a craft-grounded sleep-technique reading fused chart + craft + timing, brand-clean (heart coherence breath, never the teacher's name). Craft Knowledge Engine Phase 2 is wired AND live on cloud (craft + techniques synced to R2, commits 5be790e/bc507c1; cloud /api/corpus-stats: craft=94, techniques=18, records=25570). NEW DIRECTION (Jeff): HERMES AS COMMAND CENTER, "a cheat code superhighway into all our systems," Jeff full keyset, Sol/Colin governed. Map: Affirmology_Hermes_CommandCenter_CapabilityMap_v1.md. The shared ACTION LAYER (endpoint + Hermes tool + chat button + server-side tier check) is GREENLIT with briefs written: C16 cross-chat messaging (Affirmology_CrossChatMessaging_C16_BuildBrief_v1.md) + C17 send-to-Studio (Affirmology_SendToStudio_C17_BuildBrief_v1.md), to BUILD TOGETHER in one Code pass (combined paste delivered in chat). C15 field-briefing / read-aloud audio rides on that layer (Affirmology_FieldBriefingAudio_C15_BuildBrief_v1.md + cost memo Affirmology_FieldBriefingAudio_CostMemo_v1.md): two modes, casual read-aloud is primary ("read me the chat while I cook"), field-briefing-with-save is the upgrade. ENGINE PATH for C15: start on ElevenLabs (already wired, no new account), HARD-capped per user + tier-gated server-side (Jeff's cost constraint), then move the default read-aloud voice to a LOCAL open TTS (Kokoro/Piper on the Mac mini) for ~$0; do NOT rely on OpenAI (Jeff cancelled it); Fish Audio is the cheap hosted fallback. Public share LINK for saved audio still needs C10 (R2 public media). Single living backlog of tests + changes: Affirmology_TestAndChange_Queue_v1.md. PENDING NEXT: paste the combined C16/C17 build to the studio Code window; the local funnel server still needs a manual restart to pick up the Phase 2 engine changes for local --council renders. Also logged: Hermes chat readings do NOT pass Apollo's craft gate, so chat-side accuracy slips (e.g. one reading briefly conflated Pearl 44.1 with 45.5) need a lightweight Hermes self-check, to be folded into Phase 3 of the craft grower.

Earlier 2026-06-18 (Cowork, Atlas+Studio planning session: Jeff's brain dump captured. ATLAS DECISIONS LOCKED (section 17b): in-app messaging Jeff/Sol/Colin only, Hermes takes actions, permission tiers, remember-last-mode, transcript-only voicenotes, nightly auto-applies SAFE changes only, Whisper now / Parakeet later, brand the Cloudflare Access page. STUDIO UPGRADE QUEUE added (Affirmology_StudioChangeList_v1.md top block): numerology full-name accuracy guard, structure overview/scope panel, length up to 45min, music-bed selector (None+Heavenly now, pace categories defined), conversation history, demo-candidate labeling, openings/endings research, slower ElevenLabs pacing, relationship in-app, internal-report transparency. NEW COUNCIL AGENT: PERSEPHONE, the breakthrough/transformation guardian (section 12). Prior entry below: (1) CHIRON, the Technique Healer, added to the council as a new prompted role between Sophia and Orpheus, with a before/after on Jeff's real chart. See section 12. (2) LAPTOP HOUSEKEEPING now that the Studio is on the cloud: retired the local laptop Studio server, moved the corpus OFF the external SSD to an internal path under the AFFIRMOLOGY folder, and corrected the misleading corpus status counting. See section 20. Earlier same day: STUDIO DEPLOYED TO THE CLOUD on Render + R2, full render pipeline proven end-to-end incl. PDF; corpus + music bed pulled from R2 on boot; auth locked; dependency audit. See section 19. Also: corpus-structurer model bake-off = HOLD on Haiku, and the "remaining backlog" is non-structurable junk, both in Affirmology_Nemotron_CorpusUpgrade_Plan_v1.md.)

ACTIVE WORK POINTER (Studio + Atlas build, 2026-06-18): the work order for today's Claude Code session is Affirmology_ClaudeCode_BuildBrief_2026-06-18_v1.md (Studio upgrades S1-S10, then Atlas v1 B1-B9, with exact files, acceptance criteria, and guardrails). Build Studio first (Sol tests tonight), then Atlas. Persephone gate prompt: CLAUDE OUTPUTS/Affirmology/Affirmology_Persephone_GatePrompt_v1.md.

ACTIVE WORK POINTER: for the current website-video and demo-web redesign haul, READ Affirmology_SessionHandoff_VideoBuild_v1.md next. It is the portable continuity capsule with the locked cosmos-film direction, the generated Lily voiceovers and their word-timing maps, the tech approach, and every open task. Use the design-motion-principles and emil-design-eng skills on the film.


0. The continuity rule (why this file exists)

Past chats kept starting ignorant and repeating or undoing work. Concrete failures that prove it: session notes claimed the transits tradition had 0 docs when the database actually had 146; one chat did not know the demo audio baseline another had set; a chat claimed the corpus was not architected into generation when it was. The cure is this file plus the discipline above. If you are a chat reading this, the most useful thing you can do is keep it accurate.


1. State at a glance


2. What is wired vs not (read before claiming anything about the pipeline)

WIRED and working: - Chart engines (astrology, Human Design, Gene Keys, numerology), verified against Jeff, Josh Parini, Sol fixtures (pytest). - Script generation, voice synthesis (ElevenLabs Charlotte), FFmpeg mix, Sacred Audio PDF. One CLI command produces a full render. - CLI Studio flags (2026-06-15): --concept "<directive>" (the structure directive; passes through to generate_script(concept=), content stays chart-only) and --build-report (writes the team-facing backend/build_report.md: design rationale, what was used/why, what was NOT used/why, suggestions, and a techniques footer from the Techniques Library). New module agents/build_report.py. Cost discipline: the script uses the strong model (Sonnet), the script map and build report use Haiku (AFFIRMOLOGY_BACKOFFICE_MODEL, default claude-haiku-4-5). - Audio QC gate (scripts/audio_qc.py) is NOW WIRED into the CLI --audio path (2026-06-15): it runs on the voice-only track after synthesis, and on a detected dropout it re-renders at a lower speed (--qc-retries, default 2) and refuses to serve a bad file (no mp3/PDF produced). It exposes run_qc() for in-process use. Speed: --speed is honored; auto-tune ceiling lowered to 1.05 so it never warbles. - Corpus scrape + structure pipeline (Haiku backend), with whole-document chunking and a re-mine mode. - Verifier that regex-checks scripts against the chart JSON to catch hallucinated placements.

NOT wired yet (do not claim otherwise): - Corpus-fed generation: WIRED 2026-06-14 (pending a live test render). script_generator.py now calls _corpus_sources(chart), which uses db.search_records() to pull real A/B-tier interpretation snippets for the chart's spine (the four Gene Keys spheres, Sun/Moon/Rising, HD type and authority, Life Path) and injects them into the prompt as SOURCE MATERIAL so the language is grounded in the tradition texts. The v5 reference script was replaced with a content-free STRUCTURAL SKELETON, so no founder placements can leak into anyone's script. Corpus DB path is env AFFIRMOLOGY_CORPUS_DB (default /Volumes/Affirmology/corpus/corpus.db); if the DB is missing or locked the retrieval returns empty and generation proceeds chart-only (robust, will not break a render). STILL TO VERIFY: run a real render and read the script to confirm quality and that the grounding shows through. The fuller PersonalizationAgent design (context bundle, specialist) is in Affirmology_SubconsciousOS_AgenticArchitecture_v1.md Part Four. - Demo web backend (server + Worker) not yet stood up.


3. Corpus state (MOVED 2026-06-18 to the internal path /Users/jeffreyparker/CLAUDE/AFFIRMOLOGY/corpus; was on the external SSD. See section 20 for the move + the corrected structurable status.)

Scorecard (docs / words / structured docs): - western_astrology: 550 / 3.61M / 34 - human_design: 1,487 / 1.57M / 706 - transits: 382 / 1.08M / 369 - vedic_astrology: 527 / 0.88M / 42 - gene_keys: 413 / 0.40M / 186 - numerology: 507 / 0.19M / 7 - Total: ~3,866 docs, ~7.7M words, ~1,344 structured docs. - Live record counts (2026-06-14, SELECT tradition, COUNT(*) FROM record): human_design 7,863; transits 2,525; gene_keys 1,524; western_astrology 544; vedic_astrology 362; numerology 87. Total ~12,905 records, up from ~10,600 on 2026-06-13. Doc/word/structured-doc columns above are the 2026-06-13 snapshot.

Important nuance: the low "structured %" on western, vedic, numerology is NOT a budget wall. Those traditions are big scanned books. Their real content is partly mined; most of their unstructured docs are sub-100-word junk pages that are correctly skipped. The genuine remaining work is (a) finishing the human design YouTube backlog, and (b) re-mining the big books deeper with --redo-min-words plus a higher --max-chunks-per-doc (needs more credit).

Code capabilities added this week (in affirmology-agent/src/affirmology/corpus/): - Haiku/Anthropic structurer backend (default), removes the Gemini/Google billing blocker. --backend anthropic. - Real structure-only mode that structures existing extracted docs. - Whole-document chunking (--chunk-chars, --max-chunks-per-doc) so big books are read past the front matter. - Re-mine mode (--redo-min-words) that clears a long doc's shallow records and re-chunks it deeper, no duplicates. - Stale-path remap (_resolve_extracted_path) so paths from old sandbox sessions resolve to the SSD. - transits added to the default tradition set; transit element types added to the structurer prompt. - New gene keys sources added; human design YouTube channels switched to uncapped. - scripts/overnight_corpus.sh: chained, unattended, cost-capped corpus run with a morning report.

NEW TRADITION (2026-06-19): techniques folded into the corpus. The Techniques Library (Affirmology_TechniquesLibrary_v1.md) is now structured into 18 tier-A records (inductions, identity/language, somatic, state/timing, sound layers, closing, plus the 3 proposed/benchmark techniques) under tradition techniques, so the engine and the oracles (Chiron especially) retrieve methods the same way they retrieve chart interpretations. Ingest is the re-runnable module affirmology-agent/src/affirmology/corpus/techniques.py (python -m affirmology.corpus.techniques), idempotent (wipes prior techniques records first), so re-run it when Jeff's heart-coherence technique is added. techniques added to _TRADITIONS in affirmology-studio/api/hermes_tools.py (the list search_corpus iterates and exposes in its tool enum) and the tool description now points the council at the methods layer. Verified live: /api/corpus-stats reports techniques: 18 after a server restart. NOT scraped, so it is intentionally left out of the scraper's run.py TRADITIONS list.

CRAFT KNOWLEDGE ENGINE - PHASE 1 DONE (2026-06-19, per Affirmology_CraftKnowledgeEngine_Plan_v1.md). The second knowledge pillar (craft = HOW we say it and make it land, vs the chart = WHAT we say). New distilled store: table craft on corpus.db, owned by affirmology-agent/src/affirmology/corpus/craft.py (CraftStore, search_craft with tokenized relevance ranking, search_craft_text helper). Each entry is actionable: area / method / why / when_to_use / how_to_apply / one_liner / tags, across five areas (neuroscience, frequency_sound, audio_production, meditation_hypnosis, reading_craft). SEEDED by a one-time Haiku distillation (affirmology-agent/src/affirmology/corpus/craft_seed.py, reusable by the Phase 3 nightly grower) from 6 docs: TechniquesLibrary, Neuroscience_AudioEfficacy, PredictiveBrain_IdentityChange, AudioMastering_Production, DepthPsychology_JungianIntegration, and the ReadingCraft standard. Result: 94 entries (audio_production 24, reading_craft 38, meditation_hypnosis 16, neuroscience 9, frequency_sound 7), cost $0.19 of a $1.50 cap. Brand-checked (no em dashes, no named teacher, no medical claims). Idempotent: re-run python -m affirmology.corpus.craft_seed to re-seed (clears each doc's prior seed rows first). STILL TO DO - Phase 2: wire it in (replace the static TECHNIQUES_LIBRARY menu in build_report.py with craft retrieval; give Chiron/Orpheus a search_craft tool; add a craft check to Apollo's efficacy gate; add search_craft to Hermes in affirmology-studio/api/hermes_tools.py). Phase 3: extend the nightly growth cron to grow the craft tradition (crawl wide, distill, fold in feedback). Phase 4 (later): frequency/sound overlays in audio_mix.py (Studio-only, demo untouched).

CRAFT KNOWLEDGE ENGINE - PHASE 2 DONE (2026-06-19): the craft base is now wired into the agents (Studio --council path only; the LOCKED DEMO never passes --council and is untouched, and generate_script is unchanged). Ownership per the corrected plan: HYPNOS is the PRIMARY owner of technique selection/sequencing. Changes: (1) affirmology-agent/src/affirmology/agents/council.py - new select_craft() (technique set + a healing slice for CHIRON), writing_craft() (reading_craft slice for Orpheus), hypnos_plan() (Hypnos selects/sequences an ordered technique plan from the live craft base), and HYPNOS_SYSTEM prompt; compose() runs Hypnos once, injects the plan + writing-craft into Orpheus's draft context, and feeds the craft plan + base into apollo_review() (new craft_plan/craft_base args) so Apollo's technique/hypnos gates check the script against the craft base; the Hypnos plan is written into council_transcript.md. (2) affirmology-agent/src/affirmology/agents/build_report.py - the static TECHNIQUES_LIBRARY menu is REPLACED by live search_craft retrieval (_craft_menu_text); the static list is kept only as a fallback. (3) affirmology-studio/api/hermes_tools.py - new search_craft(query, area) tool (function + schema + dispatch) so chat readings ground in craft. (4) affirmology-studio/api/main.py - Hermes system prompt documents the search_craft tool. ALL craft retrieval degrades to empty on any failure, so a render never breaks. Verified: imports clean, craft menu/plan/tool all return real entries, demo path untouched, graceful fallback confirmed. REQUIRES a git push of affirmology-studio (for the Hermes search_craft tool to reach studio.affirmology.ai) AND a restart of the local funnel server (so the live agents + the --council render path pick up the engine changes). Phase 3 next: extend the nightly growth cron to grow the craft tradition.

DEPLOYED TO CLOUD 2026-06-20 (commits ca3a055 + eb6c075, live on studio.affirmology.ai): the Phase 2 craft wiring + two Hermes hardening fixes shipped together. (a) Hermes FIX A (front-end polling in web/app.js: hermesSend polls /api/hermes/history for up to 3 min instead of flashing an error on a slow/throwing POST; cache-bust v18->v19). (b) Hermes FIX B (api/main.py: both forced-final-synthesis calls now keep tools=HERMES_TOOLS, fixing the multi-oracle BadRequestError; reading quality + oracle model untouched). Both per CLAUDE OUTPUTS/Affirmology/Affirmology_HermesLoop_Bug_v1.md. VENDORED-ENGINE SYNC: the cloud Dockerfile bundles affirmology-studio/affirmology-agent/ (AFFIRMOLOGY_AGENT_ROOT=/app/affirmology-agent), which was missing corpus/craft.py and had stale council.py/build_report.py; all three were synced into the vendored copy so cloud --council renders match local. CRAFT DATA SYNCED TO R2 + LIVE ON CLOUD 2026-06-20 (commit 5be790e). MERGED, not overwritten: pulled R2 corpus/corpus.db (the studio boot key), confirmed the nightly cron had NOT run (R2 had no meaning/distinctions/craft tables; record=25552 = the 6 original traditions), backed the original up to corpus/backups/corpus.db.pre-craft-20260620, copied the craft table (schema + all 94 rows) into the R2 copy via ATTACH (integrity_check ok; record/source/document unchanged at 25552/102/3880), and pushed it back to the same key (18,796,544 bytes). corpus_boot re-pulls on size mismatch, so the redeploy reloaded it. VERIFIED LIVE: cloud /api/corpus-stats returns craft=94 (audio_production 24, reading_craft 38, meditation_hypnosis 16, neuroscience 9, frequency_sound 7), records still 25552, size 18796544. /api/corpus-stats was extended to report craft/meaning/distinctions counts (public). NOTE: the authenticated cloud Hermes search_craft call could not be run from here (cloud STUDIO_AUTH_TOKEN is Render-only + Cloudflare Access); verified equivalently via search_craft against the exact merged DB (real entries, not fallback). TECHNIQUES TRADITION ALSO SYNCED TO R2 + LIVE 2026-06-20 (empty redeploy bc507c1): same merge method, copied the techniques source+document+18 record rows into the R2 corpus (backup corpus/backups/corpus.db.pre-techniques-20260620; no id collisions; integrity_check ok, foreign_key_check clean; craft stayed 94 and all 6 base traditions unchanged), pushed back (18,808,832 bytes), cloud re-pulled. Cloud /api/corpus-stats now: records 25570, by_tradition includes techniques=18, craft=94. Cloud corpus now matches local. Local funnel server still needs a manual restart to pick up the Phase 2 engine changes for local renders.

C16 + C17 BUILT + DEPLOYED 2026-06-20 (commit 96d8dd6, live on studio.affirmology.ai; app.js v20). Per Affirmology_CrossChatMessaging_C16_BuildBrief_v1.md and Affirmology_SendToStudio_C17_BuildBrief_v1.md. Shared shape (bearer endpoint + permission-gated Hermes tool + chat button); api/ + web/ only (no engine change, demo untouched). C16 cross-chat messaging: deliveries table in jobs.py (add_delivery/list_inbox/mark_delivery_read, read scoped to recipient); POST /api/hermes/push, GET /api/hermes/inbox, POST /api/hermes/inbox/read; send_to_person Hermes tool; founder-circle tiers (jeff/sol/colin) enforced SERVER-SIDE in hermes_tools.check_send_permission (josh rejected); web "Send to..." control + inbox surface. C17 send-to-Studio: draft job state + source/music_bed/production_notes/draft_script columns (migrated) + create_draft() + JobManager.render_draft() (promotes a draft through the normal chart-driven script path on the same entry); POST /api/studio/draft (status draft, source hermes), POST /api/studio/draft/{id}/render; send_to_studio tool; web "Send to Studio" control + Studio-home drafts tagged "from Hermes" with a Render button. Both tools are USER-INITIATED ONLY (descriptions forbid autonomous sends) and ADDITIVE ONLY. Chart-driven preserved: the Studio stays canonical; the draft script is editable/regenerable. All 8 acceptance checks pass at API/tool level (incl. permission rejections); verified live by route gating (401 = registered). LATER (per briefs): audio payloads (C15), notifications, read receipts, advisor<->client; render-as-is vs regenerate nicety; Hermes-triggered render. FOLLOW-UP FIX 2026-06-20 (commit 849d9e1, live): the action layer shipped in 96d8dd6 but the Hermes system prompt never listed send_to_person/send_to_studio, so Hermes self-reported it "cannot" push to a person or create a Studio draft and would not use them. Added both tools to _hermes_system with the user-initiated-only framing ("you DO have this ability; only act when the user explicitly asks"). Added BUILD_TAG to /api/health so prompt-only deploys are verifiable. If Hermes is tested on the LOCAL funnel server, restart it to pick up all of this (and the still-pending Phase 2 engine changes).

C18 HERMES-RENDERED SACRED AUDIO BUILT + DEPLOYED 2026-06-20 (commit 4a0e0ea, live; build tag 2026-06-20-c18-hermes-rendered-sacred-audio; app.js v21). Per Affirmology_HermesRenderedSacredAudio_C18_BuildBrief_v1.md. Completes the action layer: Hermes renders a full Sacred Audio (voice + PDF) from chat through the EXISTING proven render/QC/PDF pipeline, delivers the finished player + PDF into the chat, then offers to share it to a searchable library. api/ + web/ only (no engine change, demo + render settings untouched); user-initiated + additive + tier-checked server-side. STORE (jobs.py): deliveries.pdf_ref + jobs.visibility(default private)/created_by (migrated); set_visibility() + list_shared(q over title/person/structure, done+shared only); JobManager.render_sacred_audio()+_run_full_render (reuses _run_script then _run_audio, then drops a kind "audio" delivery from "hermes" to the requester carrying mp3_url+pdf_url; non-blocking single worker). TOOLS (hermes_tools.py): render_sacred_audio (creates the entry via C17 create_studio_draft internals, starts the render, returns immediately with entry_id + a "rendering" message), check_my_render (status -> media urls when done), share_studio_entry (owner-only: jeff any, sol/colin own via created_by), search_studio_library; check_share_permission; run_tool now also receives the manager. ENDPOINTS (main.py): POST /api/studio/entry/{id}/share, GET /api/studio/library?shared=1&q=; inbox surfaces pdf_ref; all four C18 tools added to the Hermes SYSTEM PROMPT with the honest "everyone with Studio access = the Cloudflare Access allowlist" wording. WEB: Hermes inbox renders kind "audio" deliveries as an inline audio player + PDF link; Studio home has a Shared Library list + text search (loadSharedLibrary, GET /api/studio/library). All C18 acceptance checks pass at the wiring level (render kickoff, completion delivery with media, check tool, share + search, cross-owner permission block); the full ElevenLabs render was NOT run in the test to avoid spend (it uses the unchanged proven pipeline). LATER (per brief): customer-facing name (Cast/Invoke/Conjure/Summon) TBD; render-as-is vs regenerate.

C18 PART 1 (URGENT FIX) + PART 2 BUILT + DEPLOYED 2026-06-20 (commit 788c358, live; build tag 2026-06-20-c18-part2-cast-deliver-to; app.js v22). PART 1: Hermes 400'd on follow-up turns ("check on it") because hermes() built the model messages from the last 24 stored turns, a window that could start with an assistant turn or contain consecutive same-role turns (a reply + a render-completion delivery), both of which Anthropic rejects. Fix: _normalize_history() in api/main.py drops empty turns, drops leading assistant turns, and merges consecutive same-role turns so roles strictly alternate (falls back to the current user message if the window collapses); the except block now logs full str(exc)+traceback. Unit tests in affirmology-studio/tests/test_hermes_history.py (5/5). PART 2: (1) permissions relaxed to Studio-openness WITHIN the circle: any of jeff/sol/colin may render from any member's chart, deliver to any member, and share/unshare any circle record (check_draft_permission now requires sender+subject in circle; check_share_permission requires sender in circle). Hard stops only: reject anyone outside the circle (actor/subject/recipient); NO delete path exists (verified); demo locked. (2) render_sacred_audio gained deliver_to with REGENERATE-PER-RECIPIENT: a Cast to X is regenerated from X's OWN chart (person=X) and delivered to X, never a forward; EXCEPTION: relationship/teamwork structures (new Structure.is_relationship flag + is_relationship_structure() keyword detector in structures.py) are ONE shared audio delivered to both, no regen. JobManager.render_sacred_audio/_run_full_render now deliver to a list of recipients; created_by records the actual caster. (3) UI Hermes-render button labeled "Cast" (tool stays render_sacred_audio). (4) start_public.sh intentional edit committed (media defaults to ./data/media, no SSD needed; token print masked to last 4 chars, no secret committed). api/ + web/ only (no engine change, demo untouched), server-side enforcement. All PART 1 + PART 2 acceptance checks pass at the wiring level (full ElevenLabs render not run in tests, to avoid spend).

C19 STORED NATAL CHART BASIS + TIMING SNAPSHOT BUILT + DEPLOYED 2026-06-20 (commit 8452cda, live; build tag 2026-06-20-c19-stored-natal-basis). Per Affirmology_StoredNatalChartBasis_C19_BuildBrief_v1.md (two-tier). TIER 1 (immutable natal basis, compute once + reuse): the FULL natal Chart is cached and reused for all audio gen, Hermes, and readings. Vedic is now part of the basis: added a vedic dict field to the Chart model (api models.py), populated once in compute_chart (derived from tropical longitudes), so the complete blueprint (western incl. aspects/extended points/asteroids, HD, Gene Keys both sequences + Pearl, numerology, AND Vedic) serializes + round-trips faithfully. New affirmology/chart/cache.py: CHART_ENGINE_VERSION="2026-06-20.1" (bumping busts all caches so engine upgrades recompute once), chart_cache_key=sha1(normalized birth + version), compute_chart_cached/get_or_compute. Lookup order: committed fixtures -> SQLite chart_cache (env AFFIRMOLOGY_CHART_CACHE_DB, set to studio.db) -> compute+store. Committed natal fixtures for Jeff/Sol/Colin/Josh in src/affirmology/verification/known_charts_computed/, regenerable by scripts/precompute_known_charts.py on a version bump (instant on laptop + cloud, zero first-compute). TIER 2 (timing snapshot, date-dependent, layered on the basis): progressed_summary (progressed Sun, progressed Moon + lunation phase, upcoming sign changes) + timing_snapshot in chart/timing.py; timing_snapshot_cached per (person, date) with a TTL in cache.py. render_timing_facts STAYS LIVE (date-stamped) so timing always reflects now. WIRING: compute_chart_cached routed through get_person_chart/compute_chart_from_birth (hermes_tools._compute), people.chart_summary, overview, and the render path (cli.py) + orchestrator; studio config exports AFFIRMOLOGY_CHART_CACHE_DB=studio.db so the engine CLI subprocess shares the cache. Guardrails: identical output (caching is pure performance; natal facts byte-identical cached vs fresh, proven), demo render settings unchanged, no em dashes, engine changes VENDORED into affirmology-studio/affirmology-agent/ (verified the cloud copy loads fixtures with 0 compute). Tests: C19 acceptance 8/8 (tests/test_chart_cache.py), engine pytest 46/46. NOTE: acceptance #5 proves the natal BASIS/facts are byte-identical cached vs fresh (the audio's inputs are unchanged); a literally byte-identical audio FILE also depends on the non-deterministic LLM script step + TTS. ON VERSION BUMP: re-run scripts/precompute_known_charts.py and re-vendor the fixtures.

HERMES LONG-THREAD 400 FULLY FIXED 2026-06-20 (commit fbf49e9, live; build tag 2026-06-20-hermes-history-endonuser-fix). The C18 PART 1 normalize fix did NOT fully resolve it; reproduced the real error with a live API call: "This model does not support assistant message prefill. The conversation must end with a user message." Root cause: list_hermes_history used ORDER BY created_at ASC LIMIT 24 = the OLDEST 24 turns, so on a long thread it dropped the just-added current message and the window ended on an old assistant turn (400). Locally it never showed because jeff had only 18 turns. Fixes: (1) list_hermes_history now returns the most recent N turns in chronological order (subquery DESC LIMIT N re-sorted ASC) so the current message is always last; (2) _normalize_history also drops TRAILING assistant turns so the window always ends on a user turn. Verified by replaying real stored history (+a simulated >24-turn thread) through a live Anthropic call: succeeds (stop=end_turn) instead of 400. Unit tests 6/6. api/ only (jobs.py + main.py), no engine change, no vendor.

DAILY-DIGEST EMAIL ENDPOINT ADDED + DEPLOYED 2026-06-20 (commit 94f16be, live; build tag 2026-06-20-send-digest-resend). POST /api/send-digest (bearer-auth, studio token; for a scheduled task) sends a report email via the Resend REST API (POST https://api.resend.com/emails, Authorization: Bearer RESEND_API_KEY) from FROM_EMAIL (default reports@affirmology.ai on the verified affirmology.ai domain). Body {subject, html, text?, to:[emails]} -> {ok, id} or a clear error (503 if RESEND_API_KEY unset, 400 bad input, 502 surfacing the Resend message). stdlib urllib, no new dependency. ACTION REQUIRED (Jeff): add RESEND_API_KEY and FROM_EMAIL=reports@affirmology.ai to the Render affirmology-studio-api service env, then redeploy. Wiring verified locally (route registered, correct 503/400/502 paths); the actual test send to jeff@jeffparker.love is PENDING the Resend key (Cowork has no key + no cloud studio token, so it cannot send from here). Verified live: /api/send-digest returns 401 (registered + gated).

HERMES AVAILABILITY HOTFIX (SELF-HEAL + CLEAR) BUILT + DEPLOYED 2026-06-20 (commit 90dc89c; build tag 2026-06-20-hermes-selfheal-and-clear; app.js v24). Symptom: Hermes chat returned BadRequestError on EVERY message (even "hi"/"ye") for jeff on the CLOUD. DIAGNOSIS (evidence, not guess): the structural normalization (_normalize_history + most-recent-N list_hermes_history, commit fbf49e9) is already on origin/main and, replayed against the LIVE Anthropic API on jeff's real 20-turn history + a fresh "hi" + a 1.5M-char oversized turn, did NOT 400. A bare "hi" with the full system + all 12 tools also succeeded. So the live failure is the CLOUD running a build OLDER than fbf49e9 (its Render deploy never landed; the cloud build tag is unreadable from here because Cloudflare Access 302s /api/health). FIX (api/ + web/ only, no engine change, demo untouched): (1) SELF-HEAL in the hermes() loop: the first time Anthropic rejects the window, collapse to just the current user message (with any C22 doc context) and retry once, so a bad window can never again take the whole chat down; full exception logged. (2) CLEAR: jobs.clear_hermes_history + POST /api/hermes/clear + a "Clear chat" button in the Hermes header, the instant unblock if a thread wedges (user-initiated, scoped to the person). (3) BUILD_TAG bumped so the redeploy is verifiable at /api/health. Tests: tests/test_hermes_selfheal.py (self-heal on a forced 400 + clear wipes history), isolated against a tmp studio.db; 8/8 with the existing hermes-history tests. NOTE: could not clear jeff's CLOUD hermes_history from here (no cloud token + Access gate); the redeploy itself restores Hermes via self-heal, and the Clear button resets any thread.

C22 ATTACH/PASTE FILES INTO HERMES CHAT BUILT + DEPLOYED 2026-06-20 (commit 7f7809c; app.js v25). User hands Hermes a .txt/.md/.pdf as READ-ONLY context for one question; never stored, never shared. Frontend (web/): paperclip attach button + hidden file input + paste-a-file on the textarea (intercepts only real files; text paste falls through); text read client-side, PDFs sent as base64; removable chips above the bar that ride the next message then clear; attachment-only send gets a default "read these" ask. Backend (api/main.py): HermesRequest.attachments [{filename, text?, pdf_base64?}]; PDFs extracted server-side with pypdf (already a dep, never raises, scanned/broken PDF degrades to a visible note); per-doc cap ~20k chars + total ~48k with truncation notes; labeled context ("Attached document :\n") prepended to the current user turn in the MODEL WINDOW ONLY, only the clean message persisted. Tests: tests/test_hermes_attachments.py (labeling, caps, PDF error path, and the proof that the doc reaches the model but is not stored); real PDF round-trip verified via a weasyprint-generated PDF; 9/9. C19 (stored natal basis) was already built+deployed earlier today (commit 8452cda); confirmed its acceptance tests still pass.

HERMES SYNTHESIS-CREATE HARDENING BUILT + DEPLOYED 2026-06-20 (commit 0c2e2ed; build tag 2026-06-20-hermes-synthesis-selfheal). Symptom: Hermes surfaced BadRequestError again on a CAST (render_sacred_audio with deliver_to). ROOT CAUSE (evidence): all 12 HERMES_TOOLS schemas validate clean against Anthropic's rules (malformed-schema ruled out); the in-loop create() already self-heals (90dc89c), but the TWO forced-synthesis create() calls (the round-cap branch and the short/stub branch) were NOT wrapped, so a 400 on the accumulated tool-block window after a multi-round Cast propagated to the outer except and surfaced raw to the user. FIX (api/main.py only, no engine change, demo untouched): new _synth_create() wraps both synthesis calls (try full window with tools; on any error retry once on a flattened tools-free text window via new _flatten_messages_to_text(), which folds tool_result data into plain text and drops tool_use/tool_result blocks; returns None if even that fails, so the caller keeps the best text gathered so far). Regression test tests/test_hermes_cast_synthesis.py reproduces the exact Cast-with-deliver_to flow where synthesis 400s and asserts Hermes still returns a real reply (no raw BadRequestError); 24/24 studio tests green. Confirmed /api/health serves the new build tag (TestClient 200). NOTE: the currently-running LOCAL funnel server (port 8765) still reports the OLD build 2026-06-20-send-digest-resend, so it must be restarted (./start_public.sh) to pick up ALL of today's Hermes work (self-heal+clear 90dc89c, C22 7f7809c, synthesis hardening 0c2e2ed); the cloud picks them up on Render redeploy. The three live Hermes BadRequestError reports today were all consistent with the deployed server running code OLDER than the relevant fix.

CLOUD RENDER PATH FIX (AGENT_PYTHON RESOLUTION + AUDIO PREFLIGHT) BUILT + DEPLOYED 2026-06-20 (commit cac707a; build tag 2026-06-20-cloud-render-agentpython-preflight). Symptom: a Cast on studio.affirmology.ai returned the script but no audio link/file; cloud /api/health showed agent_python_exists:false (agent_python "python"). DIAGNOSIS: both render phases shell out to subprocess.Popen([config.AGENT_PYTHON,"-m","affirmology.cli",...]) (api/pipeline.py run_script/run_audio). The cloud Dockerfile sets AGENT_PYTHON=python and pip-installs the agent into the image's main interpreter; config returned the bare "python" verbatim, so Path("python").exists() read False (a misleading health flag) and on any host where "python" is not on PATH the render subprocess would fail. The SCRIPT step needs only the Anthropic API; the AUDIO step also needs ELEVENLABS_API_KEY + the music bed, so the real audio-only blocker (most likely ELEVENLABS_API_KEY unset on Render, or the R2 music bed not present) showed up as "script yes, audio no" with no surfaced reason. FIX (api/ only, engine + demo untouched): (1) config._agent_python() now resolves to a REAL runnable interpreter (absolute existing override honored; bare override resolved on PATH via shutil.which; unresolvable override ignored -> local venv, else sys.executable, the dep-complete single-image interpreter), so agent_python_exists is true and the subprocess always runs. (2) pipeline.run_audio() preflight fails LOUD + CLEAR when ELEVENLABS_API_KEY is unset or the music bed is missing, surfaced to the chat via the existing _run_full_render failure delivery instead of dying silently. Tests: tests/test_cloud_render_path.py (override resolution incl. cloud bare-python, fallback, absolute-honored, health true, both audio preflights); 30/30 studio tests green; verified the resolved interpreter runs affirmology.cli --audio/--council; real local end-to-end Cast render verified (audio+PDF produced + delivered). ACTION REQUIRED (Jeff): on the Render affirmology-studio-api service, confirm ELEVENLABS_API_KEY is set and check cloud /api/health now shows agent_python_exists:true, elevenlabs_key_set:true, music_bed_exists:true; those three being true is the cloud-render green light. NOTE: a JobManager re-init (server restart, OR any concurrent import of api.main such as a pytest run against the live data/studio.db) reaps in-flight jobs as "Interrupted by a restart" via _reap_stale(); do not run the studio test suite against the live db while a real render is in flight.

PERSONAL KNOWLEDGE BASE (GOLDEN-TIER CORE) BUILT + DEPLOYED 2026-06-20 (commit d028d81; build tag 2026-06-20-personal-knowledge-base). Per Affirmology_PersonalKnowledgeBase_GoldenTier_Concept_v1.md. The durable per-person standing-context store, the foundation of the golden tier and the real fix for context loss. (1) STORE: knowledge_base table in studio.db (id, person_id, title, content, kind [standing_context|reading|goal|note|suite], pinned, created_at, updated_at) with kb_add/get/list/list_all/update/delete/upsert in jobs.py; mirrored to R2 as ONE JSON object (api/kb_r2.py, STUDIO_KB_R2_KEY=knowledge_base/kb.json) on every write + restored on boot, so it survives a server REBUILD (not just a restart). No-op locally / if R2 unconfigured; never raises. (2) ALWAYS-INJECT: every Hermes turn appends the person's PINNED entries to the system prompt (main.py kb_standing_context), separate from + additional to chat history, so a chat clear or restart NEVER loses standing context; clear_hermes_history explicitly never touches the KB. (3) ADD/EDIT: Hermes tool save_to_knowledge_base {title, content, kind, pinned} (fires on "remember this / keep as standing context") + GET/POST/PATCH/DELETE /api/kb for the UI panel; circle-gated, each member manages their OWN entries (person_id scopes every write), outsiders (josh) rejected. (4) FEED AUDIO: create_studio_draft folds the person's pinned entries into the render brief (hermes_tools.pinned_kb_brief), so a Cast is bespoke to the accumulated context (ties to C24). (5) SEED: the standing WEALTH CONTEXT (from CLAUDE OUTPUTS/Affirmology/Affirmology_WealthCodes_JeffAndSol_v1.md) is the first pinned standing_context entry for Jeff and Sol, committed as text in api/seed_data/wealth{jeff,sol}.md and seeded on boot (idempotent, api/kb_seed.py, re-runnable python -m api.kb_seed), so both local + cloud seed identically. LIVE LOCAL DB SEEDED + VERIFIED (jeff 5.8k chars, sol 6.8k chars, both pinned; always-inject confirmed). Tests: tests/test_knowledge_base.py (persistence across a simulated restart, survival of a chat clear + always-inject, pinned-only injection, ownership scoping, idempotent seed, tool + permission, Cast brief, R2 no-op, endpoints); 39/39 studio tests green. api/ + render.yaml only, engine + demo untouched. NEXT (per concept doc): UI panel to view/edit the KB; grow toward the full Living Profile (C20); design the golden-tier credit model. ACTION (Jeff): restart the local funnel server to pick up the KB (and all prior Hermes/render fixes); the cloud auto-redeploys on push and boot-seeds itself.

C24 CAST VOICES THE RIGHT SCRIPT BUILT + DEPLOYED 2026-06-20 (commit 327465c; build tag 2026-06-20-c24-cast-right-script). Benchmark: Affirmology_BeliefBreakthrough_SacredAudio_Jeff_v1.md. Problem: render_sacred_audio defaulted source_script to "from_chart", so a script Hermes composed in chat was ignored and the audio recited the bare natal blueprint. Fix (api/ only; the verbatim render-as-is plumbing landed earlier in 425dbda): (1) THE SCRIPT RULE, enforced in the tool description AND the Hermes system prompt: if Hermes wrote a script it MUST pass it as source_script (voiced VERBATIM); never Cast with an empty source_script when a script exists. (2) render_sacred_audio gains brief: when generating from the chart (no source_script), the conversation's theme/intent is woven into the render brief via _from_chart_brief() (a craft directive: themed, first-person, present-tense, SPEND the chart, do not recite placements) combined with the person's pinned knowledge base (pinned_kb_brief) and the live timing already in the council path; relationship branch carries the theme too. New schema fields document source_script + brief. Tests tests/test_c24_cast_brief.py (verbatim source_script rides through as the draft; a from-chart Cast for "wealth, belief, and breakthrough" puts theme + craft directive + standing context into the concept). LIVE VERIFY: a real from-chart council render for that theme produced a 5164-char themed first-person script that names the theme and reuses Jeff's standing anchor line ("Wealth flows to the order I keep") from his seeded Wealth Context, not a placement recitation; verbatim word-for-word was proven by the Morning Activation renders. 45/45 studio tests green. NOTE: C24 makes the from-chart path themed via the brief, but the actual first-person craft still depends on the council honoring the directive; the benchmark doc is the quality bar.

RENDER OUTPUT NAMING + THEME/TYPE/AUTO-VERSION BUILT + DEPLOYED 2026-06-20 (commit 5302423; build tag 2026-06-20-render-naming-theme-type). New convention {FirstLast}{Theme}{Type}_v{N}.mp3 + {..}_v{N}_Report.pdf, applied in the STUDIO PIPELINE ONLY via the storage key after the integrity guard (engine + locked demo untouched; "Demo" kept only for the demo path). pipeline.render_basename(): FirstLast = first two name tokens (Jeff_Parker, Sol_Ballard); Theme = short CamelCase slug (default SacredAudio); Type = modality (default Custom, structure fallback via structures.structure_modality, before_bed->Bed); v{N} AUTO-INCREMENTS past any existing file with the same base. jobs: audio_theme/audio_type columns (migrated) + create_draft stores them + _run_audio keys the published mp3/pdf with the new base. hermes_tools.render_sacred_audio + create_studio_draft gain theme/type; the tool description + Hermes system prompt REQUIRE inferring + passing theme + type on every audio (version never asked). main: StudioDraftRequest gains theme/type. VERIFIED with two real renders: Jeff_Parker_WealthCodes_Morning_v1.mp3 + _v1_Report.pdf, then auto-named v2. Tests tests/test_render_naming.py.

BREAKTHROUGH CRAFT AREA ADDED + SEEDED + SYNCED 2026-06-20 (commits d86378a + c122af5; build tag 2026-06-20-breakthrough-craft-area). Sixth craft area "breakthrough" (surfacing + rewriting limiting beliefs via reconsolidation, reframing, identity, rehearsal). Added to CRAFT_AREAS in BOTH craft.py copies (local engine + vendored) and to hermes_tools _CRAFT_AREAS (test test_craft_areas.py asserts the tool enum stays in sync with the engine areas); Affirmology_BreakthroughCraft_SeedSource_v1.md added to craft_seed SEED_DOCS (local engine; the vendored copy has no craft_seed.py, seeding is local-only). Seeder run (cheapest model, $0.21 of $1.50 cap): breakthrough=24 entries, craft total 94->108, brand-clean. R2 SYNC via merge-and-push: pulled R2 corpus/corpus.db, backed up to corpus/backups/corpus.db.pre-breakthrough-20260620, replaced ONLY the craft table with the local 108-row craft (integrity_check ok; meaning=20/distinctions=1 and record=25570 preserved), pushed back. FINAL craft by_area: audio_production 22, breakthrough 24, frequency_sound 6, meditation_hypnosis 15, neuroscience 10, reading_craft 31 (total 108). NOTE: re-running craft_seed re-distills ALL docs (non-deterministic) so existing areas shifted slightly. ALSO: craft_seed only authenticates if ANTHROPIC_API_KEY is in the env, so run it as: cd affirmology-agent && source .venv/bin/activate && set -a && source .env && set +a && python -m affirmology.corpus.craft_seed. ACTION (Jeff): restart the local funnel server (it has been on STALE build 2026-06-20-hermes-synthesis-selfheal for several tasks) to pick up the naming change, C24, KB, render fix, AND the breakthrough corpus.

PRACTITIONERS & TECHNIQUES RESEARCH LANE ADDED TO NIGHTLY GROWTH 2026-06-20 (commit a21fbcf). Per Affirmology_PractitionersTechniques_ResearchCorpus_Plan_v1.md. New seventh craft area "practitioners" (the assess-later wisdom layer: teachers + techniques of transformation/manifestation). New module corpus/practitioners.py (sibling + vendored): a research_backlog table seeded from the canon (29 items: Wilber, Gurdjieff, Jung, Neville, Murphy, Coue, Erickson, NLP, Maltz, the living-from-the-end / wave-function family, etc.) and growable via add_to_backlog (e.g. Jeff's ChatGPT lists). research_lane() takes the next bounded batch, distills each via the cheapest model (injected for tests) into a KEPT craft entry: core method, mechanism (labeled evidenced/traditional/metaphor), the actionable practice, how it serves an audio, tags, usefulness/confidence score; copyright tier-wall (original method only, never verbatim; public-domain fuller; quantum/wave flagged as metaphor); no medical claims; no em dashes; NEVER auto-adopted (council reads it, a human/Apollo's gate graduates it). Wired in api/growth_cron.py AFTER the meaning stages with its own caps (GROWTH_PRACTITIONERS_MAX_COST_USD default 1.0, GROWTH_PRACTITIONERS_BATCH default 6) so it never starves the meaning builder; appends a morning-report section (teachers researched, entry counts, top new finds). CRAFT_AREAS (both) + hermes_tools _CRAFT_AREAS gain "practitioners" (kept in sync, tested). NOTE: "research" is LLM-distillation from the model's knowledge, like the existing growth stages (no live web fetch wired in the cron); a search backend can be added later. Runs on the next nightly cron (not run live here); tests/test_practitioners.py covers area+sync, backlog seed/grow, a distilled batch + advance + report, and the entry fields. 53/53 studio tests green. BACKLOG GROWN (commits e922b6e + 8ce25f8 + 612797c): canon 29 -> 57 -> 92 -> 110 (Jeff's ChatGPT archive: depth/somatic/manifestation, eastern wisdom/yogic, western esoteric/mystical, meaning/flow/growth psychology, trauma/mindfulness/breathwork, sound/frequency/journey, mind-body, indigenous/shamanic, stoic/taoist, performance, AND an 18-entry HYPNOTHERAPY block: Braid, McGill, Boyne, Yapko, Gilligan, Rossi, Kappas, Banyan, Marisa Peer/RTT + inductions/deepening/Milton Model/suggestion/regression/parts/post-hypnotic/self-hypnosis/suggestibility). SORTING FLAGS: each researched entry now also carries scope (now|future|archive) + form (audio|journaling|mindset|journey|breath|sound), validated and folded into tags as "scope:..., form:...,"; the report shows scope + form counts. RESEARCH PRIORITY: _pending orders the backlog by CATEGORY_PRIORITY (hypnotherapy then neuroscience_suggestion, the disciplines closest to our audios) before broader traditions. WIRED INTO HYPNOS: council.select_craft adds a dedicated PRACTITIONER METHODS slice (area="practitioners") and HYPNOS_SYSTEM lists practitioner methods + belief breakthrough as craft to draw on for induction/deepening/suggestion/post-hypnotic (both council.py copies synced; empty+skipped until the lane populates the area). Live backlog seeded to 110 pending (queue head is hypnotherapy). 55/55 studio tests green.

API spend: started ~$29 of credit, ~$19 spent, roughly $9-10 left (confirm in Console at https://console.anthropic.com/settings/billing). Haiku 4.5 rates: $1/M in, $5/M out. Max plan does NOT cover API; credits are separate.


4. Demo audio baseline (locked)

Canonical spec: Affirmology_DemoAudio_Baseline_v1.md (with the underscore). Do not use Affirmology_DemoAudioBaseline_v1.md, that one is a superseded stub.

Essentials: the Jeff Parker render is the reference (files in affirmology-agent/out/jeff_parker_demo_2026-05-21/). Voice ElevenLabs Charlotte, model eleven_turbo_v2_5, settings stability 0.65 / similarity 0.85 / style 0.0 / speaker boost on. Music bed Heavenly Circuit, voice-anchored mix, target -16 LUFS, -1 dBTP.

SPEED LOCKED TO 1.0 (2026-06-15): the proven-clean gold-standard renders (Jeff v1/v2) were at speed 1.0; v3 was 1.05. The earlier auto-tune climbed to 1.12+ on longer scripts and caused pitch warble (Jeff reported the demo unlistenable). The demo server now passes --speed 1.0 explicitly (locked), and the CLI auto-tune ceiling is capped at 1.05 so even the auto path can never warble. THE DEMO IS LOCKED: do not change its structure or settings without Jeff's explicit say-so. All experiments live in the Studio.

QC NOW WIRED (2026-06-15): the failure mode is ElevenLabs Turbo dropping voice mid-track at high speed (Sol's/Alex's old renders). scripts/audio_qc.py runs on the voice-only track of every CLI --audio render, re-renders slower on a dropout, and refuses to serve a bad file. Note: QC catches dead-air dropouts, not pitch warble; the speed-1.0 lock is what prevents the warble. PDF: WeasyPrint was never installed (why demo PDFs failed); now installed, and on macOS the pipeline injects DYLD_FALLBACK_LIBRARY_PATH=/opt/homebrew/lib so WeasyPrint finds pango/glib. PDF confirmed generating.


5. Demo backend (laptop, this week)

Architecture: demo.affirmology.ai (Cloudflare Pages) -> Cloudflare Worker -> laptop over Tailscale -> FastAPI (affirmology-demo-site/server/api.py) -> affirmology CLI -> audio + PDF -> webhook -> Resend email.

Done: Tailscale installed and connected on the laptop. Machine name macbook-pro-2, Tailscale IP 100.98.80.60. That IP is the Worker's MAC_MINI_URL target.

Front-end (rebuilt 2026-06-13, in CLAUDE OUTPUTS/Affirmology/demo-site-v2/): cinematic landing with a short NDA gate and the intake form (index.html), and the result experience (result.html): a ~2 minute web-native teaser (kinetic text in the brand palette, scored by the Lily trailer VO plus music bed at assets/teaser.mp3), then a ritual cue, the personalized audio player, an educational outro, a partial report reveal, and download buttons for the MP3 and the PDF. Hero line is now "One voice. One chart. One healing." The form posts to /api/render; the result page polls /api/status/{job_id}. No bundled example is loaded. A clean Cloudflare Pages upload folder (index.html, result.html, assets/teaser.mp3 only) is at CLAUDE OUTPUTS/Affirmology/deploy/cloudflare-pages-upload/. The "video while audio loads" slot is web-native animation, not Higgsfield; a separate chat is also building an animation variant for it. Deploying this folder to the existing direct-upload Pages project (demo.affirmology.ai) via New deployment is in progress. Until the Worker and Tailscale are wired, the page holds after the teaser (no audio) by design. Future automation option: connect a GitHub repo to the Pages project for auto-deploy instead of manual upload.

Single upload folder (2026-06-13): UPLOAD-THIS-TO-CLOUDFLARE/ at the AFFIRMOLOGY root is the one place to deploy. It now holds index.html (NDA forced every visit), result.html, assets/teaser.mp3, and the two new self-contained animation pages copied from the marketing chat: primer.html (= Affirmology_Primer_v5, the loading film with the lit-up bodygraph, Gene Keys wheel, audio-wave, Lily VO) and whatsinstore.html (= Affirmology_WhatsInStore_v2, the upsell reel). Uploading this folder makes all of them live (demo.affirmology.ai/primer.html, /whatsinstore.html). FUSED (2026-06-13): the flow is now form -> primer.html#<job_id> (the cosmic film with Lily VO) -> when the film ends it hands the job to result.html#<job_id>&film, which skips its own teaser, waits for the render (holding on "Composing your soul song"), then ritual ("Play my audio") -> audio player -> educational outro -> partial report reveal -> the two download buttons wired to the rendered files from /api/status. The in-page kinetic teaser stays as the fallback for a direct visit to result.html with no job. Standalone /primer.html (no job in hash) still shows its own endcard. Edits: index.html go() points to primer.html; primer toEnd() redirects when a job_id is present in the hash; result.html parses &film and runs film-mode. Also fixed a null name-wait reference that could have broken result.html. NEEDS Jeff's on-laptop live test (submit the form while the server and tailscale funnel 8443 are running). Re-upload the UPLOAD-THIS-TO-CLOUDFLARE folder to pick up the fused index.html, result.html, primer.html. POST-AUDIO FUSED (2026-06-14): when the personal audio ends, result.html now hands off to whatsinstore.html#<job_id> (the use-case reel). The reel's endcard wires its two buttons (Download your audio, Download your report) to the real files from /api/status and renders a partial report blueprint BELOW the buttons (buttons above the writeup, by request). So the re-upload now also carries the updated result.html and whatsinstore.html.

DEPLOY ARCHITECTURE CHANGED (2026-06-15): the site is now a GitHub-connected Cloudflare Worker named affirmology-site (GitHub repo jeffparkerlove22/affirmology-site, local working copy at AFFIRMOLOGY/affirmology-site/), and it AUTO-DEPLOYS on git push. It serves demo.affirmology.ai (the custom domain was moved off the old direct-upload Pages project affirmology-demo, which is now orphaned and can be deleted later). The API worker affirmology-demo-worker still owns demo.affirmology.ai/api/* and was verified still working alongside the new worker. Canonical site files now live in AFFIRMOLOGY/affirmology-site/ (index.html, result.html, primer.html, whatsinstore.html, assets/teaser.mp3); Cloudflare also added its own Workers config commit to the repo. DEPLOY WORKFLOW going forward: edit the affirmology-site files, then in GitHub Desktop Pull (to pick up Cloudflare's config commit), Commit, Push; it auto-deploys in about a minute. There is also a test URL (affirmology-site.jeff-e97.workers.dev) for checking before/without touching the domain. The old UPLOAD-THIS-TO-CLOUDFLARE drag-and-drop path is retired.

VERIFIED END TO END (2026-06-15): a real form submission on demo.affirmology.ai ran the full flow, form to primer film to personalized audio (rendered on the laptop, served over the Tailscale funnel) to the post-audio reel to the report and download buttons. Server terminal confirmed POST /render-sacred-audio 200, GET /status/{id} 200, and GET /files/.../.mp3 200/206. So /api/ on demo.affirmology.ai still routes correctly to the API worker even though the new static worker holds the custom domain (the earlier empty external probes were caching, not a routing break). The corpus-grounded, style-only generator was the version used. Open improvement notes from Jeff (to capture and work later): the audio, the report, the "video" pieces, and the overall process all have refinements he wants.

LIVE (2026-06-13): FastAPI server (affirmology-demo-site/server/api.py) running on the laptop at port 8443, exposed publicly via Tailscale Funnel at https://macbook-pro-2.tail333640.ts.net . Worker deployed with MAC_MINI_URL and MAC_MINI_AUTH_TOKEN; shared secret is affirmology-demo-secret-2026; route demo.affirmology.ai/api/* active. Chain proven externally: /api/health and /api/status/{id} both answer through the Worker from the laptop. Server adds GET /status/{job_id} (returns state + audio_url + pdf_url + blueprint) and serves the rendered files at /files via the Funnel; Worker adds GET /api/status/{job_id} proxy. Resend domain affirmology.ai is verified, but RESEND_API_KEY and FROM_EMAIL are not yet added to the Worker, so email is still off (optional). First real form submission was fired 2026-06-13 for Jeffrey Alan Parker (job 535b38a3): the chain worked, the laptop accepted it and began rendering, but it was still rendering after ~7 minutes (slower than the usual 3-5, likely the concurrent corpus runs competing for CPU/API) when the laptop had to go offline for an investor meeting, so this render did not finish. Not a failure of the wiring; the POST and status polling both worked.

CRITICAL operational fact: the live custom-audio demo only works while THIS laptop is awake, online, and running both the server and tailscale funnel 8443. When the laptop sleeps or leaves internet, the demo's audio generation is offline (Sol cannot test it remotely for this reason). The Cloudflare side (the site, the teaser, primer.html, whatsinstore.html) stays live regardless; only the per-person render needs the laptop.

Restart recipe (Worker + secrets persist, no redeploy; funnel host stays macbook-pro-2.tail333640.ts.net): 1. Server window: cd affirmology-agent && source .venv/bin/activate && cd ../affirmology-demo-site then run uvicorn with AFFIRMOLOGY_AUTH_TOKEN="affirmology-demo-secret-2026", AFFIRMOLOGY_PUBLIC_BASE_URL="https://macbook-pro-2.tail333640.ts.net", PYTHONPATH=".../affirmology-agent/src", uvicorn server.api:app --host 127.0.0.1 --port 8443. 2. Tunnel window: /Applications/Tailscale.app/Contents/MacOS/Tailscale funnel 8443. Full commands in CLAUDE OUTPUTS/Affirmology/deploy/BACKEND-TEST-RUNBOOK.md.

Still to do: complete one real render end to end (re-run a submission once the laptop is back online with the server up); consider whether the background corpus runs should pause during a live demo so renders finish in 3-5 min; add RESEND_API_KEY + FROM_EMAIL to the Worker to turn email on; re-upload already done for the always-on NDA + primer.html + whatsinstore.html.

Hard rules for the demo: - The live demo must ALWAYS generate the custom audio for the exact person and chart entered in the form. Never load a bundled or stock example. The form posts to /api/render and the result page polls /api/status/{job_id}. - Do not use the Alex Carper render as an example anywhere; it has a mid-track audio volume problem (the dropout failure mode). - Cloudflare dashboard navigation (Jeff's account): Pages and Workers live under the sidebar item Compute (Workers), not "Workers & Pages." Inside a website (zone) the sidebar only shows zone tools, so click the Cloudflare logo to return to Account Home first.


6. Brand and writing rules (enforce in all output)


7. People


8. Key documents (what to open for what)

Marketing / video assets (built 2026-06-13)


9. Open threads / next actions (prioritized)

Full demo feedback from the 2026-06-15 run-through is tracked in Affirmology_DemoPunchList_v1.md. Resolved 2026-06-15: HD type (Manifesting Generator fix held), the audio (speed-1.0 lock + QC gate, voice-anchored 6:17 mix covers the voice), and PDF generation (WeasyPrint installed + lib path). Still open: email needs the Resend key added to the worker; the primer film needs gap-filling text (all sphere names, more astrology points) and subconscious-block visuals instead of Human Design on the "bypass" beat; compare on-screen blueprint vs PDF vs original baseline for consistency.

  1. DONE 2026-06-15: demo audio warble FIXED (locked to speed 1.0, auto-tune ceiling 1.05), audio_qc.py WIRED into every render, WeasyPrint installed so the demo PDF generates. Re-rendered Jeff clean (QC PASS, 6:17, PDF OK). The demo is LOCKED.
  2. DONE 2026-06-15: Cloud Studio built and verified end to end (affirmology-studio/, section 11). Local-first, two-phase script-then-audio, named structures, QC-gated audio, mobile-first brand-matched page. Run with affirmology-studio/run_local.sh.
  3. NEXT for the Studio: layer the Studio Spec features (comfort vote 1 to 5, A/B variants, multi-person feedback, leaderboard, push-to-inner-circle, Google Sheet tracking, known-chart accuracy harness); tune per-structure length (a couple overran the 950 word cap); structure the neuroscience research into a "techniques" corpus tradition the generator pulls from.
  4. Cloud deploy the Studio when Jeff has accounts: Render (Docker from render.yaml) + R2 bucket (STUDIO_STORAGE=r2) + Cloudflare Pages for web/ + Cloudflare Access gating on studio.affirmology.ai. All scaffolding is in the repo.
  5. DONE 2026-06-14: corpus wired into generation via _corpus_sources() in script_generator.py; v5 reference is a content-free skeleton. Refine retrieval keywords if snippets read noisy.
  6. Finish the human design structuring backlog (in budget). Then, with more credit, re-mine the big western/vedic/numerology books deeper.
  7. Demo backend hardening: add RESEND_API_KEY + FROM_EMAIL to the worker to turn email on (still off). The laptop must be awake + server + funnel running for the live custom render.
  8. Build the nightly launchd watchdog so the corpus and QC run and report automatically.
  9. Investor video: fold in Josh Parini's reading and any Colin material when available; pick the male narrator.
  10. Mac mini: resume when the USB hub is replaced.

10. Traps and stale-info warnings


11. Cloud Studio (built 2026-06-15, runs local-first)

Governing build spec: Affirmology_CloudStudio_BuildSpec_v1.md (infrastructure). Feature design: Affirmology_Studio_Spec_v1.md. Both honored. The app is affirmology-studio/ at the AFFIRMOLOGY root.

What it is: one app that is BOTH Jeff's desktop tool and the future studio.affirmology.ai. It wraps the existing affirmology-agent pipeline (does not rewrite it). Cloud-shaped (FastAPI api/, static web/, storage.py abstraction, api/Dockerfile, render.yaml) but runs LOCAL-FIRST on this laptop using the agent's venv and .env. Storage is local now (files served at /media), R2 is a drop-in swap (STUDIO_STORAGE=r2 + R2_* env, R2Storage already written).

Two-phase, script-first cost discipline (matches the hard rule): - "Generate script" (cheap default): CLI --script --build-report --concept <structure directive>. Strong model for the script, Haiku for the script map and build report. No voice cost. - "Render the audio" (on demand, keepers only): CLI --audio --music <bed> --speed 1.0, QC-gated, into the same job folder so it reuses the script. Produces the mixed MP3 + the Sacred Audio Report PDF.

Structures are DEFINED, NAMED templates: api/structures.py has 14 structures across 8 categories (Foundational, Gene Keys, Astrology, Human Design, Numerology, Subconscious & somatic, Integrative, Custom). Each locks a shape (which systems lead, sequence, technique slots, length, tone) as a directive; the chart supplies all content; the model never re-invents the shape. "Custom" takes a free directive.

Endpoints (api/main.py): GET /api/structures, POST /api/script, POST /api/audio/{job_id}, GET /api/jobs/{id}, GET /api/jobs (the library), GET /api/health. GATE: local dev runs WITH NO GATE (2026-06-15). ROOT CAUSE of the "stuck on the access screen / button does nothing" bug was CSS, not auth: .gate sets display:grid, and an author display rule overrides the browser default [hidden]{display:none}, so toggling the hidden attribute in JS never actually hid the gate (it stayed painted as a fixed overlay even though the code had dismissed it and loaded the shell underneath). Fixed with [hidden]{display:none !important;} in styles.css. Separately, the gate is now also removed for local entirely: config.REQUIRE_AUTH (env STUDIO_REQUIRE_AUTH, default false) controls it: when false the API does not require the token and the front-end skips the gate entirely (it reads health.config.require_auth and lands straight on the compose screen). The cloud deploy sets STUDIO_REQUIRE_AUTH=true (in render.yaml) so studio.affirmology.ai stays gated by the shared bearer token (STUDIO_AUTH_TOKEN, default affirmology-studio-local-dev). Front-end asset refs are cache-busted (?v=2). Jobs run one-at-a-time in a thread, state in SQLite (affirmology-studio/data/studio.db), so the library survives a restart. Web (web/index.html|styles.css|app.js) is mobile-first and brand-matched to the live site (forest green / gold / cream; Cormorant Garamond + Inter + JetBrains Mono): gate, compose (person + structure), live progress, script view (script + build report + chart chips + "Render the audio"), result view (player + MP3/PDF downloads), and the library.

VERIFIED END TO END (2026-06-15): script phase produced a grounded 1009-word script (0 em dashes, correct chart: Manifesting Generator) + build report on Haiku; audio phase rendered Charlotte at 1.0, QC PASS, mixed MP3 + PDF, both served via /media. 29 pytest green after all engine changes.

FRONT-END REBUILT TO THE APPROVED MOCKUP (2026-06-15, later same day): per Affirmology_StudioBuildBrief_v1.md, the front-end now matches CLAUDE OUTPUTS/Affirmology/Affirmology_StudioUI_v3.html exactly (locked brand: starfield + aura + grain, Cormorant/Inter/JetBrains, emerald+gold). It is a 5-screen SPA wired to the real engine: LOGIN (local: log in as any of the four seeded people), HOME (greeting, quick actions, People Library with REAL computed charts, activity feed from real jobs, approved picks, category grid with readiness badges ✓ working / empty / in progress / ★ pick), COMPOSE (conversational workbench: paste-anything brief -> real chart-driven script via the two-phase engine; sending more messages makes new versions; gold "Render to audio" spends voice credits only on keepers; right rail with person/category select/length/status/versions), LIBRARY (per category, empty states + working-version badge across people), VERSION DETAIL (player, full script, "Why this build" = the team build report + Audio QC status, feedback thread with comfort vote 1-5 + comments, Make-this-the-pick). NEW BACKEND: api/people.py seeds four charts (Jeff, Sol, Colin, Josh) from known_charts.py, which now also holds SOL_BIRTH and COLIN_BIRTH. Endpoints: /api/people, /api/categories, /api/categories/{id}, /api/compose, /api/audio/{id}, /api/jobs[/{id}], /api/jobs/{id}/feedback, /api/jobs/{id}/pick. Jobs are organized as PERSON + CATEGORY + VERSION with picks and feedback in SQLite. Deep-link #as=<person>[&pg=<page>][&job=<id>] logs straight in. VERIFIED (2026-06-15): pytest 29 green; real two-phase render for Sol / Before-bed reprogramming (826-word script, 0 em dashes; Audio QC PASS; MP3 9.9MB + PDF 71KB served via /media; build report 11.6k chars); feedback + pick persist; category readiness updates; home screen screenshotted and matches the mockup, with the live render showing in the activity feed. FAST-FOLLOW (UI present, not yet wired, per the brief): relationship/multi-chart synergy, deep cosmic report (PDF, no audio), new-category creation, share/required-request notifications. The Verifier is not yet surfaced in the Studio build report (Audio QC is).

Run it locally: cd affirmology-studio && ./run_local.sh then open http://localhost:8000. Access key not needed locally (gate-free on localhost).

PHASE 1 DEPLOY = LAPTOP ENGINE + CLOUDFLARE (2026-06-15, per Affirmology_StudioDeploy_Runbook_v1.md; NOT Render yet, that is Phase 2 this week). The WHOLE Studio (UI, API, script phase, audio renders, SQLite library) runs on the laptop. PERSISTENCE: finished media (MP3 + PDF + build report) persist to the SSD at /Volumes/Affirmology/studio-media (env STUDIO_MEDIA_DIR); the library DB stays on the laptop at affirmology-studio/data/studio.db; render scratch in data/renders/. Both survive restarts (verified). START (two terminals): cd affirmology-studio && ./start_public.sh (server on 127.0.0.1:8765, prints the token; sets STUDIO_REQUIRE_AUTH=true, media on SSD) and /Applications/Tailscale.app/Contents/MacOS/Tailscale funnel --bg --https=8443 8765. Public funnel URL: https://macbook-pro-2.tail333640.ts.net:8443 (the demo's funnel on 443 is untouched; studio uses 8443). AUTH: the token is required for funnel/public traffic (the Cloudflare worker injects it); direct http://localhost use on the laptop is exempt by Host header, so the laptop tool stays gate-free. Token persisted in affirmology-studio/.studio_token (gitignored). CLOUDFLARE (Jeff clicks, click-by-click in affirmology-studio/PHASE1_CHECKLIST.md): front-end on Pages (Direct Upload of web/, no GitHub needed) at studio.affirmology.ai; a Worker (affirmology-studio/cloudflare-worker/) routes studio.affirmology.ai/api/* AND /media/* to the funnel URL with the token injected (secrets STUDIO_FUNNEL_URL, STUDIO_AUTH_TOKEN); Cloudflare Access (Zero Trust) one-time-PIN allowlist for jeff@jeffparker.love and solballard@gmail.com ONLY. VERIFIED 2026-06-15 (laptop + funnel side; the studio.affirmology.ai hop is Jeff's clicks): pytest 29 green; whole app runs on the laptop; media persists to SSD, DB on laptop; a rendered audio + the library survive a server restart; script phase works through the public funnel (Jeff/Founder confidence, 898 words, 0 em dashes); the ONE approved audio render persisted to the SSD and plays back over the funnel (HTTP 206, seekable); token enforced over the funnel (401 without it), localhost gate-free. UI fixes done: logo is Affirm + gold ology; Jeff and Sol both labeled "Founder" (equal billing). COST DISCIPLINE: script-only by default; audio (ElevenLabs) only on explicit per-version approval; the engine never auto-renders. KEEP READY for Phase 2 (a config switch, not a rebuild): render.yaml, api/Dockerfile, the R2 backend in api/storage.py, and STUDIO_REQUIRE_AUTH all in place.

STUDIO UI APPROVED 2026-06-15 (Jeff signed off on the direction): the clickable mockup CLAUDE OUTPUTS/Affirmology/Affirmology_StudioUI_v3.html is now the DESIGN SOURCE OF TRUTH, and Affirmology_StudioBuildBrief_v1.md is the authoritative build brief for Claude Code. The approved Studio is more than the current build: (1) Compose is a CONVERSATIONAL workbench, one big paste-anything box (no char limit, takes a whole Gemini dump), the system reflects back / asks questions / drafts a script inline / revises as you type, until you say "I want to hear this version" then the render button spends voice credits (script-first cost discipline preserved). (2) The logged-in person is the DEFAULT subject; you can compose for someone else and both can see/hear it (testing). (3) Per-category Library with proper EMPTY states ("be the first to create one") and a green "✓ working version" badge so the team can see the suite of audios that are actually ready. (4) Share + HARD REQUEST with a note + notify (required requests stay flagged on the recipient's list). (5) Reports on every audio. (6) Relationship / Synergy (combine 2+ charts) and one-click Deep Cosmic Report (report only, any person). (7) New-category creation (some categories like EFT may hold several audios + instructions). (8) Login: log-in-as-anyone kept for Jeff's LOCAL build; the WEB build gives Sol and Jeff their own logins (Colin later). NAMING: full names everywhere (Jeff Parker Love, Sol Ballard, Colin Jacobs, Josh Parini); equal billing, no "founder" slight, never "system/soul" framing. NEXT: Claude Code builds to this brief and deploys to the web so Sol can test.

Open studio refinements (not yet done): a few structures slightly overran the word cap (founder structure hit 1009 vs the 950 target) so per-structure length tuning is worth a pass; the Studio Spec's later layers are not built yet (comfort vote 1 to 5, A/B variants, multi-person feedback, the leaderboard, push-to-inner-circle, the techniques corpus tradition, Google Sheet tracking, the known-chart accuracy harness). Cloud deploy (Render + R2 + Cloudflare Pages + Cloudflare Access gating on studio.affirmology.ai) is pending Jeff creating the Render/R2 accounts.

12. Council/loop + relationship engine (added 2026-06-16)

13. Studio LIVE + live-use punch list (2026-06-16)

Studio is LIVE at studio.affirmology.ai (gated for Jeff + Sol; the affirmology-studio-api Worker routes to the laptop funnel; SSD persistence). Jeff rendered his own audio: the story "sounds like me" (the North Star showing up), voice clear, good music balance. The single prioritized build queue is Affirmology_StudioChangeList_v1.md. Key items: - P0 CRITICAL chart-integrity bug: a report crossed two charts (placeholder "render"/2000-01-01 in the header/blueprint/section-labels; Jeff's real data in the prose). Cause: people library not wired (so the render used the placeholder identity) and report vs script read different chart sources. Fix: wire the four real charts so a selected person passes real birth data; report + script from ONE chart computation; never fall back to a placeholder (fail loudly); purge the "render" job. Oracle: Jeff = Virgo Sun, Cancer Moon, Capricorn Rising, MG, Sacral, 2/5, Single, Gate 47, Life Path 22. - P0 iterative composer: the script step is one-way and loses the user's notes. Keep notes editable after generation, regenerate as versions, render as a separate explicit step. The conversational composer from the mockup. - Live audio feedback: music bed must cover the FULL audio length (loop/extend/fade tail); cadence, let key recognitions breathe instead of being rattled past (the council loop's job). - Voice-note feedback; feedback reachable from EVERY screen and accepting a long pasted transcript; co-created length (stop defaulting to the demo's ~6 min); named agents speak in the UI (Sophia/Orpheus/Apollo), shown in the v3 mockup. - Craft: structure-aware endings, and the openings AND endings are crafted by Orpheus as bookends (never a placement checklist). Docs: Affirmology_AudioOpenings_Framework_v1.md, Affirmology_BeforeBed_AudioStructure_v1.md. - Design source of truth for the UI: CLAUDE OUTPUTS/Affirmology/Affirmology_StudioUI_v3.html. Agent design: Affirmology_AgenticCouncil_Design_v1.md, Affirmology_InsightAgents_Design_v1.md. Build brief: Affirmology_StudioBuildBrief_v1.md. Change queue: Affirmology_StudioChangeList_v1.md. - Ops: Affirmology_StudioDeploy_Runbook_v1.md (Phase 1 done; Phase 2 = Render + R2 later). Living user guide with changelog: CLAUDE OUTPUTS/Affirmology/Affirmology_StudioGuide_v1.html (link in the Studio nav). Onboarding any chat to the system: Affirmology_SystemInterface_Guide_v1.md. - Before sending to Sol: land the two P0 fixes (chart-integrity + iterative composer), refresh, then invite her. Security: disable the workers.dev URL on affirmology-studio-api so the gated domain is the only way in. - BUILD ORDER now (per Jeff 2026-06-16): (1) council+loop prompted roles [done as prompts+demo; code wiring next], (2) Blueprint Insight Agent [feeds Sophia, opens Studio composer], (3) wire relationship.py into Prometheus+lenses, (4) Transit & Timing, (5) Potentials & Recommendation, (6) Echo + trend agents. - Kickoff-week client work (2026-06-16): 6 scripts in Affirmology_KickoffWeekSuite_v1.md, deep blueprint report Affirmology_CosmicBlueprint_Report_v2.pdf, analysis, Penta hiring map. All script-only, no renders.

Build-order step 2 (2026-06-16): Blueprint Insight Agent

BUILT as a prompted role and demonstrated on Jeff (ranked "what matters most" + convergences/tensions/gifts + suggested audio angles). Spec + demo: CLAUDE OUTPUTS/Affirmology/Affirmology_BlueprintInsightAgent_Spec_v1.md. Output is a BRIEF, not an audio. Feeds Sophia and opens the Studio composer. Code wiring (ahead of Sophia in compose(), and into the composer screen) pending the live-render step. NEXT: step 3, wire relationship.py into Prometheus + the lenses (Eros-for-clients first).

Build-order step 1 WIRED + LIVE-TESTED (2026-06-16)

The council/loop is now CODE, not just prompts, and embedded at the creation entry points: - affirmology-agent/src/affirmology/agents/council.py: sophia_brief(), apollo_review(), compose() (Sophia -> Orpheus -> Apollo loop, writes council_transcript.md). Additive. - script_generator.generate_script() gained an additive council_context="" param (empty by default, so the LOCKED DEMO path is byte-for-byte unchanged). - cli.py gained --council; both script-gen call sites route through compose() when set. - Studio pipeline.run_script() now passes --council, so every Studio creation runs the loop. The demo backend never passes it, so the demo is untouched. - LIVE TEST (real Anthropic API, model claude-sonnet-4-6) on Sol: Sophia + Orpheus + Apollo ran; Apollo passed all 4 gates first draft; output in CLAUDE OUTPUTS/Affirmology/Affirmology_CouncilLiveTest_Sol_v1.md. ElevenLabs voiced a 62-word opening clip OK (Sol_CouncilVoiceTest_opening.mp3). No full render. - Sandbox note: the engine venv is a Mac build (broken on Linux); tests here used system python3 with pip-installed deps. Full --audio (ffmpeg mix + QC + WeasyPrint PDF) should run on the Mac.

13. Studio change-list progress (working Affirmology_StudioChangeList_v1.md top-down)

Vedic incorporated into the SYNTHESIS layer (2026-06-16, per Jeff)

Jeff's call: not a separate Vedic silo yet (custom Vedic audio paths come later), but Vedic should speak when SYNERGIES appear across systems. Done: new src/affirmology/chart/vedic.py computes the Lahiri sidereal layer from the chart's already-computed tropical longitudes (no re-geocode): sidereal rashis for Sun/Moon/Ascendant, Moon nakshatra + pada + Vimshottari lord, gana, nadi. vedic_facts_text() is now fed into council.sophia_brief() so Sophia can let the sidereal sky confirm or complicate a convergence. Verified facts: Jeff sidereal Sun Leo, Moon Gemini/Ardra (lord Rahu), Asc Sagittarius; Sol sidereal Sun Capricorn, Moon Gemini/Ardra (lord Rahu), Asc Pisces. Notable synergy: BOTH founders share a sidereal Moon in Gemini, nakshatra Ardra, Rahu-ruled, reinforcing their shared tropical Cancer Moon. Live full-Sophia weave not shown here only because one Sophia call exceeds this sandbox's 45s shell cap; run on the Mac to see it woven. Full Vedic (dashas, Navamsa, yogas) + Parashara + Vedic audio paths remain queued.

Vedic = part-now / part-later project (2026-06-16, Jeff)

Plan: CLAUDE OUTPUTS/Affirmology/Affirmology_VedicEngine_PhasedPlan_v1.md. PART NOW (done): synergy-level sidereal facts (chart/vedic.py) feeding Sophia. PART LATER (phased, heavy): L1 Vimshottari dasha, L2 divisional charts + yogas, L3 strengthen the WEAK Vedic corpus (required before Vedic-led generation), L4 Parashara + dedicated Vedic audio paths. Every phase must pass a known-Vedic-chart fixture before shipping (same discipline as HD vs Josh). No Vedic-led audio yet. Keep Jeff updated here + in the change list.

P0.2 iterative composer DONE (2026-06-16)

Studio composer is now iterative (minimum viable, matches the mockup intent). Changes: - web/index.html: added an editable "Notes for this version" textarea (composeNotes) + a "Regenerate as new version" button (reviseBtn) in the composer rail. The script keeps showing in the chat alongside the notes; Render stays a separate explicit step. - web/app.js: refactored the compose call into a shared runCompose() used by both Send (append a change) and reviseFromNotes() (edited notes replace the brief). Every compose creates a NEW version (backend _next_version increments per person+category, confirmed). Added briefKey/persistComposer/syncNotes; the working brief is saved to localStorage and restored in bootChat, so navigation/reload loses nothing. setComposeBusy disables both buttons during a draft. - Verified: node --check web/app.js passes; wiring consistent; backend versioning confirmed. Full browser click-through is a Mac check (live FastAPI + browser not runnable in this sandbox). - P0 (chart-integrity + iterative composer) now COMPLETE. Next: Priority 1.5 (named agents in UI, feedback-everywhere + voice notes + pasted transcript, co-created length) and the live-audio fixes (music covers full length, structure-aware/crafted endings, cadence) which lean on the council loop already built.

14. Tracked PROJECTS (long-term, flagged 2026-06-16)

PREMIUM REPORT ENGINE v10 (2026-06-17, Cowork lane) - shared between both lanes

Built a self-contained reportlab report engine that finally embeds the REAL brand fonts (Cormorant Garamond + Inter + JetBrains Mono, instanced from Google Fonts variable files) instead of the Liberation substitutes the old builds used. This is the single biggest premium lift the redesign plan flagged. It lives in CLAUDE OUTPUTS/Affirmology/report-engine/ so Claude Code can use it too (Jeff wants tools fluid between lanes): report_engine.py (reusable builder: emerald cinematic page frame + starfield, full-cream ~11.5pt body, gold mantras with flanking rules, oracle-voice callout cards, convergence cards, founder panels, constellation/diamond motifs + a hand-drawn cover), assemble_report.py (style-aware extractor that reconstructs an existing report PDF into ordered role-tagged blocks, text verbatim, so NO content drift), build_jeffsol_v10.py (config), jeffsol_content.json, and fonts/static/*.ttf. Regenerated Jeff & Sol as Affirmology_CosmicBlueprint_Report_v10.pdf (16pp, montage-reviewed, cover is a clear upgrade). The locked APPROVED FORMAT (continuous flow, panels, oracle ORACLES, sparing gold mantras, overview, "What This Asks of You", future-journal close) is preserved exactly; only the typography/beauty changed. Chart-data panel font bumped slightly per Jeff. Jeff's design notes (2026-06-17): the look is good, the small chart-data font was bumped, investor/business docs do NOT need the emerald background (white is fine for those), and real graphics come LATER from a visual-aids suite (current motifs are light placeholders). NEXT: apply the engine to Colin (v10) and make it the template for ALL future reports; backport into the Mac builders or just use this engine. The investor/exec standalone PDFs (FriendsAndFamily, InvestorBrief, ExecSummary, data-room one-pagers, North Star) are DRAFTS and LOWER priority per Jeff; if/when done, correct the ExecSummary's stale "distributions from day one" framing to the locked v2 capital philosophy, and they can be on white, not emerald.

Report format LOCKED (2026-06-16) + two reports final

After several iterations, the report format Jeff approved is: continuous flow (no forced page-per-section), compact "mechanical" panels with RICH explanatory + cross-system SYNTHESIS prose underneath, the named agents as "ORACLES" giving short signed blurbs throughout plus a longer Oracle council conversation, a few sparing gold mantras, an OVERVIEW up top, a "What This Asks of You" ACTIONABLE section, and a future-journal close. Build with reportlab + embedded Liberation fonts; ALWAYS run a render-every-page montage review for deadspace before delivering. Builders: outputs/build_js_v9.py (Jeff & Sol) and outputs/build_colin_v3.py (Colin). Finals: CLAUDE OUTPUTS/Affirmology/Affirmology_CosmicBlueprint_Report_v9.pdf and Affirmology_FoundingChart_forColin_v3.pdf. This is the template for all future reports (the Reporting System Overhaul project). Sol correction baked in: she is the orchid/voice/pulse who shines when invited; Jeff convenes community in person and sets her stage.

15. Kickoff-week audios rendered via the Studio on the Mac (2026-06-17)

Correct path locked in: this chat drives the Studio API over the Tailscale funnel (https://macbook-pro-2.tail333640.ts.net:8443, token in affirmology-studio/.studio_token). compose -> audio -> poll jobs; the render runs ON THE MAC (chart-driven, council loop, QC-gated, Heavenly Circuit bed). NO in-sandbox synthesis, NO chunking. The earlier failure was trying to synthesize inside the Cowork sandbox (hard 45s command cap) during an ElevenLabs slow patch; not a token/credit/server problem (account healthy, ~75% chars left). Rendered + delivered to CLAUDE OUTPUTS/Affirmology/KickoffWeek_Audio/: - Sol_TheCrowning_v1 (astro_moment, sol, 8:14) - Jeff_RePourAndOverflow_v1 (astro_moment, jeff, 7:33) - Wealth_Is_The_Weather_Jeff_v1 (before_bed, jeff, 7:50) OPEN: Solstice Launch is a TWO-PERSON team audio; Studio compose is single-person and there is no team/relationship category wired in yet (relationship.py exists in the engine but is not exposed via the Studio). Needs a decision: single-person solstice render now, or wire the team path into the Studio (with Jeff). Also: team-script Sol-role fix applied in Affirmology_KickoffWeekSuite_v1.md (02/06); combined Jeff "Re-Pour and the Overflow" added as Script 09.

16. Companion (two-person) audio: design + Model A delivered (2026-06-17)

Spec: CLAUDE OUTPUTS/Affirmology/Affirmology_CompanionAudio_TwoVoice_Spec_v1.md. Decision (Jeff): ship MODEL A now (one narrator, "we" + occasional direct address to each); flagship later is Model B two-voice with Jeff/Sol CLONED voices (instant clone ~1-3 min calm sample each; pro clone 30+ min). Per-person voice_id to live on the Studio profile. Delivered the 4th kickoff audio via brief-driven compose on the existing single-person path (anchor jeff + astro_moment + relationship facts in the brief): SolsticeLaunch_Team_v1 (6:09). Came out as a true "we" piece with shared Cancer Moon / Scorpio Mars body integration + direct address to each. NOTE: engine named Jeff's Pearl as Gate 45 Synergy (his real chart) vs the brief's 44 teamwork; minor, chart-grounded. DURABLE BUILD (next, with Jeff): proper team path = generalize relationship call to N people, team composer with speaker tags [JEFF]/[SOL]/[BOTH], Studio "Companion" category with people[] on /api/compose. start_public.sh runs uvicorn WITHOUT --reload, so adding the endpoint needs a server restart by Jeff to go live.

17a. Music toolkit + strategy (2026-06-17, Cowork)

Catalog of music sources with license terms: Affirmology_MusicToolkit_Catalog_v1.md (uploaded). Audition pad: Affirmology_MusicAudition_Log_v1.md. STRATEGY DECISION (Jeff): cheap route to proof-of-concept and FUNDING first, custom beds later. Phase 1 (now): Suno (already subscribed, $0 incremental) for on-demand beds + 2-3 pay-once Meditation Music Library beds only where the clean sold-product license matters (sleep/journey/morning); no subscriptions or buyouts yet. Phase 2 (after funded): submit the Sonic Spheres quote form (https://forms.gle/7xkDpx2NvEjRcyKL6) and commission owned, on-brand signature beds per use case (the Affirmology house sound); revisit TunePocket/PremiumBeat if still useful. Sonic Spheres has NO public pricing (quote-only). LYRIA 3 (Google) added to the toolkit (2026-06-17): Lyria 3 Fast ~30s, Lyria 3 Pro up to ~3min structured, commercial-OK on paid Gemini tiers, SynthID watermark, on Gemini API/Vertex (~$0.08/song) so programmable; best NOW for marketing soundtracks (pairs with Higgsfield), candidate for product beds, later API per-user music (verify Vertex redistribution-at-scale first). Consolidated index of ALL music tools + links: Affirmology_MusicTools_MasterList_v1.md; licensing detail in Affirmology_MusicLicensing_v1.md. The locked demo bed (Heavenly Circuit) is untouched by any of this. SUNO BED PROMPT PACK built (2026-06-17): Affirmology_SunoBedPrompts_v1.md, ready-to-paste instrumental/loopable bed prompts (3 variants each) for Sleep, Journey, Morning, Gym, with an Affirmology sonic signature; Jeff generates in his Suno Pro/Premier account (commercial-cleared) and logs keepers in the audition log.

17c. Voice tools: Fish Audio evaluation (2026-06-17, Cowork)

Deep multi-source eval of Fish Audio (OpenAudio / Fish Speech, flagship S2 Pro) vs ElevenLabs for two Jeff use cases: (1) real-time "talk to Sophia" avatar installation, (2) cloning a person's voice into the sold Sacred Audios. Doc: Affirmology_VoiceTools_FishAudio_Eval_v1.md. Findings: Fish S2 rivals/beats ElevenLabs on raw naturalness (vendor-run blind test; independent leaderboards put it mid-pack), far cheaper (~$1.25/hr audio), great breathy/calm emotion tags. KEY TRAPS: Fish open weights are NON-COMMERCIAL (Fish Audio Research License + CC-BY-NC-SA; the "MIT/Apache" claim online is stale, verified via raw LICENSE), so self-hosting for a SOLD product is a license violation, the license-clean path is Fish's PAID hosted API. Fish has NO consent-verification (ElevenLabs enforces a voice-captcha); neither indemnifies you. RECOMMENDATION: keep ElevenLabs as production voice; ElevenLabs PVC (not Instant, not Turbo; stability ~35-40%, similarity ≤80%) is the more robust path for long-slow Sacred Audio AND the real fix for the Turbo dropout issue. Fish is the stronger fit for the avatar-installation voice (HeyGen LiveAvatar accepts Fish as TTS; only top option self-hostable offline for a kiosk) and worth a cheap A/B (~$11 Plus plan) on one real script. Legal: cloning a real person into a sold product needs a signed consent+commercial-use release per person + AI-generated disclosure to listeners (EU AI Act Art 50 from 2026-08-02; TN ELVIS Act; NO FAKES not yet law). Locked demo unchanged.

17b. Atlas app (2026-06-17; DECISIONS LOCKED 2026-06-18, Cowork)

Cloud move is DONE (section 19: Studio live on Render + R2), so Atlas is unblocked. Spec: Affirmology_Atlas_Overview_v1.md (sections 10-14 hold the locked decisions; builds on the thin Affirmology_Atlas_AppSpec_v1.md). Concept (locked): Atlas = the app, Hermes = the in-app assistant; two modes (Hermes chat default + full Studio one tap away) with a persistent corner toggle; installable PWA on phone + Mac; one Cloudflare Access login. DECISIONS LOCKED 2026-06-18 (Jeff): - Messaging circle v1 = Jeff, Sol, Colin only; messaging is IN-APP ONLY for v1 (email/external reach deferred). - Hermes TAKES ACTIONS (not read-only): creates audios from concepts, runs the composer, logs feedback, stores/pulls info wherever relevant ("the messenger"). - PERMISSION TIERS: Jeff = owner (everything, incl. private business material). Sol + Colin = collaborators: create/iterate/render audios, log feedback (text+voice), ask anything, message the team, read the shareable knowledge base and the investor-pitch/research/product material (they may be dropping insights into exactly that). They CANNOT overwrite/delete permanent files, and CANNOT see private ownership material (cap table/shares, Jeff+Sol founder agreements, legal terms). Future people: narrower. Reason Atlas matters: it is how Sol/Colin use the whole system without living in GitHub/Claude/Gemini. - Default landing = REMEMBER LAST MODE per person, with the always-present toggle. - Voicenotes = TRANSCRIPT ONLY (do not retain raw audio in R2). - Nightly improvement loop = AUTO-APPLY SAFE CHANGES + report the rest. "Safe" fenced hard: only low-risk reversible changes (copy/content/config/triage/draft proposals); NEVER the locked demo, NEVER delete/overwrite permanent files, NEVER auto-deploy engine/chart/script-structure code, NEVER silently spend voice credits; anything touching audio content/charts/structure/money/demo is report-and-propose for human approval (recommend git with easy revert). - VOICE TRANSCRIPTION (CORRECTED 2026-06-18): preferred path is NVIDIA Parakeet ON-DEVICE via sherpa-onnx (exported ONNX run on the phone CPU, offline, NO GPU; prebuilt iOS/Android examples exist for Parakeet-TDT-0.6b). This is what Jeff's dev demoed on a non-NVIDIA phone, and it is genuinely better: offline, zero per-use cost, private (audio never leaves the phone, which fits "transcript only" further), fast. Tradeoff: nudges Atlas toward a thin native wrapper or sherpa-onnx's WASM-in-browser build vs a pure PWA; settle at B7. If the dev's phone module works, route through it and skip server transcription. FALLBACK only: server-side OpenAI Whisper API on Render (seamless cloud call) to get something live before the native piece is ready. ("Wispr Flow" = Jeff's personal dictation app, not the app's layer; Granola = meeting notetaker, not for this.) - CLOUDFLARE ACCESS LOGIN is off-brand; brand the Access app (emerald/gold/cream + wordmark) or use a branded splash that hands off to Access. OPEN MEDIA NOTE: R2 public serving for media.affirmology.ai was 403 (section 19); Jeff believes it was fixed/tested OK overnight 2026-06-17/18 - VERIFY before relying on it.

ATLAS v1 BUILD STARTED (2026-06-18, Cowork, building DIRECTLY in affirmology-studio since Jeff asked Cowork to build it; Atlas == the Studio repo + PWA + Hermes, not a separate app). All ADDITIVE, existing Studio pages/flows untouched, static-checked (node --check, python ast). UNCOMMITTED in the working copy; deploys to studio.affirmology.ai on commit+push (autoDeploy). Built so far: - PWA layer: web/manifest.webmanifest, web/sw.js (conservative: caches only the static shell, never API/media/auth/POST/cross-origin, network-first), brand icons web/icons/ (gold Cormorant "A" on emerald, 192/512/180/32), apple-touch + manifest + apple-mobile-web-app meta + SW registration in index.html. Installable on iPhone/Android home screen + Mac dock. iPhone Add-to-Home-Screen works on the manifest+meta alone. - ATLAS TWO-MODE SHELL: a fixed corner toggle (#modeToggle, bottom-left; shifts right of the sidebar on desktop) flips between HERMES (chat) and STUDIO (workbench); remembers the last mode per person (localStorage atlas_mode). New #page-hermes chat screen reusing the brand chat styles. - HERMES HOME HERO (2026-06-18, Jeff asked): Hermes is now the FIRST-CHOICE entry on the Studio Home screen, a prominent constellation-dripped card at the top (.hermes-hero in index.html): a twinkling SVG gold constellation (connected stars + scattered dim stars, soft glow filter, prefers-reduced-motion respected), "Talk to Hermes" headline, "Enter Hermes ->" CTA, taps straight into chat mode. APP ICON upgraded to a sexier cinematic version (glowing gold gradient Cormorant "A" with bloom, soft halo, faint starfield, sparkle, whisper of a gold ring) at all sizes in web/icons/. - HERMES backend POST /api/hermes (api/main.py): permission-aware Claude call. Owner (jeff) = full access incl. private business; collaborators (sol/colin/josh) = product/system/research yes, private equity/legal/agreements withheld. System prompt carries the brand rules (no em dashes, Sol not Soul, Subconscious OS, recognition over instruction, no meditation-teacher name, Tier C wall) + the four charts + curated context. Degrades gracefully if no key/model. Uses ANTHROPIC_API_KEY (already in the studio env for script gen); model via env HERMES_MODEL (default claude-sonnet-4-6). Front-end Hermes chat persists history per person in localStorage. - ALSO FIXED the S3 backend half: compose minutes clamp widened 20 -> 60 in api/main.py so the new 3-45 min length slider is actually honored by the engine (was silently capping at 20). STILL TO BUILD on Atlas: in-app (Hermes-side) messaging between Jeff/Sol/Colin, the approvals queue, voicenote capture (server-side Whisper interim; on-device Parakeet later), deeper Hermes actions (kick off a render, file structured feedback) + real knowledge-base/doc retrieval, and Cloudflare Access page branding. NEEDS ON DEPLOY: confirm ANTHROPIC_API_KEY present on Render (it is, for script gen) and optionally set HERMES_MODEL. Mobile studio nav is still sidebar-only (hidden on phones) - the mode toggle works on mobile, but studio page nav on mobile is a follow-up.

ATLAS UPDATE (2026-06-18 later): (1) PUSHED (commit 6670b79): Hermes persona (humor calibration so he is not funny all the time + app-support scope + routing to the oracle specialists + a "how Atlas works" guide) and the in-app messaging BACKEND (messages table + /api/messages). (2) MESSAGING DEFERRED: Jeff is unsure it is needed; the backend rides along dormant/harmless, no UI built (task parked). (3) NEW + UNCOMMITTED (needs a push): CROSS-DEVICE HERMES HISTORY. Hermes turns now persist server-side per person (hermes_history table + add_hermes_turn/list_hermes_history in jobs.py; /api/hermes saves both turns and builds context from the stored history; new GET /api/hermes/history; front-end initHermes loads it). So a chat follows the person computer->phone (Jeff noticed history did not carry over). Files: api/jobs.py, api/main.py, web/app.js, web/index.html (app.js bumped ?v=17). (4) DONE (same uncommitted batch): VOICENOTES v1 = speak-to-text via the browser Web Speech API (transcript-only, no audio stored, feature-detected/hides if unsupported). Mic buttons in ALL boxes: Hermes input, composer input, composer notes, per-version feedback (#fbInput), and the global feedback popup (#fbText). toggleDictation()/speechSupported()/hideUnsupportedMics() in app.js; .micbtn styles + buttons in index.html. CAVEAT: Web Speech API can be flaky in an iOS standalone PWA; upgrades if so = server-side Whisper (needs a key) or on-device Parakeet via the native wrapper. The iPhone keyboard's own dictation mic also works in every field as a fallback. (5) JEFF PREFERS A NATIVE APP FEEL over the web app; the thin native Capacitor wrapper (cheap, store-free via TestFlight/sideload, also unlocks on-device Parakeet voice) is teed up for when he wants it.

HERMES EFFECTIVENESS - PHASE 1 BUILT (2026-06-18, Cowork; UNCOMMITTED, needs a push + LIVE TEST). Trigger: Sol asked Hermes for her+Jeff "wealth codes" across Gene Keys/HD/astrology/full-numerology + 2026 transits and got useless results. Root cause: Hermes was a single Claude call with a THIN static prompt (only ~5 placements/person, no engine/corpus/oracle access). NOT an Atlas data gap (the engine has full charts) but a gap in the initial Hermes build. Fix: HERMES IS NOW AGENTIC (tool use). New api/hermes_tools.py + a tool loop in /api/hermes: tools = get_person_chart + compute_chart_from_birth (full astrology/HD/all-3-GeneKeys-incl-Pearl/full-numerology/Vedic via render_all_facts, engine already in cloud), search_corpus (the ~17k records), consult_oracle (sophia/athena/prometheus/pythagoras/parashara specialist sub-readings). System prompt updated to USE the tools. Cost-bounded (max 6 rounds). Files: api/hermes_tools.py (new), api/main.py. Plan + full Phase-2 list: CLAUDE OUTPUTS/Affirmology/Affirmology_Hermes_Effectiveness_Plan_v1.md. PHASE 2 PENDING: full Vedic engine (today only partial sidereal; collect Vedic for Jeff/Sol), Transit & Timing agent (Venus/Jupiter/Pluto 2026), store confirmed full LEGAL names for name-numerology, the KNOWLEDGE BRAIN (sync deep docs hard-drive->R2 via nightly cron + search_docs), the AGENTIC COUNCIL (oracles talking to each other; wire Chiron+Persephone), new client accounts in R2 + client tier. ROSTER NOTE: roles corrected (Sophia=Western astro+synthesis lead, Athena=Gene Keys, Prometheus=Human Design, Parashara=Vedic, Pythagoras=Numerology, Hermes=assistant/router).

CRAFT KNOWLEDGE ENGINE (2026-06-20, Jeff flagged as the next pillar). Plan: Affirmology_CraftKnowledgeEngine_Plan_v1.md. GAP (verified in code): the cosmic blueprint got the full treatment, but the CRAFT side (neuroscience, frequency/sound, meditation/hypnosis technique, audio production, pro reading craft) is shallow, just a STATIC TECHNIQUES_LIBRARY menu in agents/build_report.py that Chiron picks from; the deep research sits in ~10 docs, not distilled/actionable/growing; the audio mix does NO frequency/binaural work (just a music bed). UPGRADE = a second knowledge pillar (blueprint = WHAT we say, craft = HOW we make it land): a "craft" corpus/meaning tradition seeded by distilling our research docs into actionable entries, wired DEEPLY into Chiron + Orpheus + Apollo's efficacy gate + the audio mix + Hermes (search_craft tool, replacing the static menu), and grown by the nightly cron (crawl wide). Optional later: binaural/solfeggio/tonal overlays in audio_mix.py (the one piece that changes the actual SOUND; Studio-only, demo locked). Code prompt + phased build in the plan doc. HERMES LOOP BUG fixed same day (see below / Affirmology_HermesLoop_Bug_v1.md); needs the api/main.py+hermes_tools.py push + local restart.

TEST & CHANGE QUEUE (2026-06-20) - the single living list of pending tests + changes, prioritized P0-P3, each with the exact next action: Affirmology_TestAndChange_Queue_v1.md. This is the operational hub; ADD every new "we should test/change X" here, and check items off as done. A daily 8am scheduled digest ("affirmology-test-change-digest") surfaces the top P0/P1 items to Jeff. Craft-engine agent ownership corrected: HYPNOS is primary (subconscious-efficacy + frequency/entrainment), with the Neuroscientist (the science), Orpheus (writing craft), Apollo (the gate), Chiron (healing slice only), Echo (feedback loop), not Chiron-as-primary. Frequency/sound layer (binaural/solfeggio overlays in audio_mix) = Jeff WANTS it; filed as queue C3, to spec.

COSMIC BLUEPRINT ENGINE UPGRADE (2026-06-18, Cowork) - "be masters of the cosmic blueprint." Master gap analysis (from another chat): CLAUDE OUTPUTS/Affirmology/Affirmology_EngineCoverage_Gaps_v1.md (7 priorities). HOW-to-build brief: Affirmology_CosmicBlueprint_EngineUpgrade_BuildBrief_v1.md. BIGGEST gap = the engine computes NO ASPECTS (positions without aspects = a list, not a reading). BUILT (Cowork, additive new modules, UNWIRED, need integration+test on the Mac because they touch the locked demo chart path): affirmology-agent/src/affirmology/chart/aspects.py (aspect grid: major+minor, orbs, applying/separating) and chart/extended.py (no-data-file: Black Moon Lilith mean+true, Part of Fortune/Spirit sect-correct, Vertex/anti-Vertex; data-file: Chiron + Ceres/Pallas/Juno/Vesta best-effort). NOTE: the no-file points were already computed ad hoc for Jeff & Sol by the other chat (out/*/extended_points_facts.md) = a regression anchor. PENDING (Code/Mac, sequence with corpus session; all chart/+reports/+Dockerfile, low collision): wire both modules into compute_astrology + models.AstrologyChart + reports/render.py render_all_facts (so it flows to reports AND Hermes), install seas_18.se1 in api/Dockerfile (+ AFFIRMOLOGY_EPHE_PATH, switch asteroids to FLG_SWIEPH), pytest + demo-chart regression, re-vendor/deploy. THEN Vedic depth (Vimshottari dasha, vargas D9/D10/D2, dhana yogas), condition/timing + transit-to-natal (also powers Hermes timing), HD/numerology/Gene-Keys depth (Priorities 3-7).

DOMAIN PLAYBOOKS (2026-06-18, Cowork) - Jeff: the system should already KNOW how to use the blueprint for predictable life questions (money, relationships, career) so agents don't figure it out on the fly. Model: tradition oracles read by SYSTEM; DOMAIN agents read by QUESTION (which cross-system signatures matter + how to synthesize), plugging into the agentic consult_oracle. Built: CLAUDE OUTPUTS/Affirmology/Affirmology_DomainPlaybooks_Lakshmi_v1.md = LAKSHMI's full wealth playbook (she is already the Wisdom Circle abundance voice per Affirmology_CouncilArchitecture_WisdomCircle_v1.md) + the life-domain->voice map. Wealth signatures she reads: Gene Keys Pearl sequence, astro 2nd/8th/11th + Jupiter/Venus/Part of Fortune/MC, Vedic Dhana yogas + D2 Hora + dasha timing, numerology 8/4/22, HD type/Heart-Ego/Sacral/not-self. DECISIONS (Jeff 2026-06-18 late): CAREER/vocation = ATHENA ("unless/until someone better"); HEALTH/body = IX CHEL (decided); QUAN YIN removed (FEMALE TAO absorbs compassion/being-heard); Christian mystic = HILDEGARD; AGASTYA confirmed (Vedic seat). COUNCIL WIDENED (Jeff: "be smart, not too limited"). The agentic consult_oracle (api/hermes_tools.py ORACLES) now has 12 voices: tradition experts sophia, athena (+career/vocation), prometheus, pythagoras, AGASTYA (renamed from parashara, the Vedic seat); client-facing DOMAIN voices lakshmi (wealth), eros (love), concordia (partnership/teams), hestia (family/home), gaia (community/foundation), persephone (transformation/breakthrough), chiron (healing). The domain voices can speak directly to clients. HERMES himself can also speak directly, especially on ALCHEMY (his Hermes Trismegistus alchemist form), wired into his persona prompt. More can be added over time; deeper/obscure Wisdom voices stay premium.

READING CRAFT STANDARD (the "Forrest standard", from another chat's CLAUDE OUTPUTS/Affirmology/Affirmology_ReadingCraft_Standard_v1.md). Diagnosis (correct): strong DATA layer, thin INTERPRETATION layer, so the agents grab a keyword ("8th house = other people's money") instead of teaching the MECHANISM + the choice. The 7 disciplines: mechanism-not-label, free-will-not-fate, high-road/low-road, synthesize, one living metaphor, talk warmly, end on a choice. APPLIED NOW (Cowork, uncommitted): a CRAFT block folded into all 12 Hermes consult_oracle oracle prompts + Hermes's synthesis (api/hermes_tools.py, api/main.py), so readings improve at the source. STRATEGIC (the "could be big" lever): the DEEP MEANING LAYER + DISTINCTIONS LIBRARY should be a structured store the NIGHTLY CORPUS IMPROVER builds + grows, and every Jeff/Sol "this reads odd" feedback becomes a permanent distinctions entry (corrections loop = feedback store -> nightly improver -> distinctions). The CRAFT-CRITIQUE PASS (an Apollo-style QA gate that rejects determinism/keyword-dumping/missing-high-low-road/house errors) is the reliability lever, build FIRST. Aspects (Phase 2) are the prerequisite for the synthesis discipline. Sophia already is the humanistic-Oracle voice. Recommended order: prompt-craft (done) -> critique gate -> meaning layer + distinctions via the nightly improver.

STRUCTURES ENRICHED with the new blueprint (2026-06-18, Cowork, UNCOMMITTED, rides the Hermes-layer push). api/structures.py: a global BLUEPRINT_ENRICHMENT directive is appended to EVERY audio's generation in api/main.py compose (so all audio types, incl. the natal/demo structure, now draw on the aspect grid + Lots + Lilith + Vertex + Chiron + Vedic, read with craft, using only what serves the piece). Plus targeted per-structure directive tweaks: gk_pearl (Fortune/Spirit), gk_venus (Venus aspects + Vertex), confidence_abundance (Lilith/Fortune), before_bed (Chiron/Lilith gently), founder (Spirit + MC aspects), astro_chart_power + all_systems_agree (the aspect grid). api/overview.py appends a "DEEPER READ" note to every structure's compose panel. NOTE: this enriches STUDIO generation; the separate LOCKED demo render server would need the same enrichment wired to get aspects into the live demo audio (coordination item). ORCHESTRATION (dynamic, not fixed): usually the core astrologers (Sophia/Athena/Prometheus) + Hermes bear the message with specialists feeding support; sometimes the bearer asks a specialist to go deep; sometimes a domain voice (Lakshmi/Eros) speaks to the client directly. UNCOMMITTED: hermes_tools.py + main.py (Lakshmi + Eros oracles) need a push. Next playbook: relationships (Eros live + the lenses).

17c. Voice engine alternative to test: Fish Audio (2026-06-17, Cowork)

Jeff's call: start creating tests with Fish Audio (fish.audio, by Hanabi AI) as an alternative voice engine to ElevenLabs. Evaluated 2026-06-17. What it is: an expressive real-time TTS + voice-cloning platform (current model Fish Audio S2; open-source lineage OpenAudio S1 / Fish Speech), with a hosted API and an open-source self-host path. Why it is worth testing for us: - Cost. API is roughly $15 per 1M UTF-8 bytes (s2-pro), pay-as-you-go, no subscription or monthly minimum. Independent and Fish's own comparisons put it about 50 to 70 percent cheaper than ElevenLabs for comparable quality. At our render volume this matters once the Studio scales. - Voice cloning from a very short sample (they claim 10 to 15 seconds), multilingual (30+ languages, same voice). Directly relevant to the Model B flagship two-voice plan (cloned Jeff and Sol voices, section 16): a cheaper, faster clone path to A/B against ElevenLabs. - Inline emotion and delivery tags ([soft], [whispering], [breathy], [sighing], [pause], [long pause], [excited], etc.). Promising for our meditative cadence and for letting key recognitions breathe, which is an open Studio craft item (section 13). - Open-source self-host option for cost and control at scale, and an API with low-latency streaming for the future Atlas voice-note / chatbot directions. Hard constraints on any test (do not break): - THE DEMO STAYS LOCKED to ElevenLabs Charlotte at the proven baseline (section 4). Fish is a STUDIO / sandbox experiment only. No Fish output goes near the demo unless Jeff explicitly says "make this the new demo." - scripts/audio_qc.py still gates every Fish render (dropout/artifact reject), same as ElevenLabs. Verify Fish honors a reliable, warble-free pace before trusting it; our whole baseline lock exists because Turbo warbled at speed. - Commercial use needs a paid Fish plan (their free tier is personal-use only). Confirm commercial rights and data/privacy terms before any client-facing use, especially for cloned founder voices. - Voice identity: blind A/B Fish vs ElevenLabs for (a) a cloned Jeff/Sol voice and (b) a Charlotte-equivalent narrator, judged on authenticity, emotional nuance, and artifact-free long renders, before adopting anywhere. NEXT: stand up a small Fish test in the Studio sandbox: clone Jeff and Sol from short calm samples, render the same script through Fish and through ElevenLabs, QC both, and compare. Pricing/API source: docs.fish.audio + 2026 cost write-ups.

17d. SMS vs email delivery for sample/free/affiliate audios (2026-06-17, Cowork)

Jeff's question: automate SMS delivery instead of email for better response on sample/free/affiliate Affirmology audios; concern that email is needed for the Meta ads pixel. Looked at quo.com + 2026 benchmarks. Findings: - Response gap is real: 2026 benchmarks put SMS open ~90-98% vs email ~28%, SMS CTR ~19-22% vs email ~3% (about 9x). SMS wins the single high-intent "your audio is ready, tap to listen" moment. - The pixel premise is slightly off, and this changes the decision. The Meta pixel fires on the WEB PAGE, not inside the email or text. Whatever channel carries the link, the pixel fires when they land on the audio player page, so retargeting works either way. For audience matching, Meta Custom Audiences + Conversions API accept HASHED PHONE NUMBERS as a primary identifier, not just email. So SMS does NOT sacrifice Meta retargeting/audience building. Email's genuine edge is different: far cheaper per send, better long-form nurture, universal CRM key. - Therefore not either/or. Plan: capture BOTH email + phone on the free-audio form (phone with explicit SMS consent); deliver the audio LINK by SMS for response rate; the link lands on a pixel-tracked player page so tracking/retargeting works; keep email for cheap ongoing nurture + as a second match key. Audio is never attached; always a link to a hosted player page (where pixel + analytics live). - Real cost of SMS is COMPLIANCE, not the pixel: US marketing texts need explicit opt-in, 10DLC A2P brand+campaign registration, STOP/HELP handling, TCPA (statutory damages per message). Highest risk with AFFILIATE traffic: consent must be captured on OUR form with clear SMS-consent language, never assumed from an affiliate list. This is the gating workstream before scaling SMS. Tooling tiers: - Quo (formerly OpenPhone): a shared business phone + inbox for two-way conversations (calls, texts, AI receptionist, routing), NOT a bulk-marketing blaster. Has an API, Zapier/Make, a Quo MCP, and a Claude integration "coming soon"; automated texts via Zapier ~$0.01/msg. FIT: the personal/relationship layer (a real number that texts the audio link and can reply, for Jeff's Miami community + founder-led/affiliate concierge warmth). The "Claude integration coming soon" is worth watching for our agent stack. - Twilio or a marketing-SMS platform: the automated, scaled sample/free/affiliate funnel. Our engine already produces per-person output, so a send can fire on render-complete. Twilio ~$0.0079/SMS + carrier fees. NET: pursue SMS as primary delivery for samples/affiliate audios, keep email alongside, treat consent/10DLC as the gating workstream. Quo = human/relational sends; Twilio (or similar) = automated funnel. Sources: dotdigital/omnisend 2026 benchmarks, quo.com, Twilio pricing.

DELIVERY FLOW DECISION (2026-06-17, Jeff + Cowork): - Do NOT gate the free/sample/affiliate audio behind an app install. For top-of-funnel, friction kills conversion: a stranger's first taste must be a no-install WEB PLAYER PAGE (PWA, app-like, zero install), and that page is where the Meta pixel lives and fires. The Atlas app is the UPSELL / retention layer for converted + community users, not the front door. After the audio lands, soft-prompt "add to home screen / get the full app." - Flow: SMS/email link -> pixel-tracked page -> listen -> app prompt. One page (player + pixel together) or two (a quick tracked landing that fires an intent event, then the player) both work. START with the single player page; only split into two if we want a separate pre-audio "intent" event to optimize ads against. The link CAN route through a tracking page then into the app if a given flow calls for it, but the default sample flow stays web-player. - Twilio is the right automation tool (programmatic SMS firing on render-complete, cheap pay-as-you-go); the spend is small. The real cost of going SMS is consent + 10DLC registration, not the Twilio bill. Budget TIME there, especially for affiliate traffic. - Data capture: capture BOTH email + phone (phone = ~9x SMS response + delivery channel; email = cheap nurture + second Meta match key). Every required field costs completion rate, so this is an A/B question, not a default. MAIN OPEN DECISION (Jeff, to settle): (A) PHONE REQUIRED + EMAIL OPTIONAL, or (B) REQUIRE BOTH. Lean: if SMS is primary delivery, phone is the must-have; option B maximizes data + reach but at some completion-rate cost. Test both.

POST-AUDIO MONETIZATION LAYER (2026-06-17, Jeff + Cowork): - The post-audio moment is the highest-intent window (they just felt something true about themselves). Make the offer there. Existing asset pointed at this: whatsinstore.html post-audio upsell reel (section 8); the "marketing move pop-up" is that, tightened into a clear offer + button. - TWO coordinated surfaces, not redundant: (1) ON-PAGE post-audio pop-up = the peak-moment ask; (2) SMS sequence = re-engage non-converters over the next few days with a small set of different angles/landing pages. Every SMS pushes to a pixel-tracked landing page, so each one also feeds retargeting audiences (ad engine keeps warming). - UX: LET IT LAND. The pop-up appears one beat AFTER the audio ends, not on top of the afterglow (same "let recognitions breathe" craft value as the audios). - Offer set: keep small + test. Candidates: full personalized audio / subscription, deeper cosmic report, affiliate invite, bundle. - CONSENT COPY TREATMENT (Jeff's call): on the capture form, "we'll TEXT YOU THE AUDIO" in BIGGER text; the marketing-message consent in SMALLER, different-color text. Still clearly readable, just less of a vibe killer. COMPLIANCE NOTE: that styling is fine as long as the marketing disclosure stays legible and clear (not hidden/deceptive); delivering the audio is TRANSACTIONAL but pushing offers is MARKETING, so the opt-in must explicitly cover "we'll also text offers," not just the audio. Keep it clear-and-conspicuous to stay TCPA-safe (small ≠ buried).

18. Film visual-asset pack (2026-06-17, Cowork) - the "make it not look lame" build

All in CLAUDE OUTPUTS/Affirmology/film-assets/ (generators alongside, so anything is re-tweakable). The principle locked with Jeff: the browser is the COMPOSITOR/conductor, not the artist; structured charts I build procedurally (my strength), cinematic/organic footage comes from Higgsfield (Jeff, starting tomorrow). Guidance doc: Affirmology_FilmAssets_ShoppingList_v1.md. Process/diagnosis doc: Affirmology_CosmosFilm_EvolutionProcess_v1.md. The B2 cosmos film text-overlap was also fixed in Affirmology_Primer_B2_textfix.html (captions to lower third, sequential, no collisions; Claude Code to fold in).

Built and Jeff-approved this session: - Zodiac: 12 gold constellation SVGs (zodiac/), elegant, drop-in. - Human Design bodygraph v1 (bodygraph.svg): correct 9-center shapes/positions + channels, centers id'd. NEXT (requested, not yet built): bodygraph v2 with CURVED channels, gate numbers inside centers, and the Design/Personality side panels; plus a flashing multi-chart beat (different pretend definitions glow back-to-back with type+authority words: Manifesting Generator/Generator/Manifestor/Projector/Reflector, Sacral/Emotional/Splenic authority, etc). - Gene Keys sequences (gk_seq/), shapes now CORRECT and locked (do not relitigate): ACTIVATION = zigzag (Life's Work top -> Evolution right -> Radiance left -> Purpose bottom). VENUS = zigzag chain Core->SQ->EQ->IQ->Attraction->Purpose (6 spheres). PEARL = tetrahedron (Brand/Pearl/Vocation/Culture). Each centered in the 64-gate wheel, color-coded (Activation emerald, Venus gold, Pearl pale). One-by-one light-up GIF exists (goldenpath/sequences_lightup.gif). - Full Golden Path (goldenpath/golden_path_full.svg): all 11 spheres, three sequences color-coded, with the SQ->Vocation link Jeff requested. Correct as of end of session. - Brain: brain_gold.png / brain_emerald.png (recolored from Jeff's brain2.png, transparent, glow). brain_alive.gif = breathing glow + firing synapses + absorption pulse (2D animation I make here; 3D rotation would be Higgsfield). - Sacred geometry (sacred/): Flower of Life, Seed of Life, Metatron's Cube, Merkaba, Sri Yantra, Golden Spiral, Torus, Vesica Piscis, all gold line-art; plus sacred_swirl.gif (counter-rotating hypnotic mandala). - Web feasibility demos (answer to "can we do quantumstretch / Codrops particle galaxies"): galaxy_demo.html (Three.js + GLSL animated galaxy, gold core to emerald arms, live sliders, manual orbit; FIXED the OrbitControls-404 bug) and scroll_demo.html (GSAP+Lenis preloader/smooth-scroll/pinned-reveal/counters in-brand). Both UNVERIFIED by Cowork (no browser/GPU in sandbox); Jeff reviews in browser. Verdict: yes, that whole class of site is our existing GSAP/Three stack. - STILL QUEUED (procedural, no Jeff assets needed): astrology natal wheel with lines drawing in + rotation (pairs with the birth-flash beat: Earth + horizon flare -> ring -> chart); bodygraph v2 + flashing charts (above). - TOMORROW: Jeff generates Higgsfield footage (cosmos nebula loop, Earth-with-sunrise, horizon flare per the shopping list); Cowork strips/recolors/composites it with these assets and can scroll-scrub it. A Higgsfield-style media MCP (generate_video/image/3d) also surfaced in this session's tool list.

17. Demo overhaul: execution plan (2026-06-17)

Consolidated, lane-tagged plan to resume the demo overhaul the moment Claude Code finishes the B2 cosmos loading film: CLAUDE OUTPUTS/Affirmology/Affirmology_DemoOverhaul_ExecutionPlan_v1.md. Covers the five flow pieces (pre-form opening, loading film, audio player, post-audio display, post-audio short video), the post-audio result.html bug notes (Safari scroll stall; thin blueprint missing Rising + more Gene Keys + intro; download buttons still point at mocks; consistency check), the email switch (Resend domain verified; still need RESEND_API_KEY + FROM_EMAIL on the worker), the ordered checklist, and a NEW proposal Jeff asked about: an AMBIENT (not kinetic) animation during listening, slow/low-contrast/optional, loosely audio-reactive, the user's chart barely visible behind it, with a dim toggle and prefers-reduced-motion. Jeff likes the idea; treat it as the sixth experience. - COSMOS FILM TEXT FIX (2026-06-17, Cowork): the B2 primer had captions colliding (all pinned dead-center with overlapping time windows, plus chart-art labels in the same zone). Cowork applied a deterministic fix in Affirmology_Primer_B2_textfix.html (copy of B2, original untouched): captions moved to the lower third (top:71%) so they clear the centered chart art, the three system label+phrase pairs merged into single two-line beats, and every caption window made strictly sequential (verified zero time-overlaps). CLAUDE CODE: fold these BEATS + the .beat position change into the canonical B2 on the next pass. Aesthetic/art quality is a SEPARATE problem (needs real assets, not code) tracked in Affirmology_CosmosFilm_EvolutionProcess_v1.md.

19. CLOUD DEPLOY - Studio LIVE on Render + R2 (2026-06-18, Claude Code)

The Studio engine now runs in the cloud, not just the laptop. Full render pipeline PROVEN end-to-end.

20. Laptop housekeeping (2026-06-18, Claude Code) - Studio is on the cloud now

Done now that studio.affirmology.ai runs on Render + R2 (section 19):

Corpus corruption ROOT-CAUSED and RECOVERED (2026-06-18, Claude Code)

A 10-doc Haiku pilot on the "pending" docs (to confirm they yield records before structuring all of them) returned 0 records. Investigation found TWO things: (1) the lowest-id pending docs are full scanned books and archive.org search/index pages (not interpretation prose), and more importantly (2) MOST "pending" extracted text was BINARY GARBAGE. ROOT CAUSE: the scraper saved the raw HTTP body still COMPRESSED (Brotli/gzip/deflate) without honoring Content-Encoding, and extract_html just .decode("utf-8")'d it, so the "extracted text" was garbage with a bogus word_count (passing the >100 floor). The raw bytes were intact, so it is fully recoverable with NO network calls. - FIX (permanent): added _maybe_decompress() to corpus/scraper.py (sniffs gzip/zlib/deflate/brotli, decompresses, leaves real HTML untouched); extract_html now decompresses before extracting. Mirrored into both engine trees, so future crawls are fixed too. (Brotli decompression needs the brotli package; the import is guarded so gzip/deflate still work without it. Declare brotli in the agent deps when convenient.) - DB PATH MIGRATION: the corpus move had left document.raw_path (3,865) and extracted_path (2,391) pointing at the deleted SSD prefix; remapped all to the internal path (0 left on SSD). - RECOVERY: new rerunnable scripts/recover_compressed.py (dry-run by default, --apply to write) decompresses + re-extracts every unstructured doc from its cached raw bytes and updates the extracted file + word_count when the result is real readable text. APPLIED: of 2,257 unstructured docs, 1,652 RECOVERED to readable text (numerology 492, vedic 384, western 372, human_design 263, gene_keys 141); 605 stayed unchanged (already-text or genuine index/placeholder pages); 0 raw files missing. DB backed up first to corpus/corpus.db.bak (reversible). - RESULT (classifier re-run after recovery): failed-extraction residue 1,474 -> 177; real structurable docs 2,312 -> 3,514 (1,609 structured + 1,905 pending); total quarantined residue 352. The corpus is far healthier than the old framing assumed. - CORRECTION to the prior-session claim that "the remaining backlog is non-structurable junk": that was largely WRONG. The bulk was compressed-but-recoverable real content; ~1,200 docs were salvaged. A small genuine residue remains (index/search/placeholder pages + a few un-decompressable files). - PILOT PROOF that recovered docs structure: re-structuring a sample of recovered pages with Haiku yielded real records (Chaldean numerology 14, Cafe Astrology 11, gene keys 7, etc.). Total pilot API spend ~$0.67 (Haiku). - NEXT (needs Jeff's go; this is the credit-spending step): run the full Haiku structure-only pass over the ~1,905 pending docs now that they are real text. Rough estimate ~$15-40 at Haiku rates depending on book chunking. Recommend tradition batches (numerology/western/vedic first, where recovery added the most) with --max-cost-usd caps and a small --limit re-pilot per tradition to confirm yield before each full batch.

CORPUS DIRECTION CHANGE (2026-06-18, Jeff + Cowork) - ACQUISITION over re-grinding

Standing plan: Affirmology_CorpusAcquisition_Plan_v1.md (hand to Claude Code, runs unattended within budget). Jeff's call after reviewing Code's Western run: the corpus feels weak because effort went into re-structuring a scrape full of archive.org search?query= / index / junk pages (the "6 Western big books" were all search-result pages, 0 yield). The leverage is ACQUIRING real, legal full text and parsing THAT. - PRIORITIES: Western (highest) > Gene Keys + Vedic (both important) > numerology SHELVED (lightly used; do not spend on it now). - THE UNLOCK: fetch public-domain (Tier A) full-text books, not search pages. Western: Gutenberg (Ptolemy Tetrabiblos #70850, Sepharial #46963) + archive.org *_djvu.txt (Raphael, Alan Leo, William Lilly). Vedic: sacred-texts.com Jyotish + PD Parashara. Gene Keys: A/B only, TIER WALL on Rudd/Ra Uru Hu (Tier C, never scraped); use PD I Ching (Legge, not 1950 Wilhelm) + A/B community commentary. - MODEL/COST: Gemini key now works, so re-open the structurer choice (old "HOLD on Haiku" was the Gemini billing block). Run a 10-doc bake-off Gemini Flash vs Haiku vs Nemotron; use the cheapest good model for the bulk. Jeff has Gemini + Nemotron + Haiku credit. - BUDGET: Jeff adding ~$15-20 now, re-ups when proven useful; pilot-before-batch, hard --max-cost-usd caps, quarantine noise permanently, stop at ~$3 floor and report. - PUSH after every significant piece (each tradition/big-book set overwrites R2); ONE Render restart at the end, not after every push. - COORDINATION: Code stays in affirmology-agent corpus code; do NOT touch affirmology-studio or numerology.py/council.py/script_generator.py (Cowork editing in parallel). The engine items (numerology guard, Persephone gate) land AFTER the corpus run is done and pushed.

21. Corpus ACQUISITION run (2026-06-18, Claude Code) - real public-domain books + Gemini Flash

Per Affirmology_CorpusAcquisition_Plan_v1.md. Stopped re-grinding the old scrape; ACQUIRED real full text and parsed it. New corpus scripts (all in affirmology-agent/scripts/, corpus code only): acquire_books.py (Gutenberg + archive.org _djvu.txt, never /search), bakeoff.py, gemini_structure.py (concurrent, tag-validating), run_plan.py, coverage_report.py, classify_corpus.py, recover_compressed.py, structure_batch.py, pilot_v2_prompt.py. - MODEL BAKE-OFF: Gemini Flash (gemini-2.5-flash) WON decisively: 33 records / 2 book chunks for $0.0011 vs Haiku 3 records / $0.042. Nemotron yielded 0. Gemini is the bulk model now (key works; old "HOLD on Haiku" is lifted). ~400x cheaper/record. Default Gemini, escalate only if a pilot underperforms. - WESTERN: acquired 6 PD books (Ptolemy, Sepharial x2, Raphael, Alan Leo, William Lilly). KEY FINDING: record quality == SOURCE quality, because the structurer prompt preserves the source's voice (rule 2). Pre-1900 OCR books (Lilly 1647, Raphael 1828, Ptolemy) produce archaic + OCR-garbled records -> QUARANTINED (not deleted) into the new record_quarantine table (2583 + pilots = 3682 rows), their sources marked DEFERRED, docs reprocessable. Modern-era books (Alan Leo ~1910, Sepharial ~1920) produce clean evergreen records -> KEPT. Western book records added this run: Alan Leo 540, Sepharial Manual 479, Sepharial How-To 427 = ~1,446. Western total 4,297 -> 5,743 (depth 11.4). - GENE KEYS + VEDIC: book acquisition hit UNRELIABLE archive scans - the "Legge Yi King" DLI scan (in.gov.ignca.20915) is mislabeled (Western astrology body), and "Brihat Jataka 1885" (wg1079) is a bound miscellany mixing Brihat Jataka with Western directions. All pre-1900 anyway. DEFERRED to v2 + source verification. Gene Keys stays 670, Vedic 391. Tier wall HELD: never scraped Rudd/Ra Uru Hu (Tier C); only public-domain texts attempted. - COST: the whole acquisition run cost ~$0.30 (Gemini Flash). The fresh $20 is essentially untouched. Budget is no longer the constraint; source quality + correct sourcing are. - CORPUS TOTAL: ~20,060 records. corpus.db pushed to R2 (15.8MB, 2026-06-18 17:12 UTC). NEEDS ONE Render restart of affirmology-studio-api to go live (re-pulls on boot when R2 size differs). - v2 PROMPT DRAFTED + PILOTED (NOT yet used for reprocessing, awaiting Jeff's go): pilot_v2_prompt.py holds a v2 structurer prompt that EXTRACTS THE MEANING in clean modern neutral English instead of preserving archaic wording (unlocks the deep classics; safer on copyright). Piloted on William Lilly 1647: faithfully modernized garbled 1647 OCR into clean records (e.g. source "if the major part of the Significators be in Diurnal Signs, the Birth will be by day" -> "If the majority of chart significators are placed in diurnal signs, the birth will occur during the day"). Faithful, not fabricated. NEXT (on Jeff's go): adopt v2 and reprocess the quarantined classics (Lilly/Raphael/Ptolemy) + re-source verified I Ching (Legge) and Brihat Jataka for gene_keys/vedic.

v2 prompt ADOPTED + classics reprocessed + Gene Keys/Vedic re-sourced (2026-06-18, later)

Polish run: numerology + Part of Fortune + asteroids/points + Gene Keys layer-b (2026-06-18, later)

Proven cadence (verify source genuine + public-domain -> v2 modernize/de-bias -> pilot shown -> scale). Gemini credits depleted (separate Google billing), so all on Haiku. - NUMEROLOGY (was shelved, un-shelved with verified PD classics): Westcott "Numbers: Their Occult Power & Mystic Virtues" (1890) + Sepharial "Kabala of Numbers" (1920), content-verified. Cheiro skipped (no clean PD scan). +514 records -> 1,138 (depth 18.7). Yields number symbolism (Number_1..9 + masters), the basis for life-path/expression retrieval. - PART OF FORTUNE: already well-covered (~19 modern records, houses 1-12 + aspects); classical Ptolemy/Lilly extraction mostly deduped against the better modern set. Done. - ASTEROIDS + POINTS (Chiron, Ceres, Pallas, Juno, Vesta, Black Moon Lilith): modern, not in PD classics, so synthesized from MULTI-SOURCE A/B web consensus in our OWN voice (no single-site verbatim), general + 12 signs + 12 houses per body. +51 new (the rest of the keys already existed). scripts/synth_points.py. - GENE KEYS LAYER-B (navigation methodology, tier-walled): scripts/synth_genekeys_b.py. 19 methodology/navigation concept records (sequences/spheres/contemplation/three-frequency model, our words, NOT Rudd's Activation/Venus/Pearl names) + shadow/gift/siddhi for 61/64 keys, each DERIVED FROM THE PUBLIC-DOMAIN I CHING (King Wen) hexagram theme in our own words. TIER-WALL FIX: quarantined 180 pre-existing shadow/gift/siddhi records that came from a third-party blog reproducing RUDD'S NAMED SET verbatim (e.g. "Gift of Guidance" GK7, "Shadow of Inertia" GK9) into record_quarantine (reason genekeys_rudd_named_tierwall); replaced with our clean I-Ching-derived set (verified: GK7 gift = "strategic coordination" not "Guidance"). Kept shadow/gift/siddhi only as generic frequency labels per Jeff. - FINAL CORPUS (2026-06-18): western 8,271 / human_design 7,952 / transits 4,764 / vedic 1,726 / gene_keys 1,701 / numerology 1,138 = ~25,552 records. corpus.db pushed to R2 (18.6MB, 2026-06-18). NEEDS ONE Render restart of affirmology-studio-api (Claude has NO Render API key; Jeff restarts manually) to go live; service re-pulls corpus on boot when R2 size differs.

17. Wealth codes reading + paste-ready blueprint data + stored Vedic (2026-06-17)

18. First full agentic wealth readings via /api/hermes (2026-06-20)

The CLAUDE.md rule is now LIVE in practice: astrology routed through the agents, not the chat. Ran five oracle readings over the funnel and compiled them: CLAUDE OUTPUTS/Affirmology/Affirmology_WealthCodes_OracleReadings_v1.md (~43k chars): Jeff x Lakshmi, Jeff x Agastya, Sol x Lakshmi, Sol x Agastya, Together x Concordia. Quality is a clear step up: mechanism-level, multi-system synthesis, uses the new points (Black Moon Lilith, Chiron, Part of Fortune), PROGRESSIONS (e.g. Sol's Progressed Moon in Capricorn), Vimshottari dasha, and 2026 transits. Jeff = "Merchant-King" (8th-house capital + Gate 45); Sol = "identity not hustle" (NN + Lilith Taurus, 11th-house community); Agastya read past money-hardship via the Ardra/Rahu Moon and dasha. OPERATIONAL NOTES for the agents: (a) single/1-2-oracle calls work reliably; MULTI-oracle (6+) still hits the residual forced-synthesis BadRequestError (see Affirmology_HermesLoop_Bug_v1.md) - so run focused calls and compile. (b) /api/hermes is synchronous and slow (>45s); POST then poll GET /api/hermes/history (the reply persists even if the client times out). (c) heavy threads get flaky as history grows; a couple calls hung/stubbed before succeeding on retry. (d) minor accuracy wobble seen (Jeff reading briefly conflated Pearl 44.1 with Radiance 45.5) - exactly what the planned craft-critique QA pass should catch.

19. Before-bed WEALTH audios on the new Quartz Pulse Tone bed (2026-06-20)

New sleep bed added: affirmology-agent/music/Quartz Pulse Tone.mp3 (Jeff uploaded; ~8.6 min, 192k). Use MP3 for beds (pipeline re-encodes to mp3; WAV master kept by Jeff). Category for the bed selector: Stillness/Delta (before-sleep). Rendered 2 before-bed wealth/abundance audios (theme: call in abundance, get Affirmology funded, comfort in path + timing). Method: compose before_bed via Studio on the Mac (chart-driven), grab the engine's voice-only intermediate (backend/*_voice.mp3), re-mix with Quartz in the sandbox (voice_offset 8, music 0.18, 9s fade). This is how to use a NEW bed before the Studio bed-selector ships. Delivered to CLAUDE OUTPUTS/Affirmology/KickoffWeek_Audio/: Jeff_BeforeBed_Wealth_Quartz_v1 (9:07), Sol_BeforeBed_Wealth_Quartz_v1 (7:02).

20. Investor-video TITLE SYSTEM + name-morph (2026-06-24)

Built the reusable gold AFFIRMOLOGY title system for the movie-trailer bridge. Winning pipeline (locked): generate the gold title as a STILL (Nano Banana, perfect text) → animate with Higgsfield Kling 3.0 two-keyframe morphing (start_image + end_image) → key out the black (lumakey) for transparent overlays. Hand-coded/remotion text was abandoned (looked cheap). Full spec: CLAUDE OUTPUTS/Affirmology/Affirmology_TitleSystem_v1.md. - CANONICAL frame (the alignment lock): AFFIRMOLOGY_canonical_BLACK.png + _ALPHA.png (1280x720). Every title animation starts/ends on this so they line up pixel-perfect when stacked in CapCut. - Assets in Affirmology_VideoEditKit/grand_bridge/TITLE_SYSTEM/: INTRO_black_to_AFFIRMOLOGY (.mp4/_ALPHA.mov), OUTRO_AFFIRMOLOGY_to_black (.mp4/_ALPHA.mov), affirmology_NAMEMORPH_v4_snappy (.mp4/_ALPHA.mov = black→AFFIRMOLOGY→Affirmations+Astrology+AI→Affirm+ology+AI→Affirmology.ai→AFFIRMOLOGY). - Also in grand_bridge/: nebula entrance pieces (nebula_bloom, title reveal, lockup_living), soul-song + subconscious-OS transparent overlays, hero constellation light-up v3 (the painterly hero figure igniting). All on-disk for Jeff to assemble in CapCut. - Jeff drives final assembly in CapCut (the agreed workaround); chat generates premium assets + transparent overlays. Next options: more intros/outros anchored to canonical; rebuild nebula entrance off canonical for full alignment; push morph even faster.

21. Master edit guide + oracle browser prompt pack (2026-06-24)

22. Investor-video VOICE CAST (locked record) + new VO rendered (2026-06-24)

FOUND in Higgsfield history (so we never lose it again). The v7 character VO uses the inworld_text_to_speech model with these voices: - JOE = Ethan (en) - MONIKA = Olivia (en) - FRIEND/guide = Liam (en) - In-app ORACLE = Serena (en) - ATLAS (bridge thesis) = Arthur (ElevenLabs preset, voice_id 30fc8796-ceb6-4a66-b3a7-4a145ef7f346) - NOT inworld; locked this session. - Jeff's personal wealth audios (separate) = Orion (ElevenLabs, ed69c516). Rule note (Jeff 2026-06-24): the "all audio through our engine" hard rule is for PRODUCT Sacred Audio; the INVESTOR VIDEO VO is allowed via Higgsfield to match prior choices. NEW VO rendered + saved to Affirmology_VideoEditKit/audio/new_vo/: joe_guide_kickoff (Ethan); friend1_partytrick / friend2_testimony_seattle / friend3_reframe (Liam); oracle_wealthblueprint (Serena); monika_SA1_hours / SA2_circle / SA3_ceiling / SA4_worth / SA5_becoming (Olivia); atlas_thesis (Arthur). m_ceiling stays as-is (already Olivia). Personalization through-line: Affirmology_PersonalizationTagging_Review_v1.md + 6 new source-tag overlays in VideoEditKit/overlays/ (tag_joe_ and tag_stars_). STILL OPEN: the 2 Seattle zero-proof company clips (factory cheers + laptop success) - need the blond-friend anchor image; prompts in Affirmology_NanoBanana_PromptPack_v1.