Skip to main content

plat-multifamily-underwriting

Deterministic multifamily underwriting engine: rent roll / T12 ingestion, a schema-validated canonical deal format, monthly cashflow + waterfall math, and a statute-cited property-tax regime module. Numbers come from the engine, not from a model. The same inputs always produce the same outputs.

python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest

What this is

Layer Job
engine/modules/ Deterministic cashflow math: revenue, opex, debt, capex, renovations, fund waterfall, metrics (IRR, EM, DSCR, CoC, cap rates).
engine/ingest/ Rent roll, T12, and OM parsers -> canonical deal JSON. Refuses to invent missing values.
engine/validator.py Schema v0.1 conformance + reference integrity + cohort-overlap gates.
engine/property_tax.py, engine/tax_regimes.py Millage-based property tax projection with per-regime statute citations.
engine/api.py Framework-free JSON request handlers (handle_run_deal, portfolio, refi-vs-sell).
runs/ingest_deal.py Canonical intake CLI: documents or agent-authored JSON -> validated deal JSON.

Quick start — run the intake CLI on the synthetic fixtures:

python runs/ingest_deal.py --rent-roll tests/fixtures/sample_rent_roll.csv \
  --t12 tests/fixtures/sample_t12.csv --start 2026-05 --end 2031-04 \
  --property-id "Sample Deal" --output output/sample.json --validate

Honest limitations

  • Synthetic-only validation. Every fixture in this repository is synthetic. No live offering memorandum, rent roll, or T12 is shipped, and parser coverage is not claimed beyond the synthetic fixtures and formats in tests/.
  • Property tax regimes require human review. engine/tax_regimes.py and docs/TAX_REGIME_SCHEDULES.md cite statutes, but rates, assessment ratios, and revaluation cadences must be reviewed by a qualified professional per jurisdiction before production use.
  • No invented numbers. Missing millage, missing rent, unknown unit status -> blockers and None, never silent zeros.
  • LLM OM extraction is opt-in. The default install parses nothing with a hosted model. The om-llm extra enables the Anthropic-based OM extractor; the core engine never imports it.

Layout

engine/          deterministic underwriting modules + canonical schema
engine/schemas/  deal_schema_v0_1.json (canonical deal format)
engine/ingest/   rent roll / T12 / OM parsers
tests/           synthetic fixtures only
runs/            ingest_deal.py intake CLI
docs/            specs, module docs, tax regime schedules

Contributing

Synthetic fixtures only — never commit real deal documents, property names, tenant IDs, or credentials. See CONTRIBUTING.md and SECURITY.md. DCO sign-off required.

License

Apache-2.0. See LICENSE.

Release files for plat-multifamily-underwriting 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for plat-multifamily-underwriting 0.1.0
File Size Uploaded
plat_multifamily_underwriting-0.1.0.tar.gz 405.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for plat-multifamily-underwriting 0.1.0
File Interpreter ABI Platform
plat_multifamily_underwriting-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 706.7 kB

Release files / plat_multifamily_underwriting-0.1.0.tar.gz

Download URL plat_multifamily_underwriting-0.1.0.tar.gz
Size 405.8 kB
Tags Source
SHA-256 checksum
How to use checksums
3c3dc408468eba1c9f7a9005b590f5c1c70bfd160e18772d2066d0eaa7903db0
BLAKE2b-256 checksum
How to use checksums
0e4647229a8a2d06fc9b5ca4da998f87b5cf0757f89b06a3df545d651d5c6c65
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release files / plat_multifamily_underwriting-0.1.0-py3-none-any.whl

Download URL plat_multifamily_underwriting-0.1.0-py3-none-any.whl
Size 300.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3140e4b70534babd090e7fa5cff80de70d23fc097323c5d17778075ac4e15ece
BLAKE2b-256 checksum
How to use checksums
ce86a8fa4449d1ab6f0b0d87c4e4614fa11fc1ba06af001057ab5d6d82e29d5d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page