Verification
System · verification

Verification

How a number earns its place in Aedex: every displayed value is the projection of an inspectable claim, and the record is built to be challenged.

1. Claim
Every fact — a value, an owner, a loan — enters as a claim naming its source, license, confidence and observation time. Nothing is a bare number.
2. Canonical hash
The claim is canonicalized (RFC 8785 JCS) and hashed with SHA-256. Any alteration — a digit, a date — changes the hash.
3. Merkle tree
Claim hashes roll into a Merkle tree, so one root commits to the entire record and any single claim can be proven against it.
4. Anchor
The root is published outside our control, making the record tamper-evident: history can be audited, never silently rewritten.
Serving
Reads come from the v2 ledger gateway when reachable; otherwise the bundled snapshot.
Gateway
Catalog mix
273verified377partial2unverified
Verified = identity & ownership confirmed against public records. Valuations are modeled unless a disclosed deal is cited.
Public anchor
PendingActivates with live ledger ingestion.
Claims and their sources are live today; canonical hashing and the externally published Merkle root are applied when a record is anchored — the final step, still pending.
Verify in your browser
Run the ledger’s frozen conformance vectors on this device: claim hashes, Merkle roots and inclusion proofs, presence proofs, and anchor-record Ed25519 signatures — the same golden vectors the Python, Go and TypeScript implementations must reproduce byte-for-byte.
This demonstrates that the verification math runs entirely client-side. It does not make the public anchor live — that stays Pending until the public ledger activates.

The badge language

Tap any badge — here or anywhere — to inspect the claim
Corroborated
Two or more independent sources agree. The badge shows the count.
Single source
One public record backs it — solid, but not yet corroborated.
Estimated
Modeled — no public citation yet. We show the model, never dress it as sourced.
Disputed
Sources conflict. We surface the dispute instead of averaging it away.

Cite & embed

verification as public infrastructure

Every asset’s verification state is public: a read-only JSON endpoint for citations and pipelines, and an embeddable badge that resolves to the underlying evidence. Both state only what the record supports — a partially sourced asset reads “Partially sourced”, never “Verified”, and anchor fields appear only once a record is actually anchored.

Verification API
GET /api/verify/ONEVANDE
{
  "schema": "aedex.verify.v1",
  "ticker": "ONEVANDE",
  "name": "One Vanderbilt",
  "assetClass": "Office",
  "market": "Midtown Manhattan",
  "verification": "partial",
  "sourcedClaims": {
    "total": 12,
    "distinctSources": 7,
    "byCategory": {
      "value": 0,
      "ownership": 5,
      "debt": 1,
      "tenants": 4,
      "news": 0,
      "property": 2
    }
  },
  "sources": {
    "value": [],
    "ownership": [
      "https://slgreen.com/mori-building-co-ltd-completes-additional-investment-in-sl-greens-one-vanderbilt-avenue/"
    ]
  },
  "anchor": {
    "status": "pending"
  },
  "links": {
    "permalink": "/asset/ONEVANDE",
    "badge": "/embed/badge/ONEVANDE",
    "methodology": "/verification"
  }
}
Public, cacheable, CORS-open; unknown tickers return a JSON 404. Only claims carrying a real public source URL are counted, and cap rate, NOI, rents and occupancy — private metrics — never appear here.
Provenance badge
<iframe
  src="/embed/badge/ONEVANDE"
  width="300" height="64"
  style="border:0" loading="lazy"
  title="Aedex verification — One Vanderbilt"></iframe>
Light/dark follows the reader’s system; force it with ?theme=dark. The badge wording is derived from the record’s verification state, and it links back to the asset page — where every value carries its source.

Aedex Indices — methodology

v1.0versioned like the ledger schema

The indices are computed only from the sourced verified-deals store — no modeled or estimated value ever enters one. Every rule that governs what qualifies, how it is normalized, and when a series is withheld:

