Skip to content

Instantly share code, notes, and snippets.

@jedjohan
Last active August 21, 2025 19:00
Show Gist options
  • Save jedjohan/1058909f6b00ae85a813b6d580a61c20 to your computer and use it in GitHub Desktop.
Save jedjohan/1058909f6b00ae85a813b6d580a61c20 to your computer and use it in GitHub Desktop.

Revisions

  1. jedjohan revised this gist Aug 21, 2025. 1 changed file with 51 additions and 5 deletions.
    56 changes: 51 additions & 5 deletions platform.drawio
    Original file line number Diff line number Diff line change
    @@ -36,22 +36,22 @@
    <mxCell id="1" parent="0" />

    <!-- User Layer -->
    <mxCell id="users" value="πŸ‘₯ Users&#xa;Technical Writers&#xa;Content Teams&#xa;Reviewers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E1F5FE;strokeColor=#0277BD;strokeWidth=2;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxCell id="users" value="πŸ‘₯ Users&#xa;Technical Writers&#xa;Content Teams&#xa;Reviewers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E1F5FE;strokeColor=#0277BD;strokeWidth=2;fontSize=11;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="40" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- Frontend Layer -->
    <mxCell id="frontend" value="🌐 Frontend Application&#xa;Collaborative Document Editor&#xa;Review &amp; Approval Interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E1F5FE;strokeColor=#0277BD;strokeWidth=2;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxCell id="frontend" value="🌐 Frontend Application&#xa;Collaborative Document Editor&#xa;Review &amp; Approval Interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E1F5FE;strokeColor=#0277BD;strokeWidth=2;fontSize=11;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="160" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- API Gateway -->
    <mxCell id="gateway" value="πŸ” API Gateway&#xa;Authentication &amp; Authorization&#xa;Rate Limiting &amp; Routing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFEBEE;strokeColor=#D32F2F;strokeWidth=2;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxCell id="gateway" value="πŸ” API Gateway&#xa;Authentication &amp; Authorization&#xa;Rate Limiting &amp; Routing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFEBEE;strokeColor=#D32F2F;strokeWidth=2;fontSize=11;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="280" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- Platform API -->
    <mxCell id="api" value="πŸ“„ Platform API&#xa;Document Lifecycle Management&#xa;Slim Endpoints β†’ Service Delegation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#7B1FA2;strokeWidth=2;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxCell id="api" value="πŸ“„ Platform API&#xa;Document Lifecycle Management&#xa;Slim Endpoints β†’ Service Delegation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#7B1FA2;strokeWidth=2;fontSize=11;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="400" width="200" height="80" as="geometry" />
    </mxCell>

    @@ -333,7 +333,53 @@
    </mxCell>
    <!-- Queue for Async Processing (ADR-007) -->
    <mxCell id="queue_res" value="οΏ½ Queue (Service Bus / Storage)&#xa;Document Events&#xa;Async Triggers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxCell id="queue_res" value="πŸ“¨ Queue (Service Bus / Storage)&#xa;Document Events&#xa;Async Triggers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <!-- Queue for Async Processing (ADR-007) -->
    <mxCell id="queue_res" value="πŸ“¨ Queue (Service Bus / Storage)&#xa;Document Events&#xa;Async Triggers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="840" y="500" width="140" height="80" as="geometry" />
    </mxCell>
    <!-- Transformer / Processor -->
    <mxCell id="transform_res" value="🧩 Transformer Service&#xa;AST + Enrichment&#xa;Background Processing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="780" y="740" width="170" height="80" as="geometry" />
    </mxCell>
    <!-- AI Agent Orchestrator -->
    <mxCell id="ai_agent_res" value="πŸ€– AI Agent Orchestrator&#xa;Agent Scenarios&#xa;Semantic Actions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="420" y="740" width="170" height="80" as="geometry" />
    </mxCell>
    <!-- Audit Logs -->
    <mxCell id="audit_logs_res" value="πŸ“ Audit Logs&#xa;Centralized Events&#xa;User Correlation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="240" y="740" width="160" height="80" as="geometry" />
    </mxCell>
    <!-- Metadata vs Versions -->
    <mxCell id="metadata_split_res" value="πŸ“„ Metadata vs Versions&#xa;Mutable / Immutable" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="40" y="740" width="180" height="80" as="geometry" />
    </mxCell>

    <!-- ADR Badges (Azure Resources Diagram) -->
    <mxCell id="badge_aiagent_res_014" value="ADR-014" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#388E3C;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="590" y="732" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_audit_res_010" value="ADR-010" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#F57C00;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="300" y="732" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_metadata_res_012" value="ADR-012" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#F57C00;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="100" y="732" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_transform_res_006" value="ADR-006" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#388E3C;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="890" y="732" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_queue_res_007" value="ADR-007" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#388E3C;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="840" y="492" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_search_res_011" value="ADR-011" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#388E3C;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="660" y="492" width="60" height="18" as="geometry" />
    </mxCell>

    <!-- Legend (Azure Resources) -->
    <mxCell id="legend_azure" value="LEGEND\nColors & meanings align with logical view.\nSolid Edge = Sync Call; Dashed = Async / External / Audit.\nBadges ADR-### map to docs/adr records for rationale." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#424242;strokeWidth=1;fontSize=9" vertex="1" parent="1">
    <mxGeometry x="960" y="40" width="180" height="140" as="geometry" />
    </mxCell>

    <!-- Connections -->
    </mxCell>
    <!-- Transformer / Processor -->
    <mxCell id="transform_res" value="🧩 Transformer Service&#xa;AST + Enrichment&#xa;Background Processing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
  2. jedjohan revised this gist Aug 21, 2025. 1 changed file with 152 additions and 22 deletions.
    174 changes: 152 additions & 22 deletions platform.drawio
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,34 @@
    <?xml version="1.0" encoding="UTF-8"?>
    <mxfile host="app.diagrams.net" modified="2025-08-21T18:00:00.000Z" agent="Platform Architecture Template" etag="template" version="24.6.4" type="device">
    <mxfile host="app.diagrams.net" modified="2025-08-21T18:00:00.000Z" agent="Platform Archit <mxCell id="metadata_split" value="πŸ“„ Metadata vs Versions&#xa;Mutable Current State&#xa;Immutable History" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="870" y="850" width="170" height="60" as="geometry" />
    </mxCell>
    <!-- ADR Badges (Logical Diagram) -->
    <mxCell id="badge_async_007" value="ADR-007" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#388E3C;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="890" y="820" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_transform_006" value="ADR-006" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#388E3C;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="300" y="832" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_aiagent_014" value="ADR-014" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#388E3C;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="490" y="832" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_audit_010" value="ADR-010" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#F57C00;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="680" y="832" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_metadata_012" value="ADR-012" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#F57C00;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="870" y="832" width="60" height="18" as="geometry" />
    </mxCell>
    <mxCell id="badge_search_011" value="ADR-011" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#388E3C;fontSize=9;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="760" y="552" width="60" height="18" as="geometry" />
    </mxCell>
    <!-- Legend (Logical) -->
    <mxCell id="legend_logical" value="LEGEND\nColors:\nBlue = User / Frontend\nPink/Red = Security & Gateway\nPurple = Core API Layer\nGreen = Domain / Processing Services\nOrange = Platform / Integration / Audit\nOlive/Light Green = DevOps / Infra\nPink (Alt) = AI & Observability\n\nEdges:\nSolid = Synchronous Call\nDashed = Async / External / Audit\n\nBadges:\nADR-### = Architecture Decision Record" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#424242;strokeWidth=1;fontSize=9" vertex="1" parent="1">
    <mxGeometry x="40" y="40" width="200" height="260" as="geometry" />
    </mxCell>
    <!-- Connections -->e Template" etag="template" version="24.6.4" type="device">
    <diagram name="Logisk Arkitektur" id="logisk">
    <mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
    <root>
    @@ -27,60 +56,60 @@
    </mxCell>

    <!-- Domain Services -->
    <mxCell id="services_container" value="πŸ’Ό Domain Services" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=3;fontSize=14;fontStyle=1;verticalAlign=top;spacingTop=10" vertex="1" parent="1">
    <mxCell id="services_container" value="πŸ’Ό Domain Services" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=3;fontSize=11;fontStyle=1;verticalAlign=top;spacingTop=10;shadow=1" vertex="1" parent="1">
    <mxGeometry x="120" y="520" width="840" height="120" as="geometry" />
    </mxCell>

    <mxCell id="doc_service" value="πŸ“ Document Service&#xa;CRUD Operations&#xa;Validation &amp; Mapping" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="doc_service" value="πŸ“ Document Service&#xa;CRUD Operations&#xa;Validation &amp; Mapping" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="140" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="version_service" value="πŸ”„ Versioning Service&#xa;Git-based Version Control&#xa;Change Tracking" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="version_service" value="πŸ”„ Versioning Service&#xa;Git-based Version Control&#xa;Change Tracking" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="280" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="collab_service" value="πŸ‘₯ Collaboration Service&#xa;Comments &amp; Reviews&#xa;Real-time Updates" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="collab_service" value="πŸ‘₯ Collaboration Service&#xa;Comments &amp; Reviews&#xa;Real-time Updates" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="420" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="approval_service" value="βœ… Approval Service&#xa;Workflow Management&#xa;Review Processes" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="approval_service" value="βœ… Approval Service&#xa;Workflow Management&#xa;Review Processes" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="560" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="search_service" value="πŸ” Search Service&#xa;Hybrid Vector + Text Search&#xa;AI-powered Semantic Search" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="search_service" value="πŸ” Search Service&#xa;Hybrid Vector + Text Search&#xa;AI-powered Semantic Search" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="700" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="locale_service" value="🌍 Localization Service&#xa;Multi-language Support&#xa;Translation Workflows" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="locale_service" value="🌍 Localization Service&#xa;Multi-language Support&#xa;Translation Workflows" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="840" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <!-- Azure Services -->
    <mxCell id="azure_container" value="☁️ Azure Services Integration" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=3;fontSize=14;fontStyle=1;verticalAlign=top;spacingTop=10" vertex="1" parent="1">
    <mxCell id="azure_container" value="☁️ Azure Services Integration" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=3;fontSize=11;fontStyle=1;verticalAlign=top;spacingTop=10;shadow=1" vertex="1" parent="1">
    <mxGeometry x="120" y="680" width="840" height="120" as="geometry" />
    </mxCell>

    <mxCell id="azure_devops" value="πŸ“‚ Azure DevOps&#xa;Git Repository&#xa;Raw Document Storage&#xa;Version History" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="azure_devops" value="πŸ“‚ Azure DevOps&#xa;Git Repository&#xa;Raw Document Storage&#xa;Version History" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="140" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="cosmos_db" value="πŸ—„οΈ Cosmos DB&#xa;Document Metadata&#xa;Comments &amp; Approvals&#xa;Search Index Data" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="cosmos_db" value="πŸ—„οΈ Cosmos DB&#xa;Document Metadata&#xa;Comments &amp; Approvals&#xa;Search Index Data" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="280" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="ai_search" value="πŸ” Azure AI Search&#xa;Vector + Text Search&#xa;Semantic Ranking&#xa;Hybrid Queries" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="ai_search" value="πŸ” Azure AI Search&#xa;Vector + Text Search&#xa;Semantic Ranking&#xa;Hybrid Queries" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="420" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="openai" value="πŸ€– Azure OpenAI&#xa;Embeddings Generation&#xa;Text-to-Vector&#xa;AI Content Analysis" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="openai" value="πŸ€– Azure OpenAI&#xa;Embeddings Generation&#xa;Text-to-Vector&#xa;AI Content Analysis" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="560" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="blob_storage" value="πŸ“¦ Azure Blob Storage&#xa;AST Document Trees&#xa;Binary Content&#xa;Search Artifacts" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="blob_storage" value="πŸ“¦ Azure Blob Storage&#xa;AST Document Trees&#xa;Binary Content&#xa;Search Artifacts" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="700" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="app_config" value="βš™οΈ Azure App Configuration&#xa;Environment Settings&#xa;Feature Flags&#xa;Multi-tenant Config" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxCell id="app_config" value="βš™οΈ Azure App Configuration&#xa;Environment Settings&#xa;Feature Flags&#xa;Multi-tenant Config" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="840" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    @@ -89,8 +118,47 @@
    <mxGeometry x="40" y="280" width="140" height="80" as="geometry" />
    </mxCell>

    <mxCell id="github" value="πŸ”— GitHub Actions&#xa;CI/CD Pipelines&#xa;Automated Testing&#xa;Deployment Automation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F1F8E9;strokeColor=#689F38;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="1000" y="400" width="140" height="80" as="geometry" />
    <!-- Azure DevOps Pipelines (Replacing prior GitHub CI/CD) -->
    <mxCell id="azdo_pipelines" value="πŸ“‚ Azure DevOps Pipelines&#xa;Build / Test / Deploy&#xa;Boards &amp; Repos&#xa;Artifact Publishing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F1F8E9;strokeColor=#689F38;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="1000" y="400" width="160" height="90" as="geometry" />
    </mxCell>

    <!-- Async Processing (ADR-007) -->
    <mxCell id="async_container" value="οΏ½ Async Processing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=3;fontSize=12;fontStyle=1;verticalAlign=top;spacingTop=8" vertex="1" parent="1">
    <!-- Async Processing (ADR-007) -->
    <mxCell id="async_container" value="πŸ”„ Async Processing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=3;fontSize=11;fontStyle=1;verticalAlign=top;spacingTop=8;shadow=1" vertex="1" parent="1">
    <mxGeometry x="120" y="820" width="840" height="120" as="geometry" />
    </mxCell>
    <mxCell id="queue_service" value="πŸ“¨ Queue&#xa;Document Events&#xa;Transformation Triggers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="140" y="850" width="140" height="60" as="geometry" />
    </mxCell>
    <mxCell id="transform_service" value="🧩 Transformer Service&#xa;JSON AST Generation&#xa;AI Enrichment" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="300" y="850" width="170" height="60" as="geometry" />
    </mxCell>
    <mxCell id="ai_agent" value="πŸ€– AI Agent Orchestrator&#xa;Agent Scenarios&#xa;Semantic Actions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="490" y="850" width="170" height="60" as="geometry" />
    </mxCell>
    <mxCell id="audit_logs" value="πŸ“ Audit Logs&#xa;Centralized Actions&#xa;User Context &amp; Correlation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="680" y="850" width="170" height="60" as="geometry" />
    </mxCell>
    <mxCell id="metadata_split" value="πŸ“„ Metadata vs Versions&#xa;Mutable Current State&#xa;Immutable History" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="870" y="850" width="170" height="60" as="geometry" />
    </mxCell>
    </mxCell>
    <mxCell id="queue_service" value="πŸ“¨ Queue&#xa;Document Events&#xa;Transformation Triggers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="140" y="850" width="140" height="60" as="geometry" />
    </mxCell>
    <mxCell id="transform_service" value="🧩 Transformer Service&#xa;JSON AST Generation (ADR-006)&#xa;AI Enrichment" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="300" y="850" width="170" height="60" as="geometry" />
    </mxCell>
    <mxCell id="ai_agent" value="πŸ€– AI Agent Orchestrator&#xa;Agent Scenarios (ADR-014)&#xa;Semantic Actions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="490" y="850" width="170" height="60" as="geometry" />
    </mxCell>
    <mxCell id="audit_logs" value="πŸ“ Audit Logs (ADR-010)&#xa;Centralized Actions&#xa;User Context &amp; Correlation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="680" y="850" width="170" height="60" as="geometry" />
    </mxCell>
    <mxCell id="metadata_split" value="πŸ“„ Metadata vs Versions (ADR-012)&#xa;Mutable Current State&#xa;Immutable History" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="870" y="850" width="170" height="60" as="geometry" />
    </mxCell>

    <!-- Connections -->
    @@ -133,7 +201,29 @@
    </mxCell>

    <!-- External integrations -->
    <mxCell id="api_to_github" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#689F38;dashed=1" source="api" target="github" edge="1" parent="1">
    <mxCell id="api_to_pipeline" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#689F38;dashed=1" source="api" target="azdo_pipelines" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <!-- Async edges -->
    <mxCell id="api_to_queue" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#388E3C;dashed=1" source="api" target="queue_service" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="queue_to_transform" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#388E3C" source="queue_service" target="transform_service" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="transform_to_aiagent" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#388E3C" source="transform_service" target="ai_agent" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="aiagent_to_openai" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#388E3C;dashed=1" source="ai_agent" target="openai" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="aiagent_to_audit" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#F57C00;dashed=1" source="ai_agent" target="audit_logs" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="api_to_audit" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#F57C00;dashed=1" source="api" target="audit_logs" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="cosmos_to_metadata_split" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#F57C00;dashed=1" source="cosmos_db" target="metadata_split" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    @@ -237,9 +327,29 @@
    <mxGeometry x="240" y="140" width="160" height="80" as="geometry" />
    </mxCell>

    <!-- GitHub -->
    <mxCell id="github_res" value="πŸ”— GitHub&#xa;Source Code Repository&#xa;CI/CD Pipelines&#xa;Automated Deployments" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F1F8E9;strokeColor=#689F38;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="760" y="260" width="160" height="80" as="geometry" />
    <!-- Azure DevOps Pipelines (Resources) -->
    <mxCell id="azdo_pipelines_res" value="πŸ“‚ Azure DevOps Pipelines&#xa;Build / Test / Deploy&#xa;Boards &amp; Repos&#xa;Artifacts" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F1F8E9;strokeColor=#689F38;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="760" y="260" width="170" height="90" as="geometry" />
    </mxCell>
    <!-- Queue for Async Processing (ADR-007) -->
    <mxCell id="queue_res" value="οΏ½ Queue (Service Bus / Storage)&#xa;Document Events&#xa;Async Triggers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxCell id="queue_res" value="πŸ“¨ Queue (Service Bus / Storage)&#xa;Document Events&#xa;Async Triggers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    </mxCell>
    <!-- Transformer / Processor -->
    <mxCell id="transform_res" value="🧩 Transformer Service&#xa;AST + Enrichment&#xa;Background Processing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="780" y="740" width="170" height="80" as="geometry" />
    </mxCell>
    <!-- AI Agent Orchestrator -->
    <mxCell id="ai_agent_res" value="πŸ€– AI Agent Orchestrator&#xa;Agent Scenarios (ADR-014)&#xa;Semantic Actions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="420" y="740" width="170" height="80" as="geometry" />
    </mxCell>
    <!-- Audit Logs -->
    <mxCell id="audit_logs_res" value="πŸ“ Audit Logs (ADR-010)&#xa;Centralized Events&#xa;User Correlation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="240" y="740" width="160" height="80" as="geometry" />
    </mxCell>
    <!-- Metadata vs Versions -->
    <mxCell id="metadata_split_res" value="πŸ“„ Metadata vs Versions (ADR-012)&#xa;Mutable / Immutable" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="40" y="740" width="180" height="80" as="geometry" />
    </mxCell>

    <!-- Connections -->
    @@ -278,7 +388,27 @@
    </mxCell>

    <!-- CI/CD connections -->
    <mxCell id="github_to_container" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#689F38;dashed=1" source="github_res" target="container_env" edge="1" parent="1">
    <!-- Pipelines to Container Env -->
    <mxCell id="pipelines_to_container" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#689F38;dashed=1" source="azdo_pipelines_res" target="container_env" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <!-- Async Flow Edges -->
    <mxCell id="api_to_ai_agent_res" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#388E3C;dashed=1" source="platform_api" target="ai_agent_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="ai_agent_to_queue_res" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#388E3C" source="ai_agent_res" target="queue_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="queue_to_transform_res" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#388E3C" source="queue_res" target="transform_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="transform_to_openai_res" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#388E3C" source="transform_res" target="openai_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="api_to_audit_res" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#F57C00;dashed=1" source="platform_api" target="audit_logs_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>
    <mxCell id="cosmos_to_metadata_split_res" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#F57C00;dashed=1" source="cosmos_db_res" target="metadata_split_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

  3. jedjohan created this gist Aug 21, 2025.
    288 changes: 288 additions & 0 deletions platform.drawio
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,288 @@
    <?xml version="1.0" encoding="UTF-8"?>
    <mxfile host="app.diagrams.net" modified="2025-08-21T18:00:00.000Z" agent="Platform Architecture Template" etag="template" version="24.6.4" type="device">
    <diagram name="Logisk Arkitektur" id="logisk">
    <mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
    <root>
    <mxCell id="0" />
    <mxCell id="1" parent="0" />

    <!-- User Layer -->
    <mxCell id="users" value="πŸ‘₯ Users&#xa;Technical Writers&#xa;Content Teams&#xa;Reviewers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E1F5FE;strokeColor=#0277BD;strokeWidth=2;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="40" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- Frontend Layer -->
    <mxCell id="frontend" value="🌐 Frontend Application&#xa;Collaborative Document Editor&#xa;Review &amp; Approval Interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E1F5FE;strokeColor=#0277BD;strokeWidth=2;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="160" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- API Gateway -->
    <mxCell id="gateway" value="πŸ” API Gateway&#xa;Authentication &amp; Authorization&#xa;Rate Limiting &amp; Routing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFEBEE;strokeColor=#D32F2F;strokeWidth=2;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="280" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- Platform API -->
    <mxCell id="api" value="πŸ“„ Platform API&#xa;Document Lifecycle Management&#xa;Slim Endpoints β†’ Service Delegation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#7B1FA2;strokeWidth=2;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="400" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- Domain Services -->
    <mxCell id="services_container" value="πŸ’Ό Domain Services" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=3;fontSize=14;fontStyle=1;verticalAlign=top;spacingTop=10" vertex="1" parent="1">
    <mxGeometry x="120" y="520" width="840" height="120" as="geometry" />
    </mxCell>

    <mxCell id="doc_service" value="πŸ“ Document Service&#xa;CRUD Operations&#xa;Validation &amp; Mapping" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="140" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="version_service" value="πŸ”„ Versioning Service&#xa;Git-based Version Control&#xa;Change Tracking" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="280" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="collab_service" value="πŸ‘₯ Collaboration Service&#xa;Comments &amp; Reviews&#xa;Real-time Updates" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="420" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="approval_service" value="βœ… Approval Service&#xa;Workflow Management&#xa;Review Processes" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="560" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="search_service" value="πŸ” Search Service&#xa;Hybrid Vector + Text Search&#xa;AI-powered Semantic Search" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="700" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="locale_service" value="🌍 Localization Service&#xa;Multi-language Support&#xa;Translation Workflows" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="840" y="560" width="120" height="60" as="geometry" />
    </mxCell>

    <!-- Azure Services -->
    <mxCell id="azure_container" value="☁️ Azure Services Integration" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=3;fontSize=14;fontStyle=1;verticalAlign=top;spacingTop=10" vertex="1" parent="1">
    <mxGeometry x="120" y="680" width="840" height="120" as="geometry" />
    </mxCell>

    <mxCell id="azure_devops" value="πŸ“‚ Azure DevOps&#xa;Git Repository&#xa;Raw Document Storage&#xa;Version History" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="140" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="cosmos_db" value="πŸ—„οΈ Cosmos DB&#xa;Document Metadata&#xa;Comments &amp; Approvals&#xa;Search Index Data" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="280" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="ai_search" value="πŸ” Azure AI Search&#xa;Vector + Text Search&#xa;Semantic Ranking&#xa;Hybrid Queries" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="420" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="openai" value="πŸ€– Azure OpenAI&#xa;Embeddings Generation&#xa;Text-to-Vector&#xa;AI Content Analysis" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="560" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="blob_storage" value="πŸ“¦ Azure Blob Storage&#xa;AST Document Trees&#xa;Binary Content&#xa;Search Artifacts" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="700" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <mxCell id="app_config" value="βš™οΈ Azure App Configuration&#xa;Environment Settings&#xa;Feature Flags&#xa;Multi-tenant Config" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="840" y="720" width="120" height="60" as="geometry" />
    </mxCell>

    <!-- External Services -->
    <mxCell id="entra_id" value="πŸ”‘ Microsoft Entra ID&#xa;Enterprise Authentication&#xa;JWT Token Validation&#xa;RBAC Permissions" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFEBEE;strokeColor=#D32F2F;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="40" y="280" width="140" height="80" as="geometry" />
    </mxCell>

    <mxCell id="github" value="πŸ”— GitHub Actions&#xa;CI/CD Pipelines&#xa;Automated Testing&#xa;Deployment Automation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F1F8E9;strokeColor=#689F38;strokeWidth=2;fontSize=10" vertex="1" parent="1">
    <mxGeometry x="1000" y="400" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Connections -->
    <mxCell id="users_to_frontend" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#0277BD" source="users" target="frontend" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="frontend_to_gateway" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#0277BD" source="frontend" target="gateway" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="gateway_to_api" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#D32F2F" source="gateway" target="api" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="api_to_services" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=3;strokeColor=#7B1FA2" source="api" target="services_container" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <!-- Service to Azure connections -->
    <mxCell id="doc_to_devops" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#388E3C" source="doc_service" target="azure_devops" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="doc_to_cosmos" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#388E3C" source="version_service" target="cosmos_db" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="search_to_ai" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#388E3C" source="search_service" target="ai_search" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="search_to_openai" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#388E3C" source="approval_service" target="openai" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <!-- Auth connections -->
    <mxCell id="gateway_to_entra" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#D32F2F;dashed=1" source="gateway" target="entra_id" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <!-- External integrations -->
    <mxCell id="api_to_github" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#689F38;dashed=1" source="api" target="github" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    </root>
    </mxGraphModel>
    </diagram>

    <diagram name="Azure Resources" id="azure">
    <mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
    <root>
    <mxCell id="0" />
    <mxCell id="1" parent="0" />

    <!-- Internet -->
    <mxCell id="internet" value="🌐 Internet" style="ellipse;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1976D2;strokeWidth=2;fontSize=14;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="520" y="40" width="120" height="60" as="geometry" />
    </mxCell>

    <!-- Application Gateway -->
    <mxCell id="app_gateway" value="πŸšͺ Application Gateway&#xa;WAF Protection&#xa;SSL Termination&#xa;Load Balancing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFEBEE;strokeColor=#D32F2F;strokeWidth=3;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="140" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- Container Apps Environment -->
    <mxCell id="container_env" value="πŸ“¦ Container Apps Environment&#xa;Microservices Hosting&#xa;Auto-scaling&#xa;Blue-Green Deployments" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1976D2;strokeWidth=3;fontSize=12;fontStyle=1" vertex="1" parent="1">
    <mxGeometry x="480" y="260" width="200" height="80" as="geometry" />
    </mxCell>

    <!-- Platform API -->
    <mxCell id="platform_api" value="πŸ“„ Platform API&#xa;Container App&#xa;Document Management&#xa;RESTful Endpoints" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1976D2;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="420" y="380" width="140" height="70" as="geometry" />
    </mxCell>

    <!-- Dev Host -->
    <mxCell id="dev_host" value="πŸ”§ Development Host&#xa;Aspire Orchestration&#xa;Local Development&#xa;Service Discovery" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1976D2;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="600" y="380" width="140" height="70" as="geometry" />
    </mxCell>

    <!-- Azure DevOps -->
    <mxCell id="azure_devops_res" value="πŸ“‚ Azure DevOps&#xa;Git Repositories&#xa;Raw Document Content&#xa;Version Control History" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="40" y="500" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Blob Storage -->
    <mxCell id="blob_storage_res" value="πŸ“¦ Azure Blob Storage&#xa;AST Document Trees&#xa;Binary Content&#xa;Search Artifacts" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="200" y="500" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Cosmos DB -->
    <mxCell id="cosmos_db_res" value="πŸ—„οΈ Azure Cosmos DB&#xa;Document Metadata&#xa;Comments &amp; Approvals&#xa;Global Distribution" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="360" y="500" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- AI Search -->
    <mxCell id="ai_search_res" value="πŸ” Azure AI Search&#xa;Vector + Text Search&#xa;Semantic Ranking&#xa;Cognitive Skills" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E8;strokeColor=#388E3C;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="520" y="500" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Azure OpenAI -->
    <mxCell id="openai_res" value="πŸ€– Azure OpenAI&#xa;GPT-4 &amp; Embeddings&#xa;Content Generation&#xa;Semantic Analysis" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FCE4EC;strokeColor=#C2185B;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="40" y="620" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Application Insights -->
    <mxCell id="app_insights" value="πŸ“Š Application Insights&#xa;Performance Monitoring&#xa;Error Tracking&#xa;Usage Analytics" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FCE4EC;strokeColor=#C2185B;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="200" y="620" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Log Analytics -->
    <mxCell id="log_analytics" value="πŸ“ˆ Log Analytics&#xa;Centralized Logging&#xa;Query &amp; Alerting&#xa;Security Monitoring" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FCE4EC;strokeColor=#C2185B;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="360" y="620" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- App Configuration -->
    <mxCell id="app_config_res" value="βš™οΈ Azure App Configuration&#xa;Environment Settings&#xa;Feature Flags&#xa;Configuration Management" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="680" y="500" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Key Vault -->
    <mxCell id="key_vault" value="πŸ” Azure Key Vault&#xa;Secrets Management&#xa;Certificate Storage&#xa;Managed Identity Keys" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="840" y="500" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Managed Identity -->
    <mxCell id="managed_id_res" value="πŸ†” Managed Identity&#xa;Service Authentication&#xa;Zero-Trust Security&#xa;Azure Service Access" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF3E0;strokeColor=#F57C00;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="520" y="620" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Virtual Network -->
    <mxCell id="vnet" value="πŸ”— Virtual Network&#xa;Private Endpoints&#xa;Network Security Groups&#xa;Service Integration" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F1F8E9;strokeColor=#689F38;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="680" y="620" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Private Endpoints -->
    <mxCell id="private_endpoints" value="πŸ”’ Private Endpoints&#xa;Secure Service Access&#xa;Network Isolation&#xa;Private Connectivity" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F1F8E9;strokeColor=#689F38;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="840" y="620" width="140" height="80" as="geometry" />
    </mxCell>

    <!-- Entra ID -->
    <mxCell id="entra_id_res" value="πŸ”‘ Microsoft Entra ID&#xa;Enterprise Authentication&#xa;Conditional Access&#xa;Multi-factor Authentication" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFEBEE;strokeColor=#D32F2F;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="240" y="140" width="160" height="80" as="geometry" />
    </mxCell>

    <!-- GitHub -->
    <mxCell id="github_res" value="πŸ”— GitHub&#xa;Source Code Repository&#xa;CI/CD Pipelines&#xa;Automated Deployments" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F1F8E9;strokeColor=#689F38;strokeWidth=2;fontSize=11" vertex="1" parent="1">
    <mxGeometry x="760" y="260" width="160" height="80" as="geometry" />
    </mxCell>

    <!-- Connections -->
    <mxCell id="internet_to_gateway" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=3;strokeColor=#1976D2" source="internet" target="app_gateway" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="gateway_to_container" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=3;strokeColor=#D32F2F" source="app_gateway" target="container_env" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="container_to_api" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#1976D2" source="container_env" target="platform_api" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="container_to_devhost" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#1976D2" source="container_env" target="dev_host" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <!-- Data connections -->
    <mxCell id="api_to_devops" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#388E3C" source="platform_api" target="azure_devops_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="api_to_cosmos" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#388E3C" source="platform_api" target="cosmos_db_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <mxCell id="api_to_search" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#388E3C" source="platform_api" target="ai_search_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <!-- Auth connections -->
    <mxCell id="gateway_to_entra_res" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#D32F2F;dashed=1" source="app_gateway" target="entra_id_res" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    <!-- CI/CD connections -->
    <mxCell id="github_to_container" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=2;strokeColor=#689F38;dashed=1" source="github_res" target="container_env" edge="1" parent="1">
    <mxGeometry relative="1" as="geometry" />
    </mxCell>

    </root>
    </mxGraphModel>
    </diagram>
    </mxfile>