All 10 working agents independently returned CONCERNS. Audit-quality scored 69/100 โ firmly "ship after fix" โ and identified 4 fixes that resolve in-place without another swarm pass. Once those 4 land, the plan ships.
The biggest single signal: five agents independently asked for more questions beyond Q1-Q9. We had built a sourcing-grade question set; we hadn't built a discovery-grade one. The fix is +7 atomic questions and one sibling verb (exa.discover()).
exa.refresh(company_key)) plus one sibling verb (exa.discover(geo, vertical, role)). 7 parallel call paths collapse to 2 orthogonal verbs sharing the same middleware. Hidden import sites grow from 7 to 13+.max(output.default, Q.default, domain_tier_uplift)). Anti-facts column + do-not-mention filter. Conversation-only-fields block makes invisible discovery gaps visible to the rep.signal_registry (AF1 closed). Cache wired into exa_answers with UNIQUE constraint. Websets prepaid $150/mo bucket + daily reconciler. Cost cap raised $0.30 โ $0.50 to accommodate the 7 new questions./admin/company/[company_key] inspector view (the 5th unstated pain that listener surfaced): Ewing/Mark sees every Q's value + freshness + source URL + confidence in one read. Eliminates the new bottleneck of "Ewing is the only one who can tell if the output is right."| Q | Name | Role | Stage | Depth | Cost | Source |
|---|---|---|---|---|---|---|
| Q1 | company_overview | both | most | shallow | $0.007 | original |
| Q2 | owner_founder | seller | most | shallow | $0.007 | original |
| Q3 | company_size_financials | both | most | shallow | $0.012 | original |
| Q4 | market_acquirers | seller | letter+ | medium | $0.007 | original |
| Q5 | ma_history | both | letter+ | medium | $0.012 | original |
| Q6 | corp_dev_contact | buyer | letter+ | shallow | $0.007 | original |
| Q7 | owner_contact_info | seller | letter+ | shallow | $0.135 Websets | original |
| Q8 | company_reputation | seller | letter+ | shallow | $0.007 | original |
| Q9 | financial_capacity | buyer | letter+ | medium | $0.012 | original |
| Q10 | acquisition_history (promoted from writer-framing) | both | letter+ | medium | $0.012 | hunter |
| Q11 | legacy_and_succession (legacy_anchors, succession_pressure, prior_offers_declined) | seller | letter+ | medium | $0.020 | draper |
| Q12 | recency_hook (last-30-day signal) | seller | dial+ | shallow | $0.007 | writer |
| Q13 | verbatim_quote (owner's own words) | seller | letter+ | shallow | $0.007 | writer |
| Q14 | leadership_tenure (LinkedIn-resolvable) | both | meeting | shallow | $0.007 | discovery-criteria |
| Q15 | real_estate_structure (operating-co + propco) | seller | meeting | shallow | $0.012 | discovery-criteria |
| Q16 | business_quality_signals (recurring %, churn, concentration) | seller | letter+ | medium | $0.012 | discovery-criteria |
Conversation-only fields (Exa cannot answer โ surfaced as prep-doc questions): why_sell_now, desired_timeline, prior_LOIs, valuation_expectations, deal_breakers, post_sale_role, books_quality, ebitda_adjusted, attorney_relationship, key_person_dependency_intent, owner_comp_addbacks, capex_requirements.
/admin/company/[company_key].feature_metrics; cache hits free; Websets reconciled daily.| Step | Task | Owner | Depends on |
|---|---|---|---|
| 0 | Write + apply C12 migrations (6 SQL files) | sonnet-builder | nothing |
| 0.5 | Confirm MCP entries gone from ~/.claude.json | (DONE in this thread) | โ |
| 0.7 | Author golden fixtures from current buyside_hunt v1 output | sonnet-builder | nothing |
| 1 | engine/lib/exa_domains.py (parallel with #2) | sonnet-builder A | step 0 |
| 2 | src/lib/exa/domains.ts (parallel with #1) | sonnet-builder B | step 0 |
| 3 | engine/lib/exa_middleware.py | opus-architect | #1 |
| 3.5 | src/lib/pipeline-stages.ts enum (parallel with #3) | sonnet-builder A | none |
| 4 | ExaQuestion + ExaSkill.ask() + ExaSkill.discover() | opus-architect | #3 |
| 5 | exa.refresh(company_key) runner | opus-architect | #4 |
| 6 | CHECKPOINT: golden-fixture diff vs buyside_hunt v1 โ zero-diff or explained-diff required | Mark | #5 + #0.7 |
| 7 | Migrate recipes (pilot consumer) | Charlie | #6 PASS |
| 8 | POST /api/exa/refresh HTTP wrapper | Bear | #4 |
| 8.5 | /admin/company/[company_key] inspector page | Bear | #5 |
| 9 | First live exa.refresh() call logged | Ewing approves | #7 |
| # | System-map Gap | Status |
|---|---|---|
| 1 | Exa duplicate clients not deleted | CLOSED โ final demolition step (post pilot) |
| 2 | home_services vertical missing buyer_list_file | OUT OF SCOPE โ orthogonal |
| 3 | Letter engine vertical config not passed | PARTIALLY CLOSED โ proposal_engine becomes consumer via recipe pinning |
| 4 | Classification keywords duplicated | OUT OF SCOPE |
| 5 | Researcher/Nurturer agents are stubs | OUT OF SCOPE |
| 6 | Architecture doc pre-consolidation | PARTIALLY CLOSED โ exa_templates.yaml + SPEC.md become canonical |
| 7 | Proposal auto-generator setVertical() not called | OUT OF SCOPE |
| 8 | Exa archive scripts not deleted | CLOSED โ final demolition step |
Net: 2 fully closed ยท 2 partially closed ยท 4 explicitly out of scope. All in-scope gaps have an owning change in this plan.
confidence(field) = max( output.default_confidence, question.default_confidence, domain_tier_uplift ) cost_cap(refresh) = min( global_cost_ceiling_per_refresh_usd, // $0.50 output_question_sets[output].cost_ceiling_usd ) output(refresh) = ( caller.output_override // recipe pin or HTTP body override ?? recipe.output // recipe match ?? stage_to_output[stage] // default )
Locked decision L7 โ "founder_story and acquisition_history are writer-layer framings, not Exa-layer questions" โ is retired. The YAML's first-class output entries for both with distinct Q-sets and cost ceilings prove they're Exa-layer outputs. Audit-quality resolved the contradiction storyteller surfaced. SPEC.md, FRAMEWORK-CONVERGENCE.md L12 list, and the YAML's writer_layer_outputs note will be updated.
Three decisions, ~15 minutes of your time. Then execution starts.