/**
 * Current-code invariants asserted (2026-04-21, ses_006 Phase 6):
 *
 *   - Constructor filters OUT triggers with `enabled: false` + sorts
 *     by `priority` desc (higher first). Triggers without priority
 *     sort at 0.
 *   - `evaluate(state)` returns every trigger whose condition matches
 *     AND whose cooldown has elapsed. Order reflects the sorted
 *     trigger list.
 *   - Budget exhausted (callCount ≥ maxCallsPerRun) → evaluate returns [].
 *   - `recordFiring(id, iteration)` updates both `lastFiredMap` (for
 *     cooldown) and `callCount` (for budget).
 *   - Condition matchers:
 *     - `on_error`: matches iff state.lastError is set; if categories
 *       are given, requires at least one category substring match.
 *     - `on_iteration`: `state.iteration % everyN === 0`.
 *     - `on_context_percent`: `state.contextWindowPercent >= threshold`.
 *     - `on_tool_category`: `state.lastToolCategory` present + in
 *       `condition.categories`.
 *     - `on_cost_percent`: costBudgetPercent present + ≥ threshold.
 *     - `on_complexity`: totalToolCalls ≥ toolCallThreshold.
 *     - `custom`: calls the predicate.
 *   - Cooldown: trigger does NOT fire if `iteration - lastFired <
 *     cooldownIterations`. No cooldown → always eligible.
 *
 *   - **Purity:** evaluate() is pure relative to the advisory phase —
 *     it returns triggers; it does NOT inject messages or mutate
 *     external state. The injection happens in the advisory phase
 *     (runtime/query/iteration/phases/advisory.ts), which pushes a
 *     user message via `runMgr.pushMessage`. That file is OUT of
 *     scope for this test file (covered by the phase test).
 */
export {};
//# sourceMappingURL=evaluator.test.d.ts.map