Every observability stack ships three pillars: metrics, logs, and traces. Each answers "what is my system doing." fasten adds a fourth pillar that answers a different question: "what did my system commit to, and can we prove it was not rewritten?" This page is about what fasten adds, what it deliberately is not, and how the four pillars compose.
| Pillar | Answers | Cannot answer |
|---|---|---|
| Metrics | "How many requests per second? What is p99 latency? Are we within SLO?" | "Which decision did entity X make?" (aggregate loses the entity) |
| Logs | "What events did this service emit? What was the error message?" | "Has this line been altered since it was written?" (log is a text stream) |
| Traces | "What did request R do? Which service called which, with what latency?" | "What state did request R commit, and does it agree across services?" (span is a span) |
| fasten | "What did my system commit to at time T, on what evidence, and prove nothing was rewritten." | "What is my p99 right now?" (fasten is not a metric) |
"Prove that this row was not altered after it was written."
Every fasten audit row carries prev_hash, hash, and monotonic_seq. A single tampered row breaks the chain deterministically; verify_chain() runs offline against any SDK-emitted database and returns first_break_at. A regulator can reproduce the verification without special tooling. See How the hash chain proves tamper-evidence for the walked example.
Metrics have no per-row identity. Logs are a text stream · nothing prevents editing the file. Traces are spans emitted by services; the span store trusts the service. fasten is the only pillar built around "prove no one rewrote history."
request_id from your existing traces; you do not need to replace anything.The value is the fourth pillar. If you're picking one tool to run all of observability from, fasten is not that tool. If you need the tamper-evident commitment record the other three cannot produce, fasten sits alongside them.
fasten does not compete with your observability stack; it slots in next to it, sharing the correlation id.
request_id (or reads the one your gateway already stamps).fasten.emit(...) with the same request_id.The positioning triangle uses "fourth pillar" as the vertical anchor. The horizontal anchor is connective tissue across AI and non-AI systems; the temporal anchor is state over time.
The audit substrate for distributed systems, and the belief layer for the AI agents on top of them.