# justinscitech/astrarisk architecture

> Architecture diagram of the GitHub repository justinscitech/astrarisk, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/justinscitech/astrarisk
- Repository: https://github.com/justinscitech/astrarisk

## Overview

Astra Risk is a human-reviewed commercial-property underwriting workspace, with a separate Federato triage queue and a public tenant/auto quoting assistant. The main case journey is submission intake, queued analysis and evidence gathering, broker follow-up when information is missing, then underwriter review and decision. The README documents these capabilities and the worker/storage roles; sampled routes confirm intake, queueing, source confirmation, and action handling. Some worker internals and UI wiring are not shown in the excerpts, so uncertain links are omitted.

Main entry points: [`src/app/api/cases/route.ts`](https://github.com/justinscitech/astrarisk/blob/main/src/app/api/cases/route.ts) (Case intake API), [`src/app/api/quote/route.ts`](https://github.com/justinscitech/astrarisk/blob/main/src/app/api/quote/route.ts) (Quote API), [`src/app/api/cases/[id]/actions/route.ts`](https://github.com/justinscitech/astrarisk/blob/main/src/app/api/cases/%5Bid%5D/actions/route.ts) (Case actions API), [`src/agent/jobs.ts`](https://github.com/justinscitech/astrarisk/blob/main/src/agent/jobs.ts) (Durable job queue)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workspace["Underwriting workspace"]
  node_workspace_ui["Case workspace<br/>[page.tsx]"]
  node_case_api["Case intake API<br/>[route.ts]"]
  node_case_actions["Case actions API<br/>[route.ts]"]
  node_source_api["Source confirmation API<br/>[route.ts]"]
end

subgraph group_agent["Case review agent"]
  node_case_analysis["Analysis and appetite<br/>[analysis.ts]"]
  node_extract_model["Fact extraction<br/>[model.ts]"]
  node_context["Property evidence<br/>[context-sources.ts]"]
  node_source_discovery["Source discovery"]
  node_activities["Case activities<br/>[activities.ts]"]
  node_job_queue["Durable job queue<br/>[jobs.ts]"]
  node_worker["Agent worker<br/>[worker.ts]"]
end

subgraph group_triage["Federato triage"]
  node_triage_ui["Triage queue<br/>[page.tsx]"]
  node_triage_api["Triage API<br/>[route.ts]"]
  node_federato_triage["Federato planner<br/>[triage.ts]"]
end

subgraph group_quote["Quoting assistant"]
  node_quote_page["Quote page<br/>[page.tsx]"]
  node_quote_api["Quote API<br/>[route.ts]"]
  node_quote_intake["Quote intake<br/>[intake.ts]"]
  node_quote_rating["Quote rating<br/>[rating.ts]"]
end

subgraph group_data["Persistence and integrations"]
  node_postgres[("PostgreSQL<br/>[db.ts]")]
  node_mongo[("MongoDB documents<br/>[mongo.ts]")]
  node_quote_store[("Quote records<br/>[quotes.ts]")]
end

node_underwriter(("Underwriter"))
node_broker(("Broker"))
node_federato{{"Federato service"}}
node_public_sources{{"Public property sources"}}
node_brokerbase{{"Browserbase"}}
node_ai_models{{"Optional AI models"}}

node_broker -->|"submits case"| node_case_api
node_case_api -->|"stores submission text"| node_mongo
node_case_api -->|"creates case and job"| node_postgres
node_case_api -->|"enqueues analysis"| node_job_queue
node_job_queue -->|"provides jobs"| node_worker
node_worker -->|"runs activities"| node_activities
node_activities -->|"analyzes case"| node_case_analysis
node_case_analysis -->|"extracts facts"| node_extract_model
node_extract_model -.->|"optionally consults"| node_ai_models
node_case_analysis -->|"gathers property evidence"| node_context
node_context -->|"queries records"| node_public_sources
node_source_api -->|"validates selection"| node_source_discovery
node_source_api -->|"records source and research job"| node_postgres
node_source_api -->|"enqueues research"| node_job_queue
node_source_discovery -.->|"optionally searches pages"| node_brokerbase
node_case_actions -->|"records action and job"| node_postgres
node_case_actions -->|"stores broker response"| node_mongo
node_case_actions -->|"enqueues follow-up or decision"| node_job_queue
node_workspace_ui -->|"loads and submits cases"| node_case_api
node_workspace_ui -->|"sends review actions"| node_case_actions
node_underwriter -->|"reviews case"| node_workspace_ui
node_broker -->|"answers questions"| node_case_actions
node_triage_ui -->|"loads or runs queue"| node_triage_api
node_triage_api -->|"runs triage"| node_federato_triage
node_triage_api -->|"reads and saves report"| node_postgres
node_federato_triage -->|"queries submissions"| node_federato
node_triage_ui -->|"opens row as case"| node_case_api
node_quote_page -->|"requests estimate"| node_quote_api
node_quote_api -->|"parses request"| node_quote_intake
node_quote_api -->|"calculates estimate"| node_quote_rating
node_quote_api -.->|"optionally enriches facts"| node_ai_models
node_quote_api -->|"saves conversation facts"| node_quote_store
node_quote_page -->|"advisor views referrals"| node_underwriter

click node_workspace_ui "https://github.com/justinscitech/astrarisk/blob/main/src/app/(app)/cases/%5Bid%5D/page.tsx"
click node_case_api "https://github.com/justinscitech/astrarisk/blob/main/src/app/api/cases/route.ts"
click node_case_actions "https://github.com/justinscitech/astrarisk/blob/main/src/app/api/cases/%5Bid%5D/actions/route.ts"
click node_source_api "https://github.com/justinscitech/astrarisk/blob/main/src/app/api/cases/%5Bid%5D/source/route.ts"
click node_case_analysis "https://github.com/justinscitech/astrarisk/blob/main/src/agent/analysis.ts"
click node_extract_model "https://github.com/justinscitech/astrarisk/blob/main/src/agent/model.ts"
click node_context "https://github.com/justinscitech/astrarisk/blob/main/src/agent/context-sources.ts"
click node_source_discovery "https://github.com/justinscitech/astrarisk/blob/main/src/agent/source-discovery.ts"
click node_activities "https://github.com/justinscitech/astrarisk/blob/main/src/agent/activities.ts"
click node_job_queue "https://github.com/justinscitech/astrarisk/blob/main/src/agent/jobs.ts"
click node_worker "https://github.com/justinscitech/astrarisk/blob/main/src/agent/worker.ts"
click node_triage_ui "https://github.com/justinscitech/astrarisk/blob/main/src/app/(app)/triage/page.tsx"
click node_triage_api "https://github.com/justinscitech/astrarisk/blob/main/src/app/api/triage/route.ts"
click node_federato_triage "https://github.com/justinscitech/astrarisk/blob/main/src/federato/triage.ts"
click node_quote_page "https://github.com/justinscitech/astrarisk/blob/main/src/app/(site)/quote/page.tsx"
click node_quote_api "https://github.com/justinscitech/astrarisk/blob/main/src/app/api/quote/route.ts"
click node_quote_intake "https://github.com/justinscitech/astrarisk/blob/main/src/quote/intake.ts"
click node_quote_rating "https://github.com/justinscitech/astrarisk/blob/main/src/quote/rating.ts"
click node_postgres "https://github.com/justinscitech/astrarisk/blob/main/src/lib/db.ts"
click node_mongo "https://github.com/justinscitech/astrarisk/blob/main/src/lib/mongo.ts"
click node_quote_store "https://github.com/justinscitech/astrarisk/blob/main/src/lib/quotes.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_workspace_ui,node_case_api,node_case_actions,node_source_api,node_brokerbase toneBlue
class node_case_analysis,node_extract_model,node_context,node_source_discovery,node_activities,node_job_queue,node_worker toneAmber
class node_triage_ui,node_triage_api,node_federato_triage toneMint
class node_quote_page,node_quote_api,node_quote_intake,node_quote_rating toneRose
class node_postgres,node_mongo,node_quote_store,node_underwriter,node_broker,node_federato,node_public_sources,node_ai_models toneIndigo
```

## Components

### Underwriting workspace

- [Case workspace](https://github.com/justinscitech/astrarisk/blob/main/src/app/(app)/cases/%5Bid%5D/page.tsx): `src/app/(app)/cases/[id]/page.tsx`
- [Case intake API](https://github.com/justinscitech/astrarisk/blob/main/src/app/api/cases/route.ts): `src/app/api/cases/route.ts`
- [Case actions API](https://github.com/justinscitech/astrarisk/blob/main/src/app/api/cases/%5Bid%5D/actions/route.ts): `src/app/api/cases/[id]/actions/route.ts`
- [Source confirmation API](https://github.com/justinscitech/astrarisk/blob/main/src/app/api/cases/%5Bid%5D/source/route.ts): `src/app/api/cases/[id]/source/route.ts`

### Case review agent

- [Analysis and appetite](https://github.com/justinscitech/astrarisk/blob/main/src/agent/analysis.ts): `src/agent/analysis.ts`
- [Fact extraction](https://github.com/justinscitech/astrarisk/blob/main/src/agent/model.ts): `src/agent/model.ts`
- [Property evidence](https://github.com/justinscitech/astrarisk/blob/main/src/agent/context-sources.ts): `src/agent/context-sources.ts`
- [Source discovery](https://github.com/justinscitech/astrarisk/blob/main/src/agent/source-discovery.ts): `src/agent/source-discovery.ts`
- [Case activities](https://github.com/justinscitech/astrarisk/blob/main/src/agent/activities.ts): `src/agent/activities.ts`
- [Durable job queue](https://github.com/justinscitech/astrarisk/blob/main/src/agent/jobs.ts): `src/agent/jobs.ts`
- [Agent worker](https://github.com/justinscitech/astrarisk/blob/main/src/agent/worker.ts): `src/agent/worker.ts`

### Federato triage

- [Triage queue](https://github.com/justinscitech/astrarisk/blob/main/src/app/(app)/triage/page.tsx): `src/app/(app)/triage/page.tsx`
- [Triage API](https://github.com/justinscitech/astrarisk/blob/main/src/app/api/triage/route.ts): `src/app/api/triage/route.ts`
- [Federato planner](https://github.com/justinscitech/astrarisk/blob/main/src/federato/triage.ts): `src/federato/triage.ts`

### Quoting assistant

- [Quote page](https://github.com/justinscitech/astrarisk/blob/main/src/app/(site)/quote/page.tsx): `src/app/(site)/quote/page.tsx`
- [Quote API](https://github.com/justinscitech/astrarisk/blob/main/src/app/api/quote/route.ts): `src/app/api/quote/route.ts`
- [Quote intake](https://github.com/justinscitech/astrarisk/blob/main/src/quote/intake.ts): `src/quote/intake.ts`
- [Quote rating](https://github.com/justinscitech/astrarisk/blob/main/src/quote/rating.ts): `src/quote/rating.ts`

### Persistence and integrations

- [PostgreSQL](https://github.com/justinscitech/astrarisk/blob/main/src/lib/db.ts): `src/lib/db.ts`
- [MongoDB documents](https://github.com/justinscitech/astrarisk/blob/main/src/lib/mongo.ts): `src/lib/mongo.ts`
- [Quote records](https://github.com/justinscitech/astrarisk/blob/main/src/lib/quotes.ts): `src/lib/quotes.ts`

### Other components

- **Underwriter**
- **Broker**
- **Federato service**
- **Public property sources**
- **Browserbase**
- **Optional AI models**

## Connections

- Broker → Case intake API: submits case
- Case intake API → MongoDB documents: stores submission text
- Case intake API → PostgreSQL: creates case and job
- Case intake API → Durable job queue: enqueues analysis
- Durable job queue → Agent worker: provides jobs
- Agent worker → Case activities: runs activities
- Case activities → Analysis and appetite: analyzes case
- Analysis and appetite → Fact extraction: extracts facts
- Fact extraction → Optional AI models: optionally consults
- Analysis and appetite → Property evidence: gathers property evidence
- Property evidence → Public property sources: queries records
- Source confirmation API → Source discovery: validates selection
- Source confirmation API → PostgreSQL: records source and research job
- Source confirmation API → Durable job queue: enqueues research
- Source discovery → Browserbase: optionally searches pages
- Case actions API → PostgreSQL: records action and job
- Case actions API → MongoDB documents: stores broker response
- Case actions API → Durable job queue: enqueues follow-up or decision
- Case workspace → Case intake API: loads and submits cases
- Case workspace → Case actions API: sends review actions
- Underwriter → Case workspace: reviews case
- Broker → Case actions API: answers questions
- Triage queue → Triage API: loads or runs queue
- Triage API → Federato planner: runs triage
- Triage API → PostgreSQL: reads and saves report
- Federato planner → Federato service: queries submissions
- Triage queue → Case intake API: opens row as case
- Quote page → Quote API: requests estimate
- Quote API → Quote intake: parses request
- Quote API → Quote rating: calculates estimate
- Quote API → Optional AI models: optionally enriches facts
- Quote API → Quote records: saves conversation facts
- Quote page → Underwriter: advisor views referrals
