# thecodeforgerhq/msf-reasoning-agent architecture

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

- Interactive diagram: https://gitdiagram.com/thecodeforgerhq/msf-reasoning-agent
- Repository: https://github.com/thecodeforgerhq/msf-reasoning-agent

## Overview

1. **Top-level shape**
   - Athenaeum is a two-tier system: a **Next.js 16 frontend** and a **FastAPI backend**.  
   - The backend can run fully offline, or it can use optional Microsoft/Azure services plus Groq fallbacks.  
   - The main runtime contract is **HTTP + Server-Sent Events**, so the UI receives a live trace of each reasoning turn, not just final text.

2. **Backend core: the reasoning pipeline**
   - The central backend subsystem is `app/agent/`, which implements a **gate → router → answer** pipeline.
   - Every user turn is processed as a typed stream of events, with separate phases for safety gating, intent routing, grounding, planning, and answer streaming.
   - This is the architectural heart of the product: it turns a chat turn into a controlled workflow with visible intermediate states.

3. **Safety boundary**
   - Input safety is enforced before the agent does anything useful.
   - The gate is layered: regex pre-filter, deterministic heuristic checks, Prompt Guard, Azure content safety / RAI checks, and additional output guards during streaming.
   - Safety is treated as a first-class boundary, not a prompt instruction, and the system distinguishes “unsafe” from “unreachable” provider failures.

4. **Routing and multi-intent orchestration**
   - The router maps a turn to focused agent intents such as recommendation, grounded module Q&A, study planning, practice, evaluation, feedback, and progress checks.
   - Compound requests are supported: one message can fan out into an ordered sequence of intents.
   - The orchestrator preserves intent order, re-applies per-link guards, and streams the result back in phases.

5. **Grounding and answer honesty**
   - Answers are grounded against the approved course content using either **Azure AI Search / Foundry IQ** or a deterministic offline lexical retriever.
   - If grounding is weak or missing, the system re-dispatches once with stricter sourcing and adds a disclaimer instead of pretending certainty.
   - This boundary keeps the assistant tied to the repository’s curated learning corpus rather than free-form generation.

6. **Learning domain and content model**
   - The curated learning material lives in `ayanakoji/athenaeum/content/`, organized as a catalog of **verticals → courses → modules**.
   - `catalog/` loads that content and exposes it to the reasoning agents as the canonical course graph.
   - The repo’s design assumes the catalog is authoritative: recommendations, citations, and navigation all depend on it.

7. **Courses, chats, and learner state**
   - The backend models “a chat as a course”: course rows hold the conversation plus staging state.
   - Progress is not stored as a simple flag; it is **derived** from assessments and current course structure.
   - Course-related flows live under `app/courses/` and include chat, practice, assessments, skill checks, feedback, and progression views.

8. **Assessments as a separate bounded system**
   - Authored assessment banks are isolated from learner state in a **separate SQLite database**.
   - The bank files in `ayanakoji/assessments/banks/` are validated against a JSON schema and seeded through backend tooling.
   - Assessment execution includes quiz generation, oral evaluation, grading, and validation logic, with support for Azure Blob mirroring when cloud credentials exist.

9. **Manager Insights boundary**
   - `app/manager/` provides a separate aggregate-only surface for team leads.
   - It consumes only team-level rollups and synthetic Work IQ data, not individual learner details, so the data-flow boundary prevents per-person leakage.
   - The manager UI is guarded and reuses the same safety/trace style as learner chat, but with aggregate snapshots instead of personal learning data.

10. **Work IQ and notifications**
   - `app/workiq/` serves a deterministic, synthetic organizational calendar and work-pattern model used by study planning and manager analytics.
   - `app/notifications/` maintains a background tick that emits reminders, deadlines, streak events, and deduplicated notifications.
   - These are supporting services rather than the main interaction loop, but they feed the planning and engagement surfaces.

