[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N0P80HWKNKQB8P3NEWW10A":3,"skill-same:01M6N0P80HWKNKQB8P3NEWW10A":86},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":64,"commitSha":65,"skillDirectory":66,"forksCount":67,"repositoryHtmlUrl":68,"repositoryHomepageUrl":6,"ownerHtmlUrl":69,"ownerBlogUrl":70,"ownerDescription":71,"updatedAt":72,"install":73,"resources":85},"01M6N0P80HWKNKQB8P3NEWW10A","google-loops",null,"Set up and operate the Gmail\u002FCalendar\u002FContacts connector and the open-loop\nengine: who is waiting on the user, what they promised, and the context\nneeded to respond. Covers painless BYO OAuth setup (exactly two user\ninteractions), the daily `gbrain waiting` digest, loop closing\u002Fmuting, and\ntroubleshooting via the typed error catalog.","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\u002Fgoogle-loops\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"google loops","google","loops","close","closing","me","contacts","Connector","painless","false","people","connect","loop","open","up","respond","operate","ingestion","error","SET","2026-11-10 10:12:30",false,"---\nname: google-loops\nversion: 1.0.0\ndescription: |\n  Set up and operate the Gmail\u002FCalendar\u002FContacts connector and the open-loop\n  engine: who is waiting on the user, what they promised, and the context\n  needed to respond. Covers painless BYO OAuth setup (exactly two user\n  interactions), the daily `gbrain waiting` digest, loop closing\u002Fmuting, and\n  troubleshooting via the typed error catalog.\ntriggers:\n  - \"connect gmail\"\n  - \"connect google\"\n  - \"connect calendar\"\n  - \"connect contacts\"\n  - \"who is waiting on me\"\n  - \"what do I owe people\"\n  - \"open loops\"\n  - \"unanswered email\"\n  - \"set up email ingestion\"\n  - \"gbrain waiting\"\ntools:\n  - open_loops\n  - loops_close\n  - loops_mute\n  - entity\n  - context_pack\nmutating: true\nwrites_pages: false\n---\n\n# Google Loops — Setup and Daily Operation\n\nThe connector ingests Gmail threads, calendar events, and contacts into the\nbrain and maintains the open-loop record behind `gbrain waiting`. Full\nreferences: `docs\u002Fguides\u002Fgoogle-connect.md` (setup + every error and its\nfix) and `docs\u002Fguides\u002Fopen-loops.md` (how detection works).\n\n## Contract for the harness (read first)\n\n1. **Relay `[SHOW USER]` blocks verbatim.** Setup commands print fenced\n   `[SHOW USER] ... [\u002FSHOW USER]` blocks — numbered steps with deep links.\n   Pass them to the user unchanged (paraphrasing loses load-bearing detail\n   like \"Desktop app, NOT Web application\"). Batch everything into ONE\n   message per block.\n2. **The whole setup is exactly two user interactions.** (1) The Google\n   Cloud checklist + the user hands back the downloaded client JSON.\n   (2) The user clicks one consent URL. If you find yourself asking a third\n   question, re-read the block you skipped.\n3. **Never put secrets in argv or chat when avoidable.** When the user drops\n   `client_secret_*.json` into chat, save it to a file (mode 0600) and pass\n   the path: `gbrain google connect --client-json \u003Cpath>`. Env\n   (`GOOGLE_CLIENT_ID`\u002F`GOOGLE_CLIENT_SECRET`) also works. Raw\n   `--client-id\u002F--client-secret` flags are the last resort.\n4. **Every command speaks JSON.** Add `--json` and read\n   `{ ok, status, next_action: { command, user_message }, error }`. When\n   `next_action.user_message` is present, that IS the message to show the\n   user; when `next_action.command` is present, that is your next call.\n   Errors carry `{ code, problem, cause, fix, doc_url }` — show the user\n   `problem` + `fix`, nothing else.\n5. **Re-running is always safe.** `gbrain google connect` and\n   `gbrain google setup` are idempotent state machines — the documented fix\n   for most errors is \"run it again.\"\n\n## Setup (the one command)\n\n```bash\ngbrain google setup --json\n```\n\nHandles: credential intake (prints the GCP checklist when nothing is on\nfile) → consent (loopback locally; auto paste-back over SSH\u002Fheadless —\nnon-TTY flows complete via a second call:\n`gbrain google connect --code \"\u003Cpasted-redirect-url>\"`) → source\nregistration → a budgeted first sync (newest mail first; the deep backfill\nresumes on later syncs automatically) → the first `gbrain waiting` digest.\n\nMultiple accounts: repeat with `--account work@example.com`.\n\nAlready holding Google access another way (a Google CLI with its own auth,\n`gcloud`, a credential gateway that mints tokens)? Skip OAuth and point the\nsource at it — no credential enters gbrain:\n\n```bash\ngbrain sources add gmail-work --kind google --account you@example.com \\\n  --access command --token-command \"\u003Ccommand that prints an access token>\"\n```\n\n(`--access env --token-env \u003CVAR>` reads an externally-refreshed token from\nthe environment instead.) Then `gbrain sync --source gmail-work` and\n`gbrain waiting` work identically.\n\nVerify health afterwards: `gbrain google status --json` (per-account\nrefresh probe) — and `gbrain doctor` carries a `google_oauth` check that\nwarns once a Testing-mode account goes 5+ days without a successful\nrefresh. An actively-syncing account gets no pre-warning before the 7-day\nTesting-mode expiry — publishing to Production is the real fix.\n\n## Daily operation\n\n```bash\ngbrain waiting --json        # the killer output: ranked people waiting\ngbrain loops done \u003Cid>       # user handled it\ngbrain loops drop \u003Cid>       # user is not going to do it\ngbrain loops mute sender \u003Cemail>   # never track this sender again (closes its open reply-owed loops)\ngbrain loops unmute sender \u003Cemail> # undo; the loops it closed are re-checked on the next sync\ngbrain loops drop sender \u003Cemail> --dry-run   # preview closing one sender's reply-owed loops\n```\n\n- `waiting` may end with `withheld_noise`: open reply-owed loops from senders\n  whose mail is automated (bank or shipping alerts). Show the user each\n  `preview_command`, run it (`--dry-run` changes nothing), and drop only after\n  the user agrees: a drop cannot be undone. Offer `loops mute sender` when the\n  user wants a stop they can reverse.\n\n- `waiting` REFUSES on stale data (no successful sync in 24h) and names the\n  exact fix (`gbrain sync --source \u003Cid>`). Run the sync, then retry. Only\n  use `--stale-ok` when the user explicitly accepts stale results.\n- `completeness: \"partial\"` means some mail in the last 14 days is held after\n  repeated import failures (listed in `held`), or, with `no_google_sources:\n  null`, the sources could not be read (retry). Present the answer as partial:\n  name each held item (sender, and subject when shown) and its retry command\n  (`gbrain sources retry-held \u003Cid>`). Never say \"you are clean\" on a partial\n  answer.\n- When presenting loops, show: the counterparty, what's owed (summary), the\n  evidence quote, the deep link (opens the exact Gmail thread in the right\n  account), and the due date when present. The trusted-local result already\n  carries a paste-ready `text` digest — reuse it.\n- For \"context to respond\": each group carries the counterparty's entity\n  card (summary, recent history, other open threads). Need more, call\n  `context_pack` with the counterparty slug.\n- After the user says they replied\u002Fhandled something, close the loop\n  (`loops done`) — thread loops also self-close on the next sync when the\n  reply is visible in Gmail.\n\n## Continuous ingestion\n\nGoogle sources sync like any source: autopilot and `gbrain sync --all` pick\nthem up automatically. No cron of its own. A bare un-targeted `gbrain sync`\ndoes NOT reach them — use `--source \u003Cid>` or `--all`.\n\n## Troubleshooting\n\nEvery failure has a typed code with the fix attached —\n`docs\u002Fguides\u002Fgoogle-connect.md#troubleshooting` is the canonical table. The\nthree the user will actually hit:\n\n- **\"Google hasn't verified this app\"** during consent → expected; it's the\n  user's own app: Advanced → Continue. Warn them BEFORE they click the URL.\n- **`access_denied_test_user`** → they forgot to add themselves as a test\n  user (the error carries the deep link).\n- **`invalid_grant_testing_expiry`** (everything silently stopped ~day 7) →\n  their consent screen is still in Testing; publish to Production, then\n  `gbrain google connect --reauth \u003Cemail>`.\n\n## Cost honesty\n\nCommitment extraction sends recent email text (≤30 days, ≤50 threads\u002Fsweep)\nto the configured chat provider. Tell the user once during setup; the off\nswitch is `gbrain config set loops.extraction_enabled false`. The\nunanswered-thread detector is free and unaffected.\n\n## Output Format\n\nWhen relaying `gbrain waiting`, present per counterparty, most urgent first, then the `## No counterparty` section (loops that name no person) last:\n\n```\n## \u003CCounterparty> (\u003CN> open)\n- [\u003Cloop_type>] \u003Cwhat's owed> (\u003Cage>) — due \u003Cdate if any>\n  > \"\u003Cevidence quote>\"\n  \u003CGmail deep link>\n```\n\nThe trusted-local `--json` result already carries this as a paste-ready\n`text` field — prefer relaying it over re-rendering. For setup commands,\nrelay `[SHOW USER]` blocks verbatim and `error.problem` + `error.fix` on\nfailures; never dump raw JSON envelopes at the user.\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- Setup prints `[SHOW USER]` blocks: relay them verbatim, one message per block. `gbrain mcp expose` and `gbrain google` still exit 2 when they need the user's confirmation (documented legacy), so read the block, not just the exit code.\n- A Google credential error (`invalid_grant_revoked`, `consent_timeout`, `wrong_account_consented`, …) carries `{ code, problem, cause, fix }`: show the user the problem and fix; most fixes are \"run it again\" by the user.\n- `gbrain waiting` refuses on stale data or reports partial coverage from held items: run the sync it names, or `gbrain sources status \u003Cid>` then, after the user agrees, `gbrain sources retry-held \u003Cid>`.\n\n## Anti-Patterns\n\n- **Paraphrasing a `[SHOW USER]` block.** The checklists carry load-bearing\n  detail (\"Desktop app, NOT Web application\", the test-user step). Relay\n  verbatim, one message per block.\n- **Asking the user for client_id\u002Fclient_secret as chat text.** Take the\n  downloaded JSON as a 0600 file (`--client-json \u003Cpath>`) or env vars;\n  secrets in argv\u002Fchat are the last resort, never the default.\n- **Answering \"who is waiting on me\" from `query`\u002F`search`.** The open-loop\n  record is `open_loops` \u002F `gbrain waiting` — search results have no\n  loop-state semantics and will happily surface answered threads.\n- **Dropping `completeness: \"partial\"`.** A partial answer with no loops is\n  not an empty inbox; say which items are held and how to re-attempt them.\n- **Bypassing the staleness refusal with `--stale-ok` silently.** Run the\n  named `gbrain sync --source \u003Cid>` first; only pass `--stale-ok` when the\n  user explicitly accepts possibly-outdated loops.\n- **Marking loops done for the user.** Close (`gbrain loops done \u003Cid>`) only\n  after the user says it's handled; thread loops self-close on the next sync\n  when the reply is visible in Gmail.\n","# Google Loops — Setup and Daily Operation\n\nThe connector ingests Gmail threads, calendar events, and contacts into the\nbrain and maintains the open-loop record behind `gbrain waiting`. Full\nreferences: `docs\u002Fguides\u002Fgoogle-connect.md` (setup + every error and its\nfix) and `docs\u002Fguides\u002Fopen-loops.md` (how detection works).\n\n## Contract for the harness (read first)\n\n1. **Relay `[SHOW USER]` blocks verbatim.** Setup commands print fenced\n   `[SHOW USER] ... [\u002FSHOW USER]` blocks — numbered steps with deep links.\n   Pass them to the user unchanged (paraphrasing loses load-bearing detail\n   like \"Desktop app, NOT Web application\"). Batch everything into ONE\n   message per block.\n2. **The whole setup is exactly two user interactions.** (1) The Google\n   Cloud checklist + the user hands back the downloaded client JSON.\n   (2) The user clicks one consent URL. If you find yourself asking a third\n   question, re-read the block you skipped.\n3. **Never put secrets in argv or chat when avoidable.** When the user drops\n   `client_secret_*.json` into chat, save it to a file (mode 0600) and pass\n   the path: `gbrain google connect --client-json \u003Cpath>`. Env\n   (`GOOGLE_CLIENT_ID`\u002F`GOOGLE_CLIENT_SECRET`) also works. Raw\n   `--client-id\u002F--client-secret` flags are the last resort.\n4. **Every command speaks JSON.** Add `--json` and read\n   `{ ok, status, next_action: { command, user_message }, error }`. When\n   `next_action.user_message` is present, that IS the message to show the\n   user; when `next_action.command` is present, that is your next call.\n   Errors carry `{ code, problem, cause, fix, doc_url }` — show the user\n   `problem` + `fix`, nothing else.\n5. **Re-running is always safe.** `gbrain google connect` and\n   `gbrain google setup` are idempotent state machines — the documented fix\n   for most errors is \"run it again.\"\n\n## Setup (the one command)\n\n```bash\ngbrain google setup --json\n```\n\nHandles: credential intake (prints the GCP checklist when nothing is on\nfile) → consent (loopback locally; auto paste-back over SSH\u002Fheadless —\nnon-TTY flows complete via a second call:\n`gbrain google connect --code \"\u003Cpasted-redirect-url>\"`) → source\nregistration → a budgeted first sync (newest mail first; the deep backfill\nresumes on later syncs automatically) → the first `gbrain waiting` digest.\n\nMultiple accounts: repeat with `--account work@example.com`.\n\nAlready holding Google access another way (a Google CLI with its own auth,\n`gcloud`, a credential gateway that mints tokens)? Skip OAuth and point the\nsource at it — no credential enters gbrain:\n\n```bash\ngbrain sources add gmail-work --kind google --account you@example.com \\\n  --access command --token-command \"\u003Ccommand that prints an access token>\"\n```\n\n(`--access env --token-env \u003CVAR>` reads an externally-refreshed token from\nthe environment instead.) Then `gbrain sync --source gmail-work` and\n`gbrain waiting` work identically.\n\nVerify health afterwards: `gbrain google status --json` (per-account\nrefresh probe) — and `gbrain doctor` carries a `google_oauth` check that\nwarns once a Testing-mode account goes 5+ days without a successful\nrefresh. An actively-syncing account gets no pre-warning before the 7-day\nTesting-mode expiry — publishing to Production is the real fix.\n\n## Daily operation\n\n```bash\ngbrain waiting --json        # the killer output: ranked people waiting\ngbrain loops done \u003Cid>       # user handled it\ngbrain loops drop \u003Cid>       # user is not going to do it\ngbrain loops mute sender \u003Cemail>   # never track this sender again (closes its open reply-owed loops)\ngbrain loops unmute sender \u003Cemail> # undo; the loops it closed are re-checked on the next sync\ngbrain loops drop sender \u003Cemail> --dry-run   # preview closing one sender's reply-owed loops\n```\n\n- `waiting` may end with `withheld_noise`: open reply-owed loops from senders\n  whose mail is automated (bank or shipping alerts). Show the user each\n  `preview_command`, run it (`--dry-run` changes nothing), and drop only after\n  the user agrees: a drop cannot be undone. Offer `loops mute sender` when the\n  user wants a stop they can reverse.\n\n- `waiting` REFUSES on stale data (no successful sync in 24h) and names the\n  exact fix (`gbrain sync --source \u003Cid>`). Run the sync, then retry. Only\n  use `--stale-ok` when the user explicitly accepts stale results.\n- `completeness: \"partial\"` means some mail in the last 14 days is held after\n  repeated import failures (listed in `held`), or, with `no_google_sources:\n  null`, the sources could not be read (retry). Present the answer as partial:\n  name each held item (sender, and subject when shown) and its retry command\n  (`gbrain sources retry-held \u003Cid>`). Never say \"you are clean\" on a partial\n  answer.\n- When presenting loops, show: the counterparty, what's owed (summary), the\n  evidence quote, the deep link (opens the exact Gmail thread in the right\n  account), and the due date when present. The trusted-local result already\n  carries a paste-ready `text` digest — reuse it.\n- For \"context to respond\": each group carries the counterparty's entity\n  card (summary, recent history, other open threads). Need more, call\n  `context_pack` with the counterparty slug.\n- After the user says they replied\u002Fhandled something, close the loop\n  (`loops done`) — thread loops also self-close on the next sync when the\n  reply is visible in Gmail.\n\n## Continuous ingestion\n\nGoogle sources sync like any source: autopilot and `gbrain sync --all` pick\nthem up automatically. No cron of its own. A bare un-targeted `gbrain sync`\ndoes NOT reach them — use `--source \u003Cid>` or `--all`.\n\n## Troubleshooting\n\nEvery failure has a typed code with the fix attached —\n`docs\u002Fguides\u002Fgoogle-connect.md#troubleshooting` is the canonical table. The\nthree the user will actually hit:\n\n- **\"Google hasn't verified this app\"** during consent → expected; it's the\n  user's own app: Advanced → Continue. Warn them BEFORE they click the URL.\n- **`access_denied_test_user`** → they forgot to add themselves as a test\n  user (the error carries the deep link).\n- **`invalid_grant_testing_expiry`** (everything silently stopped ~day 7) →\n  their consent screen is still in Testing; publish to Production, then\n  `gbrain google connect --reauth \u003Cemail>`.\n\n## Cost honesty\n\nCommitment extraction sends recent email text (≤30 days, ≤50 threads\u002Fsweep)\nto the configured chat provider. Tell the user once during setup; the off\nswitch is `gbrain config set loops.extraction_enabled false`. The\nunanswered-thread detector is free and unaffected.\n\n## Output Format\n\nWhen relaying `gbrain waiting`, present per counterparty, most urgent first, then the `## No counterparty` section (loops that name no person) last:\n\n```\n## \u003CCounterparty> (\u003CN> open)\n- [\u003Cloop_type>] \u003Cwhat's owed> (\u003Cage>) — due \u003Cdate if any>\n  > \"\u003Cevidence quote>\"\n  \u003CGmail deep link>\n```\n\nThe trusted-local `--json` result already carries this as a paste-ready\n`text` field — prefer relaying it over re-rendering. For setup commands,\nrelay `[SHOW USER]` blocks verbatim and `error.problem` + `error.fix` on\nfailures; never dump raw JSON envelopes at the user.\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- Setup prints `[SHOW USER]` blocks: relay them verbatim, one message per block. `gbrain mcp expose` and `gbrain google` still exit 2 when they need the user's confirmation (documented legacy), so read the block, not just the exit code.\n- A Google credential error (`invalid_grant_revoked`, `consent_timeout`, `wrong_account_consented`, …) carries `{ code, problem, cause, fix }`: show the user the problem and fix; most fixes are \"run it again\" by the user.\n- `gbrain waiting` refuses on stale data or reports partial coverage from held items: run the sync it names, or `gbrain sources status \u003Cid>` then, after the user agrees, `gbrain sources retry-held \u003Cid>`.\n\n## Anti-Patterns\n\n- **Paraphrasing a `[SHOW USER]` block.** The checklists carry load-bearing\n  detail (\"Desktop app, NOT Web application\", the test-user step). Relay\n  verbatim, one message per block.\n- **Asking the user for client_id\u002Fclient_secret as chat text.** Take the\n  downloaded JSON as a 0600 file (`--client-json \u003Cpath>`) or env vars;\n  secrets in argv\u002Fchat are the last resort, never the default.\n- **Answering \"who is waiting on me\" from `query`\u002F`search`.** The open-loop\n  record is `open_loops` \u002F `gbrain waiting` — search results have no\n  loop-state semantics and will happily surface answered threads.\n- **Dropping `completeness: \"partial\"`.** A partial answer with no loops is\n  not an empty inbox; say which items are held and how to re-attempt them.\n- **Bypassing the staleness refusal with `--stale-ok` silently.** Run the\n  named `gbrain sync --source \u003Cid>` first; only pass `--stale-ok` when the\n  user explicitly accepts possibly-outdated loops.\n- **Marking loops done for the user.** Close (`gbrain loops done \u003Cid>`) only\n  after the user says it's handled; thread loops self-close on the next sync\n  when the reply is visible in Gmail.\n",{"name":5,"tools":44,"version":50,"mutating":51,"triggers":52,"description":63,"writes_pages":40},[45,46,47,48,49],"open_loops","loops_close","loops_mute","entity","context_pack","1.0.0",true,[53,54,55,56,57,58,59,60,61,62],"connect gmail","connect google","connect calendar","connect contacts","who is waiting on me","what do I owe people","open loops","unanswered email","set up email ingestion","gbrain waiting","Set up and operate the Gmail\u002FCalendar\u002FContacts connector and the open-loop\nengine: who is waiting on the user, what they promised, and the context\nneeded to respond. Covers painless BYO OAuth setup (exactly two user\ninteractions), the daily `gbrain waiting` digest, loop closing\u002Fmuting, and\ntroubleshooting via the typed error catalog.\n","master","1e2fdc28a560c4a80a6e1f2d164d598032de41ff","skills\u002Fgoogle-loops",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":74,"prompt":84,"zipAvailable":51},[75,78,81],{"tool":76,"command":77},"npx","npx skills add garrytan\u002Fgbrain --skill google-loops",{"tool":79,"command":80},"bunx","bunx skills add garrytan\u002Fgbrain --skill google-loops",{"tool":82,"command":83},"pnpm","pnpm dlx skills add garrytan\u002Fgbrain --skill google-loops","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fgoogle-loops\u002FSKILL.md",[],[87,99,105,126,150,164],{"skillNo":88,"name":89,"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":90,"categories":91,"keywords":92,"publishedAt":39},"01M6N109FNGH1PK49T734PZXGB","query-helper","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[93,94,95,96,97,98,28],"query helper","helper","query","search","page","find",{"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":39},"01M6N108A23GW6NGQEQ0E7GV0A","broken","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[101],{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":39},"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",[],[112,113,114,115,116,97,117,118,33,119,95,120,29,121,122,123,124,125,96],"brain ops","brain","ops","true","attribution","read","write","look","pages","with","enrich","web","path","source",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":137,"publishedAt":39},"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",[132],{"categoryNo":133,"categoryName":134,"taxonomyType":135,"taxonomyTypeDesc":136},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[138,139,140,24,141,96,142,32,143,95,28,21,144,145,146,147,148,149],"meeting","prep","meeting prep","prepare","brief","build","about","you","briefing","threads","for","Meet",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":39},"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",[],[157,158,159,96,160,28,161,162,163],"inbox zero","ZeRO","inbox","clear","replies","my","triage",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":39},"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",[],[171,172,173,120,113,174,175,118,176,115,96,177],"deal memo","deal","memo","draft","investment","history","founder"]