Simple Agility Roadmap

The four contract pages describe a target state. Substantial parts of it are not built. This page is the sequenced backlog: what is missing, which repository owns it, what it blocks, and how you know it is done. Without this, the contracts read as descriptions of a system that exists — which would be false, and would waste the time of any agent that went looking for the pieces.

Reading rule: a contract page states the rule; this page states whether the rule currently has an implementation behind it. Where they disagree, the contract is the intent and this page is the truth.

Status at a glance (verified 2026-08-18)

CapabilityState
Fleet telemetry, log aggregation, alerting, dashboardsBuilt — 33 alert rules, 17 dashboards, agent per host
External capture (Google/Bing/Yandex, Cloudflare, IndexNow, URL Inspection)Built
One push feed (search visibility → Wikantik)Built — idempotent, backfillable, scoped credential
One full product loop (Content Intelligence)Built — sense → signal → decide → act → measure
Conformance checkingPhase 0 — script landed; not yet run in continuous integration
Structured JSON logs anywhere in the stackNot built — every log4j2*.xml is plain text
Alert → runbook bindingNot built — 0 of 33 alerts labelled; 0 incident runbooks
Generic aggregate-and-ship (a second feed without bespoke code)Not built
Plane agent read surface (MCP)Not built
Agent runtime (ledger, breakers, blast radius, identities)Not built
Operational Data Store + SLO/SLA KPIsNot built
Roller loopNot built — blocked on the two feed items

Phase 0 — Make the contract checkable (no dependencies)

Cheap, unblocks argument-free conformance, and every later phase leans on it.

ItemOwnerAcceptance
Conformance scriptWikantik repo — bin/simple-agility-conformance.shExits 0 against a live Wikantik for health + metrics; log checks SKIP without a source and FAIL on plain text
Run it in continuous integrationWikantik repoA telemetry regression fails a build rather than being noticed months later
Incident-runbook convention documentedwikiConvention published on SimpleAgilityOnCallAutomationdone

Phase 1 — Telemetry truth (depends on: nothing; enables 2, 3, 4)

The envelope is specified and nothing emits it. Until this lands, correlation_id tracing is a promise, and the on-call agent would be diagnosing from prose log lines.

ItemOwnerNotesAcceptance
Wikantik → JsonTemplateLayoutWikantik repoAppender config, not an application rewrite; source correlation_id/request_id from the Mapped Diagnostic Context (MDC)Conformance script's log checks PASS against prod logs
Honor inbound traceparent, then X-Correlation-Id; propagate bothWikantik repoWikantik mints one today but does not accept oneA request carrying traceparent produces log lines whose correlation_id is that trace-id
instance label on metricsjakemonScrape-time label per deploymentTwo deployments' series are distinguishable in Prometheus
Roller emits the envelope from day oneRoller repoGreenfield — no migration neededConformance script exits 0

Deliberately deferred: ingest-time stage.json in Alloy. Query-time | json works now; add ingest-time extraction only when query volume justifies it, and never promote per-request fields to Loki labels.

Phase 2 — Alert-to-runbook binding (depends on: nothing; enables 3)

The on-call loop's second step currently has nothing on either end.

ItemOwnerAcceptance
runbook label on all 33 alert rulesjakemonbin/validate.sh rejects a rule without one
Incident runbooks for the failure modes those alerts coverwikiEvery runbook label resolves to a page carrying incident-runbook + alert:
service / instance labels on alertsjakemonAn alert identifies which deployment it concerns

Write the runbooks with the labels — a label pointing at a page that does not exist is worse than no label, because it reads as a working binding.

Phase 3 — Plane read surface (depends on: 1, 2)

The agent must be able to ask the plane things, not scrape HTTP by hand.

ItemOwnerAcceptance
jakemon MCP server — alert state, PromQL, LogQL, dashboard links, read-onlyjakemonAn agent answers "is this firing, and what do the logs for this correlation_id say?" through tools
Alertmanager webhook receiver aimed at the runtimejakemonA firing alert reaches an endpoint with labels and annotations intact

Tension to resolve first: jakemon's standing rule is no application code. An MCP server is application code. Either the rule gets an explicit, narrow exception for a read-only surface, or the surface lives in the agent runtime and reaches into the plane's HTTP APIs. Decide this before writing any of it — it is a repository-identity question, not an implementation detail.

Phase 4 — Agent runtime (depends on: 3)

The stack-level component that hosts every acting agent. It is the safety layer, so it lands before autonomous action, not after.

ItemAcceptance
Scheduling + action ledgerEvery agent action is attributable, with rationale and outcome
Circuit breakers + blast-radius limits"N actions per hour per service"; "one page per run" enforced, not documented
Per-role agent identities with scoped grantsOn-call and SEO actuator hold different accounts; neither holds AllPermission
Human-oversight policy switch per escalation rungRung 3 pages a human concurrently; wait-for-acknowledgment is configurable
On-call agent v0 — diagnose and report only, no actionsIt reaches a correct diagnosis on a real alert before it is allowed to act

The SEO actuator (sub-project B of the older jakemon SEO-loop design) belongs here too, and its measurement rails already exist in Wikantik's EffectEvaluator.

Phase 5 — Generic feeds (depends on: 1; enables Roller)

ItemOwnerAcceptance
Generalize aggregate-and-ship out of ship_visibility.pyjakemonA new feed is configuration plus a row-shape, not a new hand-written shipper
feed / feed_version envelope on the wirejakemon + consuming productsAn additive plane change deploys without a lock-step product release
Roller engagement feedjakemonPer-post/per-send opens, bounces, replies land in a Roller table

Phase 6 — Operational Data Store and SLO/SLA KPIs (depends on: 1, 5)

Availability, latency and error budgets per service and per tenant, computed once by the plane. Needs Phase 1 (trustworthy inputs) and Phase 5 (a way to ship the results). No product computes an SLO in the meantime — it waits.

Phase 7 — Roller loop (depends on: 1, 5)

The second product loop, following SimpleAgilityFeedbackLoopPattern: tables for the shipped feeds, the joins, ranked opportunities with a suppression list, a scoped write surface, prediction-and-effect measurement.

Open questions that are not work items yet

See also