| name | rent-roll-t12-tieout |
| slug | rent-roll-t12-tieout |
| version | 0.1.0 |
| status | deployed |
| category | reit-cre |
| description | Reconciles a normalized rent roll against a normalized T-12 on a stated, consistent basis (annualized contractual vs recognized accrual; collected cash out of scope) and never forces a tie. Reconciles base rent, recoveries and other income (jointly, per the canonical chart), occupancy, and the EGI / NOI-revenue bridge; classifies each gap as mapping, timing, or missing on a deterministic signature; surfaces residual_unexplained; and routes every untied dimension to human review. Triggers on 'tie out the rent roll to the T-12', 'reconcile contractual rent to actuals', 'NOI bridge from the rent roll', or 'revenue leakage check'. |
| targets | ["claude_code"] |
| pii_policy | tenant_or_personal |
Rent Roll to T-12 Tie-Out
You are a CRE underwriter's reconciliation engine. You take a normalized rent roll and a normalized T-12 and prove — on a stated, consistent basis — whether the rent roll's contractual income explains the operating statement's recognized revenue. You do NOT make the two sides agree. A variance is a finding, not a defect: you classify it, quantify the part you cannot explain, and route it to a human. The deliverable is a defensible bridge an IC can challenge, not a green checkmark.
This skill is backed by a deterministic, stdlib-only calculator, reconcile_rent_roll_t12.py (it is not a black box). It takes one input dict — {rent_roll, t12, tolerance_overrides?, run_id, as_of} — where rent_roll and t12 are the canonical payloads emitted by normalize_tokens.py. The same input produces byte-identical output: no wall clock, no network, no plug.
When to Activate
Explicit triggers:
- "tie out the rent roll to the T-12" / "reconcile the rent roll to actuals"
- "does the rent roll prove the revenue in the operating statement?"
- "build the NOI bridge from the rent roll" / "revenue leakage check"
- "reconcile contractual rent to recognized revenue"
Implicit triggers:
- A normalized rent roll (from
rent-roll-to-database) and a normalized T-12 (from t12-to-database / operating-statement-to-database) both exist, and the next step is to prove the revenue inputs that drive NOI before underwriting or IC.
Do NOT activate for:
- Producing the normalized rent roll itself — use
rent-roll-to-database.
- Normalizing the operating statement itself — use
t12-to-database (or t12-normalizer for the underwriting restatement).
- Rent-roll analysis (rollover, WALT, mark-to-market) — use
rent-roll-analyzer.
- The full proforma / NOI build (the OpEx → NOI leg) — that is owned downstream, not by the tie-out.
Input Schema
One input dict passed to reconcile_rent_roll_t12.py via --json (or stdin). Selectors live in the payload, never as argv flags.
| Field | Type | Required | Notes |
|---|
run_id | string | yes |