1. The question
Adding touring and enrichment logic is like adding new rooms to a house while people still live in it — each room is fine alone, but the hallways between them are where things get missed.
- New touring and enrichment logic means more moving parts talking to each other.
- Each part can pass its own test and still disagree with its neighbor in production.
- The fear: nobody would notice until a real caller hit the seam.
Proves: the shape of the question Fede asked, 2026-09-13.
2. What runs today, by cadence
It's not an empty gym — it's a gym where the machines that work on individual muscles are booked solid, and the ones that test whether your whole body moves together are unused.
- 27 GitHub jobs already run nightly or weekly — voice, SMS/email, renewals, config drift.
- The full CI suite also reruns every night, not just on each pull request.
- Correcting the premise: CI is not silent — the gap is narrower and specific.
Proves: propflow-testing-inventory-2026-09-13.md §1–2, full workflow list in the appendix.
Deeper → Appendix: every scheduled workflow
3. The three real gaps
Like a smoke detector with a dead battery — it looks installed, the light even used to blink, but nobody would know it stopped working until there's smoke.
- Coworker-facing scenario harness: fires only on a diff to one file, no timer.
- Mac nightly eval script: header claims 4am, no matching schedule exists anywhere.
- PR gate: missing one key means live config-drift checks quietly skip, not fail.
Proves: inventory §2 (coworker), §2 (Mac script, no plist in ~/Library/LaunchAgents), §4/drift audit (PR-gate key gap).
4. How the field does it
Same four checkpoints an airline runs before a flight: pre-flight checklist, night-before maintenance, a black-box recorder while flying, and a test flight before the plane ever carries passengers.
- Sierra's tau-bench checks agents succeed repeatedly, not just once.
- Decagon runs the new agent silently alongside the live one before switching over.
- ElevenLabs and Cresta simulate full multi-turn conversations, not single replies.
- SRE teams run one small fake transaction through production every few minutes.
Proves: agentic-testing-industry-research-2026-09-13.md §1–5, with source links in the appendix.
Deeper → Appendix: industry sources table
5. The pairs that actually break
Two coworkers can each be great at their job and still hand off work wrong — the failure isn't either person, it's the handoff.
- Each pair needs a check on the handoff, not just on each side alone.
- Voice-prompt-to-live-config already has one (nightly); it's the model to copy.
- The other four pairs don't have a dedicated check yet — see the appendix table.
Proves: inventory §5 gaps table, reproduced in full in the appendix.
Deeper → Appendix: component-pair gaps table
6. Proposal: a tiered cadence
Like a restaurant kitchen: taste every dish before it goes out (per PR), do a full menu run-through before the doors open (nightly), and have one dish sent to a real table every day just to make sure the kitchen still works (canary).
- Per PR: deterministic checks plus a prompt/tool config snapshot diff.
- Nightly, on the subscription runner: 25–50 golden journeys, one full robot call/text/email each.
- Continuous: one synthetic call and text per live line daily, alerted through Sentry.
- Weekly: the adversarial red-case set.
Proves: industry research §6–7 (tiered pattern, 2-property sizing), inventory's identified gaps this closes.
7. Cost and token discipline
Same rule as any recurring bill — automate it on the plan you already pay for, don't open a new metered tab every night.
- All new nightly/continuous jobs run on the existing subscription eval runner.
- Sampling, not full replay, keeps nightly journeys to 25–50 cases.
- Fable stays out of the loop for this — subagents run the checks, not the orchestrator.
Proves: CLAUDE.md "Evals run on the subscription" and "Token budget" rules; prior $600 metered-key incident.
8. Decisions for Fede
Four short yes/no calls, each with a recommendation already picked — nothing here needs him to design anything from scratch.
- Wire the nightly journeys now, or wait until after Thursday's Western Slope go-live? Recommend: after Thursday, canary dark first.
- Add a daily synthetic call/text to the live 970 line? Recommend: yes — one call a day, team-number allowlist only.
- Fix the PR-gate missing key so drift checks stop silently skipping? Recommend: yes, small PR.
- Put the coworker harness on a nightly timer? Recommend: yes.
Proves: each item traces to a named gap in Chapter 3 or the field pattern in Chapter 4 — none is net-new scope.
A1 · Appendix — full record
Every table behind the chapters above, for whoever builds this next.
Every scheduled GitHub Actions workflow
| Workflow | Cron (UTC) | What it does |
|---|---|---|
ci.yml | 0 7 daily | full-suite authoritative gate, not diff-scoped |
nightly.yml | 0 8 daily | SMS/email stress + renewal/topics/leasing/prospect-comms/maintenance-turnover/routing-triage/resident-compliance evals, prod-invariant audit |
voice-nightly.yml | 0 9 daily | voice simulation job |
voice-comprehensive.yml | 30 9 daily | full voice sweep |
voice-replay.yml | 15 10 daily | replay against real past calls |
voice-prompt-drift.yml | every 6h | drift check |
nightly-renewal-harness.yml | 0 9 daily | harness + Willows live run + prod-history replay canary |
nightly-el-config-drift.yml | 0 6 daily | live ElevenLabs vs repo comparison, with key |
nightly-suppression-canary.yml | 30 9 daily | canary |
nightly-d8-pipeline-sweep.yml | 0 10 daily | thumbs-down/up to test-pipeline sweep |
intent-evals.yml | 0 9 Mon | golden-eval + trace-replay drift check |
renewal-evals.yml | 15 9 Mon | gauntlet + live multiturn |
goldmine-live-scorecard.yml | 0 15 Mon | live scorecard |
semgrep.yml | 0 13 Mon | full static-analysis scan |
lambda-runtime-eol-check.yml | 0 13 Mon | Lambda EOL check |
adr-lens-sync.yml | monthly | ADR lens sync |
| audit-runtime-token-parity, dlq-alarms-refresh, prod-cookie-preflight, schedule-drift, sync-phone-numbers, workflow-pr-digest, customer-success-review, branch-preview-domain, cache-janitor | daily | infra/config checks, not test harnesses |
| prod-freshness-alarm, review-verdict-watchdog | every 15 min | staleness / stalled-PR polling — monitoring, not testing |
Harnesses and their trigger
| Harness / script | Trigger today | Notes |
|---|---|---|
| promptfoo domain configs (≥20) | nightly crons above | evals/run-all.sh [domain] |
~50 eval-*-subscription.ts scripts | mixed — some wired into crons, some ad hoc | subscription bearer, sanctioned pattern |
scripts/coworker-harness/ | diff to lib.ts only | bench-only, org_sandbox, outbound suppressed |
nightly-renewal-harness.yml willows-live-run | daily 0 9 UTC | touches live bench property |
~/.claude/scripts/agent-eval-daily.sh | none — claimed 4am MT, no plist exists | 3 agent-eval test files against real Claude API |
stress-test-telegram-update.sh | disabled plist | .disabled-2026-07-02 |
Component-pair gaps
| Component pair | Test exists? | Cadence | Gap |
|---|---|---|---|
| Voice prompt ↔ live EL config | Yes (nightly drift) | Daily | PR-gate twin reportedly runs without the API key — nightly is the only catch, a day late |
| Voice prompt HEAD ↔ frozen snapshot vs live | Partially | 6h + nightly | One variant compared a frozen snapshot, not HEAD; said fixed 2026-09-07, not reconfirmed |
| Coworker scenarios ↔ Willows bench data | Yes | Diff-triggered only, no timer | Regressions untouched by a lib.ts diff go uncaught between runs |
| Renewal workflow ↔ live bench property | Yes | Daily | None apparent — scheduled and live |
| Mac agent eval ↔ real Claude API | Script exists, unwired | Claimed 4am MT daily, actually unscheduled | Launchd plist referenced in the script's own comment doesn't exist |
| Twilio webhooks ↔ routes; calendar/listings sync ↔ context injection | Not inventoried this pass | — | Flagged for a follow-up, out of word budget this pass |
Industry sources
| Company / tool | Practice | Source |
|---|---|---|
| Sierra | tau-bench — repeat-task consistency, 375-task benchmark | sierra.ai/blog/tau-bench |
| Decagon | Shadow tests, A/B routing, Watchtower always-on QA | decagon.ai/glossary |
| ElevenLabs | Simulation API — full, next-reply, and tool-call testing | elevenlabs.io/docs |
| Cresta | Synthetic customers from real conversation data | cresta.com/blog |
| Google SRE | Synthetic transactions, canary releases | sre.google/workbook |
| OpenAI / Promptfoo | Per-PR fast evals + nightly deep evals | qaskills.sh/promptfoo-guide |
| Braintrust | Offline dev evals + online production scoring with alert thresholds | braintrust.dev/articles |
Full inventory: ~/agents/006/propflow-testing-inventory-2026-09-13.md. Full industry research with all 24 sources: ~/agents/006/agentic-testing-industry-research-2026-09-13.md.