orgstate / ARCHITECTURE.md
Legal-i's picture
Initial OrgState deploy via Stage 150 free-tier stack
d2d1903 verified
# ARCHITECTURE โ€” ืžื‘ื ื” ื”ื™ืขื“
ื”ืžื‘ื ื” ืฉืืœื™ื• ื”โ€‘monorepo ืžืชื›ื ืก. `core/` (+`config`/`calibration`/`pipeline`),
`verticals/logistics/` ื•โ€‘`harness/` ื›ื‘ืจ ื‘ืžื‘ื ื” ื”ื™ืขื“; `infra/` ื•โ€‘`delivery/`
ืขื“ื™ื™ืŸ ื‘โ€‘`legacy/` ื•ืžื”ื’ืจื•ืช ื‘ืฉืœื‘ื™ื ื”ื‘ืื™ื (`MIGRATION_MAP.md`).
## ืขืงืจื•ืŸ ืžื ื—ื”
ืชืœื•ืช ื–ื•ืจืžืช ื‘ื›ื™ื•ื•ืŸ ืื—ื“ ื‘ืœื‘ื“:
```
core โ† verticals โ† infra โ† delivery
โ–ฒ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
delivery ื•-infra ืžืฉืชืžืฉื™ื ื‘-core; core ืœื ื™ื•ื“ืข ืขืœ ืืฃ ืื—ื“ ืžื”ื
```
`core/` ืืกื•ืจ ืฉื™ึตื“ืข ืขืœ ืฉื•ื ืฉื›ื‘ื” ืื—ืจืช. ืื ืžืฉื”ื• ื‘โ€‘`core/` ืฆืจื™ืš ืœื™ื™ื‘ื ืžโ€‘`infra/`
ืื• ืžโ€‘`verticals/` โ€” ื”ื•ื ืœื ืฉื™ื™ืš ืœโ€‘`core/`.
## ื”ืฉื›ื‘ื•ืช
### `core/` โ€” ื”ืœื™ื‘ื” ื”ืื ืœื™ื˜ื™ืช โœ… ื”ื•ื’ืจ ื‘-Stage 0
ืžื•ื“ืœ ื”ื ืชื•ื ื™ื ื”ืงื ื•ื ื™ ื•ื”ืžืชืžื˜ื™ืงื” ื”ื“ื˜ืจืžื™ื ื™ืกื˜ื™ืช. stdlib ื‘ืœื‘ื“, ืœืœื I/O, ืœืœื state.
- `events.py` โ€” `CanonicalEvent`
- `state.py` โ€” `EntityState`
- `ontology.py` โ€” `Entity`, `ENTITY_TYPES`
- `signals.py` โ€” ฮ”, ฯˆ, ฮพ, ฮณ, ฮบ, ฮฉ (signal math)
- `drift.py` โ€” `DriftIssue`, `drift_score`, `severity_from_score`
- `decisions.py` โ€” `DecisionItem`, `recommendation_for_issue`
ื–ื• ื”ืฉื›ื‘ื” ื”ื™ื—ื™ื“ื” ืฉื—ื™ื™ื‘ืช ืœื”ื™ื•ืช ืžื›ื•ืกื” ื‘โ€‘100% ื‘ื‘ื“ื™ืงื•ืช correctness ืืžื™ืชื™ื•ืช.
ื”ื™ื•ื: 36 ื‘ื“ื™ืงื•ืช, ื›ื•ืœืœ ื‘ื“ื™ืงืช leadโ€‘time ืื™ื ื˜ื’ืจื˜ื™ื‘ื™ืช (`tests/test_core_integration.py`).
### `verticals/` โ€” adapters ืœืื ื›ื™ื โœ… Stage 1 (logistics)
adapter ืขื•ืฉื” ืขื‘ื•ื“ื” ืื—ืช: ืžืžืคื” ืกื›ืžื” ื’ื•ืœืžื™ืช ืฉืœ ืœืงื•ื— ืœโ€‘canonical events/metrics
ืฉโ€‘`core/` ืžื‘ื™ืŸ. **ืฉื•ื ืœื•ื’ื™ืงื” ืื ืœื™ื˜ื™ืช ื‘โ€‘adapter** โ€” ื”ื•ื ืชืจื’ื•ื ื‘ืœื‘ื“.
`logistics/` ื”ื•ื ื”โ€‘adapter ื”ืจืืฉื•ืŸ (`config.yaml` + `adapter.py`).
`team_drift_detector.py` ื”ื•ื’ืจ ืœื›ืืŸ โ€” detector, ืœื core, superseded ืข"ื™ ื”ืฆื™ื ื•ืจ ื”ื’ื ืจื™.
### `harness/` โ€” harness ืื™ืžื•ืช โœ… Stage 2
ืžื—ื•ืœืœ ืชืจื—ื™ืฉื™ื ืžืชื•ื™ื’ื™ื ื•ืžื•ื“ื“ ืืช ื”ืžื ื•ืข ืžื•ืœ ground truth: precision, recall,
detection delay, leadโ€‘time. ืชืœื•ื™ ื‘โ€‘`core/` ื‘ืœื‘ื“. ื’ื ืฉืขืจ CI ื•ื’ื ื”ื“ืžื• ืฉืœ ื”ืžื•ืฆืจ
(`python -m harness`).
### `infra/` โ€” ืฉื›ื‘ืช ืชืฉืชื™ืช (Stage 3, ื‘ืคืจื•ืกื•ืช)
**3a โœ…** `infra/storage/` โ€” ืื—ืกื•ืŸ: tenants, calibrations, runs (SQLite ื”ื™ื•ื,
ื”โ€‘`Database` ื‘โ€‘`db.py` ื”ื•ื ื”โ€‘seam ืœโ€‘Postgres). `infra/service.py` โ€”
`OrgStateService`, ืฉื›ื‘ืช ื”ืชื–ืžื•ืจ ืฉืžื—ื‘ืจืช `core` ืœโ€‘`storage`.
**3b โœ…** `infra/api/` โ€” shell ื“ืง ืฉืœ HTTP: `handlers.py` (ืœื•ื’ื™ืงื” ื˜ื”ื•ืจื”, ืœืœื
fastapi), `errors.py` (ืžื•ื“ืœ ืฉื’ื™ืื•ืช), `app.py` (ื—ื™ื•ื•ื˜ FastAPI). ื”ืฉืจืฉืจืช:
FastAPI app โ†’ handlers โ†’ OrgStateService โ†’ core+storage.
**3c โœ…** `infra/ingestion/` โ€” `connectors.py` (`Connector` ABC,
`InMemoryConnector`, `CSVFolderConnector`, `build_connector`) +
`scheduler.py` (`Schedule` ื ืฉืžืจ, `is_due`/`due_schedules` ื˜ื”ื•ืจื™ื,
`IngestionService`, `run_scheduler` loop ื“ืง). connector = "ืžืื™ืคื” ื”ื“ืื˜ื”",
ื”โ€‘adapter ืขื“ื™ื™ืŸ ื‘ืขืœ ืžื™ืคื•ื™ ื”ืกื›ืžื”.
**3d โœ…** `infra/deployment/` โ€” `settings.py` (`RuntimeSettings` ืžโ€‘env),
`observability.py` (logging ืžื•ื‘ื ื” JSON), `scheduler_service.py` (entry point
ืฉืœ ื”โ€‘worker). `Dockerfile` + `docker-compose.yml` ื‘ืจืžืช ื”โ€‘repo โ€” api ื•โ€‘scheduler
ื›ืฉื ื™ processes ืขืœ image ืื—ื“ ืฉื—ื•ืœืงื™ื DB ืื—ื“ ื“ืจืš `ORGSTATE_DB_PATH`.
ื ื•ืชืจ: auth/RBAC (`auth_*.py`) ื•โ€‘backend Postgres โ€” ืคืจื•ืกื•ืช ื ืคืจื“ื•ืช ื“ืจืš ื”โ€‘seam.
### `delivery/` โ€” ืคืœื˜ ืžื•ืœ ืœืงื•ื— (Stage 4)
ื“ื•ื— ื ื™ื”ื•ืœื™, ืชื•ืจ ื”ื—ืœื˜ื•ืช, evidence views, ื“ืฉื‘ื•ืจื“ื™ื, branded report builder,
PDF export. ื”ื™ื•ื ื‘โ€‘`legacy/`: `customer_report_builder.py`,
`executive_audit_report_builder.py`, `branded_report_builder_v31.py`,
`*_dashboard*.py`, `evidence_view_builder.py`, `pdf_exporter_v28.py`.
## ื ืชื™ื‘ ื”ื ืชื•ื ื™ื (ื›ืฉื”ืžื‘ื ื” ื™ื•ืฉืœื)
```
ืžืงื•ืจ ื“ืื˜ื” ืฉืœ ืœืงื•ื—
โ†’ verticals/<vertical> (ืžื™ืคื•ื™ ืกื›ืžื” โ†’ CanonicalEvent)
โ†’ core (EntityState โ†’ signals ฮ”ฯˆฮพฮณฮบ โ†’ ฮฉ โ†’ drift_score โ†’ DecisionItem)
โ†’ infra (persist, schedule, serve via API)
โ†’ delivery (executive report, decision queue, evidence view)
```
## ื”ื—ืœื˜ื•ืช ืžื‘ื ื” ืžื•ื“ืขื•ืช
- **`infra/` ื•ืœื `platform/`** โ€” `platform` ืžืฆืœ ืขืœ ืžื•ื“ื•ืœ stdlib ื‘ืฉื ื–ื”.
- **`core/` ืœืœื ืชืœื•ื™ื•ืช** โ€” ื›ื“ื™ ืฉื”ื‘ื“ื™ืงื•ืช ื™ื”ื™ื• ืžื”ื™ืจื•ืช, ื•ืฉืื™ ืืคืฉืจ ื™ื”ื™ื”
"ืœื”ื‘ืจื™ื—" I/O ืื• state ืœืชื•ืš ื”ืœื™ื‘ื”.
- **`legacy/` ื ืฉืืจ ืจืฅ** โ€” ืœื ืžืฉื‘ืจื™ื ื›ืœื•ื. ื›ืœ ืฉืœื‘ ืžื”ื’ืจ ืจื›ื™ื‘, ืžื—ืœื™ืฃ ืืช
ื”โ€‘import, ื•ืžื•ื—ืง ืืช ื”ืžืงื•ืจ ืžโ€‘`legacy/` ืจืง ื›ืฉื”ื‘ื“ื™ืงื•ืช ื™ืจื•ืงื•ืช.