AssetRow is the per-title asset register — one row per income-bearing asset (a title / unit): its income streams, the facility secured against it, and provenance. These are reconcilable, COA-tied facts, so the row lives in the ledgers schema alongside coa / periods — not in the analysis lane (that holds the forward valuation model). Migration: 017_valuation_model.sql.
"assets" subledger type on import.
You rarely build an
AssetRow by hand. ntro.valuations.store.save_model
bridges the domain objects (ntro.valuations.models.Asset) to these rows and
versions them; load_model reads them back into the engine. Use this type
directly only when reading the raw register (e.g. a custom analysis query).Type-specific fields
| Field | Type | Purpose |
|---|---|---|
name | str | The title / unit name (e.g. "Flat 1"). |
asset_type | str | Asset class — defaults to "residential_unit". Drives engine treatment (let-up, capex). |
income_streams | list[dict] (JSONB) | Serialised ntro.valuations.models.IncomeStream[] — rent / parking / EV / ancillary, each rolling up to a COA income line. JSONB so the polymorphic per-stream shape round-trips without a column explosion. |
facility | dict | None (JSONB) | Serialised ntro.valuations.models.Facility (loan / rate / term) — the title’s allocated debt, when secured. None for unencumbered assets. |
layout | str | None | Free-form unit layout (e.g. "2-bed"). |
epc | str | None | EPC rating. |
provenance | str | None | Where the fact came from (document ref, runbook step). |
model_version | int | Version stamp. A re-synthesis or a new fact writes a fresh row; old versions are retained so you can diff. |
Row column block (id, entity_id, period, task_id, status, …) is inherited — see the Subledgers overview.
Why facts and forward model are split
AssetRow (facts) lives in ledgers.assets; the forward valuation model lives
in analysis.valuations. The split keeps the law value = f(facts, assumptions, engine_version) honest: facts are reconciliation-grade and stable,
the model is derived and re-runnable. The two schemas never blur — analysis
is the forward lane, never an accounting ledger.
Related
Subledgers overview
Row base + SubledgerStatus lifecycle, and the standard column block.expenses
Another shipped platform type — single expense receipt.
journal_proposals
The journal-staging platform type.
Typing
Period and the shared field types used across rows.