Observability

Signals & Alerts

Signals are structured events emitted by the Niitaka policy engine whenever something noteworthy happens during an agent run — a guardrail tripped, a retry fired, a cost spike detected. They are your real-time audit trail of every intervention the platform makes on behalf of your agent.

Alerts are the notification layer on top of signals. Configure a webhook, email, or Slack destination and Niitaka will push a notification each time a matching signal arrives.

Signal taxonomy

Every signal has a type (the broad category) and a subtype (the specific event). The colour coding follows severity.

guardrail
cost_limitstep_limit

Hard execution stop — a cost or step threshold was reached and the run was aborted.

control
retryfallbackretry_exhausted

Operational control action taken — a retry or model fallback was triggered by the engine.

alert
cost_spikeerror_spike

Soft warning — an anomaly detector noticed unusual cost or error rates across sessions.

policy
policy_triggered

A policy rule matched and its configured action was applied. Expected enforcement.

Reading the signals feed

The Signals page groups signals by day with sticky date headers. Each row shows:

Type badgeColour-coded pill: rust = urgent action taken, gold = warning, olive = expected policy enforcement.
SubtypeThe specific event — e.g. retry, cost_limit, cost_spike.
AgentThe agent_id of the session that triggered the signal.
MessageHuman-readable description of what happened and why.
TimeExact timestamp (local timezone).
New dotA filled dot on signals you haven't seen since the last visit.

Click any signal row to navigate directly to the session it belongs to. The session drawer opens at the exact event that triggered the signal.

Note:The unread badge in the sidebar counts signals created since your last visit to the Signals page and clears automatically when you open it.

Filtering

  • Type filter — show only control, policy, guardrail, or alert signals.
  • Agent filter — scope to signals from a single agent ID.
  • Date range — presets for last 24 h, 7 d, 30 d, or a custom range.

Real-time stream

Signals appear in the feed in real time via Server-Sent Events (SSE). You do not need to refresh — new signals push to the top of the current day group as they arrive.

Alert configurations

Alerts let you forward specific signals to an external destination. Configure them under Settings → Alerts.

Email

Sends a plain-text email with signal type, subtype, agent, and message.

# Slack

Posts a formatted message to the configured Slack Incoming Webhook URL.

Webhook

HTTP POST to any HTTPS endpoint with a JSON payload matching the Signal schema.

Configuration fields

Signal typesWhich signal types to forward — any combination of control, policy, guardrail, alert. Leave all selected to forward everything.
Agent filterOptionally scope the alert to a single agent_id. Leave blank to match signals from all agents.
CooldownMinimum minutes between repeated notifications for the same signal type from the same agent. Prevents alert fatigue during outages.
DestinationEmail address, Slack webhook URL, or generic HTTPS webhook endpoint.
Tip:Set a cooldown of at least 5 minutes on guardrail alerts. A misconfigured agent can trip cost_limit dozens of times per minute — without a cooldown your inbox or Slack channel will be flooded.

When signals fire

The policy engine evaluates every incoming event. A signal is emitted whenever:

  • A cost_limit or step_limit warn or abort threshold is crossed.
  • A retry policy fires (subtype: retry) or is exhausted (subtype: retry_exhausted).
  • A fallback policy switches the model (subtype: fallback).
  • A policy_triggered event is logged by the engine for any other policy match.
  • A cost spike or error spike is detected by the background anomaly detector (subtype: cost_spike / error_spike).

See Policy Evaluation for a detailed walkthrough of how the engine decides which signal to emit.

Next steps

  • Policies — configure the rules that drive signal emission.
  • Policy Evaluation — understand how the engine evaluates each event.