Projekt-Dashboard v2 — Cloud-Hosted Web-UI mit Drill-down KPIs

Overview

Ein web-basiertes Dashboard unter dashboard.agenticventures.de, Mobile-tauglich, Cognito-protected (Marvin via Google-Login), das alle Unternehmens-KPIs in einer Drill-down-UI bündelt. Daten werden von einer AWS-Lambda alle paar Stunden aktualisiert und als JSON in S3 gelegt; das Frontend fetcht statisch. Vollständig macOS-unabhängig — läuft 24/7, vom Handy aufrufbar.

Wichtige Pivot-Notiz: Dieser Plan ersetzt v1 (Obsidian Bases lokal). Bisheriges Work (code_repos-Mapping in Projekten + Schema-Erweiterung in schemas.md) bleibt nutzbar — Lambda liest den Vault eh.

Problem Frame

Marvin hat keinen aggregierten Blick auf:

  • Was kostet AWS gerade, pro Kunde, pro Service
  • Was läuft gerade an Hosted-Services (Lambdas, MCPs, Open-WebUI)
  • Wie ist die Finanzlage (offene Rechnungen, MRR, Cashflow)
  • Was passiert in welchem Projekt
  • Wie strukturiert ist der Vault, welche Wissens-Cluster + Bridges
  • Welche Repo-Health-Probleme (tote Links, fehlende Frontmatter, drift)

Daily-Briefing-Push gibt’s, aber er ist linear/text. Marvin ist visueller Typ + ADHS — braucht ein Bild auf einen Blick + Möglichkeit reinzuzoomen. Soll vom Handy unterwegs aufrufbar sein, also nicht an seinen iMac gebunden.

Requirements Trace

KPI-Bereiche (Tag 1 alle vier vorgesehen, aber in Phasen ausgeliefert)

  • R1 AWS-Kosten — Total + pro Account/Kunde + pro Service, Trend 7/30 Tage, Drill-down auf Service-Ebene → Phase 1 / Unit 3
  • R2 Hosted-Services-Status — welche Lambdas laufen, MCP-Health-Pings, Open-WebUI-Erreichbarkeit, Cloudflare-Tunnel-Status → Phase 2 / Unit 8
  • R3 Finanzen — offene Rechnungen, MRR, Cashflow 30/90 Tage, Top-5-Schuldner via Papierkram-MCP → Phase 2 / Unit 9
  • R4 Projekt-Aktivität — Karten pro aktivem Projekt mit Status, next_step, last_activity (via GitHub-API) → Phase 2 / Unit 10
  • R5 Repo-Health — tote Wikilinks, fehlende Frontmatter, drift, status:tbd-Count → Phase 3 / Unit 11
  • R6 Vault-Graph — Knowledge-Graph mit Cluster-Detection + Bridge-Hervorhebung (Cytoscape + Louvain) → Phase 3 / Unit 12

Plattform

  • R7 Web-UI unter dashboard.agenticventures.de, mobile-tauglich → Unit 1 + Unit 5
  • R8 Cognito Auth (User Pool + Google IdP, hello@-Konto only) → Unit 2
  • R9 Cloud-hosted, läuft auch wenn iMac aus ist → Unit 1 (Infrastruktur), Unit 4 (Lambda)
  • R10 Daten-Refresh 4-6x täglich via EventBridge + on-demand-Trigger im Frontend → Unit 4

Scope Boundaries

  • Tag 1 alle 4 KPIs gleichzeitig ist nicht realistisch. Stattdessen: Foundation + AWS-Kosten als Sprint 1, Rest staggered in Sprint 2-3
  • Keine Multi-User-Auth (nur Marvin), kein Steuerberater-Login (Open Question für später)
  • Keine Echtzeit-Daten — Refresh-Frequenz ~4h reicht (Cost-Explorer-Daten sind eh 24h-delayed)
  • Keine Datenbank — JSON-Files in S3 reichen als State-Layer (Single-User, kleine Datenmengen)
  • Kein WebSocket/Live-Updates — Pull-on-Load + manueller Refresh-Button
  • Claude-Code-Sessions (~/.claude/projects/) entfallen als Datenquelle weil sie lokal-only sind und Lambda nicht drauf zugreifen kann. Phase-2-Idee: optionaler lokaler Sync ins Vault, dann liest Lambda sie aus dem Vault (Hybrid, akzeptiert Trade-off)
  • Kein Export (CSV/PDF) im MVP
  • Keine Alarme/Benachrichtigungen über das Dashboard (Daily-Briefing-Push bleibt der Channel dafür)