11. **Persistence and data boundaries**
   - The repo intentionally separates mutable learner workspace from authored assets:
     - `athenaeum.db` for learner/course state
     - `assessments.db` for authored banks and attempts
   - WAL mode and idempotent schema setup support simple deployment and offline use.
   - The local content corpus, assessment banks, and synthetic Work IQ data are all repo-owned artifacts, which keeps the app deterministic and reproducible.

12. **Frontend architecture**
   - The frontend is a Next.js App Router app with distinct surfaces for login, learner workspace, course chat, module views, assessments, reviews, and the manager dashboard.
   - It parses SSE events into UI components such as traces, practice cards, skill-gate cards, plans, suggestions, and blocked/error states.
   - The UX is built around inspectability: users can see the trace of the agent’s reasoning, not just the final answer.

13. **External services and fallback strategy**
   - Optional cloud dependencies include **Azure OpenAI**, **Azure AI Search**, **Azure AI Evaluation**, **Azure Content Safety**, and **Azure Blob Storage**.
   - Groq provides fallback LLMs and jailbreak classification when configured.
   - The system is designed to degrade to a deterministic offline path when cloud credentials are missing or services are unavailable.

14. **Quality, evaluation, and deployment**
   - The backend includes a substantial `tests/` suite, plus a dedicated red-team / audit harness in `agent_audit/` for live and offline evaluation.
   - CI covers backend checks, frontend checks, Playwright E2E, and secret scanning.
   - Deployment is split: backend on Render, frontend on Vercel, with local PM2 support for running both services together.

15. **What to draw in an architecture diagram**
   - The most important boxes are: **frontend SSE client**, **FastAPI backend**, **agent pipeline**, **content/catalog store**, **assessments store**, **Work IQ/notifications**, and the optional **Azure/Groq cloud column**.
   - The key arrows are:
     - browser → backend via HTTP/SSE
     - backend → catalog/content and databases
     - agent pipeline → grounding/safety/LLM services
     - manager insights → aggregate snapshots only
     - frontend ← streamed trace/events
   - The main architectural boundary is between **curated, deterministic repository data** and **optional cloud inference services**.

Main entry points: [`ayanakoji/backend/app/agent/orchestrator.py`](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/orchestrator.py) (Agent Flow), [`ayanakoji/backend/app/main.py`](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/main.py) (FastAPI App), [`ayanakoji/backend/app/agent/router_agent.py`](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/router_agent.py) (Router), [`ayanakoji/backend/app/agent/grounding.py`](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/grounding.py) (Grounding)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Frontend"]
  node_browser(("Browser<br/>client<br/>[page.tsx]"))
  node_sse_ui["SSE UI<br/>next-app<br/>[pipeline-trace.tsx]"]
  node_learner_shell["Workspace<br/>next-shell"]
  node_manager_ui["Manager UI<br/>next-view"]
  node_api_client["API Client<br/>frontend-api<br/>[api.ts]"]
end

subgraph group_backend["Backend"]
  node_main_api["FastAPI App<br/>api-host<br/>[main.py]"]
  node_agent_flow["Agent Flow<br/>reasoning-pipeline<br/>[orchestrator.py]"]
  node_safety_gate{{"Safety Gate<br/>guardrail<br/>[gate.py]"}}
  node_router_agent["Router<br/>[router_agent.py]"]
  node_grounding[("Grounding<br/>retrieval<br/>[grounding.py]")]
  node_answer_stream["Answer Stream<br/>streaming-response<br/>[answer.py]"]
  node_courses_api["Courses API<br/>learner-state<br/>[router.py]"]
  node_assessments_api["Assessments API<br/>assessment-system<br/>[router.py]"]
  node_catalog_api[("Catalog API<br/>content-index<br/>[router.py]")]
  node_manager_api["Manager API<br/>aggregate-surface<br/>[router.py]"]
  node_workiq_api[("Work IQ<br/>synthetic-data<br/>[router.py]")]
  node_notifications["Notifications<br/>background-service<br/>[background.py]"]
