# Architecture
Technical architecture of the CRE Acquisition Orchestration System. This document covers agent hierarchy, phase dependencies, data flow, the checkpoint system, and file structure.
---
## 1. Agent Hierarchy
The system uses a three-level hierarchy: Master Orchestrator, Phase Orchestrators, and Specialist Agents. The acquisition pipeline has 27 core orchestration roles, and the dashboard/runtime also model 4 document ingestion roles, for 31 named AI roles in the public catalog.
```mermaid
graph TD
SRC[Source Documents]
DOC[document-orchestrator]
RRPARSE[rent-roll-parser]
FINPARSE[financials-parser]
OMPARSE[offering-memo-parser]
MO[Master Orchestrator]
SRC --> DOC
DOC --> RRPARSE
DOC --> FINPARSE
DOC --> OMPARSE
RRPARSE --> MO
FINPARSE --> MO
OMPARSE --> MO
MO --> DDO[Due Diligence Orchestrator]
MO --> UWO[Underwriting Orchestrator]
MO --> FINO[Financing Orchestrator]
MO --> LEGO[Legal Orchestrator]
MO --> CLO[Closing Orchestrator]
DDO --> RRA[rent-roll-analyst]
DDO --> OPA[opex-analyst]
DDO --> PI[physical-inspection]
DDO --> MS[market-study]
DDO --> ER[environmental-review]
DDO --> LTR[legal-title-review]
DDO --> TC[tenant-credit]
UWO --> FMB[financial-model-builder]
UWO --> SA[scenario-analyst]
UWO --> ICM[ic-memo-writer]
FINO --> LO[lender-outreach]
FINO --> QC[quote-comparator]
FINO --> TSB[term-sheet-builder]
LEGO --> PSA[psa-reviewer]
LEGO --> TSR[title-survey-reviewer]
LEGO --> ET[estoppel-tracker]
LEGO --> LDR[loan-doc-reviewer]
LEGO --> IC[insurance-coordinator]
LEGO --> TDP[transfer-doc-preparer]
CLO --> CC[closing-coordinator]
CLO --> FFM[funds-flow-manager]
style SRC fill:#334155,color:#fff
style DOC fill:#0f766e,color:#fff
style RRPARSE fill:#0f766e,color:#fff
style FINPARSE fill:#0f766e,color:#fff
style OMPARSE fill:#0f766e,color:#fff
style MO fill:#1a1a2e,color:#fff
style DDO fill:#16213e,color:#fff
style UWO fill:#16213e,color:#fff
style FINO fill:#16213e,color:#fff
style LEGO fill:#16213e,color:#fff
style CLO fill:#16213e,color:#fff
```
### Agent Counts
| Level | Count | Examples |
|-------|-------|---------|
| Master Orchestrator | 1 | master-orchestrator |
| Phase Orchestrators | 5 | due-diligence-orchestrator, underwriting-orchestrator, financing-orchestrator, legal-orchestrator, closing-orchestrator |
| Specialist Agents | 21 | rent-roll-analyst, scenario-analyst, psa-reviewer, etc. |
| Document Ingestion Roles | 4 | document-orchestrator, financials-parser, offering-memo-parser, rent-roll-parser |
| **Total Named AI Roles** | **31** | 27 core acquisition roles + 4 document ingestion roles |
Additionally, some specialists spawn child agents at runtime:
- **scenario-analyst** spawns up to 27 scenario sub-agents
- **lender-outreach** spawns up to 12 lender-specific sub-agents
- **estoppel-tracker** spawns up to 200 per-unit estoppel sub-agents
Use **27** when referring only to the core acquisition hierarchy. Use **31** when describing the complete open-source AI role catalog exposed by the dashboard and runtime.
---
## 2. Phase Dependency Graph
Phases execute in a specific dependency order. Some parallelism is possible.
```mermaid
graph LR
DD[Phase 1
Due Diligence
7 agents]
UW[Phase 2
Underwriting
3 agents]
FIN[Phase 3
Financing
3 agents]
LEG[Phase 4
Legal
6 agents]
CLO[Phase 5
Closing
2 agents]
DD -->|"100% complete"| UW
UW -->|"100% complete"| FIN
DD -->|"80%+ complete"| LEG
FIN -->|"Loan docs ready"| LEG
DD --> CLO
UW --> CLO
FIN --> CLO
LEG --> CLO
style DD fill:#0f3460,color:#fff
style UW fill:#533483,color:#fff
style FIN fill:#e94560,color:#fff
style LEG fill:#0f3460,color:#fff
style CLO fill:#16213e,color:#fff
```
### Phase Dependencies Explained
| Phase | Depends On | Can Start When |
|-------|-----------|---------------|
| Due Diligence | Nothing | Immediately at pipeline start |
| Underwriting | Due Diligence | DD is 100% complete (all 7 agents finished) |
| Financing | Underwriting | UW is 100% complete (financial model, scenarios, IC memo done) |
| Legal | Due Diligence (partial) | DD is 80%+ complete (6 of 7 agents). Loan-doc-reviewer waits for Financing. |
| Closing | All prior phases | DD, UW, Financing, and Legal are all complete or conditional |
### Parallel Execution Timeline
```mermaid
gantt
title Pipeline Execution Timeline
dateFormat X
axisFormat %s
section Due Diligence
5 parallel agents :dd1, 0, 30
2 sequential agents :dd2, after dd1, 15
section Legal (Early Start)
PSA + Title + Estoppel + Insurance :leg1, 36, 50
Loan-Doc-Reviewer (waits for Financing) :leg2, after fin, 20
section Underwriting
Financial Model :uw1, after dd2, 15
Scenarios (27 parallel):uw2, after uw1, 10
IC Memo :uw3, after uw2, 10
section Financing
Lender Outreach (parallel) :fin, after uw3, 20
Quote Comparison :fin2, after fin, 10
Term Sheet :fin3, after fin2, 10
section Closing
Closing Coordinator :clo1, after fin3, 15
Funds Flow Manager :clo2, after clo1, 10
```
---
## 3. Data Flow
Data flows from deal setup and source documents through the dashboard launch layer into one of two runtimes: offline simulation or live Codex. Both paths publish local artifacts that the Package view can read. Codex authentication stays outside the repo: the dashboard can check local status and start `codex login`, but it never reads or returns credential material.
```mermaid
flowchart TD
subgraph Operator["Operator Workspace"]
USER[Operator]
DASH[Dashboard
Operator Deal Hub]
DOCINTAKE[Document Intake
Upload Extract Approve]
LAUNCH[Workflow Launcher
Runtime Selector]
AUTH[ChatGPT Auth Panel
Login Button]
PACKAGE[Package View]
end
subgraph LocalConfig["Local Inputs"]
DEAL[config/deal.json
or data/deals/{dealId}/deal.json]
THRESH[config/thresholds.json]
REG[config/agent-registry.json]
WORKFLOWS[config/workflows.json]
SOURCES[data/deals/{dealId}/documents]
SNAPSHOT[data/runs/{dealId}/input-snapshot.json]
end
subgraph Runtime["Runtime Paths"]
RM[Run Manager]
SIM[Offline Simulation
scripts/orchestrate.js]
CODEX[Live Codex Runner
scripts/codex-agent-runner.js]
CLI[Codex CLI
ChatGPT login]
AUTHSTORE[Codex Credentials
outside repository]
end
subgraph Artifacts["Local Artifacts"]
STATUS[data/status
checkpoints events manifests]
PHASE[data/phase-outputs]
REPORTS[data/reports
reports workpapers]
RAW[data/codex-runs
prompts logs memos]
end
USER --> DASH
DASH --> DOCINTAKE
DASH --> LAUNCH
LAUNCH --> AUTH
DOCINTAKE --> SOURCES
SOURCES --> SNAPSHOT
DEAL --> SNAPSHOT
THRESH --> SNAPSHOT
REG --> SNAPSHOT
WORKFLOWS --> SNAPSHOT
SNAPSHOT --> RM
LAUNCH --> RM
AUTH --> CLI
RM --> SIM
RM --> CODEX
SIM --> STATUS
SIM --> PHASE
SIM --> REPORTS
CODEX --> CLI
CODEX --> RAW
CODEX --> STATUS
CODEX --> REPORTS
CLI --> AUTHSTORE
STATUS --> PACKAGE
REPORTS --> PACKAGE
RAW --> PACKAGE
PACKAGE --> DASH
style DASH fill:#16213e,color:#fff
style SIM fill:#0f3460,color:#fff
style CODEX fill:#533483,color:#fff
style AUTH fill:#0f766e,color:#fff
style AUTHSTORE fill:#334155,color:#fff
style CLI fill:#e94560,color:#fff
style PACKAGE fill:#1a1a2e,color:#fff
```
### Input Files
| File | Purpose | When Read |
|------|---------|-----------|
| `config/deal.json` | Property details, financials, timeline | Pipeline start |
| `config/thresholds.json` | Investment criteria for go/no-go decisions | Pipeline start and final verdict |
| `config/agent-registry.json` | Maps agent names to prompt files | Pipeline start |
| `config/workflows.json` | Built-in workflow catalog and phase/agent selections | Dashboard or CLI workflow launch |
| `data/deals/{dealId}/documents/` | Uploaded source documents | Dashboard launch readiness and input snapshot |
| `data/runs/{dealId}/...input-snapshot.json` | Source-backed launch package | Simulation and live Codex runs |
### Output Files
| File | Generated By | Contents |
|------|-------------|----------|
| `data/reports/{deal-id}/final-report.md` | Master Orchestrator | Complete acquisition report with verdict |
| `data/reports/{deal-id}/dd-report.md` | DD Orchestrator | Due diligence findings |
| `data/reports/{deal-id}/underwriting-report.md` | UW Orchestrator | Financial model, scenarios |
| `data/reports/{deal-id}/financing-report.md` | Financing Orchestrator | Lender quotes, terms |
| `data/reports/{deal-id}/legal-report.md` | Legal Orchestrator | Title, PSA, estoppel, insurance |
| `data/reports/{deal-id}/closing-report.md` | Closing Orchestrator | Readiness assessment |
| `data/codex-runs/{runId}/summary.md` | Codex Runner | Live Codex run summary |
| `data/codex-runs/{runId}/{phase}/{agent}.md` | Codex Specialist | Live Codex memo for a markdown agent |
| `data/status/{dealId}/run-{runId}-events.ndjson` | Story Engine | Dashboard-readable run events |
| `data/status/{dealId}/run-{runId}-documents.json` | Story Engine | Dashboard Package document registry |
---
## 4. Checkpoint System
The system uses a 3-tier checkpoint architecture for crash resilience and resume capability.
```mermaid
flowchart TD
subgraph Tier1[" Tier 1: Human-Readable "]
SS[data/status/.json
quick orientation for humans]
end
subgraph Tier2[" Tier 2: Master Checkpoint "]
MC[data/status/DEAL-ID.json
phase statuses progress timestamps]
end
subgraph Tier3[" Tier 3: Agent Checkpoints "]
AC1[data/status/DEAL-ID/agents/rent-roll-analyst.json]
AC2[data/status/DEAL-ID/agents/opex-analyst.json]
AC3[data/status/DEAL-ID/agents/...]
ACN[data/status/DEAL-ID/agents/funds-flow-manager.json]
end
subgraph RunArtifacts[" Run Package Artifacts "]
EVT[data/status/DEAL-ID/run-RUN-ID-events.ndjson]
DOC[data/status/DEAL-ID/run-RUN-ID-documents.json]
MAN[data/status/DEAL-ID/run-RUN-ID-manifest.json]
RAW[data/codex-runs/RUN-ID
live Codex raw outputs]
end
SS <-->|"synced after every
phase event"| MC
MC <-->|"aggregated from
agent results"| AC1
MC <--> AC2
MC <--> AC3
MC <--> ACN
MC --> EVT
AC1 --> DOC
RAW --> DOC
EVT --> MAN
DOC --> MAN
style Tier1 fill:#1a1a2e,color:#fff
style Tier2 fill:#16213e,color:#fff
style Tier3 fill:#0f3460,color:#fff
style RunArtifacts fill:#533483,color:#fff
```
### Tier 1: data/status/.json
- **Location:** Project root (`data/status/.json`)
- **Format:** Markdown
- **Updated:** After every phase completion or significant event
- **Purpose:** Human-readable status for quick orientation when resuming or checking progress
### Tier 2: Master Checkpoint
- **Location:** `data/status/{deal-id}.json`
- **Format:** JSON
- **Updated:** After every phase status change
- **Contents:**
- Deal identification (dealId, dealName, address)
- Phase-by-phase status (pending / running / complete / failed / conditional)
- Overall progress percentage (weighted: DD 25%, UW 20%, FIN 20%, LEG 25%, CLO 10%)
- Phase outputs and data for downstream phases
- Timestamps (startedAt, lastUpdated, completedAt)
### Tier 3: Agent Checkpoints
- **Location:** `data/status/{deal-id}/agents/{agent-name}.json`
- **Format:** JSON
- **Updated:** When each agent completes or fails
- **Contents:**
- Agent identification and phase
- Status (pending / running / complete / failed)
- Findings, metrics, red flags, data gaps
- Timestamps and duration
### Resume Flow
```mermaid
flowchart TD
START[Pipeline Launch]
CHECK[Read master checkpoint
data/status/DEAL-ID.json]
EXISTS{Checkpoint
exists?}
FRESH[Fresh Start:
Initialize all phases as pending]
RESUME[Resume Mode:
Read phase statuses]
SKIP[Skip completed phases
Use cached outputs]
RELAUNCH[Re-launch running/failed phases
With error context]
LAUNCH[Launch pending phases
When dependencies met]
START --> CHECK --> EXISTS
EXISTS -->|No| FRESH
EXISTS -->|Yes| RESUME
RESUME --> SKIP
RESUME --> RELAUNCH
RESUME --> LAUNCH
```
---
## 5. File Structure
Complete directory tree of the `cre-acquisition/` project.
```
cre-acquisition/
├── data/status/.json # Tier 1: Human-readable session state
├── LAUNCH.md # Quick-start launch commands
│
├── config/
│ ├── deal.json # YOUR DEAL - edit this per acquisition
│ ├── deal-example.json # Fully populated reference example
│ ├── deal-schema.json # JSON Schema for deal.json validation
│ ├── thresholds.json # Investment criteria (PASS/FAIL/CONDITIONAL)
│ ├── agent-registry.json # Agent name → prompt file mapping
│ └── examples/
│ ├── core-plus-multifamily.json # Example: core-plus strategy
│ └── opportunistic-multifamily.json # Example: opportunistic strategy
│
├── orchestrators/
│ ├── master-orchestrator.md # Full pipeline coordinator
│ ├── due-diligence-orchestrator.md # DD phase (7 agents)
│ ├── underwriting-orchestrator.md # UW phase (3 agents)
│ ├── financing-orchestrator.md # Financing phase (3 agents)
│ ├── legal-orchestrator.md # Legal phase (6 agents)
│ └── closing-orchestrator.md # Closing phase (2 agents)
│
├── agents/
│ ├── due-diligence/
│ │ ├── rent-roll-analyst.md # Rent roll analysis, unit mix, loss-to-lease
│ │ ├── opex-analyst.md # Operating expense analysis, anomaly detection
│ │ ├── physical-inspection.md # Property condition, capex estimation
│ │ ├── market-study.md # Market research, comps, demographics
│ │ ├── environmental-review.md # Phase I ESA, contamination risk
│ │ ├── legal-title-review.md # Title search, exceptions, encumbrances
│ │ └── tenant-credit.md # Tenant creditworthiness, concentration risk
│ ├── underwriting/
│ │ ├── financial-model-builder.md # Base case pro forma, cash flow projections
│ │ ├── scenario-analyst.md # 27-scenario sensitivity analysis
│ │ └── ic-memo-writer.md # Investment committee memo
│ ├── financing/
│ │ ├── lender-outreach.md # Multi-lender solicitation (up to 12 lenders)
│ │ ├── quote-comparator.md # Quote comparison matrix, best terms
│ │ └── term-sheet-builder.md # Term sheet drafting, negotiation points
│ ├── legal/
│ │ ├── psa-reviewer.md # Purchase & Sale Agreement analysis
│ │ ├── title-survey-reviewer.md # Title commitment and survey review
│ │ ├── estoppel-tracker.md # Per-unit estoppel tracking (up to 200 units)
│ │ ├── loan-doc-reviewer.md # Loan document review and compliance
│ │ ├── insurance-coordinator.md # Insurance coverage verification
│ │ └── transfer-doc-preparer.md # Transfer document preparation
│ └── closing/
│ ├── closing-coordinator.md # Closing checklist, readiness assessment
│ └── funds-flow-manager.md # Funds flow memo, wire instructions
│
├── skills/
│ ├── logging-protocol.md # Standardized logging format
│ ├── checkpoint-protocol.md # Checkpoint read/write procedures
│ ├── underwriting-calc.md # Financial calculation formulas
│ ├── risk-scoring.md # Risk score computation methodology
│ ├── multifamily-benchmarks.md # Industry benchmark data
│ ├── lender-criteria.md # Lender qualification criteria
│ ├── legal-checklist.md # Legal compliance checklist
│ └── self-review-protocol.md # Agent self-review procedures
│
├── templates/
│ ├── agent-checkpoint.json # Template for agent checkpoint files
│ ├── phase-checkpoint.json # Template for phase checkpoint files
│ ├── report-template.md # Template for phase reports
│ └── ic-memo-template.md # Template for IC memo
│
├── data/
│ ├── deals/
│ │ └── {deal-id}/
│ │ ├── deal.json # Local user-created or extraction-updated deal config
│ │ ├── criteria.json # Deal-specific underwriting criteria
│ │ ├── document-manifest.json # Source document catalog
│ │ ├── approved-fields.json # Source-backed approved fields
│ │ ├── documents/ # Uploaded source documents
│ │ └── extractions/ # Extraction previews
│ ├── workflow-presets/ # Saved local workflow launcher presets
│ ├── runs/ # Source-backed run input snapshots
│ ├── logs/
│ │ └── {deal-id}/
│ │ ├── master.log # Master orchestrator activity log
│ │ ├── due-diligence.log # DD phase log
│ │ ├── underwriting.log # UW phase log
│ │ ├── financing.log # Financing phase log
│ │ ├── legal.log # Legal phase log
│ │ └── closing.log # Closing phase log
│ ├── phase-outputs/
│ │ └── {deal-id}/ # Intermediate phase output data
│ ├── codex-runs/
│ │ └── {run-id}/ # Live Codex prompts, logs, summaries, and agent memos
│ ├── reports/
│ │ └── {deal-id}/
│ │ ├── final-report.md # Complete acquisition report
│ │ ├── dd-report.md # Due diligence report
│ │ ├── underwriting-report.md # Underwriting report
│ │ ├── financing-report.md # Financing report
│ │ ├── legal-report.md # Legal report
│ │ └── closing-report.md # Closing report
│ └── status/
│ └── {deal-id}.json # Tier 2: Master checkpoint
│ └── agents/
│ ├── rent-roll-analyst.json
│ ├── opex-analyst.json
│ └── ... # One file per agent (Tier 3)
│
├── dashboard/
│ ├── package.json # Dashboard dependencies
│ ├── vite.config.ts # Vite configuration
│ ├── server/ # Local watcher, REST API, workflow/document services
│ └── src/ # React operator portal source
│
├── validation/
│ ├── test-deal.json # Synthetic test deal for validation
│ ├── validation-runner.md # Validation suite runner
│ ├── synthetic-checkpoint.json # Test checkpoint data
│ └── expected-outputs/ # Expected results for validation
│
├── scripts/ # Utility scripts
├── build/ # Build system files (used during development)
└── docs/
├── PREREQUISITES.md # Software and account requirements
├── FIRST-DEAL-GUIDE.md # Step-by-step first deal walkthrough
├── ARCHITECTURE.md # This file
├── DEAL-CONFIGURATION.md # deal.json field reference
├── THRESHOLD-CUSTOMIZATION.md # Threshold tuning guide
└── LAUNCH-PROCEDURES.md # All launch options
```
---
## 6. Runtime Model
The project now has two first-class runtime paths plus a local auth status path:
1. **Offline deterministic runtime** - `scripts/orchestrate.js` runs the complete local simulation with no API key or subscription. It writes checkpoints, phase outputs, logs, story events, workpapers, and final reports for the dashboard.
2. **Live Codex runtime** - `scripts/codex-agent-runner.js` uses the open-source Codex CLI harness via `codex exec`. It runs selected markdown agents with a ChatGPT login, defaults to a read-only sandbox, writes raw Codex outputs to `data/codex-runs/{runId}/`, and publishes dashboard package artifacts under `data/status/{dealId}/run-{runId}-*.{ndjson,json}`.
3. **Codex auth status path** - `GET /api/codex/status` reports local readiness without secrets, and `POST /api/codex/login` starts `codex login` so the user can choose ChatGPT in the Codex browser flow.
The live Codex execution model:
1. The runner verifies `codex login status`.
2. It reads `config/workflows.json`, `config/agent-registry.json`, `config/deal.json`, and the selected scenario.
3. It selects agents from a workflow, phase, or explicit `--agent` filter.
4. It launches one `codex exec` process per selected specialist, up to the requested `--concurrency`.
5. Each Codex specialist reads the local agent, orchestrator, skill, threshold, and deal files.
6. Each specialist returns structured Markdown: verdict, findings, red flags, data gaps, and follow-up.
7. The runner writes prompts, logs, outputs, `manifest.json`, and `summary.md` under `data/codex-runs/{runId}/`.
8. The runner registers Codex memos and run summaries with the story engine so dashboard-launched live runs appear in the Package view through `data/status/{dealId}/run-{runId}-events.ndjson`, `documents.json`, and `manifest.json`.
Legacy prompt-runner launch prompts remain useful for advanced users who already operate in another agent runtime, but the recommended first-download live-AI path is Codex CLI with ChatGPT login.
### Key Design Principles
- **Markdown-native:** All agent behavior is defined in `.md` prompt files, not code
- **Stateless agents:** Each agent invocation is independent; all context is passed via prompts
- **Crash-resilient:** 3-tier checkpoints mean no work is lost on interruption
- **Observable:** Structured logs and real-time dashboard provide full visibility
- **Configurable:** Deal parameters and investment thresholds are external JSON, not embedded in prompts