How these reports are made

structural risk reports for CDP stablecoins · Amin Mohazab · github.com/amohazab

Stablecoin Dashboard publishes structural risk reports for stablecoins backed by collateralised debt positions: what backs each token, how much of that backing can be checked on-chain, and how it holds up under stress. An automated pipeline produces them; this page explains the rules it follows.

Every number traces to a pinned call

Every figure in a report is computed from Ethereum data read at one fixed block. Each value is stored with the contract call that produced it, so anyone can repeat that call on their own node, at that block, and get the same number. An AI model writes the explanatory text around the figures. It never supplies a number: its text is checked against the report's data table before anything is published.

Gates, and why their log is public

A gate is a check that must pass before a report is published. A minor finding publishes with a visible notice; a serious one withholds the report, except where a recorded ruling published a page regardless. The two cases on this site are stated under Open notices. Every time a gate fires, a public log records the date, the token, what kind of check fired, how serious it was, and how it was resolved. Anyone can say their work is checked; a log of checks stopping reports is the evidence. The log below holds 37 entries.

The written summaries on each page come from a local language model under a guard that only lets through figures printed in the data table; no second model reviews them. When a draft does not pass that guard, its section shows a notice in place of the summary and the page still publishes, so the figures stay current. The deterministic checks run on every page.

One revision, no hand edits

A report gets one revision when a judge finds a defect in its prose. In the local configuration the judge is withdrawn, so there is no revision pass: a page that fails a deterministic check is not published, and the fix goes to the template, never to the page. No report is edited by hand, and no gate can be switched off for a single run.

Same scenarios, each protocol's own mechanics

The archetype fixes the scenarios so the three pages are comparable; what happens under each shock is modelled from each protocol's own contracts.

Checked by hand

For each token, the analyst repeated a sample of the stress calls through an independent node at the report's block and compared the results with the published artifact. Each token's verify page lists the calls, so you can repeat them too.

Open notices

crvUSD's, GHO's and LUSD's pages passed every check.

The behavioral tier

The behavioral tier shows how each token trades: how far its price has strayed from the peg over the last seven days, how much DEX liquidity Webacy counts for it, how its supply changed over seven days, and how concentrated its holders are. It comes from Webacy, an external monitoring service, and is fetched at a timestamp printed on each page. Unlike the structural figures, it is not read at the report's block, and this pipeline neither computes nor verifies it.

References such as P-7.11

The appendix pages cite entries such as P-7.11. These are entries in the project's decision log, PROGRESS.md, where every ruling and implementation step is recorded in the order it was confirmed.

Detail for specialists

The six mechanisms behind the claim
  1. One block, one table, one formatter: every contract read in a run carries the run's run_block (rubric 0.5, R-13); every rendered figure replays from a flat-table field (DET-84) and is formatted by one rule (DET-89).
  2. Fail-closed: a missing or erroring gate result means no publication (DET-85, T-25).
  3. Gate integrity: the page embeds the hash of what it was built from; no page publishes with an open Level 2/3 entry, and no override or output-edit resolution exists (DET-13). Pages published by ruling carry their open entries, shown in the table below.
  4. The stale-page banner: "Last successful run / Current run: quarantined", and "Under review" after four quarantined runs (DET-59, memo §8.1.2).
  5. The public log: category-level, one entry per trigger fired (DET-60, memo §8.1.3); this page's row count is checked against the log when the site is built.
  6. Numbers never originate from the model: generate → evaluate → one revision → ship or quarantine; findings patch templates, rubrics or prompts, never a report (brief §6–§7, rubric §6 and 2.2, LLM-01).
Rubric entries not yet registered (6)

6 rubric entries are not yet registered in the harness. Until they are, a report's completeness is measured over the registered entries (rubric amendment A-16); each is listed here with its queue item.

entryqueue item
DET-09P-4.01 (DET-09 set-file inputs: GHO discovery_m absent, LUSD 0.4459 - ruling)
DET-75P-4.01 #25/#26 (field-existence clause; FR-14 fields)
DET-76abcdP-4.01 (DET-76 limbs a-d beside the registered DET-76e)
DET-81P-4.01 (GHO [[reference_feed]] rows, gap column - P-7.05)
DET-23abdP-4.01 (DET-23 limbs a/b/d beside the registered DET-23c)
DET-64P-4.01 (GHO attribution cross-check: aggregate reads)
Outcome per token
tokenblockreportchecks passedoutcomeopen log entriesgate record
crvUSD2614316807f460c089 of 90 evaluated, 6 not evaluated (judge withdrawn)publishedcrvUSD:17 T-28committed record
GHO26100308d07a270289 of 90 evaluated, 6 not evaluated (judge withdrawn)publishedGHO:9 T-02, GHO:10 T-20, GHO:17 T-28committed record
LUSD26107477ba9b2bb889 of 90 evaluated, 6 not evaluated (judge withdrawn)publishedLUSD:17 T-28committed record

