Learned rules table with confidence scores, enable/disable toggle. Correction history with filters. Rule provenance drawer. Stats cards
/escalations
Escalations
List view of open/resolved escalations with status filter. Detail view per correlation_id with full prompt, chat-mode answer textarea, "Mark as built" modal, status timeline, validation result panel. Supports tool_request_fulfillment rows
Escalation workspace at /admin/escalations — list view of all
open and resolved escalations, plus a detail view per correlation_id
that renders the full prompt, hosts the chat-mode answer textarea or
the claude_code "Mark as built" modal, and shows a status timeline +
validation result panel. This is the canonical surface for full
prompts and answer submission; Discord is the alert layer only.
Slice 22 added task_type='tool_request_fulfillment' rows: the same
detail view, but the spec body comes from
prompts/escalation/tool_build.md and the validation panel renders
tool-lint failures ((lint:anthropic_import),
(lint:secrets:…), etc.) plus the optional
requires_rebuild_warning. Lands in
slice_19_dashboard_escalation_workspace.md; tool-build row support
lands in slice_22_tool_gap_surfacing.md.
Escalation Settings page (slice 23) at /escalation-settings —
master kill switch, per-mode toggles (chat / claude_code),
budget-extension allow + max-daily slider, and a per-task-type
override grid (Auto / Force-API / Force-Manual / Disabled). Backed
by the dashboard_setting table; resolution order
dashboard_setting → YAML default.
API:GET /admin/escalation-settings,
PUT /admin/escalation-settings/{key:path},
PUT /admin/escalation-settings/task-types/{task_type}.
Optimistic locking: every PUT carries expected_updated_at
from the most recent GET; the server returns 409 with the live
state on a stale token (spec §10.7 row 1). The page surfaces a
toast and replaces the stale value with the live state — no
silent retry.
Slider safety:max_daily_extension_usd is server-validated
against hard_monthly_ceiling_usd / days_left_in_month; the GET
response carries the cap so the slider's max matches the PUT
acceptance window.
YAML-only ceiling:hard_monthly_ceiling_usd is not
dashboard-mutable — defense in depth so a compromised dashboard
session cannot raise it (spec §10.7 row 4).
Audit: every successful write inserts an
escalation_lifecycle row in invocation_log with
event='dashboard_setting_changed' and a payload of {key, value,
previous_value, had_lock_token}. escalation_request_id stays
NULL because these are subsystem-level events; the slice 19
per-row timeline filters on that FK and so only surfaces
row-scoped events. Dashboard-setting changes are visible in the
log viewer at /admin/logs.
Tool gap queue — data model and Discord ping shipped in slice 22. Standalone dashboard queue surface tracked as G-17. Currently visible as escalation-workspace rows of type tool_request_fulfillment and as dashboard-setting audit entries in /admin/logs.
All three follow the existing dashboard conventions described above.