Skip to content

feat(skills): add notification-routing skill -- pub-sub channel routing to prevent alert fatigue#625

Merged
bradygaster merged 7 commits intobradygaster:devfrom
tamirdresher:feat/notification-routing-skill
Mar 26, 2026
Merged

feat(skills): add notification-routing skill -- pub-sub channel routing to prevent alert fatigue#625
bradygaster merged 7 commits intobradygaster:devfrom
tamirdresher:feat/notification-routing-skill

Conversation

@tamirdresher
Copy link
Copy Markdown
Collaborator

Summary

Adds the notification-routing skill — a pub-sub channel routing pattern for agent notifications.

This is an "earned" skill: battle-tested from running 8+ Ralph instances in production where a single notification channel became unusable due to alert fatigue.

Problem

When a Squad grows beyond a few agents, notifications flood a single channel:

  • Failure alerts drown in daily briefings
  • Tech news buries security findings
  • Team members turn off notifications entirely

This is the microservices equivalent of dumping every service's logs into one file.

Solution

Pub-sub topic routing — the same principle as Kafka topics, RabbitMQ routing keys, and AWS SNS topic filtering:

  1. .squad/teams-channels.json — config mapping notification types to channel names/IDs
  2. CHANNEL: tag convention — agents prefix output with the target channel type
  3. Dispatcher pattern — reads the tag, routes to the right channel
  4. Provider-agnostic — Teams, Slack, Discord, or any webhook adapter

What's Included

  • packages/squad-cli/templates/skills/notification-routing/SKILL.md
  • packages/squad-sdk/templates/skills/notification-routing/SKILL.md
  • .changeset/notification-routing-skill.md

Design Principles

  • ✅ No vendor lock-in — routing config and CHANNEL: tags are provider-agnostic
  • ✅ Zero code changes to Squad core — pure skill/config pattern
  • ✅ Works with existing .squad/ file architecture
  • ✅ Degrades gracefully — falls back to default channel if tag absent

Related

@bradygaster
Copy link
Copy Markdown
Owner

🔍 Squad Team Review

Reviewed by: Procedures (Prompt Architect) — Pass 3 of consensus ceremony
Action: Hold — proposal-first policy applies
Team Consensus: 5/5 AGREE

Review Summary

This PR implements notification-routing improvements, a feature-class change that enables custom routing of system notifications based on skill category and urgency.

Process Note

Per our team's documented proposal-first policy (.squad/decisions.md): "Meaningful changes require a proposal in docs/proposals/ before execution." This is a feature-class change that needs a proposal document before merge.

What's Needed

  1. Create a proposal in docs/proposals/ describing the skill's purpose, integration points, and expected behavior
  2. Retarget this PR from main to dev (our staging branch)
  3. Once proposal is reviewed and approved, this PR can proceed

Thank you for the contribution! The implementation looks solid — we just need the process alignment. 🙏

⏸️ Action: HOLD — awaiting proposal + retarget to dev

Copy link
Copy Markdown
Owner

@bradygaster bradygaster left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FIDO Quality Review — PR #625: notification-routing skill

Verdict: ✅ MERGE

Findings

✅ Changeset package names correct: Uses @bradygaster/squad-cli and @bradygaster/squad-sdk — this is the only Tamir PR that gets this right.

✅ File paths correct: Files placed in packages/squad-cli/templates/skills/notification-routing/SKILL.md and packages/squad-sdk/templates/skills/notification-routing/SKILL.md — matches project conventions.

✅ SKILL.md format: Frontmatter has all required fields (name, description, domain, confidence, source). Has Context, Patterns, and Anti-Patterns sections per template.

✅ Additive: No breaking changes, no modifications to existing files beyond the changeset.

✅ Target branch: dev — correct for feature work.

Minor notes (non-blocking):

  • Missing trailing newline at end of both SKILL.md files
  • No explicit Examples section (template has one), but patterns section includes inline examples

Good contribution. Clean and well-structured.

@bradygaster bradygaster merged commit a9c06b0 into bradygaster:dev Mar 26, 2026
3 checks passed
bradygaster pushed a commit that referenced this pull request Mar 26, 2026
Round 1 (Audit & Baseline):
- Flight audited PR/issue state after CLI crash
- FIDO verified baseline: 5,038 tests passing, dev green
- Scribe merged stale decision inbox

Round 2 (Execution):
- Flight closed duplicate PRs #605, #604, #602
- Procedures rebased & merged PR #619 (model catalog)
- FIDO reviewed 9 community PRs: approved 3, change-requested 6

