Overview
The V3 risk framework is a versioned taxonomy of 7 categories and 42 criteria that the scoring pipeline evaluates for every vault. Each criterion resolves topass, warn, or fail per vault; criteria roll up into category scores; category scores roll up into a single composite, which is then mapped to a letter grade.
This page narrates the framework. The framework itself lives at GET /api/v3/framework — that endpoint is the source of truth for the category list, the criteria within each category, and which criteria are live versus planned.
Why the framework is an API
The framework lives behind a public, cacheable endpoint instead of being maintained as a parallel table in the docs. There’s one reason: the docs cannot drift from the API. When the API adds a criterion or moves a planned criterion to live, the next call toGET /api/v3/framework reflects that change immediately. Clients that fetch the framework get the same view the scoring pipeline used to score their last response.
This is the load-bearing claim from RFC-019 § “Framework versioning” — the framework is data, not documentation. You can render it client-side, ship it in your own admin UI, or pin a snapshot for reproducible scoring.
The endpoint is public (no API key, no billing) and cacheable for 5 minutes (Cache-Control: public, max-age=300, stale-while-revalidate=60). Hit it freely.
Categories at a glance
| Key | Name | Weight | Status |
|---|---|---|---|
smart_contract | Smart contract | 0.20 | Live |
operational_governance | Operational governance | 0.20 | Live |
asset_collateral | Asset & collateral | 0.15 | Live |
market_liquidity | Market & liquidity | 0.20 | Live |
counterparty | Counterparty | 0.10 | Live |
hack_exploit_history | Hack & exploit history | 0.15 | Live |
chain_infrastructure | Chain infrastructure | 0.00 | Stub (reserved, zero weight) |
chain_infrastructure carries zero weight today and is included so the schema is stable — its weight may become non-zero in a future scheme version, at which point existing clients keep working without any code changes.
The weights always sum to 1.00. Today the six live categories carry the full weight (chain_infrastructure is 0.00). If chain_infrastructure gains weight in a future scheme version, the live-category weights are rebalanced downward to make room — so the total stays 1.00 rather than the new category being added on top.
Composite derivation
The composite score is a two-step calculation.Step 1 — framework composite
For each category that has live criteria, compute a category score (0–100, higher = worse). Multiply each category score by its weight and sum:Step 2 — upstream floor
Take the maximum of the framework composite and the upstream risk signal:upstream_risk is a verbatim copy of risk.overallRisk from the v2 envelope on the same response. When the upstream value wins, composite.clamped_by_upstream is true. See The upstream floor on the overview for why this matters.
Letter grade mapping
The composite score maps through the active grading scheme to a letter grade (A+–F) and a star count (1–5). It is a risk rating: lower risk earns a better grade — A+ is the lowest risk, F is the highest. The grading scheme is versioned independently of the framework via ?grading_scheme. The default is v2, the standard 11-band scale below; v1 is the frozen legacy scale (it uses an E band and has no C+) and stays pinnable.
| Grade | Risk score | Stars | Grade | Risk score | Stars |
|---|---|---|---|---|---|
| A+ | 0–5 | ★★★★★ | C+ | 47–56 | ★★★☆☆ |
| A | 6–12 | ★★★★★ | C | 57–66 | ★★★☆☆ |
| A- | 13–20 | ★★★★★ | C- | 67–77 | ★★★☆☆ |
| B+ | 21–28 | ★★★★☆ | D | 78–88 | ★★☆☆☆ |
| B | 29–37 | ★★★★☆ | F | 89–100 | ★☆☆☆☆ |
| B- | 38–46 | ★★★★☆ |
Coverage disclosure
Every V3 vault detail response includes acoverage block:
Pinning the framework
Both the framework version and the grading scheme are pinnable via query parameters:| Parameter | Default | Behavior |
|---|---|---|
?framework_version=v1 | v1 | Selects which taxonomy version to score against. Unknown → 400 with { error, supported_versions: ['v1'] }. |
?grading_scheme=v2 | v2 | Selects which composite-to-letter mapping to use. Unknown → 400 with { error, supported_schemes: ['v1', 'v2'] }. |
?framework_version=v1 parameter — pass it to get the exact taxonomy that a pinned vault detail call would use.
Related resources
Framework Taxonomy
The canonical, machine-readable framework. Call this for the current category and criteria list.
Vault Detail (V3)
Request/response reference for the per-vault scoring endpoint.
Vault Risk V3 Overview
Polarity, upstream floor, and the V3 versioning contract in one page.
v2 → V3 Migration
Endpoint mapping, deprecation contract, and pinning guidance.
