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_stepmanuell, sonst veraltet alles - ADHS-Pattern: System muss unsichtbar laufen — kein “drück-mich-zum-Refresh”-Zwang, Daten müssen “einfach da sein”
External References
- AWS Cost Explorer API — GetCostAndUsage mit Filter by LinkedAccount + Service
- AWS Cognito Hosted UI + Google IdP
- Astro Documentation — statischer Site-Generator mit Islands für React-Components
- Cytoscape.js + cytoscape-cose-bilkent — Graph-Layout mit Cluster-Visualization
- networkx Louvain — Community-Detection für Cluster im Lambda
- Cloudflare Pages alternative zu CloudFront/S3 — falls Edge-Hosting bevorzugt
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.pydie 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
/refreshEndpoint - 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.tsals Vorbild für Lambda + EventBridge~/source/agents-platform/infra/bin/app.tsfür Cross-Stack-Konstanten
Test scenarios:
- Happy path:
npm run synthproduziert valides CloudFormation ohne Errors - Happy path:
cdk diffzeigt erwarteten Resource-Plan (Bucket, Lambda, CF, Cognito, API-GW) - Integration: nach Deploy
aws cognito-idp list-user-poolszeigt den neuen Pool - Edge case: Doppel-Deploy idempotent (kein Resource-Recreate)
Verification:
-
cdk deploy DashboardStackerfolgreich auf av-production -
CloudFront-Distribution-ID, S3-Bucket-Namen, Cognito-Pool-ID + Domain in
intern/projekte/projekt-dashboard/_index.mddokumentiert -
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
/refreshtriggert 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 + SERVICEaccount_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.jsonmitCache-Control: max-age=300 - Logging in CloudWatch (re-use agentic_common.logging Layer)
Patterns to follow:
~/source/agents-platform/lambdas/beleg-pipeline/main.pyPattern (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.jsonist 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.jssrc/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 devrendert 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.deCNAME → CloudFront-Distribution - ACM-Cert in us-east-1 für CloudFront (CDK-managed)
- Cloudflare DNS:
auth.dashboard.agenticventures.defü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.mdFrontmatter parsen, procode_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
| Risk | Mitigation |
|---|---|
| Cognito + Cloudflare DNS Setup hat viel Moving-Parts → kann tagelang in Setup-Hell stecken | MVP-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 echt | Im 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-Account | Initial-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ätzt | Strict-MVP-Discipline: AWS-Kosten ohne Charts ist OK, Charts in Phase 1.5 nachziehen |
code_repos-Mapping ist nur 8 Projekte, 11 fehlen | Lambda 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 versehentlich | Pre-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-amplifyvs nativeroauth4webapiJS). 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
- Origin document: _index.md
- Supersedes: v1-obsidian-bases-2026-05-14.md (lokaler Obsidian-Bases-Ansatz)
- Related: agents-platform.md, _index.md, papierkram.md
- External: AWS Cost Explorer API, Cognito Google IdP Docs, Astro Docs, Cytoscape.js + networkx Louvain