[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X1PFXCCKDY8ZK4RWZVE391":3,"skill-same:01M6X1PFXCCKDY8ZK4RWZVE391":62},{"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":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":45,"ownerDescription":46,"updatedAt":47,"install":48,"resources":61},"01M6X1PFXCCKDY8ZK4RWZVE391","notification-routing",null,"Route agent notifications to specific channels by type — prevent alert fatigue from single-channel flooding","github\u002Fsquad","github","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F9919?v=4","01M6AC83DS133TPXFSP1DHNCC6","GitHub","01M6X0MZ6B0WYMMDPK3Q61KER6",3377,"MIT","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fnotification-routing\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31],"notification routing","routing","notification","communication","notifications","channel","alert","route","type","fatigue","channels","high","single","2026-11-10 10:12:30",false,"---\nname: \"notification-routing\"\ndescription: \"Route agent notifications to specific channels by type — prevent alert fatigue from single-channel flooding\"\ndomain: \"communication\"\nconfidence: \"high\"\nsource: \"earned\"\n---\n\n## Context\n\nWhen a Squad grows beyond a few agents, notifications flood a single channel — failure alerts drown in daily\nbriefings, tech news buries security findings, and everything gets ignored. This is the pub-sub problem:\na single message queue for everything is a recipe for missed alerts.\n\nThe fix is **topic-based routing**: agents tag notifications with a channel type, and a routing function\nsends them to the appropriate destination.\n\n**Trigger symptoms:**\n- Important alerts missed because they're buried in routine notifications\n- Team members turning off notifications entirely (signal overwhelm)\n- Onboarding friction: \"where do I look for X?\"\n\n## Patterns\n\n### Channel Config Schema\n\nDefine a `.squad\u002Fteams-channels.json` (or equivalent) mapping notification types to channel identifiers:\n\n```json\n{\n  \"teamId\": \"your-team-id\",\n  \"channels\": {\n    \"notifications\": \"squad-alerts\",\n    \"tech-news\":     \"tech-news\",\n    \"security\":      \"security-findings\",\n    \"releases\":      \"release-announcements\",\n    \"daily-digest\":  \"daily-digest\"\n  }\n}\n```\n\nPlace this in `.squad\u002F` (git-tracked, shared across the team). For platforms that use channel IDs instead of\nnames (Teams, Slack), store the resolved ID alongside the name to avoid name-collision bugs:\n\n```json\n{\n  \"channels\": {\n    \"notifications\": { \"name\": \"squad-alerts\", \"id\": \"channel-id-opaque-string\" }\n  }\n}\n```\n\n### CHANNEL: Tag Convention\n\nAgents prefix their output with `CHANNEL:\u003Ctype>` to signal where the notification should go:\n\n```\nCHANNEL:security\nSecurity Reviewer found 3 new CVEs in dependency scan: lodash@4.17.15, minimist@1.2.5\n```\n\n### Routing Dispatcher (shell pseudocode)\n\n```bash\ndispatch_notification() {\n  local raw_output=\"$1\"\n  local channel=\"notifications\"  # default\n\n  if echo \"$raw_output\" | grep -qE '^CHANNEL:[a-z][a-z0-9-]*'; then\n    channel=$(echo \"$raw_output\" | head -1 | cut -d: -f2)\n    raw_output=$(echo \"$raw_output\" | tail -n +2)\n  fi\n\n  send_notification --channel \"$channel\" --message \"$raw_output\"\n}\n```\n\n### Provider-Agnostic Adapter\n\nThe routing layer is provider-agnostic. Plug in your platform adapter:\n\n```\n.squad\u002Fnotify-adapter.sh   # Teams \u002F Slack \u002F Discord \u002F webhook -- swappable\n```\n\nThe routing config and CHANNEL: tags never change. Only the adapter changes per deployment.\n\n## Anti-Patterns\n\n**Never send all notification types to one channel:**\n```\nsend_notification --channel \"general\" --message \"$anything\"\n```\n\n**Never use display names as identifiers (name collision risk):**\n```\nsend_to_team --name \"Squad\" --channel \"notifications\"\n```\n\nResolve channel IDs once at setup. Use IDs at runtime.\n\n## Distributed Systems Pattern\n\nThis is **pub-sub with topic routing** -- the same principle as Kafka topics, RabbitMQ routing keys, and\nAWS SNS topic filtering. Route by type. Each consumer subscribes to the topics it cares about.","## Context\n\nWhen a Squad grows beyond a few agents, notifications flood a single channel — failure alerts drown in daily\nbriefings, tech news buries security findings, and everything gets ignored. This is the pub-sub problem:\na single message queue for everything is a recipe for missed alerts.\n\nThe fix is **topic-based routing**: agents tag notifications with a channel type, and a routing function\nsends them to the appropriate destination.\n\n**Trigger symptoms:**\n- Important alerts missed because they're buried in routine notifications\n- Team members turning off notifications entirely (signal overwhelm)\n- Onboarding friction: \"where do I look for X?\"\n\n## Patterns\n\n### Channel Config Schema\n\nDefine a `.squad\u002Fteams-channels.json` (or equivalent) mapping notification types to channel identifiers:\n\n```json\n{\n  \"teamId\": \"your-team-id\",\n  \"channels\": {\n    \"notifications\": \"squad-alerts\",\n    \"tech-news\":     \"tech-news\",\n    \"security\":      \"security-findings\",\n    \"releases\":      \"release-announcements\",\n    \"daily-digest\":  \"daily-digest\"\n  }\n}\n```\n\nPlace this in `.squad\u002F` (git-tracked, shared across the team). For platforms that use channel IDs instead of\nnames (Teams, Slack), store the resolved ID alongside the name to avoid name-collision bugs:\n\n```json\n{\n  \"channels\": {\n    \"notifications\": { \"name\": \"squad-alerts\", \"id\": \"channel-id-opaque-string\" }\n  }\n}\n```\n\n### CHANNEL: Tag Convention\n\nAgents prefix their output with `CHANNEL:\u003Ctype>` to signal where the notification should go:\n\n```\nCHANNEL:security\nSecurity Reviewer found 3 new CVEs in dependency scan: lodash@4.17.15, minimist@1.2.5\n```\n\n### Routing Dispatcher (shell pseudocode)\n\n```bash\ndispatch_notification() {\n  local raw_output=\"$1\"\n  local channel=\"notifications\"  # default\n\n  if echo \"$raw_output\" | grep -qE '^CHANNEL:[a-z][a-z0-9-]*'; then\n    channel=$(echo \"$raw_output\" | head -1 | cut -d: -f2)\n    raw_output=$(echo \"$raw_output\" | tail -n +2)\n  fi\n\n  send_notification --channel \"$channel\" --message \"$raw_output\"\n}\n```\n\n### Provider-Agnostic Adapter\n\nThe routing layer is provider-agnostic. Plug in your platform adapter:\n\n```\n.squad\u002Fnotify-adapter.sh   # Teams \u002F Slack \u002F Discord \u002F webhook -- swappable\n```\n\nThe routing config and CHANNEL: tags never change. Only the adapter changes per deployment.\n\n## Anti-Patterns\n\n**Never send all notification types to one channel:**\n```\nsend_notification --channel \"general\" --message \"$anything\"\n```\n\n**Never use display names as identifiers (name collision risk):**\n```\nsend_to_team --name \"Squad\" --channel \"notifications\"\n```\n\nResolve channel IDs once at setup. Use IDs at runtime.\n\n## Distributed Systems Pattern\n\nThis is **pub-sub with topic routing** -- the same principle as Kafka topics, RabbitMQ routing keys, and\nAWS SNS topic filtering. Route by type. Each consumer subscribes to the topics it cares about.",{"name":5,"domain":22,"source":37,"confidence":30,"description":7},"earned","dev","7b731ec97f35346bdc4fa87c3edaf16b808fc0ae","packages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fnotification-routing",516,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad","https:\u002F\u002Fgithub.github.io\u002Fsquad\u002F","https:\u002F\u002Fgithub.com\u002Fgithub","https:\u002F\u002Fgithub.com\u002Fabout","How people build software.","2026-11-12 02:20:49",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add github\u002Fsquad --skill notification-routing",{"tool":54,"command":55},"bunx","bunx skills add github\u002Fsquad --skill notification-routing",{"tool":57,"command":58},"pnpm","pnpm dlx skills add github\u002Fsquad --skill notification-routing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fnotification-routing\u002FSKILL.md",true,[],[63,95,107,116,133,156],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":74,"publishedAt":32},"01M6X287DVJK1S91END9DSHETN","gh-aw-enlistment","Enlist a repository into Squad by installing the supported GitHub Agentic Workflows (gh-aw) bootstrap — with strict compilation, an explicit safe-update allowlist, and a human-reviewed bootstrap PR. Never auto-merges.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad\u002Fblob\u002Fdev\u002Fworkflows\u002Fskills\u002Fgh-aw-enlistment\u002FSKILL.md",[69],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94],"gh aw enlistment","gh","safe","workflows","agentic workflows","identity","squad","update","compiling","actions","ci","Safety","preflight","guide","auto","files","human","pr creation","github cli","lock",{"skillNo":96,"name":97,"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":98,"categories":99,"keywords":101,"publishedAt":32},"01M6X27Y5119CSRQFFJCV6432R","My Skill","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fmy-skill\u002FSKILL.md",[100],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},[102,103,104,105,106],"my","my skill","testing","vitest","tester",{"skillNo":108,"name":109,"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":110,"categories":111,"keywords":113,"publishedAt":32},"01M6X27RWAYB2X9ER0MVRRKXGA","bad-skill","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fbad-skill\u002FSKILL.md",[112],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},[114,115],"bad","bad skill",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":32},"01M6X27HBWM6V81KXYW5XQSWFJ","windows-compatibility","Cross-platform path handling and command patterns","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fwindows-compatibility\u002FSKILL.md",[],[123,124,125,30,126,127,128,129,130,131,132],"windows compatibility","compatibility","windows","platform","path","bugs","git","command","patterns","cross-platform",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":139,"publishedAt":32},"01M6X278Z6PF2YQN406RHJJWHG","versioning-policy","SemVer rules for Squad's stable, preview, insider, and local package versions","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fversioning-policy\u002FSKILL.md",[],[140,141,142,143,144,81,145,146,147,148,85,149,150,151,152,153,29,154,30,155],"versioning","versioning policy","policy","preview","pr","release","semver","npm","package","workspace","Rules","incident","local","resolution","insider","for",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":166,"publishedAt":32},"01M6X26XS6T23E81XNP51HMQAT","tiered-memory","Three-tier agent memory model (hot\u002Fcold\u002Fwiki) for context reduction per spawn","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Ftiered-memory\u002FSKILL.md",[162,165],{"categoryNo":163,"categoryName":164,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},[167,168,169,170,171,172,173,174,155,175,176,177,178,179,180,181],"memory","tiered memory","model","wiki","agent memory","performance","cold","memory-management","runtime","three","spawn","proposal","management","design","context"]