Round 3 (Community Merges):
- Coordinator merged 3 approved community PRs (#625, #603, #608)

Outcomes:
- 10 PRs merged total (6 merge-plan, 3 community, 1 legacy)
- 3 PRs closed as duplicates
- 6 PRs awaiting author changes
- Dev green: 5,038 tests passing
- All 6 original merge-plan PRs complete
- Decision inbox merged & deleted

Artifacts:
- Orchestration logs for Flight, Procedures, FIDO
- Session log: 2026-03-26T06:41:00Z-crash-recovery.md
- Team history updated (Flight, FIDO, Procedures)
- Decisions merged to decisions.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
chrislomonico pushed a commit to clomonico/squad that referenced this pull request Mar 26, 2026
…ng (bradygaster#624, bradygaster#625) (bradygaster#629)

* fix: suppress ExperimentalWarning in SDK subprocesses (bradygaster#624)

Add NODE_NO_WARNINGS=1 env var as first executable line in cli-entry.ts.
This propagates to child processes spawned by the Copilot SDK, preventing
SQLite ExperimentalWarning from leaking into the terminal via subprocess
stderr forwarding.

The existing process.emitWarning override is kept as belt-and-suspenders
for the main process.

Closes bradygaster#624

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: remove redundant 'squad init' messaging in first-run experience (bradygaster#625)

- Remove duplicate init guidance from firstRunElement empty-roster branch
  (banner already handles this case)
- Reword banner to prioritize /init (in-shell path) over exit-and-run
- firstRunElement now only renders for roster-present first-run onboarding

Closes bradygaster#625

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test: add tests for bradygaster#624 and bradygaster#625 first-run fixes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
chrislomonico pushed a commit to clomonico/squad that referenced this pull request Mar 26, 2026
…ster#626, bradygaster#627) (bradygaster#630)

* fix: simplify banner text and tighten layout (bradygaster#626, bradygaster#627)

- Simplify empty-roster message to single /init CTA (remove dual-path confusion)
- Standardize usage line with middle-dot separators and punchier copy
- Remove unnecessary spacer between roster/init and usage line

Closes bradygaster#626
Closes bradygaster#627

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test: add banner simplification tests (bradygaster#626, bradygaster#627)

- 5 new tests in 'Banner simplification (bradygaster#626, bradygaster#627)' describe block
- Verify single /init CTA (no dual-path 'squad init')
- Verify middle-dot separators in usage line
- Verify concise 'Type naturally' prefix
- Verify 'Ctrl+C to exit' formatting
- Verify no redundant spacers between roster and usage line
- Update bradygaster#625 test to align with new single-CTA behavior

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update Hockney history with bradygaster#626/bradygaster#627 test learnings

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
bradygaster added a commit that referenced this pull request Mar 26, 2026
)

* chore(squad): crash recovery complete — 10 PRs merged, 3 dupes closed

Round 1 (Audit & Baseline):
- Flight audited PR/issue state after CLI crash
- FIDO verified baseline: 5,038 tests passing, dev green
- Scribe merged stale decision inbox

Round 2 (Execution):
- Flight closed duplicate PRs #605, #604, #602
- Procedures rebased & merged PR #619 (model catalog)
- FIDO reviewed 9 community PRs: approved 3, change-requested 6

Round 3 (Community Merges):
- Coordinator merged 3 approved community PRs (#625, #603, #608)

Outcomes:
- 10 PRs merged total (6 merge-plan, 3 community, 1 legacy)
- 3 PRs closed as duplicates
- 6 PRs awaiting author changes
- Dev green: 5,038 tests passing
- All 6 original merge-plan PRs complete
- Decision inbox merged & deleted

Artifacts:
- Orchestration logs for Flight, Procedures, FIDO
- Session log: 2026-03-26T06:41:00Z-crash-recovery.md
- Team history updated (Flight, FIDO, Procedures)
- Decisions merged to decisions.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: remove leaked test fixture, gitignore .test-setup-* and .test-init-scaffold-*

consult.test.ts creates .test-setup-{hash}/ dirs in cwd and
init-scaffolding.test.ts creates .test-init-scaffold-{hash}/ dirs.
If tests crash before afterEach cleanup, these get left behind.
One .test-setup-* dir was accidentally committed and tracked.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: repo root cleanup — remove one-off publish scripts, export artifact, consolidate .gitignore

Removed:
- publish-0.8.21.ps1, publish-0.8.22.ps1 (version-pinned one-off release helpers)
- PUBLISH-README.md (companion to publish scripts)
- squad-export.json (generated export snapshot, not needed in repo)

.gitignore: Consolidated 3 specific .test-* patterns into single .test-* glob
to cover all 15+ test artifact naming patterns that create temp dirs in cwd.

Also pruned 3 dead git worktrees (squad-337, squad-348, squad-356).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(cli): add squad config model command for model pinning (#618)

Add a new 'squad config' CLI command with 'model' subcommand that lets
users manage model configuration:

- squad config model              — show current model config
- squad config model <name>       — set default model for all agents
- squad config model <name> --agent <a> — pin model to specific agent
- squad config model --clear      — clear default model override
- squad config model --clear --agent <a> — clear agent override

Validates model names against MODEL_CATALOG and agent names against
the .squad/agents/ directory. Uses existing SDK functions for all
config read/write operations.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: add @latest to npm install commands in cli.js and package README (#597)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants