[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N06TAXK8EMCCAE6ZSCEWGD":3,"skill-same:01M6N06TAXK8EMCCAE6ZSCEWGD":98},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":53,"linkOnly":54,"markdownContent":55,"markdownBody":56,"frontMatter":57,"refName":76,"commitSha":77,"skillDirectory":78,"forksCount":79,"repositoryHtmlUrl":80,"repositoryHomepageUrl":6,"ownerHtmlUrl":81,"ownerBlogUrl":82,"ownerDescription":83,"updatedAt":84,"install":85,"resources":97},"01M6N06TAXK8EMCCAE6ZSCEWGD","data-research",null,"Structured data research: search sources, extract structured data,\narchive raw sources, maintain canonical tracker pages, deduplicate.\nParameterized via YAML recipes for investor updates, donations,\ncompany updates, or any email-to-structured-data pipeline.","garrytan\u002Fgbrain","garrytan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19957?v=4","01M6DJCCDDG53MTYYRTXAXFG17","Garry Tan","01M6MZQZCEN3RRMD33E1X9ZZR9",32762,"MIT","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fplugin\u002Fskills\u002Fdata-research\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"data research","data","research","recipes","when","company","track","for","updates","canonical","add","sources","structured-data","get","query","maintain","tracker","pipeline","email","search","data pipeline","2026-11-10 10:12:30",false,"---\nname: data-research\nversion: 1.1.0\ndescription: |\n  Structured data research: search sources, extract structured data,\n  archive raw sources, maintain canonical tracker pages, deduplicate.\n  Parameterized via YAML recipes for investor updates, donations,\n  company updates, or any email-to-structured-data pipeline.\ntriggers:\n  - \"research\"\n  - \"track\"\n  - \"extract from email\"\n  - \"investor updates\"\n  - \"donations\"\n  - \"build a tracker\"\n  - \"data dig\"\ntools:\n  - search\n  - query\n  - get_page\n  - put_page\n  - add_link\n  - add_timeline_entry\n  - put_raw_data\n  - file_upload\nmutating: true\nupstream: data-research@fc834ee\nwhen_to_use: \"Use when the user asks: \\\"research\\\", \\\"track\\\", \\\"extract from email\\\", \\\"investor updates\\\", \\\"donations\\\".\"\n---\n\n# Data Research\n\nStructured research pipeline: search sources, extract structured data,\narchive raw, deduplicate, update canonical trackers, backlink entities.\n\n## Contract\n\nOne skill for any email-to-structured-data pipeline. The only differences\nbetween tracking investor updates, expenses, and company metrics\nare the **search queries**, **extraction schemas**, and **tracker page format**.\nAll three use the same 7-phase pipeline with parameterized recipes.\n\n## When to Use\n\n- User wants to track structured data from email, web, or API sources\n- User says \"research\", \"track\", \"extract from email\", \"build a tracker\"\n- User mentions investor updates, donations, company metrics, filings\n- User wants to set up recurring data collection (with cron recipe)\n\n## Phases\n\n### Phase 1: Define Research Recipe\n\nInfer the research target from conversation context, recent brain activity, active\ntasks (`ops\u002Ftasks.md`), and memory files. If the request is ambiguous, present the\nmost likely interpretation based on what the user has been working on. Only ask for\nclarification if context is genuinely insufficient. Options:\n- Pick a built-in recipe: investor-updates, expense-tracker, company-updates\n- Define a custom recipe with: source queries, classification rules, extraction schema,\n  tracker page path, tracker format\n\nRecipes are YAML files at `~\u002F.gbrain\u002Frecipes\u002F{name}.yaml`. Scaffold a new one by\ncopying a built-in recipe file and editing its fields.\n\n### Phase 2: Search Sources\n\nBrain first (maybe we already have this data). Then:\n- **Email** via credential gateway: windowed queries (quarterly, monthly if truncated)\n- **Web** via search: public filings, press releases, regulatory data\n- **APIs**: any structured data source the recipe defines\n- **Attachments**: PDF extraction, HTML stripping\n\n### Phase 3: Classify\n\nDeterministic first (regex patterns from recipe), LLM fallback.\nLog every LLM fallback for future regex improvement (fail-improve loop).\nSkip marketing, newsletters, noise based on recipe's classification rules.\n\n### Phase 4: Extract Structured Data\n\n**EXTRACTION INTEGRITY RULE:**\n1. Save raw source immediately (before any extraction)\n2. Extract fields using deterministic regex first, LLM fallback\n3. When summarizing batch results: **re-read from saved files**\n4. Never trust LLM working memory after batch processing\n\nThis prevents a known hallucination bug where batch-processed amounts were\n13\u002F13 wrong from LLM working memory while saved files were correct.\n\n### Phase 5: Archive Raw Sources\n\n- `put_raw_data` for email bodies, API responses\n- `file_upload` for PDF attachments, documents\n- Create `.redirect.yaml` pointers for large files in storage\n- Every tracker entry must link back to its raw source\n\n### Phase 6: Deduplicate\n\nBefore adding to tracker:\n- Exact match (same key fields) → skip\n- Fuzzy match (same entity + date + similar amount within tolerance) → flag for review\n- Different amount for same entity+date → add with note (could be correction)\n\n### Phase 7: Update Canonical Tracker + Backlink\n\n- Parse existing tracker page (markdown table)\n- Append new entries in correct section (grouped by year\u002Fquarter\u002Fentity)\n- Compute running totals\n- Backlink every mentioned entity (person → people\u002F page, company → companies\u002F page)\n- Uses enrichment service for entity pages\n\n## Built-In Recipes\n\nThree example recipes ship with GBrain (see `~\u002F.gbrain\u002Frecipes\u002F`):\n\n1. **investor-updates** — extract MRR, ARR, growth, burn, runway, headcount from investor update emails\n2. **expense-tracker** — extract amounts, recipients, platforms from receipt emails (subscriptions, services, recurring charges)\n3. **company-updates** — extract revenue, users, key metrics from portfolio company update emails\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- `file_upload` is refused for a path outside the allowed root (remote callers are confined): ask the user to upload from the brain host or pass the content inline.\n- `put_page` \u002F `add_timeline_entry` returns `revision_conflict` or `write_pending`: re-read and merge for the first; poll `gbrain write-request \u003Crequest_id>` for the second.\n- An extraction source rate-limits (`rate_limited`): back off for the stated delay and keep the cursor; log the gap instead of guessing the missing rows.\n\n## Anti-Patterns\n\n- Trusting LLM working memory for amounts after batch processing (use extraction integrity rule)\n- Creating tracker entries without raw source links\n- Running without deduplication (leads to double-counted entries)\n- Hardcoding source-specific patterns in the pipeline code (use recipes)\n\n## Output Format\n\nBrain page at the recipe's `tracker_page` path with markdown tables:\n\n```markdown\n### 2026\n\n| Date | Company | MRR | ARR | Growth | Status |\n|------|---------|-----|-----|--------|--------|\n| 2026-04-01 | Example Co | $188K | $2.3M | +14.7% MoM | [Source](link) |\n```\n\nEach entry links to its raw source. Running totals at the bottom of each section.\n\n## Conventions\n\nReferences `skills\u002Fconventions\u002Fquality.md` for citation and back-linking rules.\n","# Data Research\n\nStructured research pipeline: search sources, extract structured data,\narchive raw, deduplicate, update canonical trackers, backlink entities.\n\n## Contract\n\nOne skill for any email-to-structured-data pipeline. The only differences\nbetween tracking investor updates, expenses, and company metrics\nare the **search queries**, **extraction schemas**, and **tracker page format**.\nAll three use the same 7-phase pipeline with parameterized recipes.\n\n## When to Use\n\n- User wants to track structured data from email, web, or API sources\n- User says \"research\", \"track\", \"extract from email\", \"build a tracker\"\n- User mentions investor updates, donations, company metrics, filings\n- User wants to set up recurring data collection (with cron recipe)\n\n## Phases\n\n### Phase 1: Define Research Recipe\n\nInfer the research target from conversation context, recent brain activity, active\ntasks (`ops\u002Ftasks.md`), and memory files. If the request is ambiguous, present the\nmost likely interpretation based on what the user has been working on. Only ask for\nclarification if context is genuinely insufficient. Options:\n- Pick a built-in recipe: investor-updates, expense-tracker, company-updates\n- Define a custom recipe with: source queries, classification rules, extraction schema,\n  tracker page path, tracker format\n\nRecipes are YAML files at `~\u002F.gbrain\u002Frecipes\u002F{name}.yaml`. Scaffold a new one by\ncopying a built-in recipe file and editing its fields.\n\n### Phase 2: Search Sources\n\nBrain first (maybe we already have this data). Then:\n- **Email** via credential gateway: windowed queries (quarterly, monthly if truncated)\n- **Web** via search: public filings, press releases, regulatory data\n- **APIs**: any structured data source the recipe defines\n- **Attachments**: PDF extraction, HTML stripping\n\n### Phase 3: Classify\n\nDeterministic first (regex patterns from recipe), LLM fallback.\nLog every LLM fallback for future regex improvement (fail-improve loop).\nSkip marketing, newsletters, noise based on recipe's classification rules.\n\n### Phase 4: Extract Structured Data\n\n**EXTRACTION INTEGRITY RULE:**\n1. Save raw source immediately (before any extraction)\n2. Extract fields using deterministic regex first, LLM fallback\n3. When summarizing batch results: **re-read from saved files**\n4. Never trust LLM working memory after batch processing\n\nThis prevents a known hallucination bug where batch-processed amounts were\n13\u002F13 wrong from LLM working memory while saved files were correct.\n\n### Phase 5: Archive Raw Sources\n\n- `put_raw_data` for email bodies, API responses\n- `file_upload` for PDF attachments, documents\n- Create `.redirect.yaml` pointers for large files in storage\n- Every tracker entry must link back to its raw source\n\n### Phase 6: Deduplicate\n\nBefore adding to tracker:\n- Exact match (same key fields) → skip\n- Fuzzy match (same entity + date + similar amount within tolerance) → flag for review\n- Different amount for same entity+date → add with note (could be correction)\n\n### Phase 7: Update Canonical Tracker + Backlink\n\n- Parse existing tracker page (markdown table)\n- Append new entries in correct section (grouped by year\u002Fquarter\u002Fentity)\n- Compute running totals\n- Backlink every mentioned entity (person → people\u002F page, company → companies\u002F page)\n- Uses enrichment service for entity pages\n\n## Built-In Recipes\n\nThree example recipes ship with GBrain (see `~\u002F.gbrain\u002Frecipes\u002F`):\n\n1. **investor-updates** — extract MRR, ARR, growth, burn, runway, headcount from investor update emails\n2. **expense-tracker** — extract amounts, recipients, platforms from receipt emails (subscriptions, services, recurring charges)\n3. **company-updates** — extract revenue, users, key metrics from portfolio company update emails\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- `file_upload` is refused for a path outside the allowed root (remote callers are confined): ask the user to upload from the brain host or pass the content inline.\n- `put_page` \u002F `add_timeline_entry` returns `revision_conflict` or `write_pending`: re-read and merge for the first; poll `gbrain write-request \u003Crequest_id>` for the second.\n- An extraction source rate-limits (`rate_limited`): back off for the stated delay and keep the cursor; log the gap instead of guessing the missing rows.\n\n## Anti-Patterns\n\n- Trusting LLM working memory for amounts after batch processing (use extraction integrity rule)\n- Creating tracker entries without raw source links\n- Running without deduplication (leads to double-counted entries)\n- Hardcoding source-specific patterns in the pipeline code (use recipes)\n\n## Output Format\n\nBrain page at the recipe's `tracker_page` path with markdown tables:\n\n```markdown\n### 2026\n\n| Date | Company | MRR | ARR | Growth | Status |\n|------|---------|-----|-----|--------|--------|\n| 2026-04-01 | Example Co | $188K | $2.3M | +14.7% MoM | [Source](link) |\n```\n\nEach entry links to its raw source. Running totals at the bottom of each section.\n\n## Conventions\n\nReferences `skills\u002Fconventions\u002Fquality.md` for citation and back-linking rules.\n",{"name":5,"tools":58,"version":65,"mutating":66,"triggers":67,"upstream":73,"description":74,"when_to_use":75},[51,46,59,60,61,62,63,64],"get_page","put_page","add_link","add_timeline_entry","put_raw_data","file_upload","1.1.0",true,[34,38,68,69,70,71,72],"extract from email","investor updates","donations","build a tracker","data dig","data-research@fc834ee","Structured data research: search sources, extract structured data,\narchive raw sources, maintain canonical tracker pages, deduplicate.\nParameterized via YAML recipes for investor updates, donations,\ncompany updates, or any email-to-structured-data pipeline.\n","Use when the user asks: \"research\", \"track\", \"extract from email\", \"investor updates\", \"donations\".","master","074ec301549ded4930f04d2c3b22d709a6c095cc","plugin\u002Fskills\u002Fdata-research",4884,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain","https:\u002F\u002Fgithub.com\u002Fgarrytan","https:\u002F\u002Fblog.garrytan.com","Writes software, dreams. ","2026-11-13 04:05:07",{"source":8,"skillName":5,"commands":86,"prompt":96,"zipAvailable":66},[87,90,93],{"tool":88,"command":89},"npx","npx skills add garrytan\u002Fgbrain --skill data-research",{"tool":91,"command":92},"bunx","bunx skills add garrytan\u002Fgbrain --skill data-research",{"tool":94,"command":95},"pnpm","pnpm dlx skills add garrytan\u002Fgbrain --skill data-research","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fplugin\u002Fskills\u002Fdata-research\u002FSKILL.md",[],[99,110,116,139,163,177],{"skillNo":100,"name":101,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":53},"01M6N109FNGH1PK49T734PZXGB","query-helper","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[105,106,46,51,107,108,109],"query helper","helper","page","find","false",{"skillNo":111,"name":112,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":53},"01M6N108A23GW6NGQEQ0E7GV0A","broken","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[112],{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":53},"01M6N105E88C5K2H03H0CC79G1","brain-ops","Read, enrich, and write brain pages with source attribution.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbrain-ops\u002FSKILL.md",[],[123,124,125,126,127,107,128,129,130,131,46,132,133,134,135,136,137,138,51],"brain ops","brain","ops","true","attribution","read","write","up","look","pages","people","with","enrich","web","path","source",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":148,"publishedAt":53},"01M6N102GRMF22TVCNT6RK5MRD","meeting-prep","Build a briefing before you meet someone, from their recent threads, open loops and what they care about.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fmeeting-prep\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000034","行政与办公人员",[149,150,151,152,153,51,154,155,156,46,109,157,158,159,160,161,39,162],"meeting","prep","meeting prep","me","prepare","brief","open","build","loops","about","you","briefing","threads","Meet",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":169,"publishedAt":53},"01M6N1005QK7REHX5KGMNR5PF0","inbox-zero","Triage the inbox into replies, delegations and archives.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Finbox-zero\u002FSKILL.md",[],[170,171,172,51,173,109,174,175,176],"inbox zero","ZeRO","inbox","clear","replies","my","triage",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":53},"01M6N0ZXQ8RRRW71PNV61T57GP","deal-memo","Draft an investment memo from the deal pages and the founder history already in the brain.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fdeal-memo\u002FSKILL.md",[],[184,185,186,132,124,187,188,129,189,126,51,190],"deal memo","deal","memo","draft","investment","history","founder"]