← NimbleCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Nimble
Snapshot Sep 30, 2026 · 22:54 UTC · version 1.7.0
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "market-finder",
"description": "Discovers all businesses of a given type in any geography using Nimble\nWSAs. Two modes: Discovery finds businesses from scratch; Audit compares\na user's existing list (Google Sheet, CSV, inline) against fresh\ndiscovery, categorizing entries as matched, discovered-only, or\nreference-only. Vertical presets (Healthcare, SaaS, Restaurants, Legal,\nAuto/Home) auto-select WSA routing.\n\nTriggers: \"find all X in Y\", \"build a list of\", \"market sizing\",\n\"account universe\", \"how many X in Y\", \"TAM for\", \"discover all\",\n\"audit my list\", \"compare against\", \"what am I missing\", \"gap analysis\",\n\"verify my business list\", \"prospect list\".\n\nDo NOT use for competitor monitoring — use competitor-intel instead.\nDo NOT use for company deep dives — use company-deep-dive instead.\nDo NOT use for neighborhood-level exploration with social enrichment\n— use local-places instead.\n",
"included_files": [
{
"relative_path": "references/audit-mode.md",
"size_in_bytes": 7611
},
{
"relative_path": "references/memory-and-distribution.md",
"size_in_bytes": 22058
},
{
"relative_path": "references/nimble-playbook.md",
"size_in_bytes": 37015
},
{
"relative_path": "references/profile-and-onboarding.md",
"size_in_bytes": 9344
},
{
"relative_path": "references/vertical-presets.md",
"size_in_bytes": 6513
}
],
"skill_md_contents": "---\nname: market-finder\ndescription: |\n Discovers all businesses of a given type in any geography using Nimble\n WSAs. Two modes: Discovery finds businesses from scratch; Audit compares\n a user's existing list (Google Sheet, CSV, inline) against fresh\n discovery, categorizing entries as matched, discovered-only, or\n reference-only. Vertical presets (Healthcare, SaaS, Restaurants, Legal,\n Auto/Home) auto-select WSA routing.\n\n Triggers: \"find all X in Y\", \"build a list of\", \"market sizing\",\n \"account universe\", \"how many X in Y\", \"TAM for\", \"discover all\",\n \"audit my list\", \"compare against\", \"what am I missing\", \"gap analysis\",\n \"verify my business list\", \"prospect list\".\n\n Do NOT use for competitor monitoring — use competitor-intel instead.\n Do NOT use for company deep dives — use company-deep-dive instead.\n Do NOT use for neighborhood-level exploration with social enrichment\n — use local-places instead.\nallowed-tools:\n - Bash(nimble:*)\n - Bash(date:*)\n - Bash(cat:*)\n - Bash(mkdir:*)\n - Bash(python3:*)\n - Bash(echo:*)\n - Bash(jq:*)\n - Bash(ls:*)\n - Read\n - Write\n - Edit\n - Glob\n - Grep\n - Agent\n - AskUserQuestion\nmetadata:\n author: Nimbleway\n version: 1.6.1\n category: business-research\n---\n\n# Market Finder\n\nMarket intelligence powered by Nimble Web Search Agents.\n\nUser request: $ARGUMENTS\n\n**Before running any commands**, read `references/nimble-playbook.md` for Claude Code\nconstraints (no shell state, no `&`/`wait`, sub-agent permissions, communication style).\n\n---\n\n## Instructions\n\n### Step 0: Preflight\n\nFollow the transport selection + standard preflight from `references/nimble-playbook.md` — pick CLI or MCP at session start, then run the standard preflight calls (date calc, today, profile, memory index) in parallel.\n\nAlso simultaneously:\n- `mkdir -p ~/.nimble/memory/{reports,market-finder/checkpoints}`\n- Check for existing checkpoints: `ls ~/.nimble/memory/market-finder/checkpoints/ 2>/dev/null`\n\nFrom the results:\n- CLI missing or API key unset -> `references/profile-and-onboarding.md`, stop\n- Tag all `nimble` CLI calls: `nimble --client-source nimble-agent-skills <subcommand>`. MCP requests are attributed at the transport level — see `references/nimble-playbook.md`.\n- Profile exists -> note industry keywords if any. Apply smart date windowing from\n `references/nimble-playbook.md`. Market-finder tweak: in quick refresh mode,\n skip enrichment and only discover new metros.\n- No profile -> fine. Market-finder doesn't require onboarding. Proceed to Step 1.\n\n### Step 1: Parse Request & Detect Mode\n\nParse `$ARGUMENTS` for business type, geography, qualifiers, and **mode detection**.\n\n#### Mode detection\n\nCheck `$ARGUMENTS` for a reference list. Read `references/audit-mode.md` for the\nfull detection signals and parsing rules.\n\n| Signal | Mode |\n|--------|------|\n| Google Sheet URL, CSV path, or inline list of 3+ businesses | **Audit** |\n| Explicit audit language (\"audit my list\", \"compare against\", \"gap analysis\") | **Audit** |\n| No reference list provided | **Discovery** (default) |\n\nIf a reference list is present but intent is ambiguous, ask: \"Want me to **audit**\nyour list against fresh discovery, or use it as a starting point?\"\n\nIf audit language is detected but no reference list is provided, ask: \"You mentioned\nauditing — please provide your list (Google Sheet URL, CSV file path, or paste inline).\"\nDo not proceed with Audit mode until a reference list is received.\n\n#### Extract fields\n\n| Field | Required | Source |\n|-------|----------|--------|\n| Business type / vertical | Yes | User input (\"dentists\", \"SaaS CRM tools\") |\n| Geography | Yes (except SaaS) | User input (\"Florida\", \"Austin TX\", \"nationwide\") |\n| Reference list | Audit mode only | Google Sheet URL, CSV path, or inline |\n| Qualification criteria | Optional | User input (\"must have website\", \"10+ reviews\") |\n| Output preference | Optional | User input (\"quick summary\", \"full dataset\") |\n\n**If both type and geography are clear** from `$ARGUMENTS`, confirm briefly and\nproceed: \"Finding **dentists** in **Florida**...\" (or \"Auditing your list against\n**dentists** in **Florida**...\" in Audit mode)\n\n**If partial or ambiguous**, ask one combined question (counts as 1 of max 2\nAskUserQuestion prompts):\n\nUse AskUserQuestion with up to 3 questions:\n1. **Vertical** -- \"What type of business?\" with options: Healthcare, SaaS/Software,\n Restaurants/Food, Legal/Financial, Auto/Home Services, Other\n2. **Geography** -- \"What geography?\" (free text or: City, State, Region, Nationwide)\n3. **Depth** -- \"Quick scan or comprehensive discovery?\"\n\nSkip questions already answered by `$ARGUMENTS`.\n\n**Depth modes** (determines how much work each step does):\n\n| Depth | Discovery | Enrichment | Verification | Distribution |\n|-------|-----------|------------|-------------|--------------|\n| **Quick scan** | All sources, 1 pass | Skip (or top 5 only) | Top 5 entities | Offer |\n| **Comprehensive** | All sources + fallback retries | Full | All entities | Offer |\n\n### Step 2: Vertical Detection & Preset Loading\n\nRead `references/vertical-presets.md` and match the user's business type against\npreset trigger keywords.\n\n| Match | Action |\n|-------|--------|\n| Clear match | Load that preset's WSA routing and query pattern |\n| Partial match | Confirm: \"This looks like **Healthcare**. Use healthcare presets?\" |\n| No match | Use Custom preset with user's keywords |\n| SaaS match | Switch to non-geographic pipeline (no geo-tiling) |\n\nNote which discovery WSAs and enrichment WSAs the preset specifies.\n\n### Step 3: Geographic Scoping\n\n**Skip this step for SaaS vertical** (no geography needed).\n\n| Geography level | Tiling strategy |\n|----------------|-----------------|\n| City | Single query, no tiling |\n| Metro area | Single query per WSA |\n| State | Tile by top 5-10 metros in the state |\n| Region | Tile by states, then top metros per state |\n| Nationwide | Tile by all states, then top metros per state |\n\n**Estimate API calls:** `metros * discovery_wsas * (1 + enrichment_ratio)` where\n`enrichment_ratio` is ~0.3. Follow the Scaled Execution pattern from\n`references/nimble-playbook.md` to choose execution tier (individual / batch /\nmulti-batch / confirmation gate):\n\n```\nEstimated API calls: ~1,560 (50 states x 8 metros x 3 WSAs + enrichment)\nThis is a nationwide search. Proceed? [Y/n]\n```\n\nDerive a `slug` for checkpointing: lowercase, hyphenated, includes vertical + geo\n(e.g., `dentists-florida`, `saas-crm-tools`, `hvac-nationwide`).\n\n### Step 4: Check for Existing Checkpoint\n\nFollow the Checkpointing & Resume pattern from `references/memory-and-distribution.md`.\n\nCheck: `cat ~/.nimble/memory/market-finder/checkpoints/{slug}/discovery.json 2>/dev/null`\n\n- **Checkpoint found** -> offer: \"Found previous run ({N} entities from {date}).\n Resume and fill gaps, or start fresh?\"\n- **No checkpoint** -> proceed to Step 5\n\n### Step 5: WSA Discovery & Execution\n\n#### 5a: Discover available WSAs\n\nFor each target domain in the selected vertical preset, discover current WSAs:\n\n```bash\nnimble extract:templates list --limit 100 # then filter items for \"{domain}\"\n```\n\nRun these searches simultaneously (one per target domain). From the results:\n1. Filter by entity_type (SERP for discovery, PDP/Profile for enrichment)\n2. Prefer `managed_by: \"nimble\"` over `managed_by: \"community\"`\n3. If no WSA found for a domain, mark it for `nimble search` fallback\n4. If no WSAs found for ANY domain, fall back entirely to `nimble search` for all metros\n\nThen validate each discovered WSA's input params:\n```bash\nnimble extract:templates get --extract-template-name {discovered_name}\n```\n\nCache the discovered WSA names + params for the rest of the run.\n\n#### 5b: Geographic discovery (all except SaaS)\n\nFor each metro in the tiling plan, run the discovered WSAs simultaneously:\n\n```bash\nnimble extract:templates run --template {maps_wsa} --params '{...validated params...}'\n```\n```bash\nnimble extract:templates run --template {yelp_wsa} --params '{...validated params...}'\n```\n\nRun tertiary domain WSAs only if the preset includes them AND primary + secondary\nreturn < 10 combined unique results for that metro.\n\nChoose execution tier per the Scaled Execution pattern in\n`references/nimble-playbook.md` (based on total estimated calls from Step 3).\n\n#### 5c: SaaS discovery (non-geographic)\n\nSaaS skips WSA discovery. Run the two-pass search queries defined in the SaaS\npreset from `references/vertical-presets.md`:\n- **Pass 1 -- Product discovery:** G2, Capterra, general, ProductHunt, GitHub\n- **Pass 2 -- Financial discovery:** Crunchbase, funding news, market landscape\n\nBoth passes run simultaneously. Pass 2 is critical -- without it, funding and\ntraction data will be missing or wrong.\n\n#### 5d: Fallback\n\nIf no WSA was found for a target domain, or if a WSA fails for any metro:\n```bash\nnimble search --query \"[type] in [metro]\" --max-results 20 --search-depth lite\n```\n\n**After discovery:**\n1. Parse all results into a unified entity list\n2. Deduplicate following the Entity Deduplication pattern from\n `references/nimble-playbook.md`: place_id -> domain -> fuzzy name + city\n3. Track `source_count` per entity (how many WSAs/sources found it)\n4. Save checkpoint: `~/.nimble/memory/market-finder/checkpoints/{slug}/discovery.json`\n\n### Step 6: Enrichment\n\nRun enrichment using the WSAs discovered in Step 5a for the preset's enrichment\ntarget domains. Prioritize entities with the highest source count first. Choose\nexecution tier per Scaled Execution in `references/nimble-playbook.md`.\n\n```bash\nnimble extract:templates run --template {enrichment_wsa} --params '{...validated params...}'\n```\n\nOnly run enrichment WSAs that apply to the current vertical's enrichment targets\n(see `references/vertical-presets.md`). Skip entities without the required ID/URL\nfor the enrichment WSA.\n\nSave checkpoint: `~/.nimble/memory/market-finder/checkpoints/{slug}/enrichment.json`\n\n### Step 6b: Financial Verification (SaaS vertical)\n\nFor SaaS entities, verify funding claims before reporting. Never label a company's\nfunding stage without a source.\n\nFor each entity in the top results (top 5 in quick scan, all in comprehensive):\n```bash\nnimble search --query \"{company name} funding raised series\" --max-results 5 --search-depth lite\n```\n\n- **Source found:** Use the sourced amount and date\n- **No source found:** Display \"Undisclosed\" -- never guess \"Early stage\" or \"Bootstrapped\"\n\nThis step prevents publishing unverified financial claims. It's fast (one search\nper entity, lite depth) and catches recent funding rounds that directory sites miss.\n\n### Step 7: Deduplication & Scoring\n\n**Final deduplication:** Run a final dedup pass across all phases following the\nEntity Deduplication pattern from `references/nimble-playbook.md`. Merge fields\nfrom multiple sources into a single record per entity.\n\n**Discovery strength scoring** (skill-specific, varies by vertical):\n\nGeographic verticals (Healthcare, Restaurants, Legal, Auto/Home, Custom):\n\n| Level | Criteria |\n|-------|----------|\n| **High** | 3+ sources OR 2+ sources with reviews > 50 |\n| **Medium** | 2 sources OR 1 source with reviews > 10 |\n| **Low** | 1 source only, few/no reviews |\n\nSaaS vertical (funding + directory presence matter more than review count):\n\n| Level | Criteria |\n|-------|----------|\n| **High** | Verified funding > $10M OR 3+ directory sources OR 1000+ G2 reviews |\n| **Medium** | Verified funding < $10M OR 2 sources OR 100+ G2 reviews |\n| **Low** | 1 source only, no verified funding, few reviews |\n\nDisplay as: `*** High`, `** Medium`, `* Low`\n\n### Step 7b: Audit Comparison (Audit mode only)\n\n**Skip this step in Discovery mode.**\n\nRead `references/audit-mode.md` for the full matching algorithm, normalization rules,\nand output template.\n\n1. **Parse reference list** — detect format (Google Sheet / CSV / inline), extract\n records, normalize to `{name, domain, city, state, phone}` per the parsing rules\n in `references/audit-mode.md`\n2. **Run three matching layers** in order (domain → name+city → phone). Once an entity\n matches at any layer, stop. Track which layer produced the match.\n3. **Categorize** every entity:\n - `matched` — in both reference list and discovery results\n - `discovered_only` — found by discovery, not in reference list\n - `reference_only` — in reference list, not found by discovery\n4. **Calculate coverage score** — `matched / reference_count × 100`\n\nProceed to Step 8 with the categorized results.\n\n### Step 8: Output\n\n```\n# Market Finder: [Business Type] in [Geography]\n*Found [N] businesses | [Date] | Strength: [H] High, [M] Medium, [L] Low*\n\n## Summary\n- **Total discovered:** [N] unique businesses across [M] metros\n- **Geographic breakdown:** [top 5 metros by count]\n- **Source coverage:** [list each source used with entity counts]\n\n## Top Results (High Strength)\n\n| # | Name | Location | Rating | Reviews | Strength | Sources |\n|---|------|----------|--------|---------|----------|---------|\n| 1 | Acme Dental | Miami, FL | 4.8 | 312 | *** High | Maps, Yelp, BBB |\n| 2 | WidgetCo Health | Orlando, FL | 4.6 | 89 | *** High | Maps, Yelp |\n...\n\n## All Results by Geography\n\n### Miami, FL ([n] businesses)\n[Table of businesses in this metro]\n\n### Orlando, FL ([n] businesses)\n[Table of businesses in this metro]\n...\n\n## What's Missing\n[Data gaps: metros with low coverage, entities without websites, etc.]\n```\n\n**SaaS output variant** (when vertical is SaaS, replace \"All Results by Geography\"\nwith tier-based grouping):\n\n```\n## Players by Tier\n\n### Pure-Play (dedicated to this vertical)\n| # | Name | Domain | Funding | Key Metric | Strength | Sources |\n...\n\n### Adjacent (feature overlap from larger platforms)\n| # | Name | Domain | Funding | Key Metric | Strength | Sources |\n...\n\n### Open Source\n| # | Name | Repo | Stars | Key Metric | Strength | Sources |\n...\n```\n\n**Source links are mandatory.** Every entity must have at least one clickable source\nURL (Google Maps link, Yelp listing, website, BBB profile, G2 page, or GitHub repo).\n\n**Audit output variant** (when in Audit mode, replace the Discovery output above):\nUse the audit output template from `references/audit-mode.md`. Key sections: Summary\nwith coverage score, Matched table, Discovered Only table (expansion candidates),\nReference Only table (coverage gaps), and \"What This Means\" interpretation.\n\n### Step 9: Save to Memory\n\nMake all Write calls simultaneously:\n\n**Discovery mode:**\n- Report -> `~/.nimble/memory/reports/market-finder-{slug}-{date}.md`\n- Entity data -> `~/.nimble/memory/market-finder/{slug}/entities.json`\n\n**Audit mode:**\n- Report -> `~/.nimble/memory/reports/market-finder-audit-{slug}-{date}.md`\n- Structured data -> `~/.nimble/memory/market-finder/{slug}/audit-{date}.json`\n (all three categories with match metadata)\n\n**Both modes:**\n- Profile -> update `last_runs.market-finder` in `~/.nimble/business-profile.json`\n (only if profile exists)\n- Follow the wiki update pattern from `references/memory-and-distribution.md`: update\n `index.md` rows for all affected entity files, append a `log.md` entry for this run.\n- Clean up checkpoint (complete run) or keep (partial run)\n\n### Step 10: Share & Distribute\n\n**Always offer distribution -- do not skip this step.** Follow\n`references/memory-and-distribution.md` for connector detection, sharing flow, and\nsource links enforcement.\n\nNotion: full results table as a dated subpage.\nSlack: TL;DR with total count + top 10 entities only.\n\n### Step 11: Follow-ups\n\n**Discovery mode follow-ups:**\n- **\"Tell me more about #N\"** -> show full detail for that entity\n- **\"Filter by [criteria]\"** -> re-filter existing results\n- **\"Expand to [new geography]\"** -> add metros and re-run discovery\n- **\"Export as CSV\"** -> generate CSV from entities.json\n- **\"Run enrichment on all\"** -> extend enrichment beyond top entities\n- **\"Audit against my existing list\"** -> switch to Audit mode with this run's results\n- **\"Looks good\"** -> done\n\n**Audit mode follow-ups:**\n- **\"Export discovered-only as CSV for outreach?\"** -> CSV of expansion candidates\n- **\"Investigate reference-only gaps?\"** -> targeted searches for reference_only entries\n- **\"Run company-deep-dive on new discoveries?\"** -> deep research on discovered_only\n- **\"Re-run with a different geography?\"** -> audit the same list against a new area\n- **\"Looks good\"** -> done\n\n**Sibling skill suggestions:**\n\n> **Next steps:**\n> - Run `company-deep-dive` for a full 360 profile on any business from this list\n> - Run `competitor-positioning` to compare top players in this market\n> - Run `local-places` for neighborhood-level discovery with social enrichment and maps\n\n---\n\n## Sub-Agent Strategy\n\nFor large jobs, `nimble extract:templates batch` handles WSA parallelism server-side (see\nScaled Execution in `references/nimble-playbook.md`). Sub-agents are useful for\n**preparing** batch inputs and **processing** results, not for running individual\nWSA calls.\n\nUse `nimble-researcher` agents (`agents/nimble-researcher.md`) when:\n- Building metro query lists for large geographies (one agent per state)\n- Processing and deduplicating batch results in parallel\n\nFollow the sub-agent spawning rules from `references/nimble-playbook.md`\n(bypassPermissions, batch max 4, fallback on failure).\n\n---\n\n## Agent Teams Mode (Dual-Mode)\n\nCheck at startup: `echo $CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS`\n\n**Team mode** (flag set): Spawn **teammates** for parallel phases:\n\n- **Discovery teammate(s):** Run all discovery WSAs across metro batches\n- **Enrichment teammate:** Run enrichment WSAs for top entities\n- **Lead** (you): Coordinate, scope, deduplicate, score, generate output\n\n**Solo mode** (flag not set): Standard sequential flow from Steps 5-8.\n\n---\n\n## Error Handling\n\nSee `references/nimble-playbook.md` for the standard error table (missing API key,\n429, 401, empty results, extraction garbage). Skill-specific errors:\n\n- **WSA not found:** Skip silently and rely on other discovery sources. Log which\n WSAs were unavailable.\n- **Search 500/timeout:** Retry once without `--focus` flag. If still failing,\n retry with a simplified query. Log the failure but don't skip the entire search\n category -- partial data is better than none.\n- **No results for metro:** \"No [type] found in [metro]. Skipping to next metro.\"\n Don't abort the entire job for one empty metro.\n- **Ambiguous business type:** \"Did you mean [option A] or [option B]?\"\n (e.g., \"practice\" could be medical, dental, legal)\n- **SaaS with geography:** If the selected preset has no geo-tiling but the user\n specified a geography, offer it as a search qualifier instead.\n- **Reference list parse failure:** If Google Sheet extraction returns garbage or\n CSV is malformed, ask the user to paste the data inline instead.\n- **Empty reference list:** If parsed list has 0 valid records, warn and offer to\n switch to Discovery mode.\n- **No matches found:** If all three matching layers produce zero matches, report\n it — a 0% coverage score is valid and informative.\n"
}SHA-256: 0a25113b226e3ea3efc1aa3c58d3bb837e00add0082900c9fd9482d2b74d1557