Context & Research

Relevant Code and Patterns

  • agents-platform.md + agents-platform — CDK + Lambda Pattern. Re-use AgenticVenturesAgent-Construct + Common-Layer
  • _index.md + accounts.md — Account-IDs für Kunden-Mapping (mgmt, av-production, mk-privat, av-becker, icking)
  • papierkram.md — Papierkram-MCP für Finanz-Daten
  • web-properties.md — bestehende Web-Properties + Cloudflare-DNS-Convention
  • schemas.md §5.5 — Project-Frontmatter inkl. neuer Activity-Felder (aus v1-Work)
  • Bestehende code_repos-Felder in 8 Projekt-_index.md (aus v1-Work) — direkt nutzbar als Mapping-Daten

Institutional Learnings

  • AWS-First Hosting (Memory): Alles auf av-production AWS-Account, kein Railway, kein Vercel
  • MCP-as-a-Service Vision (Memory): mcp-vf-hosted Pattern — eigene MCPs als hosted Service mit Multi-Tenant
  • Schreibstil-Pflege: Marvin pflegt next_step manuell, sonst veraltet alles
  • ADHS-Pattern: System muss unsichtbar laufen — kein “drück-mich-zum-Refresh”-Zwang, Daten müssen “einfach da sein”

External References

Key Technical Decisions

  • Frontend = Astro Static Site. Mobile-first, SSG, kleine Bundles, React-Islands wo nötig (Charts + Graph). Alternative wären Next.js (overkill für Static-only) oder Vanilla HTML (zu rough für Drill-down-Routing).
  • Backend = AWS Lambda + S3 (JSON-Storage). Keine DB. Lambda läuft scheduled, schreibt JSON nach S3. Frontend fetcht statisch. Skaliert auf Single-User-Setup ohne Overhead.
  • Auth = Cognito User Pool + Google IdP. Hosted UI redirected zu Cognito → Google-Login → JWT zurück. Marvins hello@-Konto als einziger Federated User. Multi-User bleibt Option, nicht jetzt.
  • Hosting = S3 + CloudFront, Domain via Cloudflare. Folgt AWS-First Memory. Cloudflare nur DNS, kein Pages — sonst zwei Hosting-Anbieter.
  • MCP-Calls statt direkte API-Calls. Papierkram → Papierkram-MCP. AWS-Cost → aws-api-MCP-Pattern adaptiert (eigentlich boto3 direkt im Lambda, weil aws-api-MCP eh nur ein boto3-Wrapper ist). Vault-Daten → GitHub-API (Vault-Repo, mit PAT).
  • Refresh-Strategie: EventBridge cron 0 6,12,18 * * ? * UTC (3x täglich) + ein API-Gateway-Endpoint für on-demand-Trigger im Frontend (auth-protected).
  • Phasing: MVP = Foundation + AWS-Kosten (1 KPI live, alle anderen als leere/Coming-Soon-Karten). Sprint 2 = Projekte + Finanzen. Sprint 3 = Repo-Health + Graph. Marvin sieht Tag 1 ein funktionierendes Dashboard, nicht 4 halb-fertige.
  • Sessions-Daten entfallen als Datenquelle in v2 — Lambda kann lokale Files nicht lesen. Wenn Marvin später Sessions vermisst, baue ich eine kleine lokale claude-session-sync.py die alle paar Stunden einen Snapshot in den Vault syncen (dann liest Lambda aus dem Vault).

High-Level Technical Design

