← 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": "local-places",
"description": "Discovers, enriches, and scores local businesses in any neighborhood using\nNimble Web Search Agents (WSAs) and web data. Returns a structured, ranked\nlist with confidence scores, reviews, social presence, and an interactive map.\n\nUse this skill when the user asks about local businesses, places, or\nneighborhood discovery. Common triggers: \"find all coffee shops in\",\n\"map every bar in\", \"local businesses in\", \"discover gyms near\",\n\"what restaurants are in\", \"neighborhood guide for\", \"local places in\",\n\"find places near\", \"list all [business type] in [area]\", \"best [type]\nnear [location]\", \"build a neighborhood guide\", \"local place search\".\n\nRequires the Nimble CLI (nimble extract:templates run, nimble search, nimble extract)\nfor live web data via WSAs and fallback search.\nDo NOT use for competitor analysis or monitoring (use competitor-intel),\ncompany research or deep dives (use company-deep-dive), general web search\nor extraction (use nimble-web-expert).\n",
"included_files": [
{
"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/wsa-pipeline.md",
"size_in_bytes": 7193
}
],
"skill_md_contents": "---\nname: local-places\ndescription: |\n Discovers, enriches, and scores local businesses in any neighborhood using\n Nimble Web Search Agents (WSAs) and web data. Returns a structured, ranked\n list with confidence scores, reviews, social presence, and an interactive map.\n\n Use this skill when the user asks about local businesses, places, or\n neighborhood discovery. Common triggers: \"find all coffee shops in\",\n \"map every bar in\", \"local businesses in\", \"discover gyms near\",\n \"what restaurants are in\", \"neighborhood guide for\", \"local places in\",\n \"find places near\", \"list all [business type] in [area]\", \"best [type]\n near [location]\", \"build a neighborhood guide\", \"local place search\".\n\n Requires the Nimble CLI (nimble extract:templates run, nimble search, nimble extract)\n for live web data via WSAs and fallback search.\n Do NOT use for competitor analysis or monitoring (use competitor-intel),\n company research or deep dives (use company-deep-dive), general web search\n or extraction (use nimble-web-expert).\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 - Bash(open:*)\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: productivity\n---\n\n# Local Places\n\nLocation intelligence powered by Nimble Web Search Agents and web data APIs.\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,local-places/checkpoints}`\n- Check for existing checkpoints: `ls ~/.nimble/memory/local-places/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 the user's location preferences if any. Determine mode\n using smart date windowing from `references/nimble-playbook.md`:\n - **Full mode:** first run OR last run > 14 days ago\n - **Quick refresh:** last run < 14 days ago (skip social enrichment, reviews only\n for new places)\n - **Same-day repeat:** if `last_runs.local-places` is today, check if a report\n already exists at `~/.nimble/memory/reports/local-places-*[today].md`. If so,\n ask: \"Already ran today for this area. Run again for fresh data?\" Don't silently\n re-run.\n - Skip to Step 1\n- No profile -> that's fine. Local places doesn't require onboarding. Proceed to Step 1.\n\n### Step 1: Parse Request & Starting Questions\n\nParse `$ARGUMENTS` for place type and location. Extract:\n\n| Field | Required | Source |\n|-------|----------|--------|\n| Place type | Yes | User input (\"coffee shops\", \"gyms\", \"restaurants\") |\n| Location | Yes | User input (\"Williamsburg\", \"downtown Austin\", \"Park Slope\") |\n| Filters | Optional | User input (\"with good reviews\", \"open late\", \"cheap\") |\n| Output preference | Optional | User input (\"map\", \"list\", \"guide\") |\n\n**If both place type and location are clear** from `$ARGUMENTS`, confirm briefly and\nproceed: \"Searching for **coffee shops** in **Williamsburg, Brooklyn**...\"\n\n**If partial or ambiguous**, ask one combined question in plain text:\n\n> \"What type of places are you looking for, and where? (e.g., 'coffee shops in\n> Williamsburg' or 'gyms near downtown Austin')\"\n\n**If the user provided both but you want to scope further**, use AskUserQuestion\n(counts as 1 of max 2 prompts):\n\n> **How thorough should this search be?**\n> - **Quick scan** -- top results from Google Maps + Yelp (~20 places)\n> - **Comprehensive** -- full discovery + social enrichment + reviews (~50+ places)\n> - **Deep dive with map** -- everything above + interactive neighborhood map\n\n### Step 2: Location Disambiguation\n\nBefore any API calls, resolve the location to avoid wasted searches.\n\n**Disambiguation triggers:**\n- Location name exists in multiple cities/states (e.g., \"Williamsburg\" = Brooklyn NY\n vs. Williamsburg VA)\n- Location is a broad area (e.g., \"downtown Austin\" = multiple neighborhoods)\n- Location is informal (e.g., \"Soho\" = NYC vs. London)\n\n**If ambiguous**, ask the user (counts toward 2-prompt max):\n\n> \"There are a few places called **Williamsburg**. Which one?\"\n> - **Williamsburg, Brooklyn, NY**\n> - **Williamsburg, VA**\n> - **Other -- I'll specify**\n\n**If unambiguous**, infer the full location (city + state/country) and confirm inline:\n\"Searching **Williamsburg, Brooklyn, NY**...\"\n\nAfter disambiguation, derive the `slug` for checkpointing and file paths:\nlowercase, hyphenated, includes city + state/country (e.g., `williamsburg-brooklyn-ny`).\n\n### Step 3: Check for Existing Checkpoint\n\nFollow the Checkpointing & Resume pattern from `references/memory-and-distribution.md`.\n\nCheck: `cat ~/.nimble/memory/local-places/checkpoints/{slug}/discovery.json 2>/dev/null`\n\n- **Checkpoint found** -> offer: \"Found previous run ({N} places from {date}).\n Resume and fill gaps, or start fresh?\"\n- **No checkpoint** -> proceed to Step 4\n\n### Step 4: WSA Discovery\n\nDiscover available WSAs for all phases before execution. Run these searches\nsimultaneously:\n\n```bash\nnimble extract:templates list --limit 100 # then filter items for \"maps\"\n```\n\n```bash\nnimble extract:templates list --limit 100 # then filter items for \"reviews\"\n```\n\n```bash\nnimble extract:templates list --limit 100 # then filter items for \"social\"\n```\n\n```bash\nnimble extract:templates list --limit 100 # then filter items for \"{place-type}\"\n```\n\nFrom the combined results:\n1. Filter by `entity_type`: SERP for discovery, PDP/Profile for enrichment/detail\n2. Prefer `managed_by: \"nimble\"` over `managed_by: \"community\"`\n3. Classify into phases -- see `references/wsa-pipeline.md` for classification strategy\n4. Validate each with `nimble extract:templates get --extract-template-name {name}` to confirm params\n5. Cache all discovered WSA names + validated params for the rest of the run\n\nIf no WSAs found for a phase, that phase falls back to `nimble search`. Log\nwhich phases had WSA coverage and which are using fallback.\n\n### Step 5: Primary Search (Phase 1)\n\nRead `references/wsa-pipeline.md` for category detection logic.\n\nRun discovered maps/location WSAs simultaneously, using the validated params from\nStep 4:\n\n```bash\nnimble extract:templates run --template {discovered_maps_wsa} --params '{...validated params...}'\n```\n\n```bash\nnimble extract:templates run --template {discovered_review_site_wsa} --params '{...validated params...}'\n```\n\n**Tertiary (conditional):** Run discovered credibility WSAs only if primary +\nsecondary return < 10 combined unique results, or if the user asked for\ncredibility/trust data.\n\nIf any WSA fails or returns empty, fall back to:\n`nimble search --query \"[place-type] in [location]\" --max-results 20 --search-depth lite`\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 exact match -> domain normalization ->\n fuzzy name + city\n3. Save checkpoint:\n `~/.nimble/memory/local-places/checkpoints/{slug}/discovery.json`\n\n### Step 6: Social Enrichment (Phase 2)\n\nFor each discovered place that has a Facebook page or Instagram handle, run the\nsocial WSAs discovered in Step 4. Batch max **4 concurrent Bash calls**.\n\n```bash\nnimble extract:templates run --template {discovered_social_wsa} --params '{...validated params...}'\n```\n\nRun each discovered social WSA for places with matching handles. Skip social\nplatforms for which no WSA was discovered. If no social WSAs were found in Step 4,\nskip this phase entirely.\n\nSave checkpoint: `~/.nimble/memory/local-places/checkpoints/{slug}/social.json`\n\n### Step 7: Reviews (Phase 3)\n\nFor the top places (by source count and data completeness), run the review WSAs\ndiscovered in Step 4:\n\n```bash\nnimble extract:templates run --template {discovered_reviews_wsa} --params '{...validated params...}'\n```\n\nBatch max 4 concurrent calls. Focus on places that have a `place_id` or equivalent\nidentifier from Phase 1 discovery. If no review WSAs were found in Step 4, fall\nback to: `nimble search --query \"[place-name] reviews\" --max-results 5 --search-depth lite`\n\nSave checkpoint:\n`~/.nimble/memory/local-places/checkpoints/{slug}/reviews.json`\n\n### Step 8: Food/Drink Bonus (Phase 4)\n\n**Auto-trigger** when the place type category matches food/drink keywords.\nSee `references/wsa-pipeline.md` for the category detection logic.\n\nIf triggered, run the delivery/food WSAs discovered in Step 4. Discovery first,\nthen detail:\n\n```bash\nnimble extract:templates run --template {discovered_delivery_serp_wsa} --params '{...validated params...}'\n```\n\nFor places found on delivery platforms, fetch full details using discovered\ndetail WSAs:\n\n```bash\nnimble extract:templates run --template {discovered_delivery_detail_wsa} --params '{...validated params...}'\n```\n\nIf no delivery WSAs were found in Step 4, fall back to:\n`nimble search --query \"[place-name] [location] delivery\" --max-results 3 --search-depth lite`\n\nOnly run for food/drink categories. Skip if category doesn't match.\n\n### Step 9: Deduplication & Confidence Scoring\n\n**Deduplication:** Run a final dedup pass across all phases following the Entity\nDeduplication pattern from `references/nimble-playbook.md`. Merge fields from\nmultiple sources into a single enriched record per place.\n\n**Confidence scoring:** Follow the Entity Confidence Scoring pattern from\n`references/nimble-playbook.md`. Skill-specific target fields (N=8):\n\n| Field | Description |\n|-------|-------------|\n| name | Business name |\n| address | Full street address |\n| phone | Phone number |\n| website | Website URL |\n| rating | Average rating |\n| review_count | Number of reviews |\n| social | At least one social profile |\n| hours | Operating hours |\n\nScoring criteria:\n- **High** (8/8 fields + 2+ sources + 10+ reviews) -> display as `*** High`\n- **Medium** (5-7/8 fields OR 2+ sources with partial data) -> `** Medium`\n- **Low** (<=4/8 fields, single source, few/no reviews) -> `* Low`\n\n### Step 10: Output\n\nPresent results as a numbered table sorted by confidence (High first), then by\nrating within each tier.\n\n```\n# Local Places: [Place Type] in [Location]\n*Found [N] places | [Date] | Confidence: [H] High, [M] Medium, [L] Low*\n\n## Results\n\n| # | Name | Rating | Reviews | Confidence | Address | Sources |\n|---|------|--------|---------|------------|---------|---------|\n| 1 | Place A | 4.8 (312) | *** High | 123 Main St | [Maps][Yelp] |\n| 2 | Place B | 4.6 (89) | ** Medium | 456 Oak Ave | [Maps] |\n...\n\n## Top Picks (High Confidence)\n\n### 1. Place A\n- **Address:** 123 Main St, Williamsburg, Brooklyn, NY\n- **Phone:** (555) 123-4567 | **Website:** [placea.com](https://placea.com)\n- **Rating:** 4.8/5 (312 reviews on Google Maps, 289 on Yelp)\n- **Social:** Instagram @placea (2.1K followers) | Facebook (1.8K likes)\n- **Hours:** Mon-Fri 7am-7pm, Sat-Sun 8am-6pm\n- **Delivery:** Available on DoorDash, Uber Eats\n- **Why it stands out:** [1-2 sentences from review highlights]\n- **Sources:** [Google Maps](link) | [Yelp](link) | [Facebook](link)\n\n[Repeat for each High confidence place]\n\n## Other Results (Medium + Low Confidence)\n[Briefer format -- name, rating, address, missing data noted]\n\n## What's Missing\n[Note any data gaps: \"3 places had no website or social presence\",\n \"Reviews unavailable for BBB-only listings\"]\n```\n\n**Source links are mandatory.** Every place must have at least one clickable source\nURL (Google Maps link, Yelp listing, website, or social profile). Places without\nany source link should be noted in \"What's Missing\" but still included if they have\nsufficient data from WSA results.\n\n**Drill-down:** After presenting, tell the user:\n> \"Want details on any place? Say 'tell me more about #3' or ask for the\n> interactive map.\"\n\n### Step 11: Interactive Map (on request or \"Deep dive\" mode)\n\nGenerate an HTML file with Leaflet.js + OpenStreetMap tiles. See\n`references/wsa-pipeline.md` for the full map generation pattern and color scheme.\n\nSave to: `~/.nimble/memory/local-places/{slug}-map-{date}.html`\n\nOpen in browser: `open ~/.nimble/memory/local-places/{slug}-map-{date}.html`\n\nOnly generate automatically if the user chose \"Deep dive with map\" in Step 1.\nFor map generation details, see `references/wsa-pipeline.md`.\nOtherwise, offer it as a follow-up action.\n\n### Step 12: Save to Memory\n\nMake all Write calls simultaneously:\n\n- Report -> `~/.nimble/memory/reports/local-places-{slug}-{date}.md`\n- Per-place data -> `~/.nimble/memory/local-places/{slug}/places.json`\n (structured JSON with all enriched records)\n- Profile -> update `last_runs.local-places` 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 13: 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 top 5 places only.\n\n### Step 14: Follow-ups\n\n- **\"Tell me more about #N\"** -> show full detail for that place\n- **\"Show the map\"** -> generate interactive map (Step 11)\n- **\"Add filters\"** -> re-search with additional constraints\n- **\"Search nearby area\"** -> expand to adjacent neighborhoods\n- **\"Export as CSV\"** -> generate CSV from places.json\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 `meeting-prep` if you're meeting with someone at one of these businesses\n> - Run `competitor-positioning` to compare businesses in this area\n\n---\n\n## Sub-Agent Strategy\n\nFor comprehensive searches (50+ places), use `nimble-researcher` agents\n(`agents/nimble-researcher.md`) to parallelize enrichment.\n\nFollow the sub-agent spawning rules from `references/nimble-playbook.md`\n(bypassPermissions, batch max 4, explicit Bash instruction, fallback on failure).\nFor WSA calls at scale (11+ entities), tell agents to use `agent run-batch` instead\nof individual calls. See the Scaled Execution pattern in\n`references/nimble-playbook.md` for tier selection. Pass the discovered WSA names\nfrom Step 4 to each agent so they use the same cached names.\n\n**Spawn pattern:** One agent per batch of 10 places for social enrichment.\nEach agent runs the Phase 2 WSAs for its batch and returns structured results.\n\n**Single-batch optimization:** If <= 10 places, run enrichment directly from the\nmain context instead of spawning agents -- saves overhead.\n\n**Fallback:** If any agent fails, run those WSA calls directly from the main context.\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**: Runs all Phase 1 WSAs, deduplicates, returns unified list\n- **Enrichment teammate**: Runs Phases 2-4 for each place batch\n- **Lead** (you): Coordinates, scores, generates output and map\n\n**Solo mode** (flag not set): Standard sequential flow from Steps 4-7.\n\n---\n\n## Error Handling\n\nSee `references/nimble-playbook.md` for the standard error table (missing API key, 429,\n401, empty results, extraction garbage). Skill-specific errors:\n\n- **WSA/Search 500:** Retry once with the same params. If still failing, fall back\n to `nimble search` for that place/query. Log the failure but don't skip the place.\n- **WSA/Search timeout:** Retry once, then skip that call and continue — consistent\n with the playbook's timeout policy.\n- **WSA not found:** If no WSAs are discovered for a phase, skip that phase's WSA\n calls and fall back to `nimble search`. Log which phases had no WSA coverage.\n- **Location not found:** \"Couldn't find results for [location]. Could you be more specific?\n Try including city and state (e.g., 'Williamsburg, Brooklyn, NY').\"\n- **No results for place type:** \"No [place type] found in [location]. Want to try a\n broader category or nearby area?\"\n- **Ambiguous place type:** \"Did you mean [option A] or [option B]?\" (e.g., \"bar\" could be\n cocktail bar, sports bar, wine bar)\n"
}SHA-256: e08f5b5b38cd1a8e5a4d1fb966e40882a1f042e2382733a5bf6a3e031bd1d923