Each page's data/evaluation-<block>.json is the gate record as rendered; the ruled outcome is in the committed record, linked in the last column.

Sources for the behavioral tier
  • /rwa/{address}?chain=eth&hours=168: the depeg snapshot, its seven-day history, DEX liquidity (total and depth tier) and the Ethereum DEX pools list
  • /rwa/hci?chain=eth&pageSize=500: holder concentration, matched by contract address
  • /rwa/supply/{symbol}: the net supply change over 7, 30 and 90 days, used only when the returned row's Ethereum address is the token's

Latest snapshot per token, committed trimmed to the fields the page uses (and the undocumented cost-to-move pair, stored only), with the sha256 of every full response: out/behavioral/crvUSD/20261018T123628Z.json · out/behavioral/GHO/20261018T123628Z.json · out/behavioral/LUSD/20261018T123628Z.json. Each token page's block is rebuilt from its snapshot when the site is built (rubric amendment A-20).

Holder-concentration history is not offered by Webacy's API: its OpenAPI specification (v1.7.3) has no history endpoint or parameter for /rwa/hci, so no concentration chart is drawn.

The public log (37 rows)
entrydatetokencategorytriggerlevelresolution typeresolution datestatus
crvUSD:102026-09-14crvUSDgate failureT-282——resolved by crvUSD:23
crvUSD:112026-09-14crvUSDharness errorT-252——resolved by crvUSD:24
crvUSD:122026-09-14crvUSDjudge instabilityT-242——resolved by crvUSD:18
crvUSD:132026-09-25crvUSDgate failureT-282——resolved by crvUSD:19
crvUSD:142026-09-26crvUSDgate failureT-282——resolved by crvUSD:20
crvUSD:152026-09-30crvUSDgate integrityT-232——resolved by crvUSD:21
crvUSD:162026-09-30crvUSDgate failureT-282——resolved by crvUSD:22
crvUSD:172026-09-30crvUSDgate failureT-281——open
crvUSD:182026-09-14crvUSDjudge instabilityT-242template change2026-09-30resolution of crvUSD:12
crvUSD:192026-09-25crvUSDgate failureT-282template change2026-09-30resolution of crvUSD:13
crvUSD:202026-09-26crvUSDgate failureT-282template change2026-09-30resolution of crvUSD:14
crvUSD:212026-09-30crvUSDgate integrityT-232template change2026-09-30resolution of crvUSD:15
crvUSD:222026-09-30crvUSDgate failureT-282template change2026-09-30resolution of crvUSD:16
crvUSD:232026-09-14crvUSDgate failureT-282template change2026-09-30resolution of crvUSD:10
crvUSD:242026-09-14crvUSDharness errorT-252template change2026-09-30resolution of crvUSD:11
GHO:92026-09-14GHOoff-venue share > 25%T-021——open
GHO:102026-09-14GHOfreeze coverage below targetT-201——open
GHO:112026-09-14GHOgate failureT-282——resolved by GHO:18
GHO:122026-09-14GHOharness errorT-252——resolved by GHO:19
GHO:132026-09-25GHOgate failureT-282——resolved by GHO:20
GHO:142026-09-26GHOgate failureT-282——resolved by GHO:21
GHO:152026-10-01GHOgate integrityT-232——resolved by GHO:22
GHO:162026-10-01GHOgate failureT-282——resolved by GHO:23
GHO:172026-10-01GHOgate failureT-281——open
GHO:182026-09-14GHOgate failureT-282template change2026-10-01resolution of GHO:11
GHO:192026-09-14GHOharness errorT-252template change2026-10-01resolution of GHO:12
GHO:202026-09-25GHOgate failureT-282template change2026-10-01resolution of GHO:13
GHO:212026-09-26GHOgate failureT-282template change2026-10-01resolution of GHO:14
GHO:222026-10-01GHOgate integrityT-232template change2026-10-01resolution of GHO:15
GHO:232026-10-01GHOgate failureT-282template change2026-10-01resolution of GHO:16
LUSD:72026-09-14LUSDgate failureT-282——resolved by LUSD:9
LUSD:82026-09-14LUSDjudge instabilityT-242——resolved by LUSD:10
LUSD:92026-09-14LUSDgate failureT-282template change2026-09-14resolution of LUSD:7
LUSD:102026-09-14LUSDjudge instabilityT-242template change2026-09-14resolution of LUSD:8
LUSD:162026-10-02LUSDgate failureT-282——resolved by LUSD:18
LUSD:172026-10-02LUSDgate failureT-281——open
LUSD:182026-10-02LUSDgate failureT-282template change2026-10-02resolution of LUSD:16

37 rows, one per quarantine line in the three token logs.