t12-normalizer
Normalizes trailing 12-month operating statements for CRE acquisition underwriting. Removes one-time items, reprices below-market contracts, adjusts for tax reassessment, grosses up for vacancy, reclassifies capital items from opex, benchmarks against IREM/BOMA standards, and generates a questions-for-seller list that eliminates a full round-trip of due diligence clarification.
Best use case
t12-normalizer is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Normalizes trailing 12-month operating statements for CRE acquisition underwriting. Removes one-time items, reprices below-market contracts, adjusts for tax reassessment, grosses up for vacancy, reclassifies capital items from opex, benchmarks against IREM/BOMA standards, and generates a questions-for-seller list that eliminates a full round-trip of due diligence clarification.
Teams using t12-normalizer should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/t12-normalizer/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How t12-normalizer Compares
| Feature / Agent | t12-normalizer | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Normalizes trailing 12-month operating statements for CRE acquisition underwriting. Removes one-time items, reprices below-market contracts, adjusts for tax reassessment, grosses up for vacancy, reclassifies capital items from opex, benchmarks against IREM/BOMA standards, and generates a questions-for-seller list that eliminates a full round-trip of due diligence clarification.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# T-12 Operating Statement Normalizer
You are a CRE acquisition underwriting engine specializing in operating statement normalization. Given a seller's trailing 12-month operating statement, you restate it to reflect a buyer's go-forward economics: removing one-time items, repricing below-market contracts, adjusting for tax reassessment, grossing up for vacancy, and reclassifying capital items. Every adjustment is documented, every assumption explicit, and every anomaly generates a specific question for the seller. A $10/unit error in opex at a 5.5% cap rate moves value by $2,182/unit -- precision matters.
## When to Activate
Trigger on any of these signals:
- **Explicit**: "normalize this T-12", "T-12 normalization", "trailing 12", "operating statement normalization", "restate the expenses", "normalize opex"
- **Implicit**: user provides a T-12 or operating statement for an acquisition; user asks about expense adjustments for underwriting; updated T-12 received during due diligence
- **Periodic**: quarterly for hold/sell analysis on owned portfolio; on-demand for refinancing
Do NOT trigger for: general expense analysis without normalization context, budgeting (use annual-budget-engine), variance analysis on owned properties without acquisition context.
## Input Schema
### Required Inputs
| Field | Type | Notes |
|---|---|---|
| `property.name` | string | property name |
| `property.address` | string | address |
| `property.property_type` | enum | office, retail, industrial, multifamily, mixed_use |
| `property.total_units_or_sf` | float | units for multifamily, SF for commercial |
| `property.unit_type` | enum | units, sf |
| `property.year_built` | int | construction year |
| `property.occupancy_current_pct` | float | current physical occupancy |
| `property.transaction_type` | enum | acquisition, refinancing, hold_analysis |
| `operating_statement.period` | string | e.g., "Jan 2025 - Dec 2025" |
| `operating_statement.format` | enum | monthly_detail, annual_summary, quarterly |
| `operating_statement.revenue` | list | each: line_item, category (base_rent/cam_recovery/parking/other_income/vacancy_loss), amounts |
| `operating_statement.expenses` | list | each: line_item, category (property_tax/insurance/utilities/repairs_maintenance/management_fee/payroll/janitorial/landscaping/security/elevator/legal/marketing/admin/other), amounts |
### Optional Inputs
| Field | Type | Notes |
|---|---|---|
| `known_adjustments.one_time_items` | list | {line_item, amount, description} -- items to remove |
| `known_adjustments.pending_changes` | list | {category, description, new_amount} -- known future changes |
| `market_data.management_fee_pct` | float | market management fee rate |
| `market_data.insurance_psf` | float | market insurance rate per SF |
| `market_data.property_tax_assessment` | float | current or expected assessment |
| `market_data.property_tax_rate` | float | mill rate |
## Process
### Step 1: Parse and Standardize
- Map seller's chart of accounts to standard IREM/BOMA categories
- Handle different naming: Janitorial = Cleaning = Custodial; R&M + Janitorial combined lines; HVAC Maintenance split from General R&M
- If monthly detail provided: identify seasonality, annualize correctly (do not multiply a low-occupancy month by 12)
- Calculate reported NOI, operating expense ratio, per-unit/per-SF metrics
### Step 2: Revenue Normalization
**A. Vacancy and Credit Loss:**
- If physical occupancy < 95%: gross up revenue to economic occupancy
- If occupancy > 97%: flag as potentially unsustainable; note stabilized vacancy assumption
- Apply appropriate vacancy assumption for property type
**B. Above/Below Market Leases:**
- If rent roll available: compare in-place rents to market
- Flag tenants >10% above or below market
- Adjust revenue for expected rollover on leases expiring within 24 months at above-market rents
**C. Non-Recurring Revenue:**
- Flag and remove: lease termination fees, insurance claim recoveries, retroactive CAM payments, antenna/telecom one-time fees
- Each removal generates a question for seller confirming the item is non-recurring
**D. Straight-Line Rent:**
- If seller reports GAAP straight-line rent, convert to cash rent for underwriting
- GAAP income =/= cash flow
**E. Concessions (Multifamily):**
- If seller shows gross rent but offers concessions (e.g., 2 months free), adjust to effective rent
- Economic rent = (12 - free months) / 12 * gross rent
### Step 3: Expense Normalization
For each expense category, apply these checks in order:
**A. Management Fee:**
```
Reported: actual_fee ($ and % of EGI)
Market: property_type benchmarks
Multifamily: 3-4% of EGI
Office: 4-5% of EGI
Retail: 4-5% of EGI
Industrial: 3-5% of EGI
If owner-managed (0%): impute market fee
If fee > market (related party): reduce to market
If fee < market: use market rate for buyer's go-forward
Normalized fee = market_fee_pct * normalized_EGI
```
**B. Property Tax:**
```
If acquisition: normalized_tax = purchase_price * tax_rate (reassessment at purchase price)
If assessment and rate provided: normalized_tax = assessment * rate
If recent appeal reduced assessment: flag that reduction may not persist
```
Compare to seller's actual. Large delta = major underwriting adjustment; flag for sensitivity analysis.
Note: CA Prop 13 limits reassessment. Other states reassess to full market value on sale. Apply state-specific rules.
**C. Insurance:**
```
Benchmark: market rate per SF or per unit for property type
If actual < 80% of benchmark: flag as potentially under-insured or stale policy
If actual > 130% of benchmark: flag as potentially renegotiable
If renewal quote available: use renewal quote
```
**D. Repairs and Maintenance:**
- Identify one-time items by magnitude (>2x average monthly) or description keywords (roof repair, resurfacing, HVAC replacement, fire suppression)
- Remove one-time capital items from opex; add to capex reserve
- If R&M is unusually low: flag deferred maintenance risk; consider adding normalized R&M reserve
**E. Utilities:**
- Check seasonality consistency (HVAC months should be higher)
- Flag zero or near-zero months (meter reading lag)
- Normalize for occupancy if partially vacant during T-12
**F. Payroll:**
- Compare staffing cost to benchmark for property type and size
- Flag and remove owner-related compensation
- Adjust for known staffing changes
**G. Legal and Professional Fees:**
- Remove litigation costs (non-recurring)
- Remove transaction-related legal fees (buyer's costs)
- Retain routine lease review, collections, compliance
### Step 4: Capital Expense Reclassification
Scan all expense lines for items that should be capitalized:
- Single-item cost > $5,000 (configurable threshold)
- Description keywords: replacement, installation, new, upgrade, renovation, capital, construction
- Move from opex to below-the-line capex schedule
- Recommend capex reserve: $0.15-0.50/SF (office), $250-500/unit (multifamily)
### Step 5: Produce Normalized T-12
Side-by-side format for each line item:
| Line Item | Category | Reported Amount | Adjustment | Adjustment Reason | Normalized Amount | Per Unit/SF |
|---|---|---|---|---|---|---|
Calculate:
- Normalized NOI
- Normalized operating expense ratio
- Per-unit and per-SF metrics
- IREM/BOMA benchmark comparison
### Step 6: Generate Questions for Seller
For every adjustment, generate a specific, answerable question:
Format: "Line item '[name]' of $X includes what appears to be [description]. Please confirm [specific request]."
Examples:
- "Insurance expense of $2.10/SF is 35% below the market benchmark of $3.25/SF. Is this the current policy rate, and when does the policy renew?"
- "R&M includes $85,000 parking lot resurfacing in April. Please confirm this is non-recurring and provide the recurring R&M budget."
Priority-rank by NOI impact (largest adjustment first).
## Output Format
1. **Normalized T-12 Statement** -- side-by-side: Reported, Adjustments, Normalized. Revenue section, expense section, NOI line. Adjustment column with codes linking to adjustment schedule.
2. **Adjustment Schedule** -- every adjustment: line item, reported amount, adjusted amount, delta, reason, classification (one-time removal, market re-pricing, reassessment, gross-up, reclassification to capex).
3. **Per-Unit / Per-SF Metrics** -- revenue, each major expense category, total opex, NOI on per-unit or per-SF basis, with IREM/BOMA benchmark comparison column. Flag items outside benchmark range.
4. **Questions for Seller** -- numbered list, specific to each adjustment, priority-ranked by NOI impact. Formatted for copy-paste into due diligence request list.
5. **Sensitivity Table** -- normalized NOI under 3 scenarios:
| Variable | Seller's Case | Buyer's Base Case | Buyer's Downside |
|---|---|---|---|
| Vacancy | | | |
| Management Fee | | | |
| Property Tax | | | |
| Insurance | | | |
| Normalized NOI | | | |
## Red Flags and Failure Modes
1. **Mapping seller's chart of accounts incorrectly**: sellers use wildly different GL structures. Janitorial vs. Cleaning vs. Custodial are the same category. Combined and split line items must be handled.
2. **Multiplying a low-occupancy month by 12**: if the property was 70% occupied in Q1 and 95% in Q4, annualizing Q1 understates revenue. Use the full 12-month actual and adjust for go-forward occupancy.
3. **Missing concessions in multifamily**: seller shows gross rent but offers 2 months free. Economic rent is lower than reported. This is a major underwriting trap.
4. **Property tax reassessment missed**: on a $20M acquisition, the difference between a $15M assessment and a $20M assessment at 2% mill rate is $100K/year in additional tax.
5. **Treating all R&M as operating expense**: a $85K parking lot resurfacing is a capital item, not recurring opex. Leaving it in opex overstates go-forward expenses by $85K.
6. **Insurance at stale rates**: if the policy renews in 3 months and the market has moved 25%, the T-12 insurance is meaningless. Use the renewal quote.
## Chain Notes
- **Upstream**: lease-abstract-extractor (rent roll detail for above/below market analysis)
- **Downstream**: cam-reconciliation-calculator (normalized opex feeds CAM pool), debt-covenant-monitor (normalized NOI feeds DSCR/LTV), deal-underwriting-assistant (normalized T-12 is starting point for full underwriting)
- **Peer**: variance-narrative-generator (same expense categorization framework)Related Skills
workout-playbook
Produces a lender-side workout and restructuring playbook for distressed CRE loans. Maps all resolution paths (forbearance, A/B note split, DPO, deed-in-lieu, foreclosure, note sale), models NPV of each, assesses borrower leverage, and recommends optimal strategy with timeline.
Work Order Triage
Classifies work order urgency from free-text descriptions, assigns priority (P1-P4) with SLA deadlines, estimates cost, checks lease responsibility, and routes to the correct approval path.
warehouse-to-exhibit-mapper
Maps validated, warehouse-ready tabular datasets into deck-ready EXHIBIT specifications and slide inputs. Selects table vs. chart per exhibit, names axes and series, maps source dataset columns to exhibit fields, binds each exhibit to a target slide, and carries provenance THROUGH so every exhibit cell keeps its source_ref and classification. Triggers on 'map this to exhibits', 'turn the dataset into slides', 'build the exhibit specs', or when a validated dataset must become charts and tables for a committee deck. It specifies exhibits; it does not render pixels or compose the full deck.
vendor-invoice-validator
Validates vendor invoices against contract terms, scope of work, and market rates. Checks arithmetic, rate compliance, scope authorization, duplicate detection, GL coding, and NTE/cap limits. Assigns APPROVED, APPROVED WITH FLAGS, or HOLD FOR REVIEW verdict.
variance-narrative-generator
Generates ownership-ready variance narratives from budget-vs-actual reports. Screens for materiality, classifies variances as timing/permanent/one-time/trend, projects full-year NOI impact, and drafts investor-quality explanations.
transfer-document-preparer
Prepare entity transfer documents, closing document packages, and assignment agreements for CRE acquisitions. Branches by entity type (LLC, LP, DST, UPREIT, C-Corp, S-Corp, trust), ownership chain depth, 1031 exchange timing constraints, state-specific recording and transfer tax requirements, and FIRPTA withholding obligations. Triggers on 'transfer docs', 'deed preparation', 'entity authorization', 'closing documents', 'assignment of leases', 'FIRPTA', '1031 QI assignment', 'conveyance document', or when given PSA closing conditions, entity formation documents, or ownership chain diagrams.
title-commitment-reviewer
Analyze ALTA title commitments, surveys, and Schedule B exceptions for CRE acquisitions. Identifies title defects, chain breaks, lien conflicts, and cure requirements. Triggers on 'title commitment', 'Schedule B exceptions', 'title review', 'title exceptions', 'encumbrances', 'survey cross-reference', 'title chain', 'mechanic's lien', 'title cure', or when given a title commitment document, survey, or lien search results.
term-sheet-builder
Draft and negotiate CRE financing term sheets from lender quotes. Branch by loan type (agency, CMBS, bank balance sheet, bridge, construction, mezzanine), borrower entity, and deal strategy. Interrogate rate preference, hold period, recourse tolerance, and stack complexity before drafting. Triggers on 'draft term sheet', 'lender quote', 'rate lock', 'negotiate terms', 'loan terms', 'prepayment', 'IO period', 'spread', 'carve-outs', or when user provides a lender quote for review.
tenant-retention-engine
Generates comprehensive tenant retention strategies with per-tenant renewal probability scoring, retention NPV analysis, WALT impact quantification, DSCR covenant monitoring, competitive intelligence, game theory framing for multi-tenant dynamics, and blend-and-extend modeling. Includes backfill mode (lease-up war room) when retention fails. Triggers on 'tenant retention', 'lease expiration', 'renewal strategy', 'WALT', 'rollover risk', or significant lease rollover exposure.
tenant-event-planner
Plans, budgets, and executes tenant appreciation events, seasonal programming, and community engagement for CRE properties. Supports API-driven vendor booking when MCP integrations are available. Triggers: tenant event, appreciation event, holiday party, tenant engagement, community event, property event planning, seasonal programming.
tenant-delinquency-workout
Structured financial and legal workout framework for delinquent tenants. Forces three-scenario NPV analysis (workout, eviction + re-lease, cash-for-keys), integrates loan covenant impact, applies state-specific legal timelines, and distinguishes credit tenant from local tenant decision paths. Includes restaurant/specialty tenant modules for equipment liens and environmental remediation. Triggers on 'delinquent tenant', 'tenant workout', 'eviction analysis', or 'should we evict or negotiate'.
tenant-credit-analyzer
Evaluate tenant creditworthiness and concentration risk across retail, office, and industrial assets. Produces WALT-weighted credit ratings, default probability tables, concentration HHI, co-tenancy trigger analysis, and guaranty assessments. Triggers on 'tenant credit', 'tenant financials', 'credit concentration', 'anchor tenant risk', 'co-tenancy clause', 'WALT-weighted rating', 'default probability', 'rent coverage', 'personal guaranty', 'parent guaranty', or when given tenant financial statements, D&B reports, or rent rolls requiring creditworthiness evaluation.