Directional guidance — keine Implementation-Spec.

                                  ┌─────────────────────────────┐
                                  │  dashboard.agenticventures  │
                                  │  .de (Cloudflare DNS)       │
                                  └──────────────┬──────────────┘
                                                 │
                                  ┌──────────────▼──────────────┐
                                  │  CloudFront Distribution    │
                                  │  (HTTPS, Cognito-Authorizer)│
                                  └──────────────┬──────────────┘
                                                 │
                              ┌──────────────────┼─────────────────────┐
                              │                  │                     │
              ┌───────────────▼────────┐ ┌───────▼────────┐  ┌─────────▼──────────┐
              │ S3 Bucket              │ │ Cognito Hosted │  │ API Gateway        │
              │ /index.html /static/*  │ │ UI (Google IdP)│  │ /refresh (on-demand│
              │ /api/data/<kpi>.json   │ │                │  │  trigger)          │
              └───────────────┬────────┘ └────────────────┘  └─────────┬──────────┘
                              │                                        │
                              │ JSON gefuellt durch:                    │
                              │                                        │
              ┌───────────────▼──────────────────────────────┐         │
              │  Lambda: agent-dashboard-refresh              │◄────────┘
              │  Trigger: EventBridge (cron 6/12/18 UTC)     │
              │  + manuell via API-Gateway /refresh          │
              │                                              │
              │  Datenquellen:                                │
              │   ├─ boto3 CostExplorer (Cross-Account)      │
              │   ├─ GitHub API (Vault-Repo + Code-Repos)    │
              │   ├─ Papierkram-MCP via mcp-vf.agenticvent…  │
              │   ├─ Internal Status-Checks (HTTP-Ping MCPs) │
              │   └─ Vault-Markdown-Parser (Graph + Health)  │
              │                                              │
              │  Schreibt nach S3 unter dashboard-data/:     │
              │   ├─ aws-costs.json                          │
              │   ├─ services-status.json                    │
              │   ├─ finanzen.json                           │
              │   ├─ projekte.json                           │
              │   ├─ repo-health.json                        │
              │   └─ graph.json                              │
              └──────────────────────────────────────────────┘

Routing-Struktur (Drill-down)

/                       Uebersicht: 4 grosse KPI-Karten + neueste Aenderungen
/aws                    AWS-Kosten Drill-down
  /aws/<account-slug>     Drill-down: pro Account/Kunde
/services               Hosted-Services-Status
  /services/<name>        Drill-down: pro Service
/finanzen               Finanz-Drill-down
  /finanzen/rechnungen    Liste offene Rechnungen
  /finanzen/mrr           MRR-Verlauf
/projekte               Projekt-Liste (Karten)
  /projekte/<slug>        Projekt-Detail mit Activity-Timeline
/repo-health            Vault-Health-Report
/graph                  Knowledge-Graph mit Clustering

Implementation Units

flowchart TB
    subgraph Phase1[Phase 1 — MVP Foundation]
        U1[Unit 1: AWS-Infra CDK Stack] --> U2[Unit 2: Cognito Auth]
        U1 --> U3[Unit 3: Lambda V1 - AWS-Kosten]
        U2 --> U4[Unit 4: Frontend Setup Astro]
        U3 --> U4
        U4 --> U5[Unit 5: Deploy + DNS + Smoke]
    end
    subgraph Phase2[Phase 2 — KPI-Erweiterung]
        U5 --> U6[Unit 6: GitHub-Data fuer Projekte]
        U5 --> U7[Unit 7: Papierkram-MCP fuer Finanzen]
        U6 --> U8[Unit 8: Hosted-Services-Status]
    end
    subgraph Phase3[Phase 3 — Vault-Sicht]
        U8 --> U9[Unit 9: Repo-Health-Scanner]
        U9 --> U10[Unit 10: Graph-Build + Cytoscape]
    end

Phase 1 (MVP — funktioniert Ende des Sprints)

  • Unit 1: AWS-Infrastructure CDK Stack

Goal: Eine CDK-Stack-Definition in agents-platform/infra/lib/dashboard-stack.ts die alle AWS-Resources für das Dashboard provisioniert: S3-Bucket für Frontend + Daten, CloudFront, Lambda, EventBridge-Rule, API Gateway, Cognito User Pool.

Requirements: R7, R9

Dependencies: Keine

Files:

  • Create: ~/source/agents-platform/infra/lib/dashboard-stack.ts
  • Create: ~/source/agents-platform/lambdas/dashboard-refresh/ (Stub)
  • Modify: ~/source/agents-platform/infra/bin/app.ts (Stack instanzieren)

Approach:

  • Re-use AgenticVenturesAgent-Construct nicht — der ist für Cron-Background-Agents, das hier ist Web-Stack mit API-Gateway. Eigene Stack-Klasse
  • S3 Bucket: av-dashboard-frontend (statisches Frontend) + av-dashboard-data (JSON-Daten)
  • CloudFront mit OAC für S3-Origin, Behavior für /api/data/* → data-bucket, alles andere → frontend-bucket
  • Cognito User Pool: Google IdP, Hosted UI auf auth.dashboard.agenticventures.de
  • API Gateway HTTP API mit Cognito JWT Authorizer für /refresh Endpoint
  • Lambda agent-dashboard-refresh: ARM64 Python 3.12, Memory 1024MB, Timeout 5min
  • EventBridge Rule: cron(0 6,12,18 * * ? *) UTC trigger der Lambda
  • IAM-Permissions für Lambda: CostExplorer (org-weit lesen via assume-role in mgmt-account), S3 Write auf data-bucket, Secrets-Manager für GitHub-PAT + Papierkram-Token

Patterns to follow:

  • ~/source/agents-platform/infra/lib/daily-briefing-stack.ts als Vorbild für Lambda + EventBridge
  • ~/source/agents-platform/infra/bin/app.ts für Cross-Stack-Konstanten

Test scenarios:

  • Happy path: npm run synth produziert valides CloudFormation ohne Errors
  • Happy path: cdk diff zeigt erwarteten Resource-Plan (Bucket, Lambda, CF, Cognito, API-GW)
  • Integration: nach Deploy aws cognito-idp list-user-pools zeigt den neuen Pool
  • Edge case: Doppel-Deploy idempotent (kein Resource-Recreate)

Verification:

  • cdk deploy DashboardStack erfolgreich auf av-production

  • CloudFront-Distribution-ID, S3-Bucket-Namen, Cognito-Pool-ID + Domain in intern/projekte/projekt-dashboard/_index.md dokumentiert

  • Unit 2: Cognito Auth Setup (Google IdP)

Goal: Cognito User Pool akzeptiert Google-Sign-In via Marvins hello@-Konto. JWT-Token validiert in CloudFront-Function für statische Routes + API-Gateway-Authorizer für /refresh.

Requirements: R8

Dependencies: Unit 1 (Resources existieren)

Files:

  • Modify: ~/source/agents-platform/infra/lib/dashboard-stack.ts (Google-IdP-Config detaillieren)
  • Create: Google Cloud Console OAuth-Client Setup (manuell, dokumentiert in Runbook)

Approach:

  • Google OAuth Client anlegen: redirect_uri = Cognito Hosted UI Callback
  • Cognito User Pool: federated identity provider = Google, attribute mapping (email → preferred_username)
  • App Client: callback-URL = https://dashboard.agenticventures.de/auth/callback, logout = https://dashboard.agenticventures.de/
  • Custom Domain für Hosted UI: auth.dashboard.agenticventures.de (ACM Cert in us-east-1)
  • Pre-Sign-Up Lambda Trigger der verhindert dass jemand anderes als hello@marvinkuehlmann.com sich registriert (defense in depth)

Patterns to follow:

  • AWS Doku zu „Sign in with Google” im Cognito-User-Pool
  • Bestehende AWS-CDK-Constructs für Cognito + Google IdP

Test scenarios:

  • Happy path: Login mit hello@-Google-Konto erfolgreich, JWT enthält email-Claim
  • Edge case: Login-Versuch mit anderem Google-Konto wird durch Pre-Sign-Up-Lambda blockiert
  • Error path: Falscher OAuth-Client-Secret → 400 Error, kein Crash
  • Integration: JWT-Token bei API-Gateway /refresh-Call wird vom Authorizer akzeptiert

Verification:

  • Manueller Login-Flow via Browser klappt End-to-End

  • Test-Call mit Token auf /refresh triggert Lambda erfolgreich

  • Unit 3: Lambda V1 — AWS-Costs Aggregator

Goal: Lambda agent-dashboard-refresh kann nur AWS-Kosten aggregieren und nach S3 schreiben. Alle anderen Datenquellen sind in V1 Stubs/Mocks.

Requirements: R1

Dependencies: Unit 1

Files:

  • Create: ~/source/agents-platform/lambdas/dashboard-refresh/main.py
  • Create: ~/source/agents-platform/lambdas/dashboard-refresh/aws_costs.py
  • Create: ~/source/agents-platform/lambdas/dashboard-refresh/account_mapping.py
  • Test: ~/source/agents-platform/lambdas/dashboard-refresh/test_aws_costs.py

Approach:

  • Handler entry point: liest Refresh-Mode aus Event (scheduled vs on-demand), ruft alle Aggregatoren in try/except (failures pro KPI isoliert)
  • aws_costs.py: assume-role in mgmt-account (343241684374) → Cost Explorer Client → GetCostAndUsage für letzte 30 Tage, group by LINKED_ACCOUNT + SERVICE
  • account_mapping.py: hardcoded Map Account-ID → {slug, kunde-name, since-date} aus aws/accounts.md (alternativ später dynamisch aus Vault)
  • Output-Format:
    {
      "generated_at": "ISO-8601",
      "totals_30d": {"av-production": 12.40, "av-becker": 0.0, ...},
      "trend_7d": [{"date": "...", "total": ...}, ...],
      "by_service_per_account": {"av-production": {"Bedrock": 8.10, "Lambda": 0.30}, ...}
    }
  • Write to S3: dashboard-data/aws-costs.json mit Cache-Control: max-age=300
  • Logging in CloudWatch (re-use agentic_common.logging Layer)

Patterns to follow:

  • ~/source/agents-platform/lambdas/beleg-pipeline/main.py Pattern (logger, try/except, structured output)
  • agentic_common.bedrock-Pattern für boto3-Sessions

Test scenarios:

  • Happy path: Lambda läuft, schreibt valides JSON nach S3, JSON ist parsbar
  • Happy path: 30-Tage-Daten enthalten alle 4 Sub-Accounts (auch wenn Kosten 0 sind)
  • Edge case: CostExplorer-API-Drosselung (rate limit) → retry mit exponential backoff
  • Error path: AssumeRole schlägt fehl → loggen, schreibe Fallback-JSON mit error-Marker statt zu crashen
  • Integration: Frontend fetcht aws-costs.json und zeigt Daten korrekt

Verification:

  • aws lambda invoke --function-name agent-dashboard-refresh-Test erfolgreich

  • S3-Object dashboard-data/aws-costs.json ist da + parsable + plausible Zahlen

  • CloudWatch-Log zeigt sauberen Run unter 30s

  • Unit 4: Frontend Setup (Astro + Tailwind + Auth)

Goal: Astro-Projekt mit Layout-System, Cognito-Auth-Integration, AWS-Kosten-Seite, mobile-tauglich.

Requirements: R7

Dependencies: Unit 3 (für echte Daten — vorher mit Mock-JSON entwickeln)

Files:

  • Create: ~/source/av-dashboard/ (neues Repo)
    • package.json, astro.config.mjs, tailwind.config.js
    • src/layouts/Dashboard.astro (mit Top-Nav + Auth-Status)
    • src/pages/index.astro (Übersicht)
    • src/pages/aws.astro (AWS-Drill-down)
    • src/components/KpiCard.astro, src/components/CostTrendChart.tsx (React-Island)
    • src/lib/auth.ts (Cognito JWT Handling)
    • src/lib/data.ts (S3-JSON-Fetcher mit Cache)
  • Modify: intern/firma/lokale-source-repos.md (neuen Repo dokumentieren)

Approach:

  • Astro static output, deployed nach S3
  • Auth-Flow: Frontend prüft beim Mount auf valides JWT in localStorage, sonst redirect zu Cognito Hosted UI. Logout-Button löscht Token
  • Daten-Layer: Generic fetchKpi<T>(name: string) lädt /api/data/<name>.json, cached in-memory
  • Layout: TopNav mit Links zu allen Sections + Refresh-Button + Logout
  • Übersicht: 4 KpiCard-Components nebeneinander (mobile: gestapelt), jede mit Klick → Drill-down-Seite
  • AWS-Seite: Karten pro Sub-Account mit Total + Trend-Chart (Recharts oder Chart.js)
  • Tailwind für Mobile-First-Styling
  • React-Islands nur für interaktive Charts + Filter — sonst pure Astro

Patterns to follow:

  • agentic-ventures-website (Marvins eigener Astro-Style falls vorhanden)
  • AWS Amplify Docs für Cognito-JWT-Handling im Frontend (ohne Amplify-SDK, native fetch)

Test scenarios:

  • Happy path: Login → Redirect → Übersicht zeigt 4 KPI-Karten
  • Happy path: Klick auf AWS-Karte → /aws zeigt Detail
  • Happy path: Refresh-Button triggert /refresh API, danach reload
  • Edge case: Token expired → automatic redirect zu Login
  • Mobile: Layout funktioniert auf iPhone-Viewport (375px breit)
  • Error path: S3-Fetch fehlschlägt → Error-State in Card statt White-Screen

Verification:

  • npm run dev rendert lokal sauber mit Mock-Daten

  • Lighthouse-Score Performance > 90 auf Mobile

  • Unit 5: Deploy + DNS + End-to-End Smoke

Goal: Dashboard ist unter dashboard.agenticventures.de erreichbar, Login funktioniert, AWS-Kosten sind live.

Requirements: R7, R8, R9

Dependencies: Unit 1-4

Files:

  • Modify: ~/source/agents-platform/infra/lib/dashboard-stack.ts (final tweaks)
  • Modify: intern/capabilities/aws/_index.md (neue Resources dokumentieren)
  • Create: intern/projekte/projekt-dashboard/runbook.md (Deploy + Debug + Rollback)
  • Modify: intern/firma/web-properties.md (Dashboard als Property eintragen)

Approach:

  • Cloudflare DNS: dashboard.agenticventures.de CNAME → CloudFront-Distribution
  • ACM-Cert in us-east-1 für CloudFront (CDK-managed)
  • Cloudflare DNS: auth.dashboard.agenticventures.de für Cognito Custom Domain
  • npm run build && aws s3 sync ./dist s3://av-dashboard-frontend/ + CloudFront-Invalidation
  • Smoke-Test: Login-Flow, AWS-Kosten anzeigen, Refresh-Button, Logout

Test scenarios:

  • End-to-end happy path: Browser-URL → Login → Daten → Logout
  • Mobile End-to-end: Vom iPhone aufrufbar, Login funktioniert, Daten lesbar
  • Edge case: 2nd Browser-Tab kann ohne Login-Wiederholung auf Daten zugreifen (JWT in localStorage shared)

Verification:

  • Marvin ruft die URL vom Handy auf, kann sich einloggen, sieht AWS-Kosten
  • Lambda-Trigger via Refresh-Button funktioniert

Phase 2 (KPI-Erweiterung)

  • Unit 6: GitHub-Data für Projekte (R4)
  • Unit 7: Papierkram-MCP für Finanzen (R3)
  • Unit 8: Hosted-Services-Status (R2)

Plan-Detail für Phase 2 wird nach MVP-Live in eigenem plan-phase2.md ausgearbeitet. Daten-Sourcing-Patterns:

  • Projekte: Vault-Repo via GitHub-API klonen (in /tmp), intern/projekte/*/_index.md Frontmatter parsen, pro code_repos[i] git-log via GitHub-API für Aktivität
  • Finanzen: Papierkram-MCP via https://mcp-vf.agenticventures.de/mcp (bereits hosted) — list_invoices + list_vouchers für offene Posten/Cashflow
  • Services-Status: HTTP-HEAD-Ping auf mcp-vf-Endpoints + boto3.list_functions filtered auf agents-platform-tag

