[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N0S2BT9J7WYCGDMEMQSWE9":3,"skill-same:01M6N0S2BT9J7WYCGDMEMQSWE9":91},{"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":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":63,"commitSha":64,"skillDirectory":65,"forksCount":66,"repositoryHtmlUrl":67,"repositoryHomepageUrl":6,"ownerHtmlUrl":68,"ownerBlogUrl":69,"ownerDescription":70,"updatedAt":71,"install":72,"resources":84},"01M6N0S2BT9J7WYCGDMEMQSWE9","reports",null,"Save and load timestamped reports. Keyword routing for fast lookup. Cron jobs\nsave output as reports; the agent or user queries them by keyword. Includes\nthe Actionability Gate: delivery-time link checks (Broken\u002FDead\u002FIndirect\u002F\nMissing) for briefings, meeting digests, and research reports.","garrytan\u002Fgbrain","garrytan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19957?v=4","01M6DJCCDDG53MTYYRTXAXFG17","Garry Tan","01M6MZQZCEN3RRMD33E1X9ZZR9",32847,"MIT","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Freports\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"me","for","briefing","links","quality-gate","as","get","quality check","time","delivery","search","show","pulse","broken","page","show me","save","cron","cron jobs","2026-11-10 10:12:30",false,"---\nname: reports\nversion: 1.1.0\ndescription: |\n  Save and load timestamped reports. Keyword routing for fast lookup. Cron jobs\n  save output as reports; the agent or user queries them by keyword. Includes\n  the Actionability Gate: delivery-time link checks (Broken\u002FDead\u002FIndirect\u002F\n  Missing) for briefings, meeting digests, and research reports.\ntriggers:\n  - \"save report\"\n  - \"load latest report\"\n  - \"what's the latest briefing\"\n  - \"show me the pulse\"\n  - \"report quality\"\n  - \"link quality check\"\n  - \"validate report links\"\ntools:\n  - get_page\n  - put_page\n  - search\nmutating: true\nupstream: report-quality-gate@fc834ee\n---\n\n# Reports Skill\n\n## Contract\n\nThis skill guarantees:\n- Reports saved with timestamped filenames and frontmatter\n- Keyword routing: query → report category mapping\n- Latest report loadable by category name\n- Reports are searchable via gbrain search\u002Fquery\n- Outbound reports pass the Actionability Gate (below) before delivery\n\n## Phases\n\n1. **Save report.** Write to `reports\u002F{category}\u002F{YYYY-MM-DD-HHMM}.md` with frontmatter:\n   ```yaml\n   ---\n   title: {report title}\n   type: note            # a type the default pack declares; `report` is undeclared\n   report_type: {category name}\n   category: {category name}\n   date: {YYYY-MM-DD}\n   time: {HH:MM PT}\n   ---\n   ```\n2. **Load latest.** Given a category, find the most recent report file.\n3. **Keyword routing.** Map common queries to report categories:\n   - \"email\" \u002F \"inbox\" → ea-inbox-sweep\n   - \"social\" \u002F \"mentions\" → social-mentions\n   - \"briefing\" \u002F \"morning\" → morning-briefing\n   - \"meeting\" → meeting-sync\n   - Custom mappings configurable\n\n## Output Format\n\nSaved: `reports\u002F{category}\u002F{YYYY-MM-DD-HHMM}.md`\nLoaded: full report content with metadata.\n\n## Actionability Gate\n\nBefore any report reaches the user — a morning briefing, a meeting digest, a\nresearch report — every link must answer one question: **can the user click\nthis and immediately act?** The link canon (deterministic, never-guessed URLs)\nlives in `skills\u002F_output-rules.md` under Deterministic Links; this gate adds\nthe delivery-time failure taxonomy and the retry loop.\n\n### Four failure modes\n\n| Mode | What it means | Example |\n|------|--------------|---------|\n| **Broken** | Link is fake or a placeholder | `https:\u002F\u002Fexample.com`, `TODO-find-link` |\n| **Dead** | Link to a brain page that isn't committed\u002Fpushed | Page written but not pushed — the link 404s |\n| **Indirect** | Link goes somewhere, but not the right place | `x.com\u002Falice-example` (profile) instead of `x.com\u002Falice-example\u002Fstatus\u002F\u003Cid>` (the specific post) |\n| **Missing** | Actionable item mentioned with no link at all | \"the clip making the rounds (~800K views)\" with no URL |\n\n**Broken, Dead, and Indirect block delivery. Missing is a warning** — flag it,\ndon't block. A missing link is honest. An indirect link is a broken promise.\n\n### Blocked vs warning\n\n| Pattern | Status | Why it fails |\n|---------|--------|--------------|\n| `x.com\u002F\u003Chandle>` | Blocked | Profile ≠ post. Link to `x.com\u002F\u003Chandle>\u002Fstatus\u002F\u003Cid>` |\n| Bare publication domain | Blocked | Homepage ≠ article. Add the article path |\n| `youtube.com\u002F@channel` | Blocked | Channel ≠ video. Link to `youtube.com\u002Fwatch?v=...` |\n| Brain-page link, file uncommitted | Blocked | Link 404s until committed + pushed |\n| `example.com` \u002F `TODO` placeholder | Blocked | Not a real link |\n| `google.com\u002Fsearch?q=...` | Warning | Search ≠ source. Link to the actual result |\n| Actionable bullet with no URL | Warning | Where? Link it or describe how to find it |\n\n### The retry loop (agent-run checks)\n\nThere is no enforcement script. The agent runs these checks itself before\ndelivering any report with links:\n\n1. Compose the report.\n2. Scan every link against the failure modes above:\n   - **Brain-page links:** run `git status` in the brain repo — an uncommitted\n     page behind a link is a Dead link; commit + push first. `gbrain get \u003Cslug>`\n     confirms the page exists at all.\n   - **External links:** a profile, homepage, or channel URL standing in for\n     specific content is Indirect.\n3. If a check fails, fix the link:\n   - Have the direct URL (post ID, article path, filing page)? Use it.\n   - Don't have it? Search the source for the specific item.\n   - Can't find it? Remove the link and describe the content instead:\n     \"clip on @alice-example's timeline, ~800K views — search there.\" Never\n     leave a profile link as a substitute for a content link.\n4. Re-check.\n5. Max 2 retries → deliver with an explicit warning flag if Missing-class\n   warnings remain. Broken, Dead, and Indirect links never ship.\n\n### LLM-prompt gate snippet\n\nPaste into any report-generating prompt (subagent digests, research\nsummaries, cron report jobs):\n\n```\nACTIONABILITY GATE: Before finishing, verify every link answers \"can the user\nclick this and act immediately?\"\n- Every X link → https:\u002F\u002Fx.com\u002F{user}\u002Fstatus\u002F{post_id} — NEVER a profile link\n- Every article → full URL with path — NEVER a bare domain\n- Every brain-page link → committed + pushed, or don't link it\n- If you don't have the direct URL → describe the content WITHOUT a link\n- A missing link is better than an indirect link\n```\n\n### Consumers\n\nReport surfaces route through this gate by harness-routing convention (a\nrouting rule the resolver applies, not a mechanical guarantee): morning\nbriefings (`skills\u002Fbriefing\u002FSKILL.md`), meeting digests, research reports,\nand any saved report that carries external links.\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- A report link fails the delivery scan (broken, dead, indirect): fix it before delivery; a missing link is a warning, not a blocker.\n- Saving the report returns `write_pending` (exit 10): the link 404s until the write commits; poll `gbrain write-request \u003Crequest_id>` before sharing it.\n- A report lookup (`gbrain search`) is empty with a degraded notice: say the search was keyword-only rather than \"no prior report\".\n\n## Anti-Patterns\n\n- Saving reports without frontmatter (makes them unsearchable)\n- Using inconsistent category names across runs\n- Loading all reports when only the latest is needed\n- Not routing by keyword (forcing exact category name)\n- Delivering a report with a profile\u002Fhomepage\u002Fchannel link standing in for\n  specific content (Indirect links block delivery)\n- Linking a brain page that hasn't been committed and pushed (Dead link)\n","# Reports Skill\n\n## Contract\n\nThis skill guarantees:\n- Reports saved with timestamped filenames and frontmatter\n- Keyword routing: query → report category mapping\n- Latest report loadable by category name\n- Reports are searchable via gbrain search\u002Fquery\n- Outbound reports pass the Actionability Gate (below) before delivery\n\n## Phases\n\n1. **Save report.** Write to `reports\u002F{category}\u002F{YYYY-MM-DD-HHMM}.md` with frontmatter:\n   ```yaml\n   ---\n   title: {report title}\n   type: note            # a type the default pack declares; `report` is undeclared\n   report_type: {category name}\n   category: {category name}\n   date: {YYYY-MM-DD}\n   time: {HH:MM PT}\n   ---\n   ```\n2. **Load latest.** Given a category, find the most recent report file.\n3. **Keyword routing.** Map common queries to report categories:\n   - \"email\" \u002F \"inbox\" → ea-inbox-sweep\n   - \"social\" \u002F \"mentions\" → social-mentions\n   - \"briefing\" \u002F \"morning\" → morning-briefing\n   - \"meeting\" → meeting-sync\n   - Custom mappings configurable\n\n## Output Format\n\nSaved: `reports\u002F{category}\u002F{YYYY-MM-DD-HHMM}.md`\nLoaded: full report content with metadata.\n\n## Actionability Gate\n\nBefore any report reaches the user — a morning briefing, a meeting digest, a\nresearch report — every link must answer one question: **can the user click\nthis and immediately act?** The link canon (deterministic, never-guessed URLs)\nlives in `skills\u002F_output-rules.md` under Deterministic Links; this gate adds\nthe delivery-time failure taxonomy and the retry loop.\n\n### Four failure modes\n\n| Mode | What it means | Example |\n|------|--------------|---------|\n| **Broken** | Link is fake or a placeholder | `https:\u002F\u002Fexample.com`, `TODO-find-link` |\n| **Dead** | Link to a brain page that isn't committed\u002Fpushed | Page written but not pushed — the link 404s |\n| **Indirect** | Link goes somewhere, but not the right place | `x.com\u002Falice-example` (profile) instead of `x.com\u002Falice-example\u002Fstatus\u002F\u003Cid>` (the specific post) |\n| **Missing** | Actionable item mentioned with no link at all | \"the clip making the rounds (~800K views)\" with no URL |\n\n**Broken, Dead, and Indirect block delivery. Missing is a warning** — flag it,\ndon't block. A missing link is honest. An indirect link is a broken promise.\n\n### Blocked vs warning\n\n| Pattern | Status | Why it fails |\n|---------|--------|--------------|\n| `x.com\u002F\u003Chandle>` | Blocked | Profile ≠ post. Link to `x.com\u002F\u003Chandle>\u002Fstatus\u002F\u003Cid>` |\n| Bare publication domain | Blocked | Homepage ≠ article. Add the article path |\n| `youtube.com\u002F@channel` | Blocked | Channel ≠ video. Link to `youtube.com\u002Fwatch?v=...` |\n| Brain-page link, file uncommitted | Blocked | Link 404s until committed + pushed |\n| `example.com` \u002F `TODO` placeholder | Blocked | Not a real link |\n| `google.com\u002Fsearch?q=...` | Warning | Search ≠ source. Link to the actual result |\n| Actionable bullet with no URL | Warning | Where? Link it or describe how to find it |\n\n### The retry loop (agent-run checks)\n\nThere is no enforcement script. The agent runs these checks itself before\ndelivering any report with links:\n\n1. Compose the report.\n2. Scan every link against the failure modes above:\n   - **Brain-page links:** run `git status` in the brain repo — an uncommitted\n     page behind a link is a Dead link; commit + push first. `gbrain get \u003Cslug>`\n     confirms the page exists at all.\n   - **External links:** a profile, homepage, or channel URL standing in for\n     specific content is Indirect.\n3. If a check fails, fix the link:\n   - Have the direct URL (post ID, article path, filing page)? Use it.\n   - Don't have it? Search the source for the specific item.\n   - Can't find it? Remove the link and describe the content instead:\n     \"clip on @alice-example's timeline, ~800K views — search there.\" Never\n     leave a profile link as a substitute for a content link.\n4. Re-check.\n5. Max 2 retries → deliver with an explicit warning flag if Missing-class\n   warnings remain. Broken, Dead, and Indirect links never ship.\n\n### LLM-prompt gate snippet\n\nPaste into any report-generating prompt (subagent digests, research\nsummaries, cron report jobs):\n\n```\nACTIONABILITY GATE: Before finishing, verify every link answers \"can the user\nclick this and act immediately?\"\n- Every X link → https:\u002F\u002Fx.com\u002F{user}\u002Fstatus\u002F{post_id} — NEVER a profile link\n- Every article → full URL with path — NEVER a bare domain\n- Every brain-page link → committed + pushed, or don't link it\n- If you don't have the direct URL → describe the content WITHOUT a link\n- A missing link is better than an indirect link\n```\n\n### Consumers\n\nReport surfaces route through this gate by harness-routing convention (a\nrouting rule the resolver applies, not a mechanical guarantee): morning\nbriefings (`skills\u002Fbriefing\u002FSKILL.md`), meeting digests, research reports,\nand any saved report that carries external links.\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- A report link fails the delivery scan (broken, dead, indirect): fix it before delivery; a missing link is a warning, not a blocker.\n- Saving the report returns `write_pending` (exit 10): the link 404s until the write commits; poll `gbrain write-request \u003Crequest_id>` before sharing it.\n- A report lookup (`gbrain search`) is empty with a degraded notice: say the search was keyword-only rather than \"no prior report\".\n\n## Anti-Patterns\n\n- Saving reports without frontmatter (makes them unsearchable)\n- Using inconsistent category names across runs\n- Loading all reports when only the latest is needed\n- Not routing by keyword (forcing exact category name)\n- Delivering a report with a profile\u002Fhomepage\u002Fchannel link standing in for\n  specific content (Indirect links block delivery)\n- Linking a brain page that hasn't been committed and pushed (Dead link)\n",{"name":5,"tools":48,"version":51,"mutating":52,"triggers":53,"upstream":61,"description":62},[49,50,34],"get_page","put_page","1.1.0",true,[54,55,56,57,58,59,60],"save report","load latest report","what's the latest briefing","show me the pulse","report quality","link quality check","validate report links","report-quality-gate@fc834ee","Save and load timestamped reports. Keyword routing for fast lookup. Cron jobs\nsave output as reports; the agent or user queries them by keyword. Includes\nthe Actionability Gate: delivery-time link checks (Broken\u002FDead\u002FIndirect\u002F\nMissing) for briefings, meeting digests, and research reports.\n","master","074ec301549ded4930f04d2c3b22d709a6c095cc","skills\u002Freports",4902,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain","https:\u002F\u002Fgithub.com\u002Fgarrytan","https:\u002F\u002Fblog.garrytan.com","Writes software, dreams. ","2026-11-14 04:11:30",{"source":8,"skillName":5,"commands":73,"prompt":83,"zipAvailable":52},[74,77,80],{"tool":75,"command":76},"npx","npx skills add garrytan\u002Fgbrain --skill reports",{"tool":78,"command":79},"bunx","bunx skills add garrytan\u002Fgbrain --skill reports",{"tool":81,"command":82},"pnpm","pnpm dlx skills add garrytan\u002Fgbrain --skill reports","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Freports\u002FSKILL.md",[85],{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":90},"routing-eval.jsonl","OTHER","其他",1052,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Freports\u002Frouting-eval.jsonl",[92,103,108,131,155,169],{"skillNo":93,"name":94,"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":95,"categories":96,"keywords":97,"publishedAt":43},"01M6N109FNGH1PK49T734PZXGB","query-helper","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[98,99,100,34,38,101,102],"query helper","helper","query","find","false",{"skillNo":104,"name":37,"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":105,"categories":106,"keywords":107,"publishedAt":43},"01M6N108A23GW6NGQEQ0E7GV0A","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[37],{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":43},"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",[],[115,116,117,118,119,38,120,121,122,123,100,124,125,126,127,128,129,130,34],"brain ops","brain","ops","true","attribution","read","write","up","look","pages","people","with","enrich","web","path","source",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":142,"publishedAt":43},"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",[137],{"categoryNo":138,"categoryName":139,"taxonomyType":140,"taxonomyTypeDesc":141},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[143,144,145,24,146,34,147,148,149,100,102,150,151,152,26,153,25,154],"meeting","prep","meeting prep","prepare","brief","open","build","loops","about","you","threads","Meet",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":43},"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",[],[162,163,164,34,165,102,166,167,168],"inbox zero","ZeRO","inbox","clear","replies","my","triage",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":43},"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",[],[176,177,178,124,116,179,180,121,181,118,34,182],"deal memo","deal","memo","draft","investment","history","founder"]