/**
 * Pure report→channel matching for notification delivery.
 *
 * Zero I/O (D0002 / D0045): given a published report, the teams that might
 * subscribe, and a delivery cadence, decide which channels should receive it.
 * The side effects — loading teams, posting to Slack — live behind the ports
 * in `ports/notification.ts` and their eval adapters.
 *
 * @see docs/design-docs/notification-delivery-port.md § 5 (event derivation
 *   and scope semantics)
 */
import type { ChannelDelivery } from "../ports/notification.js";
import type { Report } from "../types/index.js";
import type { EventType, NotificationChannel, NotificationDelivery, Team } from "../types/team.js";
/**
 * Map a published report to the event types it satisfies. `eval.completed` is
 * always present; the rest are derived from the report's own fields. Order is
 * stable: completed, score-regressed, threshold-breached, failed.
 *
 * `eval.failed` is derived only from `report.degraded` — never from run-level
 * aborts, which never produce a published report (design doc § 5).
 */
export declare function deriveEvents(report: Report): EventType[];
/**
 * Resolve which channels across the given teams should receive this report at
 * the requested cadence. A channel is delivered when all three filters pass:
 * its cadence equals `cadence`, its `events[]` admits the report's derived
 * events, and its scope matches. Results are deduplicated by channel key, so a
 * channel reachable through two teams yields a single delivery (first team
 * encountered wins).
 */
export declare function matchReportToChannels(report: Report, teams: Team[], cadence: NotificationDelivery): ChannelDelivery[];
/**
 * Stable per-channel identity, used both to deduplicate matches and as the
 * `notificationResults` artifact key. A slack channel is identified by its
 * Slack channel ID; email by its address set; webhook by its logical name. The
 * `type:` prefix keeps keys distinct across channel types (so a webhook named
 * `C0123` never collides with slack channel `C0123`). Two channels with the
 * same key deliver once.
 */
export declare function channelKey(channel: NotificationChannel): string;
