Property security and LVR management¶
| ID | MOD-115 |
| System | SD05 |
| Repo | bank-credit |
| Build status | Deployed |
| Deployed | Yes |
| Last commit | 19b0610 |
Purpose¶
Registers and monitors the property security instrument attached to each residential mortgage. Calculates current loan-to-value ratio (LVR) in real time using the outstanding loan balance (sourced from MOD-003) and the most recent property valuation on record. Enforces LVR policy gates at origination — a loan cannot proceed to settlement unless a registered security instrument is recorded and the calculated LVR falls within policy limits. Monitors ongoing LVR against policy thresholds and emits breach events for credit team review.
Compliance rationale¶
RBNZ BS19 requires the bank to measure, restrict, and report lending in defined LVR bands. Specifically, the bank must not exceed prescribed portfolio concentration limits in high-LVR categories (above 80% for owner-occupier; above 70% for investor). This module provides the per-loan LVR calculation and the daily LVR snapshot table that feeds those portfolio reports.
APRA APS 220 requires ongoing collateral adequacy monitoring for secured credit exposures. The daily LVR snapshot and valuation currency checks in this module satisfy that requirement.
CRE-005 (concentration risk policy) requires that LVR band distribution is tracked at portfolio level and reported to the credit risk committee. This module is the sole source of LVR band data for that report.
REP-002 (prudential reporting policy) requires that LVR band distribution is included in RBNZ and APRA prudential returns. This module's output feeds those returns directly.
Commercial rationale¶
LVR is the primary driver of mortgage pricing. LVR bands map to margin tiers in the rate sheet — a borrower at 70% LVR pays a materially lower rate than a borrower at 85% LVR. Accurate, real-time LVR data is therefore a direct revenue input.
Ongoing LVR monitoring creates two commercial opportunities. When LVR improves (property value rises or balance reduces), the bank can proactively offer a better rate tier — a retention and cross-sell trigger. When LVR deteriorates (property value falls), the bank can act early through a collateral call or rate repricing rather than discovering the problem at default.
Data model¶
-- credit.property_securities
CREATE TABLE credit.property_securities (
security_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
loan_id UUID NOT NULL REFERENCES credit.loans(loan_id),
title_reference TEXT NOT NULL,
property_address JSONB NOT NULL, -- {street, suburb, city, postcode, country}
property_type TEXT NOT NULL CHECK (property_type IN ('residential','rural_residential','apartment','townhouse')),
registered_at TIMESTAMPTZ NOT NULL,
registration_number TEXT,
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active','discharged','suspended')),
discharged_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- credit.property_valuations
CREATE TABLE credit.property_valuations (
valuation_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
security_id UUID NOT NULL REFERENCES credit.property_securities(security_id),
valuation_date DATE NOT NULL,
valuation_amount NUMERIC(18,2) NOT NULL,
valuation_type TEXT NOT NULL CHECK (valuation_type IN ('full','desktop','avm','indexed')),
valuer_reference TEXT,
source TEXT NOT NULL, -- 'registered_valuer','avm','index_update'
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- credit.lvr_snapshots (materialised daily)
CREATE TABLE credit.lvr_snapshots (
snapshot_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
loan_id UUID NOT NULL,
security_id UUID NOT NULL,
snapshot_date DATE NOT NULL,
outstanding_balance NUMERIC(18,2) NOT NULL,
current_valuation NUMERIC(18,2) NOT NULL,
lvr_pct NUMERIC(7,4) NOT NULL, -- e.g. 0.7823 = 78.23%
lvr_band TEXT NOT NULL, -- '<60','60-70','70-80','80-90','>90'
policy_breach BOOLEAN NOT NULL DEFAULT false,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (loan_id, snapshot_date)
);
Key operations¶
1. Security registration at settlement¶
Called by MOD-116 on drawdown. Inserts a record into credit.property_securities with the title reference, property address, property type, and registration details. Records the origination valuation in credit.property_valuations. Calculates the origination LVR and writes the first credit.lvr_snapshots record. If the calculated LVR exceeds the policy limit configured for the product, the settlement gate is blocked and an error is returned to the calling workflow.
2. LVR calculation¶
lvr = outstanding_balance / current_valuation
Run daily via a scheduled batch job (after MOD-003 end-of-day balance close) and on each valuation update. The result is written to credit.lvr_snapshots. The LVR band is derived from configurable thresholds: <60, 60-70, 70-80, 80-90, >90. Band boundaries are configurable to allow for regulatory threshold changes without a code deployment.
3. LVR breach detection¶
After each LVR calculation, the result is compared against the policy breach threshold for the product (configurable per product, per jurisdiction). If LVR exceeds the threshold, the policy_breach flag is set on the snapshot record and a bank.credit.lvr_breach_detected event is emitted. This event triggers an ALERT in MOD-063 (notification orchestration) to the credit team and flags the loan for review in the back-office queue.
4. AVM index update¶
MOD-085 provides quarterly property price index updates by suburb/region. On receipt of an index update, this module applies the index factor to all credit.property_valuations records with valuation_type = 'indexed' or where the most recent full valuation is older than the index refresh threshold (configurable, default 12 months). A new credit.property_valuations record is inserted with source = 'index_update' and valuation_type = 'indexed'. LVR snapshots are recalculated for all affected loans immediately after index update.
5. Security discharge¶
Called by MOD-116 on loan payoff or external refinance. Sets the status field on credit.property_securities to discharged and records discharged_at. Emits a bank.credit.security_discharged event. MOD-001 posts the security release accounting entry.
Requirements satisfied¶
FR-521 — System shall register a property security instrument against a loan at settlement and prevent drawdown if the security record is absent or LVR exceeds the policy gate threshold.
FR-522 — System shall calculate LVR for each active secured loan daily using end-of-day outstanding balance and the most recent valuation, and store the result in credit.lvr_snapshots.
FR-523 — System shall emit a bank.credit.lvr_breach_detected event and set policy_breach = true on the snapshot record when a loan's LVR exceeds the configured policy threshold.
FR-524 — System shall update property valuations on receipt of AVM index data from MOD-085 and recalculate LVR snapshots for all affected loans within the same batch run.
Module dependencies¶
Depends on¶
| Module | Title | Required? | Contract | Reason |
|---|---|---|---|---|
| MOD-001 | Double-entry posting engine | Required | — | Drawdown and security release events are posted via the double-entry engine. |
| MOD-066 | Collateral & security management | Required | — | Collateral and security management provides the security instrument record that this module monitors. |
| MOD-085 | Market rates ingestion & normalisation | Optional | contract/events/ |
v1 ships with manual revaluation only via MOD-066; automated index-driven revaluation deferred until MOD-085 adds a property index feed. |
Required by¶
| Module | Title | As | Contract |
|---|---|---|---|
| MOD-116 | Mortgage servicing engine | Hard dependency | — |
| MOD-121 | Construction loan drawdown engine | Hard dependency | — |
Policies satisfied¶
| Policy | Title | Mode | How |
|---|---|---|---|
| CRE-001 | Credit Risk Management Policy | GATE |
Loan cannot settle without a registered security instrument recorded and LVR calculated within policy limits. |
| CRE-005 | Concentration Risk Policy | CALC |
Current LVR is calculated daily and contributes to concentration risk reporting at portfolio level. |
| CLQ-002 | Liquidity Risk Management Policy | CALC |
Secured loan balances and collateral values are included in liquidity stress calculations via this module's output. |
| REP-002 | Prudential Reporting Policy | CALC |
LVR band distribution is reported in prudential returns (RBNZ BS19 / APRA APS 220). |
Capabilities satisfied¶
(No capabilities mapped)
Part of SD05 — Credit Decisioning & Loan Platform
Compiled 2026-05-22 from source/entities/modules/MOD-115.yaml