Changelog
What actually shipped, newest first. Roadmap items are not listed here until they are live.
2026-09-04 — Decision policy, spend safety, and a model router
- Added
decide()to `@crifine/sdk` — turns an estimate and a policy intoproceed/resize/hold/defer/refuse. The ordering lives in one place, so unmeasured always outranks expensive and a closed market always outranks a threshold written for an open one. - Added
crifine decideto the CLI, and it validates the policy before the request — an API call is priced per request, so a policy that cannot be satisfied should never cost anything. - Changed `@crifine/x402` to serialise payments by default. Parallel calls could each read the budget before either had spent, and the pair would sail past a limit neither individually broke.
- Added
receiptsandremainingto the x402 wrapper — an audit trail without wiring a callback. - Added an optional model router to the assistant, via OpenRouter. It classifies a question into one of eight intents and is shown no figures at all; assets and sizes it volunteers are discarded and re-derived from the question text. Without a key the assistant answers from its keyword parser, which is the primary path either way.
2026-09-03 — SDK, tooling, and an MCP endpoint
- Added `@crifine/sdk` — the measurement method in the open, plus an independent verifier: feed it any published evidence payload and it recomputes the result and tells you whether it holds up. It is built and tested to be able to say no.
- Added `@crifine/x402` — a fetch wrapper for pay-per-request, with a mandatory
maxPerCall. There is deliberately no code path in which it pays an amount the caller did not bound. - Added `@crifine/cli` — pre-trade checks in the terminal and in CI, with exit codes a pipeline can branch on. Code
2(past the observed book) is deliberately separate from code1(gap crossed a threshold): "unmeasured" and "expensive" are not the same fact. - Added an MCP endpoint at
POST /api/mcpon the app — 8 tools, read-only, no account.
2026-09-01 — The app, and pool pages
- Added the app — wallet sign-in over EIP-4361, with wallet discovery via EIP-6963 and Robinhood Wallet surfaced first. See Wallet sign-in.
- Added the dashboard: positions ranked by execution spread worst-first, an interactive pre-trade check, the fragility board, spread alerts and a per-call usage ledger.
- Added pool pages — quoted against realized on one axis, the depth ladder, slippage by size, and the recorded daily history.
- Note: the app runs on preview data. The recorder is not yet wired to it, and every screen says so.
2026-08-29 — Method v1 published
- Added the full measurement method as a versioned document, with the seven commitments and an explicit list of what Crifine does not claim.
- Added
method_versionto every published result, so an estimate stays reproducible after the method changes. - Added
evidence_urlto every published result — keyless, permanent, no account.
2026-08-26 — Session state for RWA
- Added
market_opento results for tokenized equity and treasury pools. - Added
session_note, describing the next open in plain language. - Changed RWA slippage to apply a session penalty when the underlying venue is closed — the observed book is not the book that would absorb the trade.
market_openis always present so the penalty can be reasoned about, or stripped back out.
2026-08-24 — Stress fields over averages
- Changed headline depth fields from trailing averages to worst-observed:
lowest_depth_7d_usdreplacesavg_depth_7d_usd. An average describes the days you did not need us. - Added
days_observedto every result. A seven-day window is a weaker claim than a two-hundred-day one, and the caller is entitled to know which they got.
2026-08-22 — Continuous depth recording begins
- Added the depth recorder: snapshots every five minutes per pool, append-only, with provenance retained.
- Added initial coverage across Ethereum, Base, Arbitrum and Robinhood Chain.
- Added gap alerting on the recorder itself — a missed snapshot window is treated as a data-loss incident, not a degraded service, because that record cannot be backfilled by anyone starting later.