[Integration] Map & test Slack notification integration #33

Open
opened 2026-03-23 08:39:17 -07:00 by pyr0ball · 0 comments
Owner

Slack — Job Pipeline Notifications

Send Slack messages when notable pipeline events occur: new job batch found, interview scheduled, offer received, rejection logged.

Current state

scripts/integrations/slack.py exists (37 lines, 4 methods). Uses Incoming Webhooks — no OAuth required.

Tasks

Mapping

  • Document credential: Slack Incoming Webhook URL (created in Slack app settings)
  • Map notification events → message templates:
    • Discovery run complete: "Found {n} new jobs matching your search"
    • Job moved to phone_screen: "Interview scheduled: {title} @ {company} on {date}"
    • Job moved to offer: "Offer received from {company}"
    • Job rejected: "Rejected: {title} @ {company}"
  • Decide: single channel for all events, or configurable per-event routing?
  • Config file format: config/integrations/slack.yaml

Implementation

  • Confirm SlackIntegration.connect() validates webhook URL format
  • Implement SlackIntegration.test() — POST a test message to the webhook
  • Implement SlackIntegration.notify(event, payload) — format and POST message
  • Hook notify() into job status transitions (task_runner.py or a new event emitter)
  • Make notification events configurable (user can opt-in/out per event type)

Testing

  • Unit test: message template formatting for each event type
  • Integration test: test() sends "Peregrine connected" message to real webhook
  • Integration test: discovery run → Slack message received
  • Test graceful failure: webhook URL unreachable → log warning, don't crash pipeline

Acceptance criteria

  • Settings → Integrations shows Slack card with webhook URL field
  • Test sends a live message to the configured channel
  • At minimum, discovery completion and interview scheduling trigger notifications
## Slack — Job Pipeline Notifications Send Slack messages when notable pipeline events occur: new job batch found, interview scheduled, offer received, rejection logged. ### Current state `scripts/integrations/slack.py` exists (37 lines, 4 methods). Uses Incoming Webhooks — no OAuth required. ### Tasks **Mapping** - [ ] Document credential: Slack Incoming Webhook URL (created in Slack app settings) - [ ] Map notification events → message templates: - Discovery run complete: "Found {n} new jobs matching your search" - Job moved to phone_screen: "Interview scheduled: {title} @ {company} on {date}" - Job moved to offer: "Offer received from {company}" - Job rejected: "Rejected: {title} @ {company}" - [ ] Decide: single channel for all events, or configurable per-event routing? - [ ] Config file format: `config/integrations/slack.yaml` **Implementation** - [ ] Confirm `SlackIntegration.connect()` validates webhook URL format - [ ] Implement `SlackIntegration.test()` — POST a test message to the webhook - [ ] Implement `SlackIntegration.notify(event, payload)` — format and POST message - [ ] Hook notify() into job status transitions (task_runner.py or a new event emitter) - [ ] Make notification events configurable (user can opt-in/out per event type) **Testing** - [ ] Unit test: message template formatting for each event type - [ ] Integration test: `test()` sends "Peregrine connected" message to real webhook - [ ] Integration test: discovery run → Slack message received - [ ] Test graceful failure: webhook URL unreachable → log warning, don't crash pipeline ### Acceptance criteria - Settings → Integrations shows Slack card with webhook URL field - Test sends a live message to the configured channel - At minimum, discovery completion and interview scheduling trigger notifications
pyr0ball added this to the Paid Tier GA milestone 2026-03-23 08:39:17 -07:00
pyr0ball added the
feature-request
label 2026-03-23 08:39:17 -07:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/peregrine#33
No description provided.