[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6R7QFQSFWFA0ZPV6BVDS17D":3,"skill-same:01M6R7QFQSFWFA0ZPV6BVDS17D":57},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":13,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":42,"install":43,"resources":56},"01M6R7QFQSFWFA0ZPV6BVDS17D","notification-routing",null,"Route agent notifications to specific channels by type — prevent alert fatigue from single-channel flooding","barichter\u002Fsquad","barichter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F96797186?v=4","01M6R712K8ESMDF089BFENBR16","01M6R712R74BSQQSG2GTXBWR8P",0,"MIT","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fnotification-routing\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30],"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\nWorf 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\nWorf 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":21,"source":36,"confidence":29,"description":7},"earned","dev","ec19f5e92325e634e3c6eff500e3cefa56131cc9","packages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fnotification-routing","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad","https:\u002F\u002Fgithub.com\u002Fbarichter","2026-04-13 22:53:46",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add barichter\u002Fsquad --skill notification-routing",{"tool":49,"command":50},"bunx","bunx skills add barichter\u002Fsquad --skill notification-routing",{"tool":52,"command":53},"pnpm","pnpm dlx skills add barichter\u002Fsquad --skill notification-routing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fnotification-routing\u002FSKILL.md",true,[],[58,74,82,98,121,127],{"skillNo":59,"name":60,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":68,"publishedAt":31},"01M6R7VE8SZD1E37WWJN4ZFPWB","My Skill","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fmy-skill\u002FSKILL.md",[63],{"categoryNo":64,"categoryName":65,"taxonomyType":66,"taxonomyTypeDesc":67},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[69,70,71,72,73],"my","my skill","tester","vitest","testing",{"skillNo":75,"name":76,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":31},"01M6R7VD19M4TMAA74XGD6QSZX","bad-skill","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fbad-skill\u002FSKILL.md",[],[80,81],"bad skill","bad",{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":31},"01M6R7V9TYTX6Z621V6RWA51G6","squad-conventions","Core conventions and patterns used in the Squad codebase","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fsquad-conventions\u002FSKILL.md",[],[89,90,91,92,93,94,95,96,29,97],"squad conventions","squad","conventions","project-conventions","core","patterns","project","manual","codebase",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":31},"01M6R7TTF0ABMGSVWASVYF6D51","rework-rate","Measure and interpret PR rework rate — the emerging 5th DORA metric","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Frework-rate\u002FSKILL.md",[],[105,106,107,108,109,110,111,112,113,29,90,114,115,116,117,118,119,120,96],"rate","rework rate","metric","efficiency","prs","when","pr","review","code quality","code","code-review","metrics","health","team","analyze","quality",{"skillNo":122,"name":123,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":31},"01M6R7TRZPET44JRCSQF08EEA8","nap","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fnap\u002FSKILL.md",[],[123],{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":134,"publishedAt":31},"01M6R7TK10WCT77A52E27GR5R3","{skill-name}","{what this skill teaches agents}","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskill.md",[133],{"categoryNo":64,"categoryName":65,"taxonomyType":66,"taxonomyTypeDesc":67},[135,136,137,138,139,140,141,142,143,144,96,29,73],"{skill name}","skill name","name","design","api","how","error-handling","learned","error","api-design"]