The second loop the Simple Agility stack runs against its observability plane is operational rather than commercial: an alert fires, something diagnoses it, something acts, a human is kept in the loop at the right level. Today that "something" is a human on Telegram. This page documents the intended shape — the on-call agent, the escalation ladder, and above all the interfaces each product must expose to be operable by an agent — so that products being built now grow the right surfaces instead of retrofitting them.
Status (verified 2026-10-11):
runbook label, and jakemon's commit gate rejects one without it. The wiki has 42 incident runbooks, one per alert name, each tagged incident-runbook with an alert: field.admin:<area> grants and admin MCP are the only product-side pieces already in place. Everything below marked planned is sequenced in SimpleAgilityRoadmap.jakemon observes and does not act. Its only application code is what serves the whole stack and belongs with the plane, such as the read-only query server (SA-4). The on-call agent acts, so it lives in the stack-level agent runtime (not yet built), the same component that will host the Search Engine Optimization (SEO) actuator from the feedback-loop pattern. One runtime gives one place for agent scheduling, action ledgers, circuit breakers, blast-radius limits and the human-oversight policy switch, shared by every agent that acts on the stack.
trace.id trail in the products' ECS logs, per the telemetry contract. Today raw Hypertext Transfer Protocol (HTTP) on the Local Area Network (LAN); the plane is expected to grow an agent-facing read surface (an MCP server exposing alert state, metric queries, log queries and dashboard links) — a jakemon deliverable.The hop from "an alert fired" to "here is the procedure" needs to be deterministic — an agent must not be searching for its runbook during an incident. Both ends now exist, built to this convention. jakemon labelled its rules on 2026-08-18. It published the runbooks from docs/runbooks/ in its repository between 2026-10-02 and 2026-10-08, and added the incident-runbook tag and alert: field on 2026-10-11. bin/runbook-check.sh in jakemon verifies that every label resolves to a live page.
On the alert (jakemon): every rule carries a runbook label whose value is the exact Wikantik page slug.
- alert: WikantikDown
expr: up{job="wikantik"} == 0
for: 5m
labels:
severity: critical
service: wikantik
runbook: IncidentWikantikDown
annotations:
summary: "Wikantik {{ $labels.service_instance }} on {{ $labels.host }} has been unreachable for 5m"
On the page (Wikantik): type: runbook is already in use for developer procedures ("how to write an MCP tool"), so incident runbooks are distinguished rather than mixed in — a filter on type: runbook alone must not return build instructions to an agent handling an outage.
type: runbook, plus the tag incident-runbook, plus a frontmatter field alert: naming the alert(s) the page serves.Incident<AlertName>, so the binding is guessable from either direction even if a label is missing.list_pages_by_filter(type=runbook, tag=incident-runbook) filtered on alert:, with the runbook label as the direct path.Structure each incident runbook the way the agent will use it: what fired and what it means; how to confirm it is real (the exact PromQL/LogQL); the ordered remediation steps annotated with their escalation rung; what to check to confirm the fix; when to stop and page a human. A runbook whose steps do not name their rung forces the agent to guess how invasive it is allowed to be.
Written with the alert rule, not after the first incident: an alert without a runbook is an incomplete change.
How jakemon implements it.
docs/runbooks/Incident<AlertName>.md in the jakemon repository, committed alongside the rule it documents. bin/runbook-publish.py publishes it here through the Wikantik admin MCP. Edit the file, not the page, or the next publish overwrites the page.runbook: frontmatter block (when_to_use, steps, pitfalls) from the page's What it means, First checks, How to clear and Notes sections.Agents should be willing to escalate to invasive tools — but escalation has obligations, and whether the agent may act invasively before a human looks is a company policy decision, configured in the runtime, not fixed here.
| Rung | Means | Obligations |
|---|---|---|
| 1 | Product's scoped admin Application Programming Interface (API) / MCP tools (rebuild an index, reflow a page, rotate a credential, restart a connector) | ledger entry |
| 2 | Container-level operations through the deployment tooling (restart a service, redeploy a pinned version) | ledger entry; human notified |
| 3 | ssh / docker exec / direct database access | concurrently page the human on-call so a person oversees the actions; wait for human acknowledgment if company policy says so; ledger entry with the exact commands |
| — | after any rung ≥ 2 | trace what would have prevented the escalation — which scoped surface, runbook step, alert or metric was missing — and file it as a work item on the product or the plane. Escalations are supposed to become rarer because each one improves a surface. |
The runtime hosts several agents with different powers, and they do not share an identity. Getting this wrong once — one AllPermission service account reused by everything — silently removes the ladder, because every rung becomes reachable from rung 1.
admin:<area> model. An agent's account holds admin:index, admin:connectors and so on, never AllPermission.A Simple Agility product is on-call-automatable when it exposes:
admin:<area> grants (AdminPermission, AdminAuthFilter) with a dedicated per-integration account are the template.runbook labels./metrics, ECS JSON logs with event.action and trace.id, a liveness endpoint — because the agent diagnoses from the plane, never by reading the product's files.And from the plane: alert rules that carry runbook, service and service_instance labels (SA-5), a webhook receiver for the runtime, and the planned read surface.
Scheduling; the action ledger; circuit breakers ("stop after N actions per hour per service"); blast-radius limits ("one page per run" for the SEO actuator; "one restart per service per day" for on-call); the human-oversight policy switch per rung; agent identity and credential custody; the escalation obligations above. Neither a product nor jakemon should implement these.
service and service_instance labels on alerts)