Refund: completed
- Customer
- customer-42
- Order
- A-1042
- Read at
- 12:00 UTC
Bank settlement was not checked.
Open-source TypeScript agent framework
Connect answers to recorded evidence, carry uncertainty forward, and run your app’s checks before an answer reaches the customer.
Built on FootprintJS execution provenance. A record shows what ran and what was available; it does not prove external data is true or reveal a model’s private reasoning.
Try an answer check
Run a real agent with a scripted reply. Your app declares the checks; the runtime decides whether that reply can be delivered.
The draft matches a recent lookup for this customer and order.
Bank settlement was not checked.
For order A-1042, customer customer-42.
A candidate for checking. Showing it here does not mean it was delivered.
Enforce mode · evidence read in the caller’s scope
Fixed fixture clock: 15 Jan 2026, 12:02 UTC. Nothing is refunded.
Choose a scenario and run it to see what reaches the customer.
The guarantee has a boundary
Honest answers need evidence, explicit limits and a delivery rule. Each has its own job.
Use absent() or coverage() to declare what was checked and what remains unknown. Carry those limits with the answer.
The app owns these declarations. Model prose is not independent evidence.
Declare coverage →Use answerValidation() to check typed fields against scoped evidence. Enforce mode withholds failed or unverified answers; observe mode records and allows delivery.
Checks cover only what you configure. Withholding an answer does not undo a tool action.
Configure answer checks →Inspect context, tool calls, results and decisions together. Rerun a case without a source to test whether the output depends on it.
Execution provenance is the foundation for an audit, not a universal truth guarantee.
Inspect a recorded run →Typed negativeClaims() checks are opt-in and available in the source, but not recommended until measured. They check cited searches and write bounded statements; they still trust the app’s search declarations. Other model text remains unchecked.
Their accuracy and usefulness are unmeasured. The earlier free-text detector failed its benchmark; the revised detector is unmeasured and only adds warnings. A warning-free answer is not a verified answer. See the capability index for release availability, including features marked unreleased.
Choosing a framework
LangChain and Mastra help teams build agent applications, and both offer controls during execution. AgentFootprint’s emphasis is connecting recorded execution, evidence limits and configured answer delivery in one framework.
| Framework | What to explore |
|---|---|
| LangChain / LangGraph | Integrations, orchestration and durable workflows, with runtime guardrails. |
| Mastra | TypeScript agents, workflows, memory, tracing and evaluations, with input and output processors. |
| AgentFootprint | Execution provenance, declared evidence limits and app-configured checks before answer delivery. |
This is a difference in emphasis, not a claim of exclusive capabilities or measured superiority.
Then the runbook has to become executable.
The path is already a footprint as it runs.
The runtime underneath the answer
01 · Build
Scope
With tool scoping enabled, the selected skill brings its procedure, tools and model into the step.
Build the graph →Route
For stored results, the model gets a ticket. Your product redeems the real data.
Follow the two lanes →02 · Debug
View · five lenses
Test
If the output changes under the same baseline, you have evidence of dependence in this case—not hidden reasoning.
Test a source →support.refundbilling.refundpolicy/refunds-v1suspectDependence confirmed
Counterfactual replay tests the recorded run. It does not expose private model reasoning.
03 · Run in production
Bind
Every backend is a typed port; every vendor is an adapter behind it. Pick the ground and the adapters resolve — the agent you wrote does not move.
Wire your first port →One customer implementation
Better evaluated responses with a lower-cost model.
Field result, not a benchmark. Reproduce it on your workload.See the comparison method →04 · Monitor
.on() for typed decisions, tools, cost, errors, and coverage; mount .enable.observability() to send the same stream to OTel, CloudWatch, NDJSON, or an audit bundle.recordRun() captures state, events, and structure together; persistRecording() writes the versioned envelope to your sink.contextLedger() already aggregates which skills, tools, and injections earned their context. Dedicated cross-session coverage-gap queries are in progress; today, aggregate the typed absence and coverage events in your sink.
Start with one answer, its evidence and the rule that decides whether it can be delivered.