CFDL

CRE: two-tenant office

two-tenant office, institutional lease-by-lease DCF. Free rent, anniversary escalations, recoveries above stops, TI/LC, probability-blended rollover, vacancy, opex, forward-NOI exit, debt.

Every number below is checked against an independent reference implementation on every commit — period by period, and on each metric, inside a declared tolerance. See benchmark methodology.

The model

version 0.1
model "office-two-tenant"
use pack "cre" version "0.1.0"
time calendar monthly from 2026-01 for 120 project 12

entity asset tower

// Tenant A: 5-year lease, 3 months free, 3% anniversary escalations,
// recoveries above a full stop at 40% pro-rata, $200k TI/LC.
contract cre.lease_unit.tenant_a on entity asset.tower {
  term 2026-01..2030-12
  terms {
    rent_year = 480000
    free_rent_months = 3
    escalation = 0.03
    opex_year = 300000
    opex_escalation = 0.025
    expense_stop_year = 300000
    pro_rata_share = 0.40
    ti_total = 120000
    lc_total = 80000
  }
}

// Tenant A rollover: window starts AT EXPIRY; during the 3 downtime months
// only the renewal scenario (70%) pays. Runs through the projection tail so
// exit valuation sees a full forward year.
contract cre.rollover.tenant_a on entity asset.tower {
  term 2031-01..2036-12
  terms {
    renewal_probability = 0.7
    renewal_rent_year = 520000
    market_rent_year = 560000
    market_escalation = 0.03
    downtime_months = 3
    renewal_ti_lc = 100000
    new_ti_lc = 350000
  }
}

// Tenant B: 7-year lease from mid-2026, 2.5% escalations, $180k stop at 30%.
contract cre.lease_unit.tenant_b on entity asset.tower {
  term 2026-07..2033-06
  terms {
    rent_year = 360000
    escalation = 0.025
    opex_year = 300000
    opex_escalation = 0.025
    expense_stop_year = 180000
    pro_rata_share = 0.30
    ti_total = 100000
    lc_total = 50000
  }
}

contract cre.vacancy_loss on entity asset.tower {
  term 2026-01..2036-12
  terms {
    rate = 0.02
    potential_gross_year = 900000
  }
}

contract cre.property_opex on entity asset.tower {
  term 2026-01..2036-12
  terms {
    opex_year = 300000
    escalation = 0.025
  }
}

// Sale at the end of the hold; NOI for the valuation year is DERIVED from
// the modeled streams over the 12 projection months after the sale date.
contract cre.exit_forward on entity asset.tower {
  term 2035-12..2035-12
  terms {
    exit_cap = 0.065
    selling_costs = 0.02
  }
}

// Permanent debt (25-year amortization, 10-year hold window).
stream loan.permanent_debt_service on entity asset.tower outflow currency USD {
  schedule every monthly from 2026-01 to 2035-12
  amount = -pmt(0.055 / 12, 300, 6000000)
}

Run configuration

{
  "deterministic": {
    "annual_discount_rate": 0.0725
  }
}

Verified results

MetricValueTolerance
model.npv1,434,622.67±1
domain.cre.noi4,718,933.9±1
domain.cre.leasing_costs525,000±1
domain.cre.debt_service4,421,429.94±1
domain.cre.dscr1.067287±0.0001