From the full transcript sweep: (1) greeting/wrap instructions were saved as
Joel's words and fed the memory pipeline — now filtered in _history_lines;
(2) greeting context sliced [:6] while the tool showed [:8] ('Eight actually
— I undercounted') — aligned at 8 with an honest 'plus N more' tail.
Known gap, not blind-fixed tonight: interrupted/list assistant turns lose
content in saved history (LiveKit spoken-sync truncation) — logged for the
observation-pipeline ticket.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Real-call bafflement: 'What are they?' about a loop the agent itself raised
went to vault search and whiffed. loop_detail now token-overlap matches any
paraphrase (scores title+project+whyItMatters), returns the actual loop menu
on miss (retry silently), and both its docstring and the open_loops header
route detail questions to it explicitly — not recall, not vault.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Real private-call receipts: 3-4 silent LLM+tool rounds before any audio
(worst 22s mute), while EOU (0.35-0.47s) and TTS (0.2s) held spec. Fixes:
- _run() shell-outs fire a short spoken filler through the live session
(one per 8s window, thread-safe via call_soon_threadsafe) — the research's
thinking-signal doctrine enforced mechanically at the choke point
- voice rule: ONE tool call then talk; narrate between genuine multi-lookups
Remaining lever: TTFT creep (1.2s -> 5.4s spikes late-call) is the
fast-loop-model experiment, Joel's call via llm.model in local config.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Real-call complaint: loop lists came out as abbreviated jargon needing a
'repeat that in human' follow-up. _loop_brief now emits plain spoken prose
(slugs become words, flags become sentences), the tool header shows an
example transformation instead of just asking for plainness, and the voice
rules ban tracker notation aloud globally.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Returning callers get greeted like mates: per-caller memory (count, dates,
last-exchange tail) keyed by caller hash, stored INSIDE the quarantine zone
and loaded only into public sessions — the private-memory invariant holds by
construction. Card content injected as conversation history, explicitly
never-instructions. First-time callers keep the instant canned openers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Findings from the first public-post calls, applied to BOTH personas:
- wiki_page misses now return the real slug list — model self-corrects
silently instead of narrating tool trouble
- 'hello?' no longer triggers a verbatim opener+disclosure repeat
- interrupted lines resume, never restart
- story requests get actual stories (deep-cuts/lore/recall)
- TEACH MODE on both lines (adapted from mattpocock/skills teach):
mission question first, one scoped idea per exchange, ELI5-but-technical,
source-grounded, comprehension check before stacking; private line offers
quick_note/add_task capture so lessons survive the call
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Random cheeky self-intro per call from a Joel-editable file, disclosure
enforced in code, generate_reply fallback if the file vanishes. First audio
now lands at TTS speed instead of TTS+LLM.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Workers draft in the working tree; git show HEAD: means nothing reaches a
caller until reviewed and committed. Empty repo falls back to the v1 seed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- _load_public_context prefers shitrat-brain/index.svx (public repo), falls
back to public-context.md; PublicDocentAgent gets exactly one tool —
wiki_page(slug), path-confined read-only zoom into pages/
- disclosure moves after the greeting and shrinks to one breath
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
public-context.md is the publication boundary made concrete: a git-tracked,
human-reviewed file — the only channel project knowledge crosses to strangers.
Read fresh per call; headline-then-zoom speaking contract; persona rebalanced
away from call-infrastructure navel-gazing.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Built by a pi worker in a herdr pane (brief in .brain/data/tasks/), wired and
verified by the steering session end-to-end: public call → session + turn rows
in local Convex (tier-tagged, heartbeat liveness, 7-day purge) → hangup →
voice/public-call.completed → analyzer writes objective stats (judge: pending,
TODO pi-path rubric).
- infra/voice-agent/call_tracker.py: fire-and-forget Convex writes (1s timeout,
circuit breaker, caller hashing); wired into all four session tiers
- apps/live-dashboard: Vite+React reactive dashboard (active calls, latency,
analyses, transcript tails); schema deployed to local Convex :3210
- voice-public-call-analyze registered host-role; CONVEX_URL defaults localhost
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
An orphaned worker generation squatted the fixed health port, crash-looping
launchd respawns for 20 min while itself serving calls with a dead inference
executor — every end-of-turn prediction errored and stalled the reply.
port=0 makes the failure class unreachable; orphan killed, single generation
verified, public synthetic call clean (eou 0.35s, no prediction errors).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pubcall- rooms (new LiveKit trunk ST_Br8aw4xjvZxp, dispatch SDR_LvmgmL2a4mdD,
Telnyx connection 3002616705122829572 with channel_limit=2) route to a public
persona: AI+recording disclosure first words, curated docent context, hard
privacy walls, zero tools, 10-min cap, same turn-detector/preemptive UX as
the private line (this line IS the benchmark). Transcripts quarantine to
voice/public/ and fire voice/public-call.completed for quality analysis —
never the memory pipeline.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>