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.
| Capability | State |
|---|---|
| Fleet telemetry, log aggregation, alerting, dashboards | Built — 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 checking | Phase 0 — script landed; not yet run in continuous integration |
| Structured JSON logs anywhere in the stack | Not built — every log4j2*.xml is plain text |
| Alert → runbook binding | Not 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 KPIs | Not built |
| Roller loop | Not built — blocked on the two feed items |
Cheap, unblocks argument-free conformance, and every later phase leans on it.
| Item | Owner | Acceptance |
|---|---|---|
| Conformance script | Wikantik repo — bin/simple-agility-conformance.sh | Exits 0 against a live Wikantik for health + metrics; log checks SKIP without a source and FAIL on plain text |
| Run it in continuous integration | Wikantik repo | A telemetry regression fails a build rather than being noticed months later |
| Incident-runbook convention documented | wiki | Convention published on SimpleAgilityOnCallAutomation — done |
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.
| Item | Owner | Notes | Acceptance |
|---|---|---|---|
Wikantik → JsonTemplateLayout | Wikantik repo | Appender 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 both | Wikantik repo | Wikantik mints one today but does not accept one | A request carrying traceparent produces log lines whose correlation_id is that trace-id |
instance label on metrics | jakemon | Scrape-time label per deployment | Two deployments' series are distinguishable in Prometheus |
| Roller emits the envelope from day one | Roller repo | Greenfield — no migration needed | Conformance 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.
The on-call loop's second step currently has nothing on either end.
| Item | Owner | Acceptance |
|---|---|---|
runbook label on all 33 alert rules | jakemon | bin/validate.sh rejects a rule without one |
| Incident runbooks for the failure modes those alerts cover | wiki | Every runbook label resolves to a page carrying incident-runbook + alert: |
service / instance labels on alerts | jakemon | An 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.
The agent must be able to ask the plane things, not scrape HTTP by hand.
| Item | Owner | Acceptance |
|---|---|---|
| jakemon MCP server — alert state, PromQL, LogQL, dashboard links, read-only | jakemon | An agent answers "is this firing, and what do the logs for this correlation_id say?" through tools |
| Alertmanager webhook receiver aimed at the runtime | jakemon | A 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.
The stack-level component that hosts every acting agent. It is the safety layer, so it lands before autonomous action, not after.
| Item | Acceptance |
|---|---|
| Scheduling + action ledger | Every 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 grants | On-call and SEO actuator hold different accounts; neither holds AllPermission |
| Human-oversight policy switch per escalation rung | Rung 3 pages a human concurrently; wait-for-acknowledgment is configurable |
| On-call agent v0 — diagnose and report only, no actions | It 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.
| Item | Owner | Acceptance |
|---|---|---|
Generalize aggregate-and-ship out of ship_visibility.py | jakemon | A new feed is configuration plus a row-shape, not a new hand-written shipper |
feed / feed_version envelope on the wire | jakemon + consuming products | An additive plane change deploys without a lock-step product release |
| Roller engagement feed | jakemon | Per-post/per-send opens, bounces, replies land in a Roller table |
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.
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.
simple-agility cluster should absorb jakemon / wikantik-development / web-properties is deferred until the framing has been used in anger.traceparent (Phase 1) is the on-ramp; adopting the full stack is not planned and should not be assumed.