Phase 3 (Vault-Sicht)

  • Unit 9: Repo-Health-Scanner (R5)
  • Unit 10: Graph-Build + Cytoscape-Frontend (R6)

Plan-Detail nach Phase 2 in plan-phase3.md. Wichtige Patterns:

  • Repo-Health: Lambda klont Vault-Repo, scannt nach Pattern aus wiki-maintenance Skill — tote Wikilinks, fehlende Frontmatter, drift, status:tbd
  • Graph: alle Vault-Markdown-Files lesen, Wikilink-Extraktion via Regex, networkx-Graph bauen, Louvain-Community-Detection, JSON nach S3 mit nodes+edges+cluster-id. Frontend Cytoscape.js mit cose-bilkent-Layout, Cluster als Hintergrund-Hulls

System-Wide Impact

  • Interaction graph: Neue Domain dashboard.agenticventures.de, neue Lambda + Cognito-Pool, neue API-Gateway-Route. Greifen NICHT in bestehende Lambdas (Daily-Briefing, Beleg-Pipeline) ein
  • Error propagation: Lambda isoliert pro-KPI-Aggregator try/except. Frontend zeigt error-state pro Card statt White-Screen-Crash
  • State lifecycle: S3 JSON wird bei Re-Run komplett überschrieben (nicht inkrementell). Wenn Lambda mitten im Schreiben crashed: Frontend sieht alte Daten weiter, kein Half-Write (S3 PutObject ist atomic)
  • API surface parity: Keine — interne Web-App, nur Marvin
  • Integration coverage: End-to-End-Test = Browser → Login → Daten. Pro Aggregator separater Lambda-Unit-Test
  • Unchanged invariants: Daily-Briefing-Lambda + Beleg-Pipeline + mcp-vf-hosted unverändert. Vault-Schema additive (Felder aus v1-Work bleiben)