Inputs
Only sourced transactions that carry a real disclosed price, a date (year or month), and a transaction basis. 221 of 342 sourced records qualify — 188 fee-simple, 33 partial-interest. Reported-valuation records (a stated valuation, not a trade) are never an index input.
Basis handling
Fee-simple sales are the clean signal. Partial-interest deals are either excluded or grossed up to an implied 100% value pro-rata — no control premium or discount assumed — with every grossed-up deal flagged in the drill-down. Fee-simple and partial figures are never silently mixed.
Prime Office ($/SF)
Value-weighted $/SF (total price ÷ total floor area) of fee-simple office sales that disclose area. National and per-metro; per-metro samples are all below the thin threshold and shown as insufficient.
Trophy Index
Cohort = sourced sales with a disclosed price ≥ $500M. Series = mean transaction value per year — a pricing-level signal that reflects deal mix, not the constant-quality appreciation of a single asset.
Cap-Rate Benchmark
Median and interquartile range of disclosed transaction cap rates only. Cap rate is a private metric we never infer or fabricate; 0 sourced deals disclose one, so the benchmark currently has no qualifying inputs.
Repeat-sales
A constant-quality (Case-Shiller) read requires the same asset to trade twice in the store. Only a couple of candidate pairs exist, over too short a span and partly partial-interest — too thin to publish, shown for transparency.
Base period
Each series is rebased to 100 at its earliest robust (non-thin) period; if none qualifies, at the earliest period, stated on the chart.
Thin-sample policy
Any period with fewer than 3 sourced deals is flagged thin — hollow markers, dashed segments — and never smoothed into a false trend. Where a scope can't support a series, we show "insufficient sourced deals" rather than invent one.
Metro grouping
Deals are grouped into metros by the deal-store join (normalizeMarket), which maps raw disclosed market strings to a canonical metro and excludes multi-market / national records.
Provenance & reproducibility
Every point links to its exact deal set; the CSV export carries period, index value, sample size, each deal's disclosed and normalized figure, and its source URL — enough to re-derive the index independently.

Debt analytics — methodology

what every figure on /debt may and may not say

The debt page aggregates stated values from recorded tranches — nothing is imputed and no market data is asserted. Every rule that governs what enters, how figures are weighted, and where each reference line comes from:

Inputs
Every module on /debt aggregates recorded outstanding tranches from the catalog: 183 of 652 tracked assets carry recorded debt — 204 outstanding loans, $142.4B stated principal. A further 21 recorded tranches are repaid or refinanced and are held for history, excluded from every figure. Only stated values enter; nothing is modeled in.
Stated, or absent
Absence stays visible: a missing rate is never 0%, a missing principal is never a zero weight, and a source that writes 0 for an unstated figure is read as unstated. 89 of 204 loans state a maturity, 39 a rate, 182 a principal — each module carries its own N-of-M coverage line instead of imputing.
Undated loans
A loan with no stated maturity lives in an explicit Undated bucket, off the time axis — never folded into a year, a cumulative share or a coupon, and excluded from every year figure. It cannot be tested against a maturity window, so whether it stays in scope is an explicit switch in the scope bar, never a silent rule. When the undated column exceeds the tallest year it is clipped at the plot ceiling behind a break mark, not rescaled onto a silent second axis.
Weighted coupon
Every weighted coupon is principal-weighted over the loans stating both a principal and a rate — currently 37 of 204 — and the n/of pair beside each figure is that coverage. Where nothing in scope states both, the figure is a dash: there is no answer, not a 0. Derived from sourced inputs, never marked verified.
Recent-vintage basis
Basis: the principal-weighted coupon on the 6 most recently originated loans this catalog has origination dates for — 2023-08-31 to 2024-01-18, $250M of trust-note balances, from SEC Form ABS-EE filings on EDGAR. A thin sourced sample across 5 assets, not a market index or a rate print. Read any gap as "against the newest originations this catalog can cite", never "against the market" — the record holds no rate index, treasury print or forward curve, so none is asserted; supply your own benchmark before pricing anything off it. Assets behind it: Tysons Corner Center, Staten Island Mall, Piazza Alta, Philadelphia Marriott Downtown, Westfarms.
Rate type
Fixed vs floating is not tracked in the record, so a stated coupon may be a spread-derived rate as of the source date. Rates render exactly as the source states them; loans with no stated rate are absent from the rate distribution entirely.
Lender normalization
Grouping is conservative: only exact-string variants of a single institution — legal suffixes, casing, arranger footnotes — are merged. Syndicates and co-lender strings are never merged or split: a syndicate's full principal sits on one verbatim row, not across its members, even when that fragments a count. Nearest is the earliest stated maturity; a lender whose loans are all undated shows a dash, not a date.
Debt type (derived)
The record has no structured instrument field, so the debt-type family is read off each record's stated instrument description. It is derived, never a source fact — an unreadable string falls to Other / unclassified rather than being guessed into a bucket.
Cumulative curve & past years
The maturity wall's cumulative line is derived from the bars, and its denominator is dated stated principal only — undated principal is in neither the line nor any year. Years before the current year stand as the source states them: a matured loan may have been refinanced without a captured public record.
Servicer tape
Where an SEC ABS-EE filing matches an asset, its payment/servicing narrative is quoted word for word — never summarized, classified or truncated, since a shortened fragment can invert the fact. Trust note portion balances: The cited trust's pari-passu note only — a slice of a larger whole loan, not the full mortgage on the building. Whole-property figures as reported by the servicer in the filing — servicer-reported, not independently verified.