Roadmap¶
Themes, not promises: dates are targets and slip when reality intervenes.
0.1 — the bounded run (shipped 2026-10-13)¶
- [x] boundary proxy with cap enforcement (
max_usd,max_tokens,max_model_calls,max_wall_seconds) - [x] append-only hash-chained ledger, canonical JSON, RFC 6962 Merkle root
- [x] receipts with embedded price table, usage inclusion proofs, limits disclosure
- [x] offline
docket verify(Python) and an independent Node verifier, both bound to the committed conformance vectors - [x] findings engine: runaway loops, uncached repeats, oversized context, denied calls, deny-write violations, premium-model leakage
- [x] filesystem snapshots and diffs, egress decisions, SDK + raw-HTTP recording
- [x] offline demo with a scripted provider, and a tamper demonstration
- [x] zero runtime dependencies; format specification
docket/receipt/v1 - [x] mutation testing of the cryptographic modules and the ledger (
tools/mutate.py), with every survivor classified as a gap or an equivalent mutant — scores indocs/testing.md
Shipped since 0.1 — what the "production engineering" list turned out to be¶
A concept-by-concept answer to the usual checklist (rate limiting, breakers, Kubernetes, Helm,
backpressure, exactly-once, p99, on-call, …) lives in
docs/production-coverage.md: what is implemented and tested, what is
recorded but not enforced, what is a validated artefact that has never been executed here, and what
is deliberately refused with a reason. The short version, as of this commit:
- [x] per-call latency recorded, summarised under a stated rule, and recomputed by both verifiers
- [x]
--port(a fixed loopback port an orchestrator can probe),--upstream NAME=URL(a mock, gateway or self-hosted model, recorded as evidence without its query string), and the boundary's/docket/healthz,/docket/readyz,/docket/metricsdocumented - [x]
DOCKET_AGENT_MODE=backoff: full jitter, capped, honouringRetry-After— the client half of the rate-limit contract - [x] a container recipe, a compose smoke test, a pod topology and a Helm chart, each checked
statically by
tools/deploy_check.py(16 checks) whose own tests break every invariant on purpose — and none of them executed, because no container runtime exists here - [x] an invariant suite: one writer per ledger, 200 events from 8 threads, a replayed call recorded twice, a killed agent, a clock that lies
- [x] load and endurance measured, not estimated:
make load(2,000 calls over 8 threads → 175.93 calls/s, client p50 44 ms) andmake soak(12,002 calls paced over ten minutes, 0 drops, receipt still verifying), with the boundary's memory measured at ≈1.1 KiB per recorded event — and a control run at half the duration showing the same per-event cost, so the growth is the event list rather than a leak. Reports indocs/measurements/2026-10-15-2core/; the harness refuses to call a run evidence when the client's count and the ledger disagree - [x]
policy.denial_code: one reader for "the boundary refused this", shared by the reference agent and the load driver, which fixed a real defect (a provider's ownerror.codewas being read as a Docket refusal) and closed a 502 inRateLimiter(aDecimalrate used to fail inside the request;nansilently disabled the limiter)
0.2 — make it easy to adopt — target: 6 weeks¶
- [ ]
docket init --from <framework>presets for Claude Code, Codex CLI, Gemini CLI, aider, OpenCode, and a generic HTTP profile - [ ] GitHub Action: run an agent step under a policy, upload the receipt as an artifact, fail the job on a policy violation or an unverifiable receipt
- [ ]
docket watch— tail a live run with a spend meter, safe to leave on a second terminal - [ ] receipt
--redactprofiles for circulating evidence externally (paths, argv, secrets) - [ ] honest coverage: record provider responses the boundary saw without parsing them (unknown providers get recorded, not skipped)
- [ ] packaging:
pipx-friendly docs,uv tool installsnippet, Homebrew formula 💰
0.3 — verification anyone can run — target: Q1 2027¶
- [ ] Go verifier (single static binary, no dependencies) 💰
- [ ] Rust verifier (crate + CLI) 💰
- [ ] TypeScript/browser verifier (verify a receipt by dropping it into a static page, fully client-side) 💰
- [ ]
docket verify --explain— for each failing check, the smallest thing you can do next - [ ] verifier conformance kit: vectors + a runner any implementation can point at, published with a compatibility table
- [ ] a public "verify this receipt" static demo page (no upload; the file never leaves the browser)
0.4 — evidence that survives scrutiny — target: Q2 2027¶
- [ ] signed receipts by default in CI contexts (
Ed25519, key from env or OS keychain) - [ ] transparency-log anchoring: optional append of a receipt digest to a public log (RFC 6962-style, generic — the goal is a trusted timestamp, never a blockchain) 💰
- [ ] witness co-signing: a second party countersigns a receipt without seeing contents
- [ ] multi-run attestations: "these 200 receipts all verify against this key" for procurement
- [ ]
docket diffsemantics for policy changes: what a stricter cap would have done to last week's traffic (retrospective enforcement) 💰
1.0 — long-term support — target: H2 2027¶
- [ ] format frozen with a compatibility promise and a published deprecation policy 💰
- [ ] security-fix window for the previous major, stated in months, not vibes 💰
- [ ] documented disaster story: what to do when a receipt fails to verify in production
- [ ] case studies from regulated-industry adopters (published with their consent)
Explicitly not on the roadmap¶
- A hosted service. There will be no Docket Cloud; the promise is that evidence need not pass through anyone's account.
- A dashboard. Rendering is someone else's product; Docket emits receipts, JSON and Markdown. Dashboards subscribe to the ledger format.
- A sandbox. Containers, gVisor, seccomp and hypervisors are better at enforcement than a user-space tool; Docket records and bounds, and says so.
- Prompt/content recording by default. Evidence that requires storing what people typed will not be the default, whatever it would cost to make it a feature.
- Blockchain anything. A transparency log needs witnesses and hashing, not tokens.