Risks & Dependencies

RiskMitigation
Cognito + Cloudflare DNS Setup hat viel Moving-Parts → kann tagelang in Setup-Hell steckenMVP-Strategie: nur AWS-Kosten Tag-1, klare Stack-Klasse. Wenn Setup-Pain: parallel Cloudflare Access als Fallback-Auth
Cost-Explorer-API ist 24h delayed → “Was kostet das HEUTE” geht nicht echtIm UI ehrlich kommunizieren (“Stand: Vorgestern + 24h Lag”). Phase 2: CloudWatch-Metrics für Live-Resource-Counts
Lambda mit AssumeRole org-weit braucht Trust-Policy in jedem Sub-AccountInitial-Setup als Teil von Unit 1 (CDK + manuelle Trust-Updates in den 4 Sub-Accounts)
Frontend wird komplex (Drill-down + Charts + Graph) → Sprint länger als geschätztStrict-MVP-Discipline: AWS-Kosten ohne Charts ist OK, Charts in Phase 1.5 nachziehen
code_repos-Mapping ist nur 8 Projekte, 11 fehlenLambda fällt auf Vault-Ordner zurück (im v1 vorgesehen). Phase 2: in der Projekt-Liste markieren “kein Repo-Mapping” als Hinweis
Cognito Pre-Sign-Up-Lambda blockiert mich versehentlichPre-Test mit Test-Konto, Pre-Sign-Up Lambda hat Bypass-Flag im Env-Var falls nötig