end

subgraph group_content["Repository Data"]
  node_content_store[("Content Corpus<br/>repo-content<br/>[_catalog.json]")]
  node_assessment_banks[("Assessment Banks<br/>repo-data<br/>[bank.schema.json]")]
  node_workiq_data["Work IQ Data<br/>repo-data<br/>[work_iq.json]"]
end

subgraph group_cloud["Optional Cloud"]
  node_azure_services[("Azure Services<br/>optional-cloud<br/>[foundry.py]")]
  node_groq_fallback(("Groq Fallback<br/>optional-llm<br/>[llm.py]"))
end

subgraph group_ops["Ops & Quality"]
  node_audit_suite["Audit Suite<br/>evaluation-harness<br/>[harness.py]"]
  node_tests_suite["Test Suite<br/>verification"]
  node_ci_cd["CI / Deploy<br/>pipeline<br/>[ci.yml]"]
end

node_browser -->|"uses"| node_api_client
node_api_client -->|"http+sse"| node_main_api
node_main_api -->|"streams"| node_sse_ui
node_main_api -->|"turns"| node_agent_flow
node_agent_flow -->|"gates"| node_safety_gate
node_agent_flow -->|"routes"| node_router_agent
node_agent_flow -->|"grounds"| node_grounding
node_agent_flow -->|"streams"| node_answer_stream
node_router_agent -->|"dispatches"| node_courses_api
node_router_agent -->|"dispatches"| node_assessments_api
node_router_agent -->|"dispatches"| node_manager_api
node_courses_api -->|"reads"| node_catalog_api
node_courses_api -->|"uses"| node_content_store
node_assessments_api -->|"reads"| node_assessment_banks
node_manager_api -->|"summaries"| node_workiq_api
node_workiq_api -->|"loads"| node_workiq_data
node_notifications -->|"nudges"| node_courses_api
node_grounding -->|"retrieves"| node_catalog_api
node_grounding -->|"corpus"| node_content_store
node_grounding -.->|"optional"| node_azure_services
node_safety_gate -.->|"checks"| node_azure_services
node_agent_flow -.->|"fallback"| node_groq_fallback
node_assessments_api -.->|"mirror"| node_azure_services
node_audit_suite -->|"evaluates"| node_agent_flow
node_tests_suite -->|"verifies"| node_main_api
node_ci_cd -->|"runs"| node_tests_suite
node_ci_cd -->|"deploys"| node_main_api
node_ci_cd -->|"deploys"| node_learner_shell

