Track design and implementation plans

Seven plan documents covering the website JS infrastructure, show theme, caller
quality overhaul, cost dashboard, the Alpine relocation, and caller variety plus
Devon's search — the record of why the current architecture looks the way it
does. Plus the press release draft.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 04:23:53 -05:00
co-authored by Claude Opus 5
parent 9d49b013c2
commit 9071ed36d3
8 changed files with 2460 additions and 0 deletions
@@ -0,0 +1,56 @@
# Caller Variety, Movable Callers, and Devon Search Fix
**Date:** 2026-06-02
**Status:** Approved, implementing
## Problems
1. **Callers feel formulaic** — too many deep moral dilemmas; the roster prompt
*enforces* it ("at least half moral dilemmas" + "NEVER generate callers who
are just enthusiastic about a hobby").
2. **Callers circle forever** — they don't take advice, restating the same moral
issue until the host cuts them off. The live dialog prompt gives a `situation`
+ `secret_want` but no mechanic to be moved, persuaded, or reach resolution.
3. **Devon's search fails** — SearXNG at `localhost:8888` is unreachable whenever
the laptop's Docker Desktop isn't running. Fragile.
## Changes
### A. Roster variety — `backend/services/caller_gen.py` (`BATCH_SYSTEM_PROMPT`)
- Remove the absolute ban on hobby/job/story callers.
- Replace "at least half moral dilemmas" with an explicit distribution for a
10-caller roster (dilemmas still lead):
- **45** moral dilemmas / confessions / betrayals — keep the STAKES language.
- **23** storytellers & enthusiasts — a wild thing that happened, a fascinating
niche obsession or fact, a vivid slice-of-life. No deep dilemma required.
- **12** believers / chaos — earnest UFO/cryptid/conspiracy callers
(Coast-to-Coast sincerity) or a big eccentric personality on a rant.
- Keep the anti-collision rule, "reason they HAD to call tonight," and
"even lighter callers need energy and specificity."
### B. Movable callers — `backend/main.py` (`get_caller_prompt`)
Add a concise conversational-arc block for every caller:
- You have a position/want, but you're a real person — if Luke makes a good
point, genuinely react: agree, change your mind, soften, dig in, or decide.
- Don't restate a point/dilemma you've already made; the conversation must move.
You can reach a resolution, a decision, or an emotional turn. You are not
required to stay stuck.
Stacks on the existing "don't restate facts / move the story forward" rule.
Must keep `get_caller_prompt` output under the 3500-char test cap.
### C. SearXNG → NAS — `backend/config.py`, `backend/services/news.py`
- Deploy SearXNG to **mmgnas** as an always-on container (deploy-nas-docker).
- Add `searxng_url` to `config.py` (env-overridable), default to the NAS URL.
- `news.py` reads `settings.searxng_url` instead of the hardcoded constant;
`intern.py` imports `SEARXNG_URL` from `news.py`, so Devon, headlines, and
caller news-grounding all follow.
## Verification
- Run test suite (note: 2 pre-existing stale `test_caller_gen.py` failures).
- Live caller-gen batch → review the roster mix.
- Devon end-to-end: a `web_search` against the NAS SearXNG returns real results.