[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N0PNSRVHGWE39WVTH69B51":3,"skill-same:01M6N0PNSRVHGWE39WVTH69B51":82},{"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":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":60,"commitSha":61,"skillDirectory":62,"forksCount":63,"repositoryHtmlUrl":64,"repositoryHomepageUrl":6,"ownerHtmlUrl":65,"ownerBlogUrl":66,"ownerDescription":67,"updatedAt":68,"install":69,"resources":81},"01M6N0PNSRVHGWE39WVTH69B51","ingest",null,"Route content to specialized ingestion skills. Detects input type and delegates.","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\u002Fingest\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"get","delegates","true","concepts","people","add","sources","input","type","brain","sync","route","ingestion","process","meetings","specialized","page","save","search","2026-11-10 10:12:30",false,"---\nname: ingest\ndescription: Route content to specialized ingestion skills. Detects input type and delegates.\ntriggers:\n  - \"ingest this\"\n  - \"save this to brain\"\n  - \"process this meeting\"\ntools:\n  - search\n  - get_page\n  - put_page\n  - add_link\n  - add_timeline_entry\n  - sync_brain\nmutating: true\nwrites_pages: true\nwrites_to:\n  - people\u002F\n  - companies\u002F\n  - concepts\u002F\n  - meetings\u002F\n  - sources\u002F\n---\n\n# Ingest Skill\n\nIngest meetings, articles, media, documents, and conversations into the brain.\n\n> **Filing rule:** Read `skills\u002F_brain-filing-rules.md` before creating any new page.\n\n## Contract\n\n- Every fact written to a brain page carries an inline `[Source: ...]` citation with date and provenance.\n- Every entity mention creates a back-link from the entity's page to the page mentioning them (Iron Law).\n- Raw sources are preserved for provenance via `gbrain files upload-raw` with automatic size routing.\n- State sections are rewritten with current best understanding, never appended to.\n- After the user's explicit automatic-capture opt-in (see `skills\u002Fsignal-detector\u002FSKILL.md`), entity detection fires on every substantive inbound message; notable entities get pages or updates. Without that opt-in, capture only what the user asks to save.\n- Notability gate before any new entity page: existing pages are updated, and a NEW page is\n  created only for a notable entity and only with meaningful content from web search or\n  existing brain context — no stubs. A non-notable mention stays an inline reference on the\n  page that mentions it.\n\n> **Convention:** See `skills\u002Fconventions\u002Fquality.md` for Iron Law back-linking.\n\nEvery mention of a person or company with a brain page MUST create a back-link\nFROM that entity's page TO the page mentioning them. An unlinked mention is a\nbroken brain. See `skills\u002F_brain-filing-rules.md` for format.\n\n## Citation Requirements (MANDATORY)\n\nEvery fact written to a brain page must carry an inline `[Source: ...]` citation.\n\n- **User's statements:** `[Source: User, {context}, YYYY-MM-DD]`\n- **Meeting data:** `[Source: Meeting \"{title}\", YYYY-MM-DD]`\n- **Email\u002Fmessage:** `[Source: email from {name} re: {subject}, YYYY-MM-DD]`\n- **Web content:** `[Source: {publication}, {URL}, YYYY-MM-DD]`\n- **Social media:** `[Source: X\u002F@handle, YYYY-MM-DD](URL)` (include link)\n- **Synthesis:** `[Source: compiled from {sources}]`\n\n## Phases\n\n> **Router note:** This skill is a router. For specialized ingestion, see: idea-ingest, media-ingest, meeting-ingestion.\n\n1. **Parse the source.** Extract people, companies, dates, and events from the input.\n2. **For each entity mentioned:**\n   - Read the entity's page from gbrain to check if it exists\n   - If exists: update compiled_truth (rewrite State section with new info, don't append)\n   - If new: check notability gate, then store the page in gbrain with the appropriate type and slug\n3. **Append to timeline.** Add a timeline entry in gbrain for each event, with date, summary, and source citation.\n4. **Create cross-reference links.** Link entities in gbrain for every entity pair mentioned together, using the appropriate relationship type.\n5. **Back-link all entities.** Update EVERY mentioned entity's page with a back-link to this page (Iron Law).\n6. **Timeline merge.** The same event appears on ALL mentioned entities' timelines. If Alice met Bob at Acme Corp, the event goes on Alice's page, Bob's page, and Acme Corp's page.\n\n## Entity Detection on Every Message (after opt-in)\n\nAutomatic capture is off by default. Once the user has explicitly opted in to\nautomatic capture for this brain (the stored choice `skills\u002Fsignal-detector\u002FSKILL.md`\nchecks before writing), production agents detect entity mentions on every\nsubstantive inbound message. This is the signal detection loop that makes the\nbrain compound over time. Without the opt-in, write only what the user asks to save.\n\n### Protocol\n\n1. **Scan the message** for entity mentions: people, companies, concepts, original\n   thinking. With the opt-in recorded, fire on every substantive message (skip\n   purely operational ones and honor narrower per-message instructions).\n2. **For each entity detected:**\n   - `gbrain search \"name\"` -- does a page already exist?\n   - **If yes:** load context with `gbrain get \u003Cslug>`. Use the compiled truth to\n     inform your response. Update the page if the message contains new information.\n   - **If no:** assess notability (see `skills\u002F_brain-filing-rules.md`). If the entity\n     is worth tracking, create a new page with `gbrain put \u003Ctype\u002Fslug>` and populate\n     with what you know.\n3. **After creating or updating pages:** sync to gbrain:\n   ```bash\n   gbrain sync --no-pull --no-embed\n   ```\n4. **Don't block the conversation.** Entity detection and enrichment should happen\n   alongside the response, not before it. The user shouldn't wait for brain writes\n   to get an answer.\n\n### What counts as notable\n\n- People the user interacts with or discusses (not random mentions)\n- Companies relevant to the user's work or interests\n- Concepts or frameworks the user references or creates\n- The user's own original thinking (ideas, theses, observations) -- highest value\n- See `skills\u002F_brain-filing-rules.md` for the full notability gate\n\n### What to capture from the user's own thinking\n\nOriginal thinking is the most valuable signal. Capture exact phrasing -- the user's\nlanguage IS the insight. Don't paraphrase.\n\n- Novel observations or theses\n- Frameworks, mental models, heuristics\n- Connections between ideas that others miss\n- Contrarian positions with reasoning\n- Strong reactions to external stimuli (what triggered it and why)\n\n## Media Workflows\n\nContent the user encounters should be captured in the brain. File by PRIMARY\nSUBJECT, not by format (see `skills\u002F_brain-filing-rules.md`).\n\n### Articles & Web Content\n\n**Input:** URL shared by user, or article mentioned in conversation.\n\n**Process:**\n1. Fetch content (`web_fetch` or equivalent)\n2. Extract: title, author, publication, date, full text\n3. Summarize: executive summary + key arguments (not a rehash)\n4. Extract entities: people, companies, concepts mentioned\n5. **Save raw source** for provenance (see Raw Source Preservation below)\n6. Analyze for the user: don't just summarize. What's interesting given what you\n   know about them? Flag connections, contradictions, content opportunities.\n\n**Write to:** appropriate directory per filing rules (about a person -> `people\u002F`,\nabout a company -> `companies\u002F`, reusable framework -> `concepts\u002F`, raw data -> `sources\u002F`)\n\n### Videos & Podcasts\n\n**Input:** URL (YouTube, podcast, etc.) or local audio\u002Fvideo file.\n\n**Process:**\n1. Get transcript -- speaker-diarized if possible (services like Diarize.io provide\n   speaker-labeled, word-level timing)\n2. **Save raw transcript** (both JSON and human-readable TXT)\n3. Analyze: executive summary, key ideas, key quotes with speaker attribution,\n   notable stories\u002Fanecdotes, people and companies mentioned\n4. Extract and cross-reference all entities mentioned\n5. **HARD RULE:** every video\u002Fpodcast brain page MUST link to the raw diarized\n   transcript. A page without transcript links is incomplete.\n\n**Write to:** `media\u002Fvideos\u002F` or `media\u002Fpodcasts\u002F` with back-links to all entities.\n\n**Quality bar:**\n- Compelling headline (not \"This video discusses...\")\n- Executive summary that makes you want to watch\u002Flisten\n- Key Ideas as actual insights, not topic labels\n- Verbatim quotes with real speaker names (not \"speaker_0\")\n- All entities extracted with context and back-linked\n\n### PDFs & Documents\n\n**Input:** File path or URL.\n\n**Process:**\n1. Extract text (OCR if scanned\u002Fimage PDF)\n2. **Save raw source** for provenance\n3. Summarize: executive summary + key sections + notable data\n4. Extract entities\n5. Cross-reference from entity pages\n\n**Write to:** per filing rules (file by primary subject, not format).\n\n### Screenshots & Images\n\n**Input:** Image file.\n\n**Process:**\n1. Analyze content (OCR for text-heavy images, description for photos)\n2. If tweet screenshot: extract text, author, date, route to social media workflow\n3. If article screenshot: extract text, route to article workflow\n4. If data\u002Fchart: extract data points, describe findings\n\n**Write to:** depends on content -- route to the appropriate workflow above.\n\n### Meeting Transcripts\n\n**Input:** Transcript from meeting recording service, or manual notes.\n\n**Process:**\n1. Pull full transcript (source of truth -- AI summaries are medium-low trust)\n2. **Save raw transcript** for provenance\n3. Write meeting page with YOUR analysis above the line, raw transcript below\n4. **Entity propagation (MANDATORY):** for each attendee and company discussed:\n   - Update their brain page State section if new info surfaced\n   - Append to their Timeline with link to the meeting page\n   - Create page if person\u002Fcompany is notable and has no page yet\n5. A meeting is NOT fully ingested until all entity pages are updated\n\n**Write to:** `meetings\u002FYYYY-MM-DD-short-description.md`\n\n**What makes a good meeting page:**\n- Reveals the real crux, not a bullet dump\n- Connects to existing brain pages (people, companies, deals)\n- Flags what changed (status, decisions, new info)\n- Names tension or what was left unsaid\n- Captures actual dynamic, not performative summary\n\n### Social Media Content\n\n**Input:** Tweet, thread, or social media post.\n\n**Process:**\n1. Fetch full content (thread, quote tweets, context)\n2. If images present: OCR via vision model for full text extraction\n3. Summarize: what's being said, why it matters, who's involved\n4. Extract entities and update brain pages\n5. Include direct link to the original post (MANDATORY for citations)\n\n**Write to:** `media\u002Fx\u002F` for daily aggregation, or entity-specific directories\nif the post is primarily about a person\u002Fcompany.\n\n## Raw Source Preservation\n\nEvery ingested item must have its raw source preserved for provenance.\n\n**Use `gbrain files upload-raw` for automatic size routing:**\n```bash\ngbrain files upload-raw \u003Cfile> --page \u003Cpage-slug> --type \u003Ctype>\n```\n\n- **\u003C 100 MB text\u002FPDF**: stays in git (brain repo `.raw\u002F` sidecar directories)\n- **>= 100 MB OR media** (video, audio, images): uploaded to cloud storage\n  via TUS resumable upload, `.redirect.yaml` pointer left in the brain repo\n\nThe `.redirect.yaml` pointer format:\n```yaml\ntarget: supabase:\u002F\u002Fbrain-files\u002Fpage-slug\u002Ffilename.mp4\nbucket: brain-files\nstorage_path: page-slug\u002Ffilename.mp4\nsize: 524288000\nsize_human: 500 MB\nhash: sha256:abc123...\nmime: video\u002Fmp4\nuploaded: 2026-04-11T...\ntype: transcript\n```\n\n**Accessing stored files:**\n- `gbrain files signed-url \u003Cstorage-path>` -- generate 1-hour signed URL for viewing\u002Fsharing\n- `gbrain files restore \u003Cdir>` -- download back to local from cloud storage\n\nUse `put_raw_data` in gbrain to store raw API responses and metadata (JSON, not binary).\n\n## Test Before Bulk\n\nWhen processing multiple items (batch video ingestion, bulk meeting processing, etc.):\n\n1. **Test on 3-5 items first.** Run in test mode if available.\n2. **Read the actual output.** Is the quality good? Are titles compelling (not\n   \"This video discusses...\")? Are entities extracted and back-linked? Is the\n   format clean?\n3. **Fix what's wrong** in the approach\u002Fskill, not via one-off patches.\n4. **Only then: bulk execute** with throttling, commits every 5-10 items.\n\nThe marginal cost of testing 3 items first is near zero. The cost of cleaning\nup 100 bad pages is enormous.\n\n## Quality Rules\n\n- Executive summary in compiled_truth must be updated, not just timeline appended\n- State section is REWRITTEN, not appended to. Current best understanding only.\n- Timeline entries are reverse-chronological (newest first)\n- Every person\u002Fcompany mentioned gets a page if notable (see filing rules)\n- Link types: knows, works_at, invested_in, founded, met_at, discussed\n- Source attribution: every timeline entry includes [Source: ...] citation\n- Back-links: every entity mention creates a back-link (Iron Law)\n- Filing: file by primary subject, not format or source (see filing rules)\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- The sub-skill this routes to fails: report which one and why, using that skill's own failure guidance; do not silently re-route to a generic page write.\n- `put_page` returns `write_pending` (exit 10) or `revision_conflict`: poll `gbrain write-request \u003Crequest_id>`, or re-read and merge; never write a duplicate page.\n- `gbrain files upload-raw` is refused for size or path: store a pointer and tell the user the raw file was not uploaded.\n\n## Anti-Patterns\n\n- **Appending to State sections.** State is rewritten with the current best understanding on every update. Append-only State sections grow stale and contradictory.\n- **Ingesting without back-links.** An unlinked mention is a broken brain. Every entity mentioned must have a back-link from their page to the page mentioning them.\n- **Skipping raw source preservation.** Every ingested item must have its raw source preserved. A brain page without provenance is unverifiable.\n- **Bulk processing without sample test.** Test on 3-5 items first. Fix quality issues in the approach, not via one-off patches.\n- **Paraphrasing the user's original thinking.** The user's exact language IS the insight. Capture verbatim phrasing for ideas, theses, and frameworks.\n\n## Output Format\n\n```\nINGESTED: [title]\n==================\n\nPage: [slug]\nType: [person \u002F company \u002F meeting \u002F media \u002F concept]\nSource: [source description]\n\nEntities detected: N\n- [entity] -> [created \u002F updated] ([slug])\n\nBack-links created: N\nTimeline entries: N\nRaw source: [preserved at path \u002F uploaded to cloud]\n```\n\n## Tools Used\n\n- Read a page from gbrain (get_page)\n- Store\u002Fupdate a page in gbrain (put_page)\n- Add a timeline entry in gbrain (add_timeline_entry)\n- Link entities in gbrain (add_link)\n- List tags for a page (get_tags)\n- Tag a page in gbrain (add_tag)\n- Store raw data in gbrain (put_raw_data)\n- Check backlinks in gbrain (get_backlinks)\n","# Ingest Skill\n\nIngest meetings, articles, media, documents, and conversations into the brain.\n\n> **Filing rule:** Read `skills\u002F_brain-filing-rules.md` before creating any new page.\n\n## Contract\n\n- Every fact written to a brain page carries an inline `[Source: ...]` citation with date and provenance.\n- Every entity mention creates a back-link from the entity's page to the page mentioning them (Iron Law).\n- Raw sources are preserved for provenance via `gbrain files upload-raw` with automatic size routing.\n- State sections are rewritten with current best understanding, never appended to.\n- After the user's explicit automatic-capture opt-in (see `skills\u002Fsignal-detector\u002FSKILL.md`), entity detection fires on every substantive inbound message; notable entities get pages or updates. Without that opt-in, capture only what the user asks to save.\n- Notability gate before any new entity page: existing pages are updated, and a NEW page is\n  created only for a notable entity and only with meaningful content from web search or\n  existing brain context — no stubs. A non-notable mention stays an inline reference on the\n  page that mentions it.\n\n> **Convention:** See `skills\u002Fconventions\u002Fquality.md` for Iron Law back-linking.\n\nEvery mention of a person or company with a brain page MUST create a back-link\nFROM that entity's page TO the page mentioning them. An unlinked mention is a\nbroken brain. See `skills\u002F_brain-filing-rules.md` for format.\n\n## Citation Requirements (MANDATORY)\n\nEvery fact written to a brain page must carry an inline `[Source: ...]` citation.\n\n- **User's statements:** `[Source: User, {context}, YYYY-MM-DD]`\n- **Meeting data:** `[Source: Meeting \"{title}\", YYYY-MM-DD]`\n- **Email\u002Fmessage:** `[Source: email from {name} re: {subject}, YYYY-MM-DD]`\n- **Web content:** `[Source: {publication}, {URL}, YYYY-MM-DD]`\n- **Social media:** `[Source: X\u002F@handle, YYYY-MM-DD](URL)` (include link)\n- **Synthesis:** `[Source: compiled from {sources}]`\n\n## Phases\n\n> **Router note:** This skill is a router. For specialized ingestion, see: idea-ingest, media-ingest, meeting-ingestion.\n\n1. **Parse the source.** Extract people, companies, dates, and events from the input.\n2. **For each entity mentioned:**\n   - Read the entity's page from gbrain to check if it exists\n   - If exists: update compiled_truth (rewrite State section with new info, don't append)\n   - If new: check notability gate, then store the page in gbrain with the appropriate type and slug\n3. **Append to timeline.** Add a timeline entry in gbrain for each event, with date, summary, and source citation.\n4. **Create cross-reference links.** Link entities in gbrain for every entity pair mentioned together, using the appropriate relationship type.\n5. **Back-link all entities.** Update EVERY mentioned entity's page with a back-link to this page (Iron Law).\n6. **Timeline merge.** The same event appears on ALL mentioned entities' timelines. If Alice met Bob at Acme Corp, the event goes on Alice's page, Bob's page, and Acme Corp's page.\n\n## Entity Detection on Every Message (after opt-in)\n\nAutomatic capture is off by default. Once the user has explicitly opted in to\nautomatic capture for this brain (the stored choice `skills\u002Fsignal-detector\u002FSKILL.md`\nchecks before writing), production agents detect entity mentions on every\nsubstantive inbound message. This is the signal detection loop that makes the\nbrain compound over time. Without the opt-in, write only what the user asks to save.\n\n### Protocol\n\n1. **Scan the message** for entity mentions: people, companies, concepts, original\n   thinking. With the opt-in recorded, fire on every substantive message (skip\n   purely operational ones and honor narrower per-message instructions).\n2. **For each entity detected:**\n   - `gbrain search \"name\"` -- does a page already exist?\n   - **If yes:** load context with `gbrain get \u003Cslug>`. Use the compiled truth to\n     inform your response. Update the page if the message contains new information.\n   - **If no:** assess notability (see `skills\u002F_brain-filing-rules.md`). If the entity\n     is worth tracking, create a new page with `gbrain put \u003Ctype\u002Fslug>` and populate\n     with what you know.\n3. **After creating or updating pages:** sync to gbrain:\n   ```bash\n   gbrain sync --no-pull --no-embed\n   ```\n4. **Don't block the conversation.** Entity detection and enrichment should happen\n   alongside the response, not before it. The user shouldn't wait for brain writes\n   to get an answer.\n\n### What counts as notable\n\n- People the user interacts with or discusses (not random mentions)\n- Companies relevant to the user's work or interests\n- Concepts or frameworks the user references or creates\n- The user's own original thinking (ideas, theses, observations) -- highest value\n- See `skills\u002F_brain-filing-rules.md` for the full notability gate\n\n### What to capture from the user's own thinking\n\nOriginal thinking is the most valuable signal. Capture exact phrasing -- the user's\nlanguage IS the insight. Don't paraphrase.\n\n- Novel observations or theses\n- Frameworks, mental models, heuristics\n- Connections between ideas that others miss\n- Contrarian positions with reasoning\n- Strong reactions to external stimuli (what triggered it and why)\n\n## Media Workflows\n\nContent the user encounters should be captured in the brain. File by PRIMARY\nSUBJECT, not by format (see `skills\u002F_brain-filing-rules.md`).\n\n### Articles & Web Content\n\n**Input:** URL shared by user, or article mentioned in conversation.\n\n**Process:**\n1. Fetch content (`web_fetch` or equivalent)\n2. Extract: title, author, publication, date, full text\n3. Summarize: executive summary + key arguments (not a rehash)\n4. Extract entities: people, companies, concepts mentioned\n5. **Save raw source** for provenance (see Raw Source Preservation below)\n6. Analyze for the user: don't just summarize. What's interesting given what you\n   know about them? Flag connections, contradictions, content opportunities.\n\n**Write to:** appropriate directory per filing rules (about a person -> `people\u002F`,\nabout a company -> `companies\u002F`, reusable framework -> `concepts\u002F`, raw data -> `sources\u002F`)\n\n### Videos & Podcasts\n\n**Input:** URL (YouTube, podcast, etc.) or local audio\u002Fvideo file.\n\n**Process:**\n1. Get transcript -- speaker-diarized if possible (services like Diarize.io provide\n   speaker-labeled, word-level timing)\n2. **Save raw transcript** (both JSON and human-readable TXT)\n3. Analyze: executive summary, key ideas, key quotes with speaker attribution,\n   notable stories\u002Fanecdotes, people and companies mentioned\n4. Extract and cross-reference all entities mentioned\n5. **HARD RULE:** every video\u002Fpodcast brain page MUST link to the raw diarized\n   transcript. A page without transcript links is incomplete.\n\n**Write to:** `media\u002Fvideos\u002F` or `media\u002Fpodcasts\u002F` with back-links to all entities.\n\n**Quality bar:**\n- Compelling headline (not \"This video discusses...\")\n- Executive summary that makes you want to watch\u002Flisten\n- Key Ideas as actual insights, not topic labels\n- Verbatim quotes with real speaker names (not \"speaker_0\")\n- All entities extracted with context and back-linked\n\n### PDFs & Documents\n\n**Input:** File path or URL.\n\n**Process:**\n1. Extract text (OCR if scanned\u002Fimage PDF)\n2. **Save raw source** for provenance\n3. Summarize: executive summary + key sections + notable data\n4. Extract entities\n5. Cross-reference from entity pages\n\n**Write to:** per filing rules (file by primary subject, not format).\n\n### Screenshots & Images\n\n**Input:** Image file.\n\n**Process:**\n1. Analyze content (OCR for text-heavy images, description for photos)\n2. If tweet screenshot: extract text, author, date, route to social media workflow\n3. If article screenshot: extract text, route to article workflow\n4. If data\u002Fchart: extract data points, describe findings\n\n**Write to:** depends on content -- route to the appropriate workflow above.\n\n### Meeting Transcripts\n\n**Input:** Transcript from meeting recording service, or manual notes.\n\n**Process:**\n1. Pull full transcript (source of truth -- AI summaries are medium-low trust)\n2. **Save raw transcript** for provenance\n3. Write meeting page with YOUR analysis above the line, raw transcript below\n4. **Entity propagation (MANDATORY):** for each attendee and company discussed:\n   - Update their brain page State section if new info surfaced\n   - Append to their Timeline with link to the meeting page\n   - Create page if person\u002Fcompany is notable and has no page yet\n5. A meeting is NOT fully ingested until all entity pages are updated\n\n**Write to:** `meetings\u002FYYYY-MM-DD-short-description.md`\n\n**What makes a good meeting page:**\n- Reveals the real crux, not a bullet dump\n- Connects to existing brain pages (people, companies, deals)\n- Flags what changed (status, decisions, new info)\n- Names tension or what was left unsaid\n- Captures actual dynamic, not performative summary\n\n### Social Media Content\n\n**Input:** Tweet, thread, or social media post.\n\n**Process:**\n1. Fetch full content (thread, quote tweets, context)\n2. If images present: OCR via vision model for full text extraction\n3. Summarize: what's being said, why it matters, who's involved\n4. Extract entities and update brain pages\n5. Include direct link to the original post (MANDATORY for citations)\n\n**Write to:** `media\u002Fx\u002F` for daily aggregation, or entity-specific directories\nif the post is primarily about a person\u002Fcompany.\n\n## Raw Source Preservation\n\nEvery ingested item must have its raw source preserved for provenance.\n\n**Use `gbrain files upload-raw` for automatic size routing:**\n```bash\ngbrain files upload-raw \u003Cfile> --page \u003Cpage-slug> --type \u003Ctype>\n```\n\n- **\u003C 100 MB text\u002FPDF**: stays in git (brain repo `.raw\u002F` sidecar directories)\n- **>= 100 MB OR media** (video, audio, images): uploaded to cloud storage\n  via TUS resumable upload, `.redirect.yaml` pointer left in the brain repo\n\nThe `.redirect.yaml` pointer format:\n```yaml\ntarget: supabase:\u002F\u002Fbrain-files\u002Fpage-slug\u002Ffilename.mp4\nbucket: brain-files\nstorage_path: page-slug\u002Ffilename.mp4\nsize: 524288000\nsize_human: 500 MB\nhash: sha256:abc123...\nmime: video\u002Fmp4\nuploaded: 2026-04-11T...\ntype: transcript\n```\n\n**Accessing stored files:**\n- `gbrain files signed-url \u003Cstorage-path>` -- generate 1-hour signed URL for viewing\u002Fsharing\n- `gbrain files restore \u003Cdir>` -- download back to local from cloud storage\n\nUse `put_raw_data` in gbrain to store raw API responses and metadata (JSON, not binary).\n\n## Test Before Bulk\n\nWhen processing multiple items (batch video ingestion, bulk meeting processing, etc.):\n\n1. **Test on 3-5 items first.** Run in test mode if available.\n2. **Read the actual output.** Is the quality good? Are titles compelling (not\n   \"This video discusses...\")? Are entities extracted and back-linked? Is the\n   format clean?\n3. **Fix what's wrong** in the approach\u002Fskill, not via one-off patches.\n4. **Only then: bulk execute** with throttling, commits every 5-10 items.\n\nThe marginal cost of testing 3 items first is near zero. The cost of cleaning\nup 100 bad pages is enormous.\n\n## Quality Rules\n\n- Executive summary in compiled_truth must be updated, not just timeline appended\n- State section is REWRITTEN, not appended to. Current best understanding only.\n- Timeline entries are reverse-chronological (newest first)\n- Every person\u002Fcompany mentioned gets a page if notable (see filing rules)\n- Link types: knows, works_at, invested_in, founded, met_at, discussed\n- Source attribution: every timeline entry includes [Source: ...] citation\n- Back-links: every entity mention creates a back-link (Iron Law)\n- Filing: file by primary subject, not format or source (see filing rules)\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- The sub-skill this routes to fails: report which one and why, using that skill's own failure guidance; do not silently re-route to a generic page write.\n- `put_page` returns `write_pending` (exit 10) or `revision_conflict`: poll `gbrain write-request \u003Crequest_id>`, or re-read and merge; never write a duplicate page.\n- `gbrain files upload-raw` is refused for size or path: store a pointer and tell the user the raw file was not uploaded.\n\n## Anti-Patterns\n\n- **Appending to State sections.** State is rewritten with the current best understanding on every update. Append-only State sections grow stale and contradictory.\n- **Ingesting without back-links.** An unlinked mention is a broken brain. Every entity mentioned must have a back-link from their page to the page mentioning them.\n- **Skipping raw source preservation.** Every ingested item must have its raw source preserved. A brain page without provenance is unverifiable.\n- **Bulk processing without sample test.** Test on 3-5 items first. Fix quality issues in the approach, not via one-off patches.\n- **Paraphrasing the user's original thinking.** The user's exact language IS the insight. Capture verbatim phrasing for ideas, theses, and frameworks.\n\n## Output Format\n\n```\nINGESTED: [title]\n==================\n\nPage: [slug]\nType: [person \u002F company \u002F meeting \u002F media \u002F concept]\nSource: [source description]\n\nEntities detected: N\n- [entity] -> [created \u002F updated] ([slug])\n\nBack-links created: N\nTimeline entries: N\nRaw source: [preserved at path \u002F uploaded to cloud]\n```\n\n## Tools Used\n\n- Read a page from gbrain (get_page)\n- Store\u002Fupdate a page in gbrain (put_page)\n- Add a timeline entry in gbrain (add_timeline_entry)\n- Link entities in gbrain (add_link)\n- List tags for a page (get_tags)\n- Tag a page in gbrain (add_tag)\n- Store raw data in gbrain (put_raw_data)\n- Check backlinks in gbrain (get_backlinks)\n",{"name":5,"tools":43,"mutating":49,"triggers":50,"writes_to":54,"description":7,"writes_pages":49},[37,44,45,46,47,48],"get_page","put_page","add_link","add_timeline_entry","sync_brain",true,[51,52,53],"ingest this","save this to brain","process this meeting",[55,56,57,58,59],"people\u002F","companies\u002F","concepts\u002F","meetings\u002F","sources\u002F","master","074ec301549ded4930f04d2c3b22d709a6c095cc","skills\u002Fingest",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":70,"prompt":80,"zipAvailable":49},[71,74,77],{"tool":72,"command":73},"npx","npx skills add garrytan\u002Fgbrain --skill ingest",{"tool":75,"command":76},"bunx","bunx skills add garrytan\u002Fgbrain --skill ingest",{"tool":78,"command":79},"pnpm","pnpm dlx skills add garrytan\u002Fgbrain --skill ingest","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fingest\u002FSKILL.md",[],[83,94,100,120,147,161],{"skillNo":84,"name":85,"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":86,"categories":87,"keywords":88,"publishedAt":38},"01M6N109FNGH1PK49T734PZXGB","query-helper","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[89,90,91,37,35,92,93],"query helper","helper","query","find","false",{"skillNo":95,"name":96,"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":97,"categories":98,"keywords":99,"publishedAt":38},"01M6N108A23GW6NGQEQ0E7GV0A","broken","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[96],{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":38},"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",[],[107,28,108,21,109,35,110,111,112,113,91,114,23,115,116,117,118,119,37],"brain ops","ops","attribution","read","write","up","look","pages","with","enrich","web","path","source",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":131,"publishedAt":38},"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",[126],{"categoryNo":127,"categoryName":128,"taxonomyType":129,"taxonomyTypeDesc":130},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[132,133,134,135,136,37,137,138,139,91,93,140,141,142,143,144,145,146],"meeting","prep","meeting prep","me","prepare","brief","open","build","loops","about","you","briefing","threads","for","Meet",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":38},"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",[],[154,155,156,37,157,93,158,159,160],"inbox zero","ZeRO","inbox","clear","replies","my","triage",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":38},"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",[],[168,169,170,114,28,171,172,111,173,21,37,174],"deal memo","deal","memo","draft","investment","history","founder"]