Subchapter 8.3
references/research-patterns.mdMarkdown10 KBView on GitHub
This reference defines two research contexts:
Both use the same 3-phase pattern but with different sub-questions and goals.
This is the most important research in the pipeline. Every downstream decision depends on it.
Discover site pages dynamically — do NOT hardcode paths like /about or /customers:
browse cloud fetch --allow-redirects "{company website}/sitemap.xml" — primary source, has ALL pagescustomer, case-stud, pricing, about, use-case, blog, docs, industry, solutionbrowse cloud fetch --allow-redirects "{company website}/llms.txt" for page descriptions"{company} customers use cases reviews""{company} alternatives competitors vs"From all findings, produce a company profile:
Do NOT include ICP, pitch angle, or sub-verticals in the profile. Those are per-run targeting decisions made in Step 2 after the profile is confirmed. The profile is a general-purpose company fact sheet that works regardless of which vertical you target next.
A thin profile produces generic search queries, weak lead scoring, and cookie-cutter emails. A rich profile with specific customers, competitors, and use cases produces targeted queries, accurate scoring, and emails that reference real pain points.
Generate sub-questions from these categories based on the ICP and enrichment fields requested. Not every category applies to every company — pick the most relevant.
For each sub-question, generate 2-3 search query variations:
# Product/Market
"{company name} what they do"
"{company name} product features customers"
# Tech Stack
"{company name} tech stack engineering blog"
"{company name} careers software engineer" (job posts reveal stack)
# Growth Signals
"{company name} funding round 2025 2026"
"{company name} launch announcement"
"{company name} hiring"
# Pain Points
"{company name} challenges {relevant domain}"
"{company name} {problem sender solves}"
# Decision Makers
"{company name} VP engineering CTO LinkedIn"
"{company name} head of growth product"Each finding is a self-contained factual statement tied to a source:
{
"subQuestion": "What does Acme sell and who are their customers?",
"fact": "Acme provides checkout optimization for Shopify stores, serving mid-market DTC brands with $5M-$50M revenue",
"sourceUrl": "https://acme.com/about",
"sourceTitle": "About Acme - Checkout Optimization",
"confidence": "high"
}Confidence levels:
high: Directly stated on the company’s own website or official pressmedium: Inferred from job postings, third-party articles, or indirect signalslow: Speculative based on industry/category, or from outdated sourcesAfter the research loop completes for a company, synthesize findings into the output record:
Score 1-10 using ALL accumulated findings as evidence:
Write icp_fit_reasoning referencing specific findings: “Series A fintech (from Crunchbase), uses Selenium for scraping (from job posting), expanding to EU market (from blog) — strong fit for browser infrastructure.”
Use the richest, most specific findings for email context:
Map findings to enrichment fields:
product_description → from Product/Market findingsindustry → inferred from Product/Marketemployee_estimate → from LinkedIn search or careers page findingsfunding_info → from Growth Signals findingsheadquarters → from company homepage or about pagetarget_audience → from Product/Market findingskey_features → from product page findingsIf a field has no supporting findings, leave it empty rather than guessing.
Apply these at synthesis time. They exist because the failure mode — especially on Framer/Next.js landing pages with little server-rendered copy — is for the subagent to pattern-match visual cues onto the sender’s ICP and fabricate a plausible-sounding description:
product_description, industry, or target_audience from fonts, design system, framework choice (Framer, Next.js, React), or site polish. “Framer-built” and “uses Geist Mono” are observations about tooling, not signals of what the company sells.product_description must quote or closely paraphrase a specific phrase from extract_page.mjs output (TITLE / META_DESCRIPTION / OG_DESCRIPTION / HEADINGS / BODY) or from an external search result. If no such phrase exists, write Unknown — homepage content not accessible.product_description is Unknown, set icp_fit_score ≤ 3 and icp_fit_reasoning: Insufficient evidence — homepage returned no readable content. Do not justify a higher score on inferred signals alone.