Files
joelhooks__joelclaw/infra/launchd/com.joel.verify-voice.plist
Joel Hooks efd679123a voice-agent: fail-loud canaries + boot verification
Closes the wayfinder ticket 'Build Fail-Loud Canaries and Boot Verification'.
Proven live: bootout of the voice agent paged Joel in 4m05s (Telnyx call+SMS
+ gateway urgent); synthetic self-call answered in 3s; verify-voice.sh 21/21.

- voice-worker-canary (cron */5): bare-room dispatch probe, cause-tagged,
  30-min cooldown, recovery notice
- voice-synthetic-call (daily 12:05 PT): outbound trunk dials own DID;
  main.py speaks a canary token to its own number, never guest mode
- voice-telnyx-balance (6h): warn <$25, page <$10 (how the old number died)
- voice-missed-call + telnyx webhook provider (Ed25519): FQDN connection now
  posts call events to hooks.joelclaw.com/webhooks/telnyx — verified
  delivering; dark until telnyx_public_key lands in agent-secrets
- verify-voice.sh + com.joel.verify-voice LaunchAgent (boot + 30 min):
  plist/GUI-session/secrets/dispatch-probe/Typesense/balance/allowlist
- serve.ts leases TELNYX_PUBLIC_KEY; run.sh leases TELNYX_PHONE_NUMBER

Built by a pi worker in a herdr pane; spec receipt in .brain/data/tasks/.
Surfaces new ticket: add-graceful-drain-voice-worker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 09:15:29 -07:00

32 lines
1.2 KiB
Plaintext

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.joel.verify-voice</string>
<key>ProgramArguments</key>
<array>
<string>/Users/joel/Code/joelhooks/joelclaw/infra/voice-agent/verify-voice.sh</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/joel/Code/joelhooks/joelclaw/infra/voice-agent</string>
<key>EnvironmentVariables</key>
<dict>
<key>HOME</key>
<string>/Users/joel</string>
<key>PATH</key>
<string>/Users/joel/.local/bin:/Users/joel/.bun/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
<key>JOELCLAW_VOICE_CONFIG</key>
<string>/Users/joel/.config/joelclaw/voice-agent.yaml</string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>1800</integer>
<key>StandardOutPath</key>
<string>/Users/joel/.local/log/verify-voice.log</string>
<key>StandardErrorPath</key>
<string>/Users/joel/.local/log/verify-voice.err</string>
</dict>
</plist>