[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71GS2KHGASQH2AMTC966EMW":3,"skill-same:01M71GS2KHGASQH2AMTC966EMW":93},{"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":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":73,"commitSha":74,"skillDirectory":75,"forksCount":14,"repositoryHtmlUrl":76,"repositoryHomepageUrl":6,"ownerHtmlUrl":77,"ownerBlogUrl":6,"ownerDescription":78,"updatedAt":79,"install":80,"resources":92},"01M71GS2KHGASQH2AMTC966EMW","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.","weareturnone\u002Fgbrain","weareturnone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F106660686?v=4","01M71GRFW4YZ9DFYK6J17YXQNB","Roelof Stoelwinder ","01M71GRFWVQF5ASVB08TP5VKWG",0,"MIT","https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain\u002Fblob\u002Fmaster\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],"data","research","data research","for","email","add","recipes","canonical","tracker","track","query","updates","data pipeline","maintain","company","structured-data","search","pipeline","get","sources","2026-11-10 10:12:30",false,"---\nname: data-research\nversion: 1.0.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\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\nAsk the user what they want to track. Either:\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`. Use `gbrain research init`\nto scaffold a new one.\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## 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\nAsk the user what they want to track. Either:\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`. Use `gbrain research init`\nto scaffold a new one.\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## 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":57,"version":64,"mutating":65,"triggers":66,"description":72},[48,42,58,59,60,61,62,63],"get_page","put_page","add_link","add_timeline_entry","put_raw_data","file_upload","1.0.0",true,[33,41,67,68,69,70,71],"extract from email","investor updates","donations","build a tracker","data dig","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","master","1fd9e273fe234ffb8d2a7705955f087f861a5c3d","skills\u002Fdata-research","https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain","https:\u002F\u002Fgithub.com\u002Fweareturnone","I have a passion for operations, systems and doing good for the world.","2026-07-08 23:38:19",{"source":8,"skillName":5,"commands":81,"prompt":91,"zipAvailable":65},[82,85,88],{"tool":83,"command":84},"npx","npx skills add weareturnone\u002Fgbrain --skill data-research",{"tool":86,"command":87},"bunx","bunx skills add weareturnone\u002Fgbrain --skill data-research",{"tool":89,"command":90},"pnpm","pnpm dlx skills add weareturnone\u002Fgbrain --skill data-research","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fdata-research\u002FSKILL.md",[],[94,110,123,138,154,175],{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":52},"01M71GTZ2PH49PD2R6RR7MHJZP","signal-detector","Always-on ambient signal capture for the OpenClaw reference fixture.","https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fopenclaw-reference-minimal\u002Fskills\u002Fsignal-detector\u002FSKILL.md",[],[101,102,103,35,104,105,106,107,108,109],"signal","signal detector","detector","openclaw","capture","reference","message","fixture","ambient",{"skillNo":111,"name":42,"nameZh":6,"description":112,"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":52},"01M71GTY1250DC73PGRWDE82KW","Look up brain pages in the OpenClaw reference fixture.","https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fopenclaw-reference-minimal\u002Fskills\u002Fquery\u002FSKILL.md",[],[42,116,106,117,104,118,119,120,121,48,122,35,108],"do","lookup","look","pages","up","brain","about",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":52},"01M71GTX0T1T9224P29SD7CSG7","context-now","ALWAYS-ON time-sensitivity discipline for the OpenClaw reference fixture.","https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fopenclaw-reference-minimal\u002Fskills\u002Fcontext-now\u002FSKILL.md",[],[130,131,132,133,134,104,35,135,106,108,136,137],"context","context now","now","time","how","discipline","sensitivity","long",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":52},"01M71GTVZJTSWXBM4ZRF4A7QVA","brain-ops","Core read\u002Fwrite cycle for the OpenClaw reference fixture.","https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fopenclaw-reference-minimal\u002Fskills\u002Fbrain-ops\u002FSKILL.md",[],[145,121,146,147,117,104,148,106,149,35,150,151,152,108,153],"brain ops","ops","Citation","people","true","read","cycle","core","write",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":52},"01M71GTT4F64V9RMNZ0WRTKWNG","webhook-transforms","Generic framework for converting external events (SMS, meetings, social mentions)\ninto brain-ingestible signals. Define a transform function, register a webhook URL,\nand incoming events get processed through the brain pipeline.","https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fwebhook-transforms\u002FSKILL.md",[],[161,162,163,164,165,120,166,167,168,169,149,170,48,171,49,172,35,173,174,50],"webhook","transforms","webhook transforms","SET","register","meetings","signals","URL","define","social","event","page","sms","generic",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":190,"publishedAt":52},"01M71GTRDKSM500PRZEXFNQHF9","testing","Skill validation framework. Validates every skill has SKILL.md with frontmatter,\nevery reference exists, every env var is declared. The testing contract for the\nskill system itself.","https:\u002F\u002Fgithub.com\u002Fweareturnone\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Ftesting\u002FSKILL.md",[181,184,187],{"categoryNo":182,"categoryName":183,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":185,"categoryName":186,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":188,"categoryName":189,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000037","律师与法务",[177,191,192,193,194,195,196,197,198,199,200,201,202,203,119,204,48,205,206,35],"test skills","validation","run","health check","test","with","health","check","env","skill validation","false","contract","tests","skill health","system","validate skills"]