Open Questions

Resolved During Planning

  • Welche KPIs Tag 1? AWS-Kosten als MVP, Rest in Phase 2/3. Marvin sieht früher etwas live als später alles auf einmal
  • Auth? Cognito + Google-Login via hello@-Konto. Multi-User ist out-of-scope MVP
  • Hosting? AWS S3 + CloudFront, Domain via Cloudflare-DNS. AWS-First wird respektiert
  • Frontend-Stack? Astro Static + React-Islands. Schlank, mobile-tauglich, SSG ohne Server
  • Sessions-Daten als Quelle? Entfällt in v2 (Lambda kann nicht lesen). Wenn Marvin’s vermisst: optionaler Hybrid in Phase 2.5

Deferred to Implementation

  • Cost-Explorer cross-account access: AssumeRole in jeden Sub-Account oder Cost Explorer im mgmt-Account mit Org-Read aktivieren? Letzteres ist sauberer wenn org-trail bereits da ist
  • Astro-Specifics: Auth-Library-Wahl (aws-amplify vs nativer oauth4webapi JS). Erstes ist heavy, zweites ist 200-Zeilen-Boilerplate aber clean
  • S3 → CloudFront vs Cloudflare Pages? AWS bleibt Decision, aber wenn Setup-Pain bei CloudFront groß: Cloudflare Pages als Fallback (gleicher Static-Output)
  • MCP-Aufruf aus Lambda: mcp-vf-hosted ist via HTTPS erreichbar, brauchen wir einen Scalekit-Token-Flow? Oder ist direkter Papierkram-API-Call einfacher? Phase 2 entscheiden
  • Graph-Daten-Volumen: Marvin hat ~500+ Vault-Files. Graph mit 500 Nodes ist machbar in Cytoscape. Wenn Performance-Problem: Cluster-Aggregation (statt jeden Node, nur Cluster + Top-Bridges)

Documentation / Operational Notes

  • Runbook in intern/projekte/projekt-dashboard/runbook.md: Deploy-Steps, Cognito-Setup-Steps (Google Cloud Console + Manuell-Steps), Debug-Pfade (CloudWatch-Logs), Rollback-Plan
  • Routing-Eintrag in CLAUDE.md: „Projekt-Dashboard / Web-UI” → dieser Plan + Runbook
  • intern/firma/web-properties.md: Dashboard als Property + Auth-Hinweis + DNS-Config
  • Cost-Alert: CloudFront + S3 + Lambda zusammen < 5€/Monat erwartet. Falls über 10€: prüfen
  • Logs in CloudWatch unter /aws/lambda/agent-dashboard-refresh
  • Monitoring: EventBridge-Cron-Failures pushen über Daily-Briefing-Telegram-Channel (Re-use bestehender Pattern)

Sources & References