One entry per method version, named YYYY.MM.N (data/method_versions.json). N counts, within the month, the changes of METHODOLOGY.md or of the scoring code that move a published score. The methodologyHash stays the machine identifier: it is a digest of the scoring code of one oracle (scripts/lib/methodology.py), not a hash of the text of METHODOLOGY.md, and each oracle has its own. The hashes of 2026.10.2 were read from getScore() on each oracle on 2026-10-13 (about 15:30Z); an earlier draft of this section had read older hashes from the public pages of the Watch, which lagged the chain, and called a correct hash a divergence. Versions before 2026.09.0 are not named: see the engineering log below.
2026-10-13: the Watch alert on Gmso1uvJnLbawvw7yezdfCDcPydwW2s2iqG3w6MDucLo was labelled with another protocol's name: the address is GMX-Solana's gmsol_store (the scorer labels it correctly).
2026-10-13: a Watch alert on a queued change carries the same score whatever the instruction in the queue does (a price-feed setting and a full replacement of the core program read the same).
2026.10.3 (code written on 2026-10-13, in the repository, not yet on the oracles: the next on-chain push carries it)#
Covers: five more targets on Ethereum L1 (Arbitrum bridge 60, Pendle V2 43, Aave V4 53, Fluid Liquidity 77, Base bridge 56); one rule for nested Safe seats (a Safe whose owner is another Safe is counted on the EOA keys that must really sign, only when those keys are distinct and only upward); a Safe is recognised on its code (a published Safe proxy), not only on what getOwners() answers; the limit that Safe owners can write the Safe's storage is now recorded as a known limit.
The nested-seat rule for a Morpho vault curator Safe now applies on every chain (one shared module, scripts/lib/curator_multisig.py, in the working repository, not yet public), after a live case on 2026-10-13: the curator of the Spark USDC Vault on Base was rewritten at 13:17:05Z (block 52554039, one Safe transaction) from a 3-of-5 into a 2-of-2 whose owners are a 3-of-5 Safe and a 1-of-2 Safe, so four keys must sign; read at the first level it looked like a 2-of-2 and the vault would have fallen from 63 to 44, on the keys that really sign it scores 65.
Moves a score once pushed: the USD AI OAdapter on Arbitrum (8 to 40: its Safe's Zodiac Delay module, analysed on 2026-10-12, no longer blocks the Safe); the Adpend USDC vault on Ethereum (2 to 19: the vault's own 14-day timelock counts, confirmed by a second independent reader); the Spark USDC Vault on Base (63 to 65, instead of the 44 a first-level reading gives); the Grove curator vault on Robinhood Chain (multisig 30 to 60, composite +9); the Monad Grove x Steakhouse vault (cross exposure 100 to 80, composite unchanged); a Uniswap V3 or Sky timelock delay under one day no longer scores as the confirmed two-day delay (the live delays are two days: no published score moves). Every oracle whose scorer imports a changed file gets a new methodologyHash; the hashes the next push should publish, computed from the scoring files of the commit that carries this registry, are in data/method_versions.json (expected_hashes) and are confirmed or corrected after the push.
Proposals refused after a second reader on 2026-10-13, so no score moves: Orvex V2 (46 proposed, 2 kept: the pair fee is uncapped), Gains Network (32 proposed, 4 kept: a 2-of-4 Safe can grant itself an allowance over the collateral). Kinetiq (4) keeps its score with a note: a bounded-power reading is under review and not applied.
2026.10.2 (2026-10-12 and 2026-10-13, on the oracles today)#
Covers: the push of 2026-10-12 / 2026-10-13 on the eight EVM oracles. Solana was not read from the chain: the registry lists a computed hash for it (the digest of the Solana scoring code at commit 06b3b21, the commit whose code reproduces the eight hashes above to the byte), to be confirmed with a read of the Solana oracle. The Robinhood oracle (0x9BF4...7f52) holds 0x667dc486...fa45 since 2026-10-13 03:26Z (table above); the committed api/scores.json still carries 0x795edc64...14c5, the hash of the push of 2026-10-10 (file generated 2026-10-10 20:41Z), and is regenerated at the next snapshot.
Moves a score: what each target's scorer read on that day; the detail per target is in the oracle itself.
Ethereum L1 keeps one entry under an older hash (the retired Ethena minting entry, 2026.09.0) because the push did not rewrite it.
2026.10.1 (2026-10-10, replaced on eight oracles)#
Hashes read on 2026-10-12 from the public pages of the Watch (the Solana one was not re-read after that):
Covers: 197 targets across nine oracles; five sub-scores (admin key, multisig, timelock, oracle authority, cross exposure) and a composite = floor(0.4a + 0.3m + 0.3t + 0.5).
Moves a score: the oracle-authority score follows the price paths one hop upstream, and a target that shares a root signer set with another loses cross-exposure points.
2026.09.0 (retroactive, entries last written 2026-09-23 and 2026-09-24)#
Covers: the entries older than the pushes above: one Ethena minting entry on Ethereum L1 (0xac9104d9774a01ae1bbb28a4725f597425697a1d7e68b1d8cf915439eec6b167, written 2026-09-23, retired, still on the oracle) and three HIP-3 dex entries on Hyperliquid (0xfbf38ff91abf710728e2df3d5370bf18eeb2a9085168612fa03955b13cc958ad, written 2026-09-24, rewritten by the push of 2026-10-12).
Moves a score: nothing today; they are old values under older code. Scores written under different hashes are not strictly comparable.
The Compare page lists the neighbouring tools one row each, what each reads and does not read, according to its own pages, read on 2026-10-12; no ranking. Built 2026-10-12, live since 2026-10-12. The two neighbours found after that reading are not on it yet (Upcoming 4).
The Backtest page reads 55 incidents from public postmortems against the six requirements the oracle publishes for every contract, and says which it could not apply: for the 7 that are about who controls a contract, the requirements flagged 2, missed 2 and could not be applied to 3 (figures read on the live page on 2026-10-14). Built 2026-10-12, live since 2026-10-12. It is not a replay by the scorer (Upcoming 8).
Each contract page shows an "Exit window" line, the time a user has to leave after a harmful change is queued, derived from the timelock sub-score (in the page code since 2026-10-11).
examples/gated-vault/ and src/AuthorityGatedVault.sol (in the working repository, not yet public): an example consumer, a vault that refuses a deposit when the oracle's score for its target is too low, stale, too old, never set or unreadable, and never gates a withdrawal. Replay the refusals on a local fork with bash examples/gated-vault/replay.sh fork. It is an example, not deployed and not audited; it had one independent review.
The Watch writes its generated files to the watch-data branch; main keeps the code, the documents and a "moved" notice at each old address under watch/.
The Watch checks the age of the last commit on main and warns at 45, 52 and 58 days: GitHub disables scheduled workflows after 60 days without repository activity.
authority-risk-mcp 0.1.0 is on PyPI, npm and the official MCP registry (io.github.RealSpap/authority-risk-mcp).
Aave levels 0-5 per privileged role: 25 of the 67 Aave V3 Core reserves plus BTC.b and USDe, read at block 26,184,127, with the calls to rerun: research/aave-levels-2026-10-13/.
No dates are promised. "next" is the immediate queue, "planned" is decided and written down, "explored" is measured or verified but not yet decided. Everything here is read-only research until a build is announced in "Changes for readers". Read against the repository and the live site on 2026-10-14: what is built has moved to "Changes for readers", and a line marked "(partly built)" says what exists today and what is still missing.
Readable method versions in the published files (partly built): the registry data/method_versions.json and the named versions above exist; the methodVersion and methodVersionDate fields appear in api/scores.json at the next generation of that file, and the Watch's methodology.json does not carry them yet. (see note)
Watch fixes recorded as known gaps on 2026-10-13 (see "Known gaps"): a wrong label on a Solana target, and the same score for a parameter change and a full code replacement in a queue.
Aave levels 0-5 for the Core reserves not yet read (the Status line of research/aave-levels-2026-10-13/ says which are read).
The Compare page, updated with the two neighbouring tools found after it was read on 2026-10-12 (Keyholder for Solana programs, OneKeyAway for EVM contracts), criterion by criterion, with sources and "not read" where we do not know. (see note)
A trust page per protocol (partly built): a prototype for one protocol (Aave V3) exists in the working repository, not yet public and is not on the live site; the page shows the weakest score among the protocol's contracts, the table of its contracts, the method in plain words and how to contest a reading. Extending it to the tracked protocols is decided. (see note)
A permission diff per governance proposal, and an authority column under it: for a proposal, the matrix "privileged function by holder, before and after", with the Safe threshold and the cumulated delay, each call simulated from each holder with a negative witness, shown as PASS/WARN/INFO (first targets: Compound, Aave, Sky). We compared with the Uniswap governance-seatbelt fork (its permission-diff check), read on 2026-10-13: it reads events and state diffs, and does not build this matrix across several DAOs with the multisig threshold, the delay and the simulated executor.
The shared-signer contagion map on the front page: which other protocols a given key can move. The shared-control sub-score exists per contract; the map does not.
A published backtest by the scorer (partly built): a backtest page is live (see "Changes for readers"); what is planned is the replay by the scorer of real incidents, stating which rules existed before each incident and whether they would have warned. (see note)
A claims registry: a team states its control configuration, the Watch re-checks it every run, a broken statement is published the same day.
Per-protocol, per-event alerts (queued timelock, rotated signer, granted role, executed freeze, changed implementation) on Telegram and Discord, driven by the 6-hour Watch, with a waiting list first (preparation files exist in the working repository, not yet public; the page is not live). The Watch itself stays free. (see note)
An on-chain guard (Zodiac Roles ScoreCondition) on a testnet, refusing a deposit when the score is below a policy or stale, with a real refusal shown (partly built). (see note)
"My money": paste an address, see your positions on the tracked contracts and the three worst scores, read-only, no wallet connection (cheapest path measured: a static page over the Zerion positions API). (see note)
The tokens you hold: can this stablecoin be frozen, by whom, how fast (44 stablecoin entries where every power sits behind one key are already extracted).
Powers actually exercised: a per-contract history of upgrades, pauses, freezes, admin mints and role changes, read from logs, with a registry of non-standard upgrade paths (Lighter on Robinhood Chain emits no EIP-1967 event).
A DAO proposal ready to paste from the score sliders.
Insurers and lenders as readers (Nexus Mutual, Chainproof, Munich Re DeFi Protect): a subscription file per protocol with replayable calls.
A warning at signing time (partly built): a MetaMask Snap with scores embedded in the package, later a Safe guard or an ERC-7579 hook "refuse if score below threshold". (see note)
Planned: per-application cross-chain and real-world assets#
LayerZero and Hyperlane configuration per application (DVN set, owner, delegate, ISM), starting with the applications that hold the most value. A delegate check exists (scripts/lib/layerzero_delegate_risk.py) and is not wired into the score.
Tokenized funds and bonds (BUIDL, USDY, OUSG, Superstate, Centrifuge, Ondo GM): freeze, forced redemption, allowlist and upgrade powers per issuer, with Aave Horizon levels.
Tokenized stocks on Solana (xStocks, Ondo GM): freeze authority and permanent delegate.
Change-of-role and upgrade alerts on RWA tokens accepted as collateral, for curators and risk providers.
Import of L2BEAT discovered.json as an external reader, closing the rollup gap.
Exit window = update delay minus withdrawal delay, with L2BEAT thresholds (below 7 days bad, below 30 days warning) and the DeFiScan Security Council criterion (partly built). (see note)
The "ultimate permission" model (chains of act calls with cumulative delays, a 1-of-N Safe counts as each signer acting alone), rewritten in Python.
Receipt fields: JCS canonical JSON with a versioned prefix, per-fact coverage checked/partial/not_checked/unavailable, a refUID to the previous attestation.
A batch canary: if a fifth of the proxies turn "non upgradeable" in one run, the node is lying and the batch is refused.
A class for EIP-7702 delegated accounts: a delegated EOA is still one key (partly built). (see note)
A date for the last change of threshold, timelock or config authority on every multisig (the Drift lesson: 2-of-5 and no timelock set five days before the loss).
Solana depth: Realms parameters (hold-up, veto, council vs community) and authority recursion (transfer hook and price oracle programs behind a target), and a program owned by a loader other than the upgradeable one read as "unresolved", not "renounced".
Sui and Aptos readings if those chains enter the oracle: UpgradeCap state and policy, upgrade_policy and upgrade_number, publisher key type.
An on-chain verifiable Watch: a daily commitment of the Watch state (already anchored on Zcash for scores; extended to every run).
A verifier and an extension profile for ERC-8241 (Protocol Control Disclosure): chainId, contract, selector, holder, threshold, delay, signature.
A verified compliance grid per page: Trail of Bits levels 1-4, the two EthTrust v3 requirements, SEAL thresholds; level 4 verified on chain as a "certificate of absence" of admin power.
A state-mate YAML and a moesi manifest per contract, generated from the readings.
A Slither plugin "authority" with RPC reads (owner or proxy admin as EOA or 7702, roles without delay, Aragon ANY_ADDR), SARIF output.
A "control" evidence file in the sense of the FATF 2026 guidance, never presented as a legal qualification.
"Under watch" and "outlook" statuses on queued actions that would move a score, with a published realization rate.
A public counter-reading next to institutional ratings (S&P vault assessments, Credora vault ratings): the on-chain reading of the day and the gap.
"White paper versus chain" per MiCA issuer: ESMA register, contract address, real powers.
A replayable log of power changes on regulated stablecoins (the StablR case: multisig owners changed before the unbacked mint).
A public reference table of the technical powers of regulated stablecoins.
Drift of configuration for SEAL-certified protocols, once a public list of certified protocols exists.
A config "pin" reading on Stellar Soroban fleets (CAP-85 executable references, timelock, pin) if Stellar stays in scope.
A per-position authority risk for a pasted address, once a positions API without a browser-exposed key is chosen.
A score block on the pages where people vote (a Snapshot plugin, a governance front end), fed by the permission diff of item 6, once a third party accepts one.
Selling single checks over x402 (eight sellers measured on chain in 2026, a few dollars each). Email alerts as a product (a Telegram channel exists). Any claim of being first, only or alone.
Notes on items marked "see note" (re-read on 2026-10-14 from the repository, the live site and the public registries)#
1: a version registry (data/method_versions.json, scheme YYYY.MM.N) is in the repository; the methodVersion and methodVersionDate fields are written by scripts/update_scores.py at the next generation of api/scores.json, and the file in the repository today does not carry them; the Watch's methodology.json is produced by the Watch job and does not carry them yet.
4: the Compare page is live and lists the neighbouring tools it read on 2026-10-12; the two tools named here are not on it.
5: the prototype builder (in the working repository, not yet public) writes the page only when the owner releases it with a marker file after reading it; the pages of the live site do not include it today.
8: the live backtest page reads incidents from public postmortems against the six published requirements and says which it could not apply; it is not a replay by the scorer, and the "rules that existed before the incident" are not on it.
10: scripts/lib/alerts.py posts a Telegram message when a score gets worse after a push; per-protocol, per-event alerts do not exist. The waiting-list files are in the working repository, not yet public and the page is not served.
11: a Safe transaction guard that refuses a call to a low or stale score exists as source (in the working repository, not yet public), src/SafeAuthorityGuardV2.sol, tested locally and reviewed once; it is not deployed. src/AuthorityGatedVault.sol (in the working repository, not yet public) is an example consumer that refuses a deposit on a weak, stale or unscored target, with 32 passing tests and 1 skipped in a run on 2026-10-14; its refusals replay on a local fork, and the replay on the real testnet is not done yet. The Zodiac Roles ScoreCondition is a different mechanism and does not exist yet.
12: a "What do I hold?" panel exists on the dashboard for EVM wallets; the version in this item (a positions API, no wallet connection) is the planned one.
17: the MetaMask Snap exists in the working repository, not yet public (snap/authority-insight) and was hardened on 2026-10-13; it is not published in the Snaps directory and not installed in a real MetaMask. The Safe guard is the item 11 note.
22: the contract sources and tests exist (src/, test/); no package is published.
24: the read-only MCP server is published and is in "Changes for readers". The AgentKit action provider and the LangChain tools exist as source in integrations/ of the public repository; neither is published as a package or listed in a registry (checked on 2026-10-14: no package of that kind on PyPI or npm under the names tried).
27: every page already shows six fixed requirements, each met, not met or not assessed; what is missing is the rosette-style grid.
31: each contract page shows an "Exit window" line derived from the timelock sub-score (live since 2026-10-11); the arithmetic with the withdrawal delay and the L2BEAT thresholds is not built.
35: an account classifier that knows EIP-7702 exists (scripts/lib/account_classification.py) and Tempo treats a delegated account as an EOA, but the review of 2026-10-13 found most scorers still test is_eoa(), so the same key can score differently. The class is not applied everywhere.
The dated engineering log of the scoring and deployment work, kept verbatim as evidence of what was checked, when, and what was left open. It reads as a working log on purpose: each entry says what that pass verified and what it did not. For the current state read the README; for the rules, METHODOLOGY.md; for the live numbers, the dashboard.
History of the README section "Why this, and why now"#
Three dated asides used to live in the README's SolGov paragraph, as the Status section did for everything else.
blind 100. Updated 2026-09-20: that is now the rule on every EVM ecosystem, not just those two chains (decision and rationale in METHODOLOGY.md; what it moved, now pushed on-chain (2026-09-20), in data/finding_2026-09-20-cross-exposure-convention-and-score-adjustments.md).
signal list this project does not fully check yet. Correction 2026-09-17: an earlier version of this paragraph said closing that gap was "the honest bar" before promoting Solana out of methodology phase -- Solana reached scoring_build the same day (chains/solana/scorers.py, 2 targets, see chains/solana/data/scored_targets_2026-09-17.md) using this project's existing cross-chain 5-dimension model, without first matching SolGov's extended signal set. Recording that honestly rather than quietly dropping the earlier claim: the stated precondition was not met, matching SolGov's fuller benchmark on Solana remains a real, separate, still-open item, not a completed step. Correction 2026-09-18 (this paragraph had gone stale, caught via the research tracker rather than silently left): chains/solana/scorers.py now covers 13 targets, not 2 -- 8 more were added 2026-09-18 (Raydium, marginfi, Kamino Liquidity, Jupiter Perps, Jupiter Lend, PumpSwap, Meteora DAMM v2, Orca Whirlpool, see chains/solana/data/scored_targets_2026-09-18- defi-config-admins.md), plus Marinade the same day (chains/solana/data/ scored_targets_2026-09-18-marinade-liquid-staking.md). Re-verified live 2026-09-18: len(chains/solana/scorers.py:SIMPLE_SCORERS) == 13, every entry a single-target -> dict scorer, matching the 13 count exactly. The SolGov-benchmark-depth gap itself remains genuinely open regardless of target count -- this correction is about the number, not the underlying claim.