[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7C9KXNF8KPBYHC0QJ43JNN5":3,"skill-same:01M7C9KXNF8KPBYHC0QJ43JNN5":68},{"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":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":14,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M7C9KXNF8KPBYHC0QJ43JNN5","schema-unify",null,"Migrate a brain from gbrain-base (or any pack) to gbrain-base-v2's 14-canonical-type taxonomy via gbrain onboard --check + the unify-types Minion handler. Collapses 94 noisy types to 15 canonical with subtypes, alias rows, and link rows. Triggers when an agent notices pack_upgrade_available, type_proliferation, or asks \"what is the canonical taxonomy \u002F how do I clean up my page types\".","verbo-lab\u002Fgbrain-espelho","verbo-lab","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F324223481?v=4","01M7C9DM5DPR5JV2EAD9EXB4GH","Verbo","01M7C9DM67A175S57DNZ4X6C1A",0,"MIT","https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho\u002Fblob\u002FJul13-sina\u002Fskills\u002Fschema-unify\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: schema-unify\ndescription: Migrate a brain from gbrain-base (or any pack) to gbrain-base-v2's 14-canonical-type taxonomy via gbrain onboard --check + the unify-types Minion handler. Collapses 94 noisy types to 15 canonical with subtypes, alias rows, and link rows. Triggers when an agent notices pack_upgrade_available, type_proliferation, or asks \"what is the canonical taxonomy \u002F how do I clean up my page types\".\nbrain_first: exempt\ntools:\n  - gbrain onboard --check\n  - gbrain onboard --check --explain\n  - gbrain onboard --check --json\n  - gbrain jobs submit unify-types\n  - gbrain jobs follow\n  - gbrain schema active\n  - gbrain schema use\n  - gbrain schema stats\n  - gbrain pages restore\n  - mcp:run_onboard\ntriggers:\n  - \"unify my types\"\n  - \"migrate to gbrain-base-v2\"\n  - \"94 types to 14\"\n  - \"apply canonical taxonomy\"\n  - \"clean up my page types\"\n  - \"pack upgrade\"\n  - \"shrink type proliferation\"\n  - \"what does the canonical taxonomy look like\"\n  - \"consolidate page types\"\n  - \"retype pages to canonical\"\n---\n\n# Schema Unification (gbrain-base → gbrain-base-v2)\n\nv0.41.22 ships **gbrain-base-v2** — a 15-type DRY\u002FMECE taxonomy (14 canonical + `note` catch-all) — as the install default for new brains. Existing brains on `gbrain-base` can opt in via the `pack_upgrade_available` onboard finding + the `unify-types` PROTECTED Minion handler.\n\nThis skill is the playbook for that migration.\n\n## brain_first: exempt\n\nThis skill is ABOUT the brain's shape — it can't depend on the brain it's reshaping. No `gbrain search` lookup first; jump straight to onboard.\n\n## When this skill fires\n\n- Agent runs `gbrain onboard --check` and sees `pack_upgrade_available` or `type_proliferation` warnings\n- User asks \"what is the canonical taxonomy \u002F how do I clean up my page types \u002F migrate to v2\"\n- A `dangling_aliases` finding surfaces (post-unify GC)\n- An agent ingesting from a custom pack wants to consult the v2 taxonomy as a reference\n\n## Mental model (one paragraph)\n\nA production gbrain brain accreted **94 distinct `pages.type` values** over years of ingestion: tweet \u002F tweet-thread \u002F tweet-bundle \u002F tweet-single \u002F media\u002Fx-tweet\u002Fbundle \u002F tweet-stub all coexisting; 5.5K concept-redirect pages; atom-partner-link pages that should be links; civic \u002F framework \u002F insight \u002F memo \u002F anecdote one-offs. The cure: collapse to **15 canonical types** (person, company, media, tweet, social-digest, analysis, atom, concept, source, deal, email, slack, writing, project, note) with subtypes\u002Fformat\u002Forigin pushed to frontmatter, alias-rows for redirects, real link-rows for edge-shaped pages, and a catch-all that bins long-tail unknowns to `note` with `frontmatter.legacy_type = \u003Coriginal>` for rollback.\n\n## Workflow\n\n### Phase 1: Discovery\n\nConfirm the brain is actually on `gbrain-base` (not already on v2).\n\n```bash\ngbrain schema active --json | jq -r '.identity'\n```\n\nExpected: `gbrain-base@1.0.0+\u003Csha>`. If you see `gbrain-base-v2@...`, the brain is already on v2 — skip the migration.\n\nThen run onboard to see what would change:\n\n```bash\ngbrain onboard --check\n```\n\nLook for the `pack_upgrade_available` finding. If it's `ok`, there's no successor declared for the active pack — done.\n\n### Phase 2: Preview\n\nRun the per-cluster narrative:\n\n```bash\ngbrain onboard --check --explain\n```\n\nThis invokes the `unify-types` handler in dry-run mode and prints:\n- How many pages would retype per cluster (tweets, articles, companies, etc.)\n- How many concept-redirect pages would become alias rows\n- How many edge-shaped pages would convert to real links\n- The synthesized catch-all rules for unknown types\n\nReview the output. If the proposed changes look wrong, **don't** proceed — file an issue or write a custom pack with adjusted mapping_rules.\n\n### Phase 3: Apply\n\nThe handler is PROTECTED (manual_only per D17) — autopilot will never auto-fire it. Submit explicitly:\n\n```bash\ngbrain jobs submit unify-types \\\n  --allow-protected \\\n  --params '{\"target_pack\":\"gbrain-base-v2\"}'\n```\n\nWatch progress per phase:\n\n```bash\ngbrain jobs follow \u003Cjob_id>\n```\n\nOn a 186K-page brain expect ~10 minutes. The handler runs:\n1. Preflight (validate target pack has `mapping_rules:`)\n2. Stats snapshot (pre-state for celebration summary)\n3. Acquire `gbrain-unify` db-lock (60min TTL)\n4. Apply phases:\n   - Explicit retype rules (tweets, articles, companies, etc.)\n   - Catch-all retype (unknown types → note with legacy_type)\n   - Page-to-link rules (atom-partner-link, symlink)\n   - Page-to-alias rules (concept-redirect)\n5. Final sync (untyped rows by path-prefix)\n6. **Flip active pack** to gbrain-base-v2 (D13)\n7. Verify + celebration summary\n\n### Phase 4: Verify\n\n```bash\ngbrain onboard --check\ngbrain schema stats\n```\n\nExpected:\n- `pack_upgrade_available` → `ok` (active pack is now v2)\n- `type_proliferation` → `ok` (≤16 distinct typed values)\n- `dangling_aliases` → `ok` (slug_aliases all point at active canonicals)\n- `gbrain schema stats` shows ≤16 distinct types\n\n### Phase 5: Post-migration\n\nAnything that used `--type article` keeps working post-unify if your CLI calls go through the `expandTypeFilter` helper (it expands `article` to `media+subtype=article` automatically). Direct SQL against `pages.type` needs updating to the canonical types.\n\nSearch queries get a small ranking signal: pages reached via `slug_aliases` (canonicals of one or more aliases) get a 1.05x boost. Visible via `gbrain search --explain`.\n\n## Rollback\n\nEvery retyped page preserves `frontmatter.legacy_type = \u003Coriginal>` per D8. Restore types via:\n\n```sql\nUPDATE pages SET type = frontmatter->>'legacy_type'\nWHERE source_id = 'default' AND frontmatter->>'legacy_type' IS NOT NULL;\n```\n\nPage-to-alias and page-to-link source pages soft-delete with 72h TTL. Restore within that window:\n\n```bash\ngbrain pages restore \u003Cslug>\n```\n\nRevert the active pack flip:\n\n```bash\ngbrain schema use gbrain-base\n```\n\n## Anti-patterns\n\n- **Don't run unify-types under autopilot.** It's manual_only by design. Autopilot remediation should never silently change your taxonomy.\n- **Don't expect mapping_rules to cover every legacy type explicitly.** Use the catch-all (`*unknown*`) for the long tail. Pages get retyped to `note` with `legacy_type` preserved.\n- **Don't rewrite body-text wikilinks.** D15: the slug_aliases table IS the resolver. `[[old-redirect-slug]]` keeps working via `engine.resolveSlugWithAlias` short-circuit.\n- **Don't bypass the dry-run.** Always run `--explain` before applying. The trust delta is real.\n- **Don't run two unify jobs concurrently.** The `gbrain-unify` db-lock serializes them; the second submission rejects with \"already in progress.\"\n\n## Decision tree\n\n```\nActive pack already gbrain-base-v2?\n  → Skip migration.\n\nCustom pack with own mapping_rules?\n  → Run --check --explain to see if your pack declares migration_from\n    for the active pack. If yes, target_pack = your pack name.\n\nBrain has many custom types not covered by gbrain-base-v2 mapping_rules?\n  → The catch-all retype binds them to `note` with legacy_type preserved.\n    Review by inspecting frontmatter.legacy_type after the migration.\n\nFederated brain (multiple sources)?\n  → Add --params source_id to scope the migration per-source. Each\n    source can be migrated independently.\n\nWorried about a specific cluster's mapping?\n  → Fork gbrain-base-v2 (`gbrain schema fork gbrain-base-v2 my-pack`),\n    edit mapping_rules in your fork, then target the fork.\n```\n\n## Contract\n\nInputs:\n- A brain on `gbrain-base` (or any pack with `migration_from: gbrain-base-v2`).\n- Write access to submit a PROTECTED Minion handler (`--allow-protected`).\n- ~10 min wallclock on a 186K-page brain.\n\nOutputs:\n- Pages retyped to canonical types with `frontmatter.legacy_type` preserved (per-page rollback signal).\n- `slug_aliases` rows for concept-redirect pages (alias table IS the resolver — no link rewrite).\n- Real `links` rows for edge-shaped pages (`atom-partner-link`, `symlink`, etc.).\n- Active pack flipped to `gbrain-base-v2` atomically at end of successful run.\n\nSide effects:\n- Source pages soft-deleted with 72h restore TTL (`gbrain pages restore \u003Cslug>`).\n- One-time cache invalidation on KNOBS_HASH_VERSION bump (5→6); self-healing in `cache.ttl_seconds`.\n- Query-time `--type X` alias-expands via `expandTypeFilter` (D14 back-compat).\n\nFailure modes:\n- Concurrent submission rejected by the `gbrain-unify` db-lock; second call exits gracefully.\n- Catch-all retype excludes `page_to_link` + `page_to_alias` source types (caught in E2E pre-merge).\n- Phase failures abort the run before `active_pack_flipped`; partial state restorable via op_checkpoint resume.\n\n## Anti-Patterns\n\nDON'T:\n- Submit `unify-types` directly via the MCP `submit_job` op without `--allow-protected`. PROTECTED handlers require trusted local callers; remote MCP rejection is the intentional trust boundary.\n- Edit `mapping_rules` in `gbrain-base-v2.yaml` to skip clusters you don't trust. Fork the pack instead (`gbrain schema fork`) so the source-of-truth migration stays consistent across brains.\n- Run `unify-types` from inside an autopilot tick. The check is `manual_only` per D17 — autopilot deliberately never auto-fires it because pack upgrades are one-time consenting taxonomy decisions.\n- Hard-delete soft-deleted source pages before the 72h restore window. Use `gbrain pages restore \u003Cslug>` first if rollback is needed.\n- Assume `frontmatter.legacy_type` survives every roundtrip. The marker is canonical for the immediate post-migration window; downstream re-imports may overwrite it.\n\n## Output Format\n\nPer phase, the handler emits to stderr:\n```\n[unify-types] phase=retype-explicit applied=N skipped=M  cost=USD  ttl=Ns\n[unify-types] phase=retype-catch-all applied=N\n[unify-types] phase=page-to-link converted=N pages soft-deleted\n[unify-types] phase=page-to-alias aliased=N pages soft-deleted\n[unify-types] phase=sync residual=N\n[unify-types] active_pack flipped from gbrain-base to gbrain-base-v2\n```\n\nFinal celebration summary to stderr:\n```\n═══════════════════════════════════════════════════════════\n  gbrain-base-v2 migration complete\n═══════════════════════════════════════════════════════════\n  Before: 94 distinct page types\n  After:  15 canonical types\n  Retyped:      25,632 pages\n  Aliased:       5,521 redirects → slug_aliases table\n  Linkified:        65 ghost pages → real link rows\n  Soft-deleted:  5,586 pages (restorable for 72h)\n═══════════════════════════════════════════════════════════\n```\n\nJSON output (`gbrain jobs follow \u003Cid> --json`) returns the structured `UnifyTypesResult` shape with `per_phase`, `pack_identity_after`, `active_pack_flipped`.\n\n## Reference\n\n- Plan + decisions: `~\u002F.claude\u002Fplans\u002Fsystem-instruction-you-are-working-transient-elephant.md`\n- Architecture: `docs\u002Farchitecture\u002Ftype-taxonomy.md`\n- Pack-upgrade mechanism: `docs\u002Farchitecture\u002Fpack-upgrade-mechanism.md`\n- Issue: https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fissues\u002F1479\n","# Schema Unification (gbrain-base → gbrain-base-v2)\n\nv0.41.22 ships **gbrain-base-v2** — a 15-type DRY\u002FMECE taxonomy (14 canonical + `note` catch-all) — as the install default for new brains. Existing brains on `gbrain-base` can opt in via the `pack_upgrade_available` onboard finding + the `unify-types` PROTECTED Minion handler.\n\nThis skill is the playbook for that migration.\n\n## brain_first: exempt\n\nThis skill is ABOUT the brain's shape — it can't depend on the brain it's reshaping. No `gbrain search` lookup first; jump straight to onboard.\n\n## When this skill fires\n\n- Agent runs `gbrain onboard --check` and sees `pack_upgrade_available` or `type_proliferation` warnings\n- User asks \"what is the canonical taxonomy \u002F how do I clean up my page types \u002F migrate to v2\"\n- A `dangling_aliases` finding surfaces (post-unify GC)\n- An agent ingesting from a custom pack wants to consult the v2 taxonomy as a reference\n\n## Mental model (one paragraph)\n\nA production gbrain brain accreted **94 distinct `pages.type` values** over years of ingestion: tweet \u002F tweet-thread \u002F tweet-bundle \u002F tweet-single \u002F media\u002Fx-tweet\u002Fbundle \u002F tweet-stub all coexisting; 5.5K concept-redirect pages; atom-partner-link pages that should be links; civic \u002F framework \u002F insight \u002F memo \u002F anecdote one-offs. The cure: collapse to **15 canonical types** (person, company, media, tweet, social-digest, analysis, atom, concept, source, deal, email, slack, writing, project, note) with subtypes\u002Fformat\u002Forigin pushed to frontmatter, alias-rows for redirects, real link-rows for edge-shaped pages, and a catch-all that bins long-tail unknowns to `note` with `frontmatter.legacy_type = \u003Coriginal>` for rollback.\n\n## Workflow\n\n### Phase 1: Discovery\n\nConfirm the brain is actually on `gbrain-base` (not already on v2).\n\n```bash\ngbrain schema active --json | jq -r '.identity'\n```\n\nExpected: `gbrain-base@1.0.0+\u003Csha>`. If you see `gbrain-base-v2@...`, the brain is already on v2 — skip the migration.\n\nThen run onboard to see what would change:\n\n```bash\ngbrain onboard --check\n```\n\nLook for the `pack_upgrade_available` finding. If it's `ok`, there's no successor declared for the active pack — done.\n\n### Phase 2: Preview\n\nRun the per-cluster narrative:\n\n```bash\ngbrain onboard --check --explain\n```\n\nThis invokes the `unify-types` handler in dry-run mode and prints:\n- How many pages would retype per cluster (tweets, articles, companies, etc.)\n- How many concept-redirect pages would become alias rows\n- How many edge-shaped pages would convert to real links\n- The synthesized catch-all rules for unknown types\n\nReview the output. If the proposed changes look wrong, **don't** proceed — file an issue or write a custom pack with adjusted mapping_rules.\n\n### Phase 3: Apply\n\nThe handler is PROTECTED (manual_only per D17) — autopilot will never auto-fire it. Submit explicitly:\n\n```bash\ngbrain jobs submit unify-types \\\n  --allow-protected \\\n  --params '{\"target_pack\":\"gbrain-base-v2\"}'\n```\n\nWatch progress per phase:\n\n```bash\ngbrain jobs follow \u003Cjob_id>\n```\n\nOn a 186K-page brain expect ~10 minutes. The handler runs:\n1. Preflight (validate target pack has `mapping_rules:`)\n2. Stats snapshot (pre-state for celebration summary)\n3. Acquire `gbrain-unify` db-lock (60min TTL)\n4. Apply phases:\n   - Explicit retype rules (tweets, articles, companies, etc.)\n   - Catch-all retype (unknown types → note with legacy_type)\n   - Page-to-link rules (atom-partner-link, symlink)\n   - Page-to-alias rules (concept-redirect)\n5. Final sync (untyped rows by path-prefix)\n6. **Flip active pack** to gbrain-base-v2 (D13)\n7. Verify + celebration summary\n\n### Phase 4: Verify\n\n```bash\ngbrain onboard --check\ngbrain schema stats\n```\n\nExpected:\n- `pack_upgrade_available` → `ok` (active pack is now v2)\n- `type_proliferation` → `ok` (≤16 distinct typed values)\n- `dangling_aliases` → `ok` (slug_aliases all point at active canonicals)\n- `gbrain schema stats` shows ≤16 distinct types\n\n### Phase 5: Post-migration\n\nAnything that used `--type article` keeps working post-unify if your CLI calls go through the `expandTypeFilter` helper (it expands `article` to `media+subtype=article` automatically). Direct SQL against `pages.type` needs updating to the canonical types.\n\nSearch queries get a small ranking signal: pages reached via `slug_aliases` (canonicals of one or more aliases) get a 1.05x boost. Visible via `gbrain search --explain`.\n\n## Rollback\n\nEvery retyped page preserves `frontmatter.legacy_type = \u003Coriginal>` per D8. Restore types via:\n\n```sql\nUPDATE pages SET type = frontmatter->>'legacy_type'\nWHERE source_id = 'default' AND frontmatter->>'legacy_type' IS NOT NULL;\n```\n\nPage-to-alias and page-to-link source pages soft-delete with 72h TTL. Restore within that window:\n\n```bash\ngbrain pages restore \u003Cslug>\n```\n\nRevert the active pack flip:\n\n```bash\ngbrain schema use gbrain-base\n```\n\n## Anti-patterns\n\n- **Don't run unify-types under autopilot.** It's manual_only by design. Autopilot remediation should never silently change your taxonomy.\n- **Don't expect mapping_rules to cover every legacy type explicitly.** Use the catch-all (`*unknown*`) for the long tail. Pages get retyped to `note` with `legacy_type` preserved.\n- **Don't rewrite body-text wikilinks.** D15: the slug_aliases table IS the resolver. `[[old-redirect-slug]]` keeps working via `engine.resolveSlugWithAlias` short-circuit.\n- **Don't bypass the dry-run.** Always run `--explain` before applying. The trust delta is real.\n- **Don't run two unify jobs concurrently.** The `gbrain-unify` db-lock serializes them; the second submission rejects with \"already in progress.\"\n\n## Decision tree\n\n```\nActive pack already gbrain-base-v2?\n  → Skip migration.\n\nCustom pack with own mapping_rules?\n  → Run --check --explain to see if your pack declares migration_from\n    for the active pack. If yes, target_pack = your pack name.\n\nBrain has many custom types not covered by gbrain-base-v2 mapping_rules?\n  → The catch-all retype binds them to `note` with legacy_type preserved.\n    Review by inspecting frontmatter.legacy_type after the migration.\n\nFederated brain (multiple sources)?\n  → Add --params source_id to scope the migration per-source. Each\n    source can be migrated independently.\n\nWorried about a specific cluster's mapping?\n  → Fork gbrain-base-v2 (`gbrain schema fork gbrain-base-v2 my-pack`),\n    edit mapping_rules in your fork, then target the fork.\n```\n\n## Contract\n\nInputs:\n- A brain on `gbrain-base` (or any pack with `migration_from: gbrain-base-v2`).\n- Write access to submit a PROTECTED Minion handler (`--allow-protected`).\n- ~10 min wallclock on a 186K-page brain.\n\nOutputs:\n- Pages retyped to canonical types with `frontmatter.legacy_type` preserved (per-page rollback signal).\n- `slug_aliases` rows for concept-redirect pages (alias table IS the resolver — no link rewrite).\n- Real `links` rows for edge-shaped pages (`atom-partner-link`, `symlink`, etc.).\n- Active pack flipped to `gbrain-base-v2` atomically at end of successful run.\n\nSide effects:\n- Source pages soft-deleted with 72h restore TTL (`gbrain pages restore \u003Cslug>`).\n- One-time cache invalidation on KNOBS_HASH_VERSION bump (5→6); self-healing in `cache.ttl_seconds`.\n- Query-time `--type X` alias-expands via `expandTypeFilter` (D14 back-compat).\n\nFailure modes:\n- Concurrent submission rejected by the `gbrain-unify` db-lock; second call exits gracefully.\n- Catch-all retype excludes `page_to_link` + `page_to_alias` source types (caught in E2E pre-merge).\n- Phase failures abort the run before `active_pack_flipped`; partial state restorable via op_checkpoint resume.\n\n## Anti-Patterns\n\nDON'T:\n- Submit `unify-types` directly via the MCP `submit_job` op without `--allow-protected`. PROTECTED handlers require trusted local callers; remote MCP rejection is the intentional trust boundary.\n- Edit `mapping_rules` in `gbrain-base-v2.yaml` to skip clusters you don't trust. Fork the pack instead (`gbrain schema fork`) so the source-of-truth migration stays consistent across brains.\n- Run `unify-types` from inside an autopilot tick. The check is `manual_only` per D17 — autopilot deliberately never auto-fires it because pack upgrades are one-time consenting taxonomy decisions.\n- Hard-delete soft-deleted source pages before the 72h restore window. Use `gbrain pages restore \u003Cslug>` first if rollback is needed.\n- Assume `frontmatter.legacy_type` survives every roundtrip. The marker is canonical for the immediate post-migration window; downstream re-imports may overwrite it.\n\n## Output Format\n\nPer phase, the handler emits to stderr:\n```\n[unify-types] phase=retype-explicit applied=N skipped=M  cost=USD  ttl=Ns\n[unify-types] phase=retype-catch-all applied=N\n[unify-types] phase=page-to-link converted=N pages soft-deleted\n[unify-types] phase=page-to-alias aliased=N pages soft-deleted\n[unify-types] phase=sync residual=N\n[unify-types] active_pack flipped from gbrain-base to gbrain-base-v2\n```\n\nFinal celebration summary to stderr:\n```\n═══════════════════════════════════════════════════════════\n  gbrain-base-v2 migration complete\n═══════════════════════════════════════════════════════════\n  Before: 94 distinct page types\n  After:  15 canonical types\n  Retyped:      25,632 pages\n  Aliased:       5,521 redirects → slug_aliases table\n  Linkified:        65 ghost pages → real link rows\n  Soft-deleted:  5,586 pages (restorable for 72h)\n═══════════════════════════════════════════════════════════\n```\n\nJSON output (`gbrain jobs follow \u003Cid> --json`) returns the structured `UnifyTypesResult` shape with `per_phase`, `pack_identity_after`, `active_pack_flipped`.\n\n## Reference\n\n- Plan + decisions: `~\u002F.claude\u002Fplans\u002Fsystem-instruction-you-are-working-transient-elephant.md`\n- Architecture: `docs\u002Farchitecture\u002Ftype-taxonomy.md`\n- Pack-upgrade mechanism: `docs\u002Farchitecture\u002Fpack-upgrade-mechanism.md`\n- Issue: https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fissues\u002F1479\n",{"name":5,"tools":24,"triggers":35,"brain_first":46,"description":7},[25,26,27,28,29,30,31,32,33,34],"gbrain onboard --check","gbrain onboard --check --explain","gbrain onboard --check --json","gbrain jobs submit unify-types","gbrain jobs follow","gbrain schema active","gbrain schema use","gbrain schema stats","gbrain pages restore","mcp:run_onboard",[36,37,38,39,40,41,42,43,44,45],"unify my types","migrate to gbrain-base-v2","94 types to 14","apply canonical taxonomy","clean up my page types","pack upgrade","shrink type proliferation","what does the canonical taxonomy look like","consolidate page types","retype pages to canonical","exempt","Jul13-sina","7b839dc996db383d84e013c744dde6716d26d5c1","skills\u002Fschema-unify","https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho","https:\u002F\u002Fgithub.com\u002Fverbo-lab","www.verbolab.co","2026-09-07 21:13:16",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add verbo-lab\u002Fgbrain-espelho --skill schema-unify",{"tool":60,"command":61},"bunx","bunx skills add verbo-lab\u002Fgbrain-espelho --skill schema-unify",{"tool":63,"command":64},"pnpm","pnpm dlx skills add verbo-lab\u002Fgbrain-espelho --skill schema-unify","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho\u002Fblob\u002FJul13-sina\u002Fskills\u002Fschema-unify\u002FSKILL.md",true,[],[69,75,81,88,95,102],{"skillNo":70,"name":71,"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":72,"categories":73,"keywords":74,"publishedAt":19},"01M7C9QJ28YBQB19E7EB0BSX94","query-helper","https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho\u002Fblob\u002FJul13-sina\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[],{"skillNo":76,"name":77,"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":78,"categories":79,"keywords":80,"publishedAt":19},"01M7C9QH49H9QNVK3K4WFWBRJG","broken","https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho\u002Fblob\u002FJul13-sina\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M7C9QE55HYHDNVR8CW5RYW6W","brain-ops","Read, enrich, and write brain pages with source attribution.","https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho\u002Fblob\u002FJul13-sina\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbrain-ops\u002FSKILL.md",[],[],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":19},"01M7C9QCM9FJT2SDK25K4BAM02","signal-detector","Always-on ambient signal capture for the OpenClaw reference fixture.","https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho\u002Fblob\u002FJul13-sina\u002Ftest\u002Ffixtures\u002Fopenclaw-reference-minimal\u002Fskills\u002Fsignal-detector\u002FSKILL.md",[],[],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":19},"01M7C9QB45B1PM7SB8GKEJV5ZG","query","Look up brain pages in the OpenClaw reference fixture.","https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho\u002Fblob\u002FJul13-sina\u002Ftest\u002Ffixtures\u002Fopenclaw-reference-minimal\u002Fskills\u002Fquery\u002FSKILL.md",[],[],{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":19},"01M7C9Q9CV2EDYHBMPFY59K2GD","context-now","ALWAYS-ON time-sensitivity discipline for the OpenClaw reference fixture.","https:\u002F\u002Fgithub.com\u002Fverbo-lab\u002Fgbrain-espelho\u002Fblob\u002FJul13-sina\u002Ftest\u002Ffixtures\u002Fopenclaw-reference-minimal\u002Fskills\u002Fcontext-now\u002FSKILL.md",[],[]]