Your agent can read anything.
It cannot act on it without asking.
An agent's danger is usually the sequence, not the step: a permitted read, then a permitted send. Bounds evaluates each call against the path of its task and the rules you wrote, refuses what breaks one, and records the verdict with a reason you can read and hand to somebody else.
Update log22 releases · newest 0.13.2, 6 November 2026
- 0.13.26 November 2026
- The serializer signs exactly what the file stores: an undefined member, a Date or an array hole can no longer make an entry unverifiable.
- verify reports how many entries before a broken one still verify, and a torn final line is announced instead of passing.
- status names the mode file it read and warns when a second one disagrees; --version answers.
- The ledger records the engine that wrote it. Node 22 is the floor.
- 0.13.15 November 2026
- A read-only release check runs before a publish.
- The ledger is read by byte range, and a preview read fails closed.
- Preview capture is fuzzed over 2,000 seeded inputs.
- 0.13.05 November 2026
- Run boundaries: a signed run start and end, with an outcome.
- A per-run budget in tokens or dollars, enforced on the next call.
- A local redacted preview per tool call, read with attesso detail.
- A rule can block while the rest of the file keeps observing.
- 0.12.34 November 2026
- A rule stops firing on fields the entry never had.
- The 24-hour decision summary is published in the reference.
- First run survives a real harness install.
- 0.12.24 November 2026
- A usage entry signs without a phantom model field.
- 0.12.14 November 2026
- Two writers can no longer reclaim the same dead lock at once.
- 0.12.04 November 2026
- Hosted review and decision views, with keyset cursors and filters.
- Measured token usage, read from the hook payload and never inferred.
- Every call for the day can be exported, not just the loaded page.
- 0.11.14 November 2026
- The source repository and its test workflow are published.
- 0.11.03 November 2026
- Packets and workspace setup from the local control surface.
- The workspace config stays private and its key shape is validated.
- 0.10.03 November 2026
- Rule drafts stay scoped to the day they were written on.
- Draft export is disabled until a draft exists, and says why.
- 0.9.03 November 2026
- Hosted policy bundles are pulled and verified before they apply.
- Status tells the truth about the ledger the hook is wired to.
- 0.8.02 November 2026
- sync --watch keeps the hosted mirror current during a long session.
- 0.7.12 November 2026
- The sync cursor restarts when the ledger key changes.
- 0.7.02 November 2026
- A cursor, batches and a device id: the ledger mirrors to a workspace.
- 0.6.12 November 2026
- The first-run setup hint stops repeating.
- 0.6.02 November 2026
- Bounded day and cursor queries replace the single-page view.
- Strict shell scope fails closed at the hook.
- A stdio control server exposes status, connect, mode and paths over MCP.
- 0.4.131 October 2026
- setup, explain and suggest, with a repeat defined as the same arguments.
- Ceilings on a task, not only on a step.
- The package says it is Bounds.
- 0.4.031 October 2026
- Veto a tool call before it runs, from any harness that speaks the hook.
- 0.3.131 October 2026
- Republish: no package change is recorded for this version.
- 0.3.031 October 2026
- Rules judge the path of a task, not one call in isolation.
- Any action can be logged, not only payments.
- The overview makes the numbers legible.
- 0.0.131 October 2026
- A local signed ledger people can install and verify.
- 0.0.0-stage31 October 2026
- The first publish, replaced a minute later by 0.0.1.
Install it and watch it refuse.
npx attesso init
npx attesso log --action web.read --subject docs.example --task job-1 \
--trust untrusted --capability read
npx attesso log --action mail.send --subject partner@example.com --task job-1 \
--capability send
# #2 DENY mail.send partner@example.com
# (PATH_DENIED by step #1 under no-send-after-untrusted-read)
npx attesso prove 2 --out receipt.json
npx attesso verify-receipt receipt.json
npx attesso report
npx attesso uiNo account, no server, no key to register. The ledger is hash-chained and signed locally, and attesso report shows what ran, what was refused, and what it cost in tokens and dollars. A receipt verifies in an empty directory with the public key: it proves the entry is in the log whose head this key signed, not that a human approved it.
npx attesso ui opens the same ledger as a local control surface at 127.0.0.1, and npx attesso sync mirrors decision summaries to a paid workspace. The local tier stays free and unlimited.
Path rules, refusals with reasons, and a record.
- Rules judge the task path, not one call: a send after an untrusted read is refused, and the refusal names the step that tainted it.
- Step and repeat ceilings stop a loop before it spends the afternoon: the same tool with the same arguments, refused at the limit you set.
- Every verdict is recorded with its rule and the state it was judged against, so the answer to "what happened" is a file, not a memory.
- Enforcement is steer first: on a repeat the earlier result is handed back, which is where tokens actually stop being spent.
Money and exposure, kept apart.
- Repeats and retry loops: in one measured session, 193 duplicate runs and 136 failure-shaped results out of 2,070 tool calls, an upper bound of 16% of that session's cost.
- Actions outside the bounds a person signed: refused before they run, with a signed reason.
- Context you did not need: a step or cost ceiling per task, enforced instead of noticed afterwards.
Waste is measured on your own sessions and quoted as a percentage of model spend. Incident avoidance is exposure, not a saving, and we do not multiply it by an invented probability.
The limits, stated here.
- A local ledger key sits beside the log. It proves the file was not edited, not that a human authorised anything.
- A local receipt proves one entry offline against the key that signed it; a stranger still has to trust that key. Hosted evidence verifies against published keys.
- Local mode has no cross-device approval and no revocation beyond deleting the directory.
Human authority, cross-device keys and verification by a stranger need the hosted plane, where an approval is a passkey assertion over exact terms and the record verifies against published keys.
Measured, not modelled · 31 October 2026
What it saves, from runs we can point at.
193 of 2,070
tool calls were duplicates
In one long agent session. Together with 136 failure-shaped results that is an upper bound of 16% of its $3.19 cost, $0.51. An inventory, not a bill we saved.
28×
one looped task cost
A retrying task burned 37,150 tokens against 1,332 for the same task minutes later. That spread is what a step or repeat ceiling ends.
+66%
median tokens when a refusal lands on wanted work
Refusing an action the agent needed costs tokens, so the ceiling is the point, not the refusal. Watching in observe mode costs +9.7%.
We publish no average savings percentage, because we have not measured one that survives its own noise: a refusal only pays when it ends a loop, and it costs+66% when it lands on work you wanted. The report shows your numbers, from your sessions, with the date on them.
Nothing until the record leaves your machine.
- Free and unlimited on your own machine. Rules, ledger, report, hook; nothing metered.
- $0.00085 per synced decision when the record has to leave your laptop, about $34 a month for a developer running 40,000 agent calls.
- No plan, no seats, no minimum. $2 of credit to start, about 2,350 decisions, no card.
Synced means a receipt Attesso signed, verifiable by someone who trusts neither you nor us. Decisions made offline are never metered. Volume and platform contracts: contact sales.
A local key proves integrity. Ours proves it to a stranger.
| Method | What it proves | Where it fits |
|---|---|---|
| Local Ed25519 key | The ledger was not edited, and one entry proves offline | Free, on your machine |
| Attesso receipt (ES256) | A third party verifies the decision without trusting you | Hosted, per synced decision |
| Passkey (WebAuthn) | A human approved these exact terms | Hosted, approvals |
A receipt names which signer it carries. A record claiming human authority must carry a WebAuthn assertion; a local or CI key is not interchangeable with one, and the verifier refuses the combination.
Commands and refusal codes: docs.attesso.com/bounds. Install from npmjs.com/package/attesso, read the source at github.com/Attesso/bounds.
Install it and watch it refuse.
Free on your machine, no account. $0.00085 per synced decision when the record has to travel.