click node_browser "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/app/page.tsx"
click node_sse_ui "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/components/chat/pipeline-trace.tsx"
click node_learner_shell "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/components/workspace/workspace-chrome.tsx"
click node_manager_ui "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/components/manager/insights-dashboard.tsx"
click node_api_client "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/lib/api.ts"
click node_main_api "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/main.py"
click node_agent_flow "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/orchestrator.py"
click node_safety_gate "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/gate.py"
click node_router_agent "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/router_agent.py"
click node_grounding "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/grounding.py"
click node_answer_stream "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/answer.py"
click node_courses_api "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/courses/router.py"
click node_assessments_api "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/assessments/router.py"
click node_catalog_api "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/catalog/router.py"
click node_manager_api "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/manager/router.py"
click node_workiq_api "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/workiq/router.py"
click node_notifications "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/notifications/background.py"
click node_content_store "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/athenaeum/content/_catalog.json"
click node_assessment_banks "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/assessments/schema/bank.schema.json"
click node_workiq_data "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/data/work_iq.json"
click node_azure_services "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/foundry.py"
click node_groq_fallback "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/llm.py"
click node_audit_suite "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/agent_audit/harness.py"
click node_tests_suite "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/tests/test_agent_orchestrator.py"
click node_ci_cd "https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/.github/workflows/ci.yml"

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_browser,node_sse_ui,node_learner_shell,node_manager_ui,node_api_client toneBlue
class node_main_api,node_agent_flow,node_safety_gate,node_router_agent,node_grounding,node_answer_stream,node_courses_api,node_assessments_api,node_catalog_api,node_manager_api,node_workiq_api,node_notifications toneAmber
class node_content_store,node_assessment_banks,node_workiq_data toneMint
class node_azure_services,node_groq_fallback toneRose
class node_audit_suite,node_tests_suite,node_ci_cd toneIndigo
```

## Components

### Frontend

Next.js App Router UI with SSE-driven learner and manager experiences

- [Browser](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/app/page.tsx): client · Learner and manager entry point · `ayanakoji/frontend/src/app/page.tsx`
- [SSE UI](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/components/chat/pipeline-trace.tsx): next-app · Streams reasoning traces into chat, practice, and manager views · `ayanakoji/frontend/src/components/chat/pipeline-trace.tsx`
- [Workspace](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/components/workspace/workspace-chrome.tsx): next-shell · Learner workspace, navigation, and course surfaces · `ayanakoji/frontend/src/components/workspace/workspace-chrome.tsx`
- [Manager UI](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/components/manager/insights-dashboard.tsx): next-view · Aggregate insights and guarded manager workspace · `ayanakoji/frontend/src/components/manager/insights-dashboard.tsx`
- [API Client](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/frontend/src/lib/api.ts): frontend-api · Fetches backend data and opens chat/manager flows · `ayanakoji/frontend/src/lib/api.ts`

### Backend

FastAPI services, agent pipeline, courses, assessments, and supporting APIs

- [FastAPI App](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/main.py): api-host · Backend entrypoint and route assembly · `ayanakoji/backend/app/main.py`
- [Agent Flow](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/orchestrator.py): reasoning-pipeline · Gate → router → grounding → answer streaming pipeline · `ayanakoji/backend/app/agent/orchestrator.py`
- [Safety Gate](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/gate.py): guardrail · Input filtering and policy checks before agent work · `ayanakoji/backend/app/agent/gate.py`
- [Router](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/router_agent.py): intent-router · Maps turns to ordered intents and fan-out workflows · `ayanakoji/backend/app/agent/router_agent.py`
- [Grounding](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/grounding.py): retrieval · Approved-corpus retrieval and citation verification · `ayanakoji/backend/app/agent/grounding.py`
- [Answer Stream](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/answer.py): streaming-response · Streams final responses and trace events back to the UI · `ayanakoji/backend/app/agent/answer.py`
- [Courses API](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/courses/router.py): learner-state · Chat, practice, assessments, skill checks, and feedback flows · `ayanakoji/backend/app/courses/router.py`
- [Assessments API](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/assessments/router.py): assessment-system · Authored assessment banks, grading, validation, and seed flows · `ayanakoji/backend/app/assessments/router.py`
- [Catalog API](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/catalog/router.py): content-index · Loads authoritative course graph and content metadata · `ayanakoji/backend/app/catalog/router.py`
- [Manager API](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/manager/router.py): aggregate-surface · Team-level rollups and synthetic insights only · `ayanakoji/backend/app/manager/router.py`
- [Work IQ](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/workiq/router.py): synthetic-data · Deterministic organizational calendar and work-pattern model · `ayanakoji/backend/app/workiq/router.py`
- [Notifications](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/notifications/background.py): background-service · Reminder, deadline, and streak notification loop · `ayanakoji/backend/app/notifications/background.py`

### Repository Data

Curated course content, assessment banks, and synthetic work data

- [Content Corpus](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/athenaeum/content/_catalog.json): repo-content · Verticals, courses, and modules used as authoritative learning material · `ayanakoji/athenaeum/content/_catalog.json`
- [Assessment Banks](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/assessments/schema/bank.schema.json): repo-data · Validated authored assessment banks and attempts · `ayanakoji/assessments/schema/bank.schema.json`
- [Work IQ Data](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/data/work_iq.json): repo-data · Synthetic work-pattern source data for planning and analytics · `ayanakoji/backend/app/data/work_iq.json`

### Optional Cloud

External inference, safety, search, and storage services used when configured

- [Azure Services](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/foundry.py): optional-cloud · OpenAI, Search, Safety, Foundry IQ, Evaluation, and Blob Storage · `ayanakoji/backend/app/foundry.py`
- [Groq Fallback](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/app/agent/llm.py): optional-llm · Fallback LLM and jailbreak classification when configured · `ayanakoji/backend/app/agent/llm.py`

### Ops & Quality

Tests, audit harnesses, and deployment/CI surfaces

- [Audit Suite](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/agent_audit/harness.py): evaluation-harness · Offline and live red-team evaluation harness · `ayanakoji/backend/agent_audit/harness.py`
- [Test Suite](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/ayanakoji/backend/tests/test_agent_orchestrator.py): verification · Backend and frontend checks, including E2E coverage · `ayanakoji/backend/tests/test_agent_orchestrator.py`
- [CI / Deploy](https://github.com/thecodeforgerhq/msf-reasoning-agent/blob/main/.github/workflows/ci.yml): pipeline · GitHub Actions, Render, Vercel, and local process orchestration · `.github/workflows/ci.yml`

## Connections

- Browser → API Client: uses · UI invokes backend APIs and chat routes
- API Client → FastAPI App: http+sse · Client reaches FastAPI over HTTP and Server-Sent Events
- FastAPI App → SSE UI: streams · Backend emits trace and answer events for live rendering
- FastAPI App → Agent Flow: turns · Chat turns enter the controlled reasoning pipeline
- Agent Flow → Safety Gate: gates · Every turn is filtered before other work begins
- Agent Flow → Router: routes · Intent selection and ordered orchestration
- Agent Flow → Grounding: grounds · Retrieval and citation verification against approved content
- Agent Flow → Answer Stream: streams · Final response and intermediate events are streamed out
- Router → Courses API: dispatches · Course chat, practice, study plans, and skill checks
- Router → Assessments API: dispatches · Assessment generation, grading, and review flows
- Router → Manager API: dispatches · Manager-intent requests go to aggregate-only views
- Courses API → Catalog API: reads · Course flows depend on canonical course and module metadata
- Courses API → Content Corpus: uses · Learner navigation and recommendations rely on curated corpus
- Assessments API → Assessment Banks: reads · Banks are validated and loaded from authored artifacts
- Manager API → Work IQ: summaries · Manager insights use team-level and synthetic work data
- Work IQ → Work IQ Data: loads · Deterministic synthetic organizational source data
- Notifications → Courses API: nudges · Background reminders and streak events support learner flow
- Grounding → Catalog API: retrieves · Content graph is the canonical grounding source
- Grounding → Content Corpus: corpus · Offline lexical retrieval from repo-owned content
- Grounding → Azure Services: optional · Azure AI Search / Foundry IQ can replace or augment offline retrieval
- Safety Gate → Azure Services: checks · Azure content safety and RAI checks when configured
- Agent Flow → Groq Fallback: fallback · Fallback LLM and classification path when cloud services are unavailable
- Assessments API → Azure Services: mirror · Assessment artifacts can mirror to Azure Blob storage
- Audit Suite → Agent Flow: evaluates · Red-team and live audits exercise the agent pipeline
- Test Suite → FastAPI App: verifies · Automated tests cover backend contracts and behavior
- CI / Deploy → Test Suite: runs · CI executes backend, frontend, E2E, and scanning checks
- CI / Deploy → FastAPI App: deploys · Backend deployment target and runtime packaging
- CI / Deploy → Workspace: deploys · Frontend deployment target and app delivery
