You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Two extensions that span Application/Infrastructure/Presentation without touching Domain.
- GitHub-issue channel (Infrastructure): GitHubIssueDriftNotifier implements the existing
IDriftNotifier port and opens an issue via POST /repos/{owner}/{repo}/issues; title/body
from a pure DriftIssue formatter (Application).
- Fan-out, not a switch (Infrastructure): CompositeDriftNotifier composes ALL configured
channels; AddInfrastructure builds the list from Alerts:SlackWebhookUrl + Alerts:GitHubRepo
(NullDriftNotifier when none). Adding a channel is one class + one registration —
RunScanHandler is unchanged. Hosts pass Alerts:GitHubRepo.
- Drift digest (Application + Presentation): DriftDigestBuilder + GetDriftDigestQuery render
one Markdown report of drift across every tracked root (reusing GetTrackedRootsAsync +
DriftAnalyzer); served at GET /api/drift/digest. No new persistence.
- Tests (81 green): DriftDigestBuilder + DriftIssue unit tests; an integration test for the
digest over real Postgres. ADR 0012, README (features, multi-channel config, digest curl).
Verified live: digest renders the full drift report for a seeded baseline.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
0 commit comments