← NimbleCONTENT HISTORY

Update to Nimble

Snapshot Sep 30, 2026 · 22:54 UTC · version 1.7.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "healthcare-providers-extract",
  "description": "Extracts structured practitioner data from healthcare practice websites.\nReturns names, credentials, specialties, contact info, and education for\nevery provider on a practice's site.\n\nUse when user asks to extract, pull, or list doctors, providers, or staff\nfrom practice websites. Triggers: \"extract doctors from\", \"pull providers\nfrom\", \"who are the providers at\", \"build a provider database\", \"list all\ndoctors at\", \"scrape the team page\", \"get practitioner data from\".\n\nAccepts practice URLs (pasted, CSV, Google Sheet) or discovers practices\nvia Google Maps when given specialty + location. Single sites or 100+ URLs.\n\nDo NOT use for filling data gaps — use healthcare-providers-enrich instead.\nDo NOT use for credential validation — use healthcare-providers-verify instead.\nDo NOT use for discovering practices — use market-finder or local-places instead.\nDo NOT use for general extraction — use nimble-web-expert instead.\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/provider-extraction-patterns.md",
      "size_in_bytes": 6868
    },
    {
      "relative_path": "references/wsa-reference.md",
      "size_in_bytes": 7457
    }
  ],
  "skill_md_contents": "---\nname: healthcare-providers-extract\ndescription: |\n  Extracts structured practitioner data from healthcare practice websites.\n  Returns names, credentials, specialties, contact info, and education for\n  every provider on a practice's site.\n\n  Use when user asks to extract, pull, or list doctors, providers, or staff\n  from practice websites. Triggers: \"extract doctors from\", \"pull providers\n  from\", \"who are the providers at\", \"build a provider database\", \"list all\n  doctors at\", \"scrape the team page\", \"get practitioner data from\".\n\n  Accepts practice URLs (pasted, CSV, Google Sheet) or discovers practices\n  via Google Maps when given specialty + location. Single sites or 100+ URLs.\n\n  Do NOT use for filling data gaps — use healthcare-providers-enrich instead.\n  Do NOT use for credential validation — use healthcare-providers-verify instead.\n  Do NOT use for discovering practices — use market-finder or local-places instead.\n  Do NOT use for general extraction — use nimble-web-expert 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  - Bash(wc:*)\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: healthcare\n---\n\n# Healthcare Providers Extract\n\nStructured practitioner extraction from healthcare practice websites, powered by\nNimble's 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 + WSA Discovery\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\n**Also simultaneously** — run WSA discovery and setup:\n- `mkdir -p ~/.nimble/memory/{reports,healthcare-providers-extract/checkpoints}`\n- `ls ~/.nimble/memory/healthcare-providers-extract/checkpoints/ 2>/dev/null`\n- Run Layer 1 (vertical) and Layer 3 (general tools) WSA discovery from\n  `references/wsa-reference.md`. Layer 2 (session-specific) runs after Step 1 when\n  you know the user's specialty.\n\nClassify discovered agents into phases and validate with `nimble extract:templates get` per\n`references/wsa-reference.md`.\n\nFrom the preflight 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 it for context. Determine mode using smart date windowing\n  from `references/nimble-playbook.md`:\n  - **Full mode:** first run OR last run > 14 days ago\n  - **Quick refresh:** last run < 14 days ago (re-extract only new/changed pages)\n  - **Same-day repeat:** if `last_runs.healthcare-providers-extract` is today, check\n    for existing report at `~/.nimble/memory/reports/healthcare-providers-extract-*[today].md`.\n    If found, ask: \"Already ran today. Run again for fresh data?\"\n- No profile -> that's fine. This skill doesn't require onboarding. Proceed to Step 1.\n\n### Step 1: Parse Input & Starting Questions\n\nParse `$ARGUMENTS` for input type using the Input Parsing Pattern from\n`references/nimble-playbook.md`. Key routing:\n- **URLs detected** -> proceed to Step 3\n- **Specialty + location** (no URLs) -> proceed to Step 2 (practice discovery)\n- **Unclear** -> ask (counts as 1 of max 2 prompts)\n\n**If input is clear**, confirm and ask one shaping question (plain text, not\nAskUserQuestion):\n\n> \"Extracting providers from **N practice sites**. Quick questions:\n> 1. Healthcare vertical? (ophthalmology, dental, dermatology, general, or other)\n> 2. Quick scan (names + credentials only) or full extraction (all 5 fields)?\"\n\n**If input is ambiguous**, use AskUserQuestion (counts as 1 of max 2 prompts):\n\n> **What practice sites should I extract providers from?**\n> - Paste URLs directly (one per line)\n> - Provide a CSV file path or Google Sheet URL with practice URLs\n> - Or describe what you're looking for (e.g., \"ophthalmologists in Austin, TX\")\n>   and I'll find practices first\n\nSkip questions the user already answered in their initial message.\n\n### Step 2: Practice Discovery (Optional)\n\nOnly if the user provided a specialty + location instead of URLs.\n\n**Two input paths into discovery:**\n\n**Path A — Fresh discovery.** User gave specialty + location. Run Layer 2 WSA\ndiscovery for session-specific agents:\n\n```bash\nnimble extract:templates list --limit 50  # filter items for \"[specialty]\"\nnimble extract:templates list --limit 50  # filter items for \"[directory-user-mentioned]\"\n```\n\nSee `references/wsa-reference.md` for the full discovery strategy, agent evaluation\ncriteria, and healthcare discovery prioritization.\n\nRun all discovery-phase agents simultaneously. Validate params with\n`nimble extract:templates get` first.\n\n**Path B — Market-finder handoff.** User ran `market-finder` first and wants to\nextract providers from those results. Read the market-finder output:\n\n```bash\ncat ~/.nimble/memory/market-finder/{slug}/entities.json 2>/dev/null\n```\n\nExtract practice records. Note: Google Maps results contain `place_url` (a Maps\nlink) but not the practice's actual website URL. Proceed to Step 2b to resolve\nreal website URLs before site mapping.\n\n**After either path:** Deduplicate by domain. Present discovered practices:\n\n> \"Found **N practices** for [specialty] in [location] across [M] data sources.\n> Proceeding to extract providers from these sites...\"\n\n**Fallback** — if no discovery WSAs were found, or results are sparse (< 3):\n```bash\nnimble search --query \"[specialty] in [location]\" --max-results 20 --search-depth lite\n```\n\n### Step 2b: Resolve Practice Website URLs\n\nDiscovery sources (Google Maps, Yelp, BBB) return listing URLs, not practice\nwebsite URLs. Before site mapping, resolve the actual website for each practice:\n\n1. **Check structured data first** — Google Maps results often include a `website`\n   field in the structured output. Use it if present.\n2. **Extract from listing page** — if no `website` field, extract the Maps listing\n   to find the practice website link:\n   ```bash\n   nimble extract --url \"[maps-listing-url]\" --format markdown\n   ```\n3. **Search fallback** — if extraction fails:\n   ```bash\n   nimble search --query \"[practice-name] [city] official website\" --max-results 3 --search-depth lite\n   ```\n\nSkip practices where no website URL can be resolved — note them in the \"Data\nQuality Summary\" output section.\n\n### Step 3: Site Mapping\n\nFollow the Site Mapping Pattern from `references/nimble-playbook.md` for each\npractice URL. Skill-specific settings:\n- **Keyword weight table:** `references/provider-extraction-patterns.md`\n- **Page cap:** 15 per site\n- **Fallback query:** `site:[domain] doctors OR providers OR team`\n\nFor 6+ practices, use sub-agents (see Sub-Agent Strategy below).\n\nSave checkpoint: `~/.nimble/memory/healthcare-providers-extract/checkpoints/{slug}/mapping.json`\n\n### Step 4: Page Extraction\n\n**WSA shortcuts first:** If WSA discovery found agents that extract provider data\nfrom healthcare directories, use those for matching practices — structured WSA\noutput is higher quality than parsed markdown.\n\nFor all other practices, follow the Page Extraction with Retry pattern from\n`references/nimble-playbook.md`. Scale using the Scaled Execution pattern from\nthe same reference.\n\nSave checkpoint: `~/.nimble/memory/healthcare-providers-extract/checkpoints/{slug}/extraction.json`\n\n### Step 5: Structured Parsing\n\nParse extracted markdown to identify providers and their fields. Read\n`references/provider-extraction-patterns.md` for the 5 core fields, credential\nregex patterns, and specialty keywords.\n\n**For each extracted page:**\n1. Scan for provider name patterns (Dr. prefix, heading patterns, bold text near\n   credential suffixes)\n2. Match credentials using the regex patterns from\n   `references/provider-extraction-patterns.md`\n3. Match specialty using keywords for the detected healthcare vertical\n4. Extract contact info (phone regex, appointment URLs, email)\n5. Extract education/training mentions\n\n**Build structured records:**\n```json\n{\n  \"name\": \"Dr. Jane Smith\",\n  \"credentials\": \"MD, FACS\",\n  \"specialty\": \"Retinal Surgery\",\n  \"contact\": {\"phone\": \"(555) 123-4567\", \"scheduling_url\": \"...\"},\n  \"education\": \"Fellowship: Bascom Palmer Eye Institute\",\n  \"source_url\": \"https://practice.com/our-doctors\",\n  \"practice_name\": \"Shore Center for Eye Care\",\n  \"practice_url\": \"https://practice.com\",\n  \"confidence\": \"High\"\n}\n```\n\n### Step 6: Deduplication & Confidence Scoring\n\nFollow the Entity Deduplication and Entity Confidence Scoring patterns from\n`references/nimble-playbook.md`. Skill-specific dedup rules and the 5-field\nconfidence criteria are in `references/provider-extraction-patterns.md`.\n\n### Step 7: Output\n\nPresent results grouped by practice, sorted by confidence within each practice.\n\n```markdown\n# Provider Extraction: [N] Providers from [M] Practices\n*[Date] | [H] High, [M] Medium, [L] Low confidence*\n\n## TL;DR\nExtracted [N] providers from [M] practice websites. [H] with complete profiles,\n[L] with partial data. [Key finding: e.g., \"12 of 15 providers are board-certified\"].\n\n## [Practice Name] ([domain])\n\n| # | Name | Credentials | Specialty | Contact | Education | Confidence |\n|---|------|------------|-----------|---------|-----------|------------|\n| 1 | Dr. Jane Smith | MD, FACS | Retinal Surgery | (555) 123-4567 | Fellowship: Bascom Palmer | High |\n| 2 | Dr. John Doe | OD | General Ophthalmology | [Book](url) | Residency: Wills Eye | Medium |\n\n[Repeat per practice]\n\n## Data Quality Summary\n- **Complete profiles (High):** [N] providers\n- **Partial profiles (Medium):** [N] providers — missing: [list common gaps]\n- **Minimal profiles (Low):** [N] providers — missing: [list common gaps]\n\n## Sources\n[Clickable URL for every page extracted, grouped by practice]\n```\n\n**Source links are mandatory.** Every provider record must trace back to a source URL.\n\n### Step 8: Save to Memory\n\nMake all Write calls simultaneously:\n\n- Report -> `~/.nimble/memory/reports/healthcare-providers-extract-{slug}-{date}.md`\n- Provider data -> `~/.nimble/memory/healthcare-providers-extract/{slug}/providers.json`\n- Profile -> update `last_runs.healthcare-providers-extract` in\n  `~/.nimble/business-profile.json` (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 9: Share & Distribute\n\n**Always offer distribution -- do not skip.** Follow\n`references/memory-and-distribution.md` for connector detection and sharing flow.\n\nNotion: full provider table as a dated subpage.\nSlack: TL;DR with provider count and confidence breakdown only.\n\n### Step 10: Follow-ups\n\n- **\"Tell me more about Dr. X\"** -> show full extracted profile\n- **\"Export as CSV\"** -> generate CSV from providers.json\n- **\"Run on more sites\"** -> append new practice URLs, extract and merge\n- **\"What's missing?\"** -> detail the data gaps per provider\n\n**Enrichment from discovered WSAs:** If Step 0 found enrichment-phase agents\n(reviews, regulatory, practice details), offer them as immediate follow-ups:\n\n> \"I also found [N] WSAs that could enrich this data: [brief list]. Want me to\n> run reputation checks or regulatory lookups on these providers/practices?\"\n\nSee `references/wsa-reference.md` for enrichment phase mapping and fallback chains.\n\n**Sibling skill suggestions:**\n\n> **Next steps:**\n> - Run `healthcare-providers-enrich` to fill data gaps (NPI lookup, board\n>   certification verification, additional contact info)\n> - Run `healthcare-providers-verify` to validate credentials and license status\n> - Run `market-finder` to discover more practice URLs in this area\n\n---\n\n## Sub-Agent Strategy\n\nFor batch extraction (6+ practices), use `nimble-researcher` agents\n(`agents/nimble-researcher.md`) to parallelize site mapping and extraction.\n\nFollow the sub-agent spawning rules from `references/nimble-playbook.md`\n(bypassPermissions, batch max 4, explicit Bash instruction, fallback on failure).\n\n**Spawn pattern:** One agent per practice (or per batch of 3 practices for large\njobs). Each agent runs Steps 3-5 for its assigned practices and returns structured\nprovider records.\n\n**Single-practice optimization:** If only 1-2 practices, run directly from the\nmain context instead of spawning agents.\n\n**Fallback:** If any agent fails, run those extractions directly from the main\ncontext. Never leave gaps in the output.\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- **No provider pages found:** \"Couldn't find provider/team pages on [domain].\n  The site may list staff differently. Want me to try extracting from the homepage\n  or search for this practice on healthcare directories?\"\n- **All extractions returned garbage:** \"The practice sites appear to be heavily\n  JavaScript-rendered. Retrying with browser rendering...\" (auto-retry with\n  `--render` per the shared pattern)\n- **Ambiguous practice name:** If a URL fails and the user provided a name instead,\n  search for the practice: `nimble search --query \"[practice name] [location] doctors\" --max-results 5 --search-depth lite`\n- **CSV/Sheet parse error:** \"Couldn't parse the input file. Expected a column with\n  practice URLs. Can you paste the URLs directly instead?\"\n"
}

SHA-256: 04d190d917cb9db0e9e5f13856de5a00c0ccd6b6012ed2ab89db29ab27a4a676