14 KiB
ToolController-Briefing für HiveGrid 2.0
Adressat: ToolController + alle AI-Coding-Agents (Sub-Agents von TC), die an HiveGrid arbeiten. Stand: 2026-05-10 Verbindlichkeit: dieses Dokument plus die hier referenzierten Pfade definieren das Vorgehen vollständig.
0. Was du baust
HiveGrid 2.0 ist eine Multi-Tenant-SaaS-Plattform für SHK-Handwerksbetriebe. Erstkunde: Geerkens. EU-Stack komplett (kein US-Anbieter). Repository-Wurzel: /Users/raffaelsheikh/Documents/GitHub/HiveGrid-Cloud.
176 Milestones in docs/milestones/M001/ bis docs/milestones/M176/. Jedes Verzeichnis enthält genau eine Datei PLAN.md. Diese sind deine Arbeits-Aufträge.
0.1 Die Boilerplate IST deine Codebase — nicht „eine Vorlage"
Das Repo HiveGrid-Cloud/ enthält die EU-sterilisierte ToolCTRL-Boilerplate als Fundament. Das ist dein Code, du editierst, erweiterst und löschst ihn. Du klonst nichts, du importierst nichts „von außen", du baust nicht parallel ein neues Projekt.
Konkret heißt das:
apps/web/,apps/api/,apps/worker/,packages/db/,packages/mail/,packages/queue/,packages/ui/,prisma/,package.jsonmit pnpm-Workspace, Tailwind 4, shadcn/Radix, BullMQ, MailerSend → das ist deine Arbeitsbasis. Du nutzt sie.- Du erweiterst, was fehlt: neue
packages/view-models/,packages/ui-hivegrid/,packages/ui-subframe/(Phase 1 leer), neue Routes unterapp/routes/..., neue Module unterapp/domain/..., neue Prisma-Modelle inprisma/schema/... - Du löschst, was nicht zu HiveGrid gehört (Affiliate/Marketing/CMS-Reste aus dem ToolCTRL-Boilerplate, falls noch vorhanden)
- Du baust in dieser Codebase, nicht neben ihr
0.2 Pre-Flight-Check beim Start (jedes Mal)
Bevor du das erste Milestone planst, verifiziere die Vorbedingungen:
package.jsonim Repo-Root existiert mit pnpm-Workspace-Konfig — wenn nein: STOP, melde „Boilerplate-Inhalt fehlt im Repo"apps/,packages/,prisma/existieren — wenn nein: STOPpnpm install && pnpm typecheck && pnpm testläuft grün — wenn nein: STOP, melde welche Tests rot sind- Kein US-Provider im Code:
grep -rE "@ai-sdk/openai|@ai-sdk/anthropic|remix-auth-google|from \"openai\"" --include="*.ts" --include="*.tsx" --include="*.json" .ist leer — wenn nein: STOP, EU-Sterilisation nicht abgeschlossen docs/PROGRESS-TRACKER.mdexistiert — wenn nein: STOP
Erst nach 5/5 grün beginnst du mit dem ersten Milestone.
1. Wo du alles findest
| Was | Wo |
|---|---|
| Verbindliches Pflichtenheft v1.1 | _bmad-output/pflichtenheft/ |
| → Vision + Anti-Liste | _bmad-output/pflichtenheft/02-vision.md |
| → 20 Architektur-Bauprinzipien | _bmad-output/pflichtenheft/03-architektur.md |
| → 7 Modul-Blöcke mit Detail-Pflichten | _bmad-output/pflichtenheft/blocks/block1.md … block7.md |
| → Anhang (Geparktes, Noah-Anmerkungen N1-N19) | _bmad-output/pflichtenheft/99-anhang.md |
| Master-Milestone-Index | docs/milestones/README.md |
| Pflichtenheft → Milestone Coverage-Map | docs/milestones/PFLICHTENHEFT-COVERAGE.md |
| Per-Milestone-Plan (176 Stück) | docs/milestones/M???-<slug>/PLAN.md |
| Live-Progress-Tracker (du updatest ihn) | docs/PROGRESS-TRACKER.md |
| Agent-Regeln + Definition of Done | AGENTS.md (Repo-Root) |
| Integration-Contracts (Sidebar, Routes, Wiring) | docs/INTEGRATION-CONTRACTS.md |
| Mid-Stream-Korrektur-Playbook | docs/MID-STREAM-CHANGES.md |
| Change-Request-Workflow | docs/CHANGE-REQUESTS.md (entsteht in M176) |
2. Wie du ein Milestone planst (Pflicht-Reihenfolge)
Pro Milestone arbeitest du diese Schritte ab — nicht überspringen:
- Lies
docs/milestones/M???-<slug>/PLAN.mdvollständig. Sie enthält Ziel, Pflichtenheft-Sektionen, Abhängigkeiten, Out-of-Scope, Erfolgskriterium, Hinweise und am Ende die Definition of Done. - Lies die referenzierten Pflichtenheft-Sektionen (
_bmad-output/pflichtenheft/blocks/blockX.mdSektion Y.Z). Klartext-Hinweise und Edge-Cases stehen dort, nicht in PLAN.md. - Lies
AGENTS.md. Verbindliche Regeln für Layer-Trennung, drei Anti-Patterns, EU-Stack, Querschnitt-Wiring, Klartext-Pflicht. - Lies
docs/INTEGRATION-CONTRACTS.md. Hier steht, wo dein Modul in Sidebar / Routes / Tab-Bar / Search-Index andockt. - Prüfe Abhängigkeiten: Sind alle in PLAN.md genannten Vorbedingungs-Milestones abgeschlossen? Wenn nein: STOP und an User melden.
- Plane Slices (TC-Standard, 5–8 pro Milestone):
- Erste Slice ist meist Datenmodell + Migration
- Folge-Slices: Domain-Logik → Loader/Action → View-Model → UI-Component → Sidebar/Routing-Wiring → Tests
- Letzte Slice: Smoke-Test + Hot-Swap-Drill
- Plane Tasks pro Slice (5 Tasks à 30 Min – 2 Std). Pro Task konkrete Files + Verify-Befehle.
- Vor Execute: prüfe gegen die Definition of Done in PLAN.md. Sind alle Punkte über die geplanten Slices abgedeckt? Wenn nicht: ergänze Slices.
- Execute pro Slice atomar. Pro Slice ein Commit. Forward-Only-DB-Migrations mit Inverse-SQL als Kommentar.
- Nach jeder Slice: Verify-Gate. Erst nach grünem Verify zur nächsten.
3. UI-Bauen ohne Subframe (Phase-1-Bootstrap)
Wichtig: Der finale UI-Workflow läuft über Subframe (Designer baut → Subframe-Output → AI-Agent integriert via Adapter). Aber jetzt baust du UI mit den vorhandenen Komponenten der Boilerplate — sauber, austauschbar, testbar.
Ziel: Geerkens-tauglich aussehende UI, die später ohne Logik-Bruch durch Subframe-Output ersetzt werden kann.
Was du verwenden darfst
| Layer | Quelle |
|---|---|
| Primitives | shadcn/ui + Radix-UI (alle @radix-ui/*-Pakete sind in der Boilerplate) |
| Icons | lucide-react |
| Tabellen | bestehende components/ui/table.* aus Boilerplate-packages/ui |
| Forms | react-hook-form + zod (bereits in Deps) |
| Charts | recharts oder @tremor/react |
| Tipp-Trigger / Suche | kbar |
| Editor | TipTap (für Notizen, Marketing-Editor) |
| Drag-&-Drop | react-beautiful-dnd / xyflow (für Automation-Editor) |
| @react-pdf/renderer | |
| Touch-Signatur | signature_pad |
| Tailwind 4 | bereits konfiguriert |
Was du NICHT machst
- ❌ KEIN Subframe-MCP-Aufruf für irgendwas in Phase 1.
- ❌ KEIN
packages/ui-subframe-Inhalt füllen — das Verzeichnis bleibt leer (oder mit Dummy-README), bis der Designer kommt. - ❌ KEINE Custom-CSS-Stylesheets pro Komponente — Tailwind-Utility-Klassen.
- ❌ KEINE eigenen Component-Libraries erfinden — nur shadcn/Radix-Composites.
Wie du UI strukturierst
Genau gleich wie es später mit Subframe sein wird — die Layer-Trennung ist jetzt schon Pflicht, sonst funktioniert der spätere Hot-Swap nicht:
app/routes/<modul>/<route>.tsx → Loader baut View-Model, rendert <Page vm={...} actions={{...}} />
packages/view-models/src/<modul>/*.vm.ts → Pure Funktion (entity, ctx) → VM, mit Zod-Schema
packages/ui-hivegrid/src/pages/<modul>/... → React-Component, baut auf shadcn/Radix mit Tailwind, KEIN Server-Code
packages/ui-hivegrid/src/components/... → Wiederverwendbare Composites (Tabellen, Karten, Modale)
Components in packages/ui-hivegrid/src/pages/<modul>/<Component>.tsx empfangen IMMER:
vm: <ModulVM>als Prop (das View-Model)actions: { onX: (...) => ... }als Prop (Callbacks)
KEINE Hooks für Daten-Fetching innerhalb dieser Components. KEINE direkten Server-Imports.
Warum das den späteren Hot-Swap erlaubt
Wenn der Designer später Subframe-Output liefert, wird der Inhalt von packages/ui-hivegrid/src/pages/<modul>/<Component>.tsx durch den Subframe-konformen Adapter ersetzt — die Schnittstelle (Props: vm + actions) bleibt identisch. Routes, View-Models, Domain-Logik werden NICHT angefasst. Der Tausch ist atomar.
Genau deshalb gilt für die Phase-1-Bootstrap-UI:
- Kein direkter
useLoaderDatain Components (auch jetzt nicht!) - Kein direkter Prisma-Import (auch jetzt nicht!)
- Alle Texte über i18n (M003)
- Alle Aktionen als Callback-Props
- View-Model hat Zod-Schema, das später dem Subframe-Adapter den Vertrag erzwingt
Visuelles Anspruchsniveau
„Sauber genug zum Testen", nicht „pixel-perfect Designer-Output". Konkret:
- Konsistentes Spacing (Tailwind 4-Standard)
- Hell + Dunkel-Modus respektiert (nutze Tailwind
dark:) - DE-Long-Strings testen (47-Zeichen-Buttons dürfen nicht überlaufen)
- Empty-States, Loading, Error mit Klartext (siehe AGENTS.md Punkt E)
- Mobile-Viewport-Test (kein Desktop-Only-Layout)
4. Pro Milestone — Pflicht-Deliverables (Definition of Done)
Aus jeder PLAN.md am Ende. In Stichpunkten:
Erreichbarkeit (siehe INTEGRATION-CONTRACTS.md §1)
- Sidebar-Eintrag in
packages/ui-hivegrid/src/app-shell/sidebar.config.tsmit Permission-Gate - Route registriert
- Breadcrumb für Detail-Routes
- Mobile-Tab-Bar-Eintrag falls relevant
- Customer-Portal-Sichtbarkeit explizit konfiguriert
Querschnitt-Wiring
- Audit (auto via M001 oder manuell)
- Activity-Stream via
logActivity(M045) - Notifications via
notify()(M011) - Search-Index in
indexed-entities.ts - Permission-Filter via
withTenantScope()+withPermission()(M004) - Feature-Flag-fähig (M006)
Code-Layer-Disziplin (PR-Block bei Verstoß)
- Loader baut VM; UI empfängt nur VM + Actions
- Keine Prisma-/Server-Imports in
packages/ui-hivegrid/** - Keine Direktimporte aus
packages/ui-subframeinapp/routes/**(ist eh leer in Phase 1) - Alle UI-Texte als i18n-Keys
Tests
- Unit-Test für VM-Builder mit Zod-Schema
- Smoke-Test in
e2e/smoke/<modul>.spec.ts - Hot-Swap-Drill grün (Smoke-Test gegen
packages/ui-mockaus M017) - Visual-Regression-Snapshot (M016)
Klartext
- Fehler-Texte aus M002-Catalog
- Empty/Loading/Error mit Klartext + nächster Aktion
- Permission-Denied → 404 statt 403
Rollback-Pfad
- Forward-Only-DB-Migration mit Inverse-SQL als Kommentar
- Atomic-Slice-Commits
- Feature-Flag vorhanden zum Abschalten ohne Deploy
Klick-Pfad zum Prüfen (steht in PLAN.md unten)
- 4-Schritt-Anleitung, wie der User die Funktion findet und testet
5. Drei harte Anti-Patterns (sofortiger PR-Block)
@prisma/clientoder~/dbinpackages/ui-hivegrid/**- Direktimport aus
packages/ui-subframeinapp/routes/**(das Paket ist Phase-1 leer, aber der Import-Pfad bleibt verboten) useLoaderData<typeof loader>()innerhalb vonpackages/ui-hivegrid/**
Plus: jede Erweiterung, die der Anti-Liste in _bmad-output/pflichtenheft/02-vision.md V.3 widerspricht. Vollständige Liste siehe dort.
6. EU-Stack — nicht verhandelbar
- KEIN
@ai-sdk/anthropic,@ai-sdk/openai,openai - KEIN
remix-auth-google, KEIN Apple-/Google-/Microsoft-Login (Phase 1) - JA Mistral primär, Scaleway sekundär, AlephAlpha tertiär
- JA Email+PW + Magic-Link + TOTP-2FA
- Hosting Scaleway (EU), DB in EU, Storage Scaleway-S3 (EU)
Wenn etwas im Boilerplate-Code noch US-Provider referenziert: STOP und an User melden — die Boilerplate sollte EU-sterilisiert sein.
7. Wenn du nicht weiterkommst
| Situation | Vorgehen |
|---|---|
| Pflichtenheft-Sektion ist mehrdeutig | STOP. Frage formulieren, an User. Kein Auto-Refactor. |
| Abhängigkeits-Milestone fehlt | STOP. An User: „M??? braucht M??? — wann fertig?" |
| Boilerplate hat Bug, der dich blockiert | STOP. Bug an User mit konkretem Pfad + Repro. |
| Anti-Listen-Punkt in PLAN.md gewünscht | STOP. Change-Request via docs/CHANGE-REQUESTS.md (M176). |
| Layer-Trennung lässt sich nicht einhalten | STOP. Architektur-Frage, nicht selber lösen. |
8. Erste konkrete Aufgabe
Beginne mit M001 (Audit-Log default). Lies:
docs/milestones/M001-audit-log-default/PLAN.md_bmad-output/pflichtenheft/03-architektur.mdSektion A.6AGENTS.mddocs/INTEGRATION-CONTRACTS.md(§5 Audit-Wiring, §6 — der Audit-Eintrag selbst gehört zu diesem Milestone)
Plane M001 in Slices, präsentiere den Plan, warte auf User-Bestätigung, dann Execute.
Nach M001 → M002 → ... in der Reihenfolge der Master-Liste, ABER: prüfe in jeder PLAN.md die Abhängigkeiten — manche Milestones lassen sich parallelisieren (siehe Wird benötigt von-Felder).
9. Was du dem User nach jedem Milestone meldest
Kurzer Statusbericht in dieser Form:
Milestone: M??? — <Titel>
Status: READY-TO-VERIFY | BLOCKED | NEEDS-USER-INPUT
Slices: X von Y abgeschlossen
Tests: Smoke ✓ / Hot-Swap-Drill ✓ / Visual-Regression: <Anzahl Diffs zu prüfen>
DoD-Score: N/14 erfüllt
Sidebar-Eintrag: <Gruppe> > <Eintrag>
Klick-Pfad zum Prüfen: <wie aus PLAN.md>
PROGRESS-TRACKER aktualisiert: ✓
Offene Punkte (falls relevant): <Liste>
10. Progress-Tracker-Pflicht (docs/PROGRESS-TRACKER.md)
Diese Datei ist Live-Übersicht für den User. Du updatest sie nach jedem Status-Wechsel:
Bei Milestone-Start
- Status in der Master-Tabelle:
⚪ NICHT-GESTARTET→🔵 IN-ARBEIT - Detail-Sektion gemäß Vorlage (Abschnitt „Vorlage" in der Tracker-Datei) anlegen — kopiere den Block, fülle Pflichtenheft-Bezug, leere Slice-Liste, leere DoD-Checkboxen ein
- Klick-Pfad-Block aus PLAN.md übernehmen, mit konkreten User-Typ + Sidebar-Pfad ausfüllen
Bei Slice-Abschluss
- In der Detail-Sektion die Slice abhaken mit Commit-Hash
- DoD-Checkboxen abhaken, sobald die jeweilige Pflicht erfüllt ist
- DoD-Score in der Master-Tabelle aktualisieren (z.B.
8/14)
Bei Milestone-Abschluss (alle DoD-Punkte erfüllt + Tests grün)
- Status in Master-Tabelle:
🔵 IN-ARBEIT→🟡 READY-TO-VERIFY - „Notes vom Agent"-Block in Detail-Sektion ausfüllen (was war nicht offensichtlich, was muss User wissen)
- STOP. Warte auf User-Sign-Off. Starte KEIN nächstes Milestone.
Nach User-Sign-Off
- User trägt selbst
🟢 SIGNED-OFF+ Datum in die Detail-Sektion ein - Du übernimmst diesen Status in die Master-Tabelle und beginnst das nächste Milestone
Konsistenz-Pflicht
- DoD-Score in Master-Tabelle muss zur Detail-Sektion passen
🟡 READY-TO-VERIFYohne 14/14 DoD = Inkonsistenz → korrigiere sofort- Mehr als 5 Milestones in
🔵 IN-ARBEITparallel → STOP, Fokus-Verlust → an User melden