Swarm #026 โ€” Exa Consolidation Final Sign-Off

2026-05-17 ยท 11 agents ยท mission criticality: HIGH ยท audit-quality verdict: FIX-AND-SHIP
VERDICT: CONCERNS โ†’ FIX-AND-SHIP

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()).

The four pains, and how the revised plan addresses them

CONSOLIDATION โ€” One entry point (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+.
ACCURACY โ€” Tier-aware confidence with explicit precedence rule (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.
WASTE โ€” $10/day breaker reads per-signal pricing from 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.
SPEED โ€” Companion /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."

The new Q-set: Q1โ€“Q16

QNameRoleStageDepthCostSource
Q1company_overviewbothmostshallow$0.007original
Q2owner_foundersellermostshallow$0.007original
Q3company_size_financialsbothmostshallow$0.012original
Q4market_acquirerssellerletter+medium$0.007original
Q5ma_historybothletter+medium$0.012original
Q6corp_dev_contactbuyerletter+shallow$0.007original
Q7owner_contact_infosellerletter+shallow$0.135 Websetsoriginal
Q8company_reputationsellerletter+shallow$0.007original
Q9financial_capacitybuyerletter+medium$0.012original
Q10acquisition_history (promoted from writer-framing)bothletter+medium$0.012hunter
Q11legacy_and_succession (legacy_anchors, succession_pressure, prior_offers_declined)sellerletter+medium$0.020draper
Q12recency_hook (last-30-day signal)sellerdial+shallow$0.007writer
Q13verbatim_quote (owner's own words)sellerletter+shallow$0.007writer
Q14leadership_tenure (LinkedIn-resolvable)bothmeetingshallow$0.007discovery-criteria
Q15real_estate_structure (operating-co + propco)sellermeetingshallow$0.012discovery-criteria
Q16business_quality_signals (recurring %, churn, concentration)sellerletter+medium$0.012discovery-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.

What ships on Monday vs what does not

Ships on Monday

Does NOT ship in this consolidation

48-hour execute list (reordered per audit-quality)

StepTaskOwnerDepends on
0Write + apply C12 migrations (6 SQL files)sonnet-buildernothing
0.5Confirm MCP entries gone from ~/.claude.json(DONE in this thread)โ€”
0.7Author golden fixtures from current buyside_hunt v1 outputsonnet-buildernothing
1engine/lib/exa_domains.py (parallel with #2)sonnet-builder Astep 0
2src/lib/exa/domains.ts (parallel with #1)sonnet-builder Bstep 0
3engine/lib/exa_middleware.pyopus-architect#1
3.5src/lib/pipeline-stages.ts enum (parallel with #3)sonnet-builder Anone
4ExaQuestion + ExaSkill.ask() + ExaSkill.discover()opus-architect#3
5exa.refresh(company_key) runneropus-architect#4
6CHECKPOINT: golden-fixture diff vs buyside_hunt v1 โ€” zero-diff or explained-diff requiredMark#5 + #0.7
7Migrate recipes (pilot consumer)Charlie#6 PASS
8POST /api/exa/refresh HTTP wrapperBear#4
8.5/admin/company/[company_key] inspector pageBear#5
9First live exa.refresh() call loggedEwing approves#7

System-map Known Gap closure map

#System-map GapStatus
1Exa duplicate clients not deletedCLOSED โ€” final demolition step (post pilot)
2home_services vertical missing buyer_list_fileOUT OF SCOPE โ€” orthogonal
3Letter engine vertical config not passedPARTIALLY CLOSED โ€” proposal_engine becomes consumer via recipe pinning
4Classification keywords duplicatedOUT OF SCOPE
5Researcher/Nurturer agents are stubsOUT OF SCOPE
6Architecture doc pre-consolidationPARTIALLY CLOSED โ€” exa_templates.yaml + SPEC.md become canonical
7Proposal auto-generator setVertical() not calledOUT OF SCOPE
8Exa archive scripts not deletedCLOSED โ€” 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.

Precedence rules (to add to SPEC ยง1)

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
)

L7 retired

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 open decisions for Ewing

  1. $0.50 cap + $150/mo Websets prepay โ€” approve?
  2. L7 retire confirmation โ€” founder_story + acquisition_history as first-class outputs, OK?
  3. Q11 legacy_and_succession scope โ€” does the orchestrator pursue all three sub-facts (legacy_anchors, succession_pressure, prior_offers_declined) or start with just legacy_anchors and graduate later?

Three decisions, ~15 minutes of your time. Then execution starts.


Notebook: skills/maxswarm/notebook/2026-05-17__026__exa-consolidation-final.md ยท Conductor-synthesized (debrief + tech-translator exempted; Conductor performed both passes).