Lebende Architektur-Dokumentation: Feature-Matrix, Datenmodell (aus Prisma), Entscheidungs-Log (aus ADRs), API-Routen und Deployment — automatisch aktuell.
Hero + 5 Sektionen + Footer, responsives Design, agile4d-Palette
NextAuth.js v4, Email Magic Link via Brevo, 6-stelliger OTP-Code, Demo-Zugang (tl@demo.4d / su@demo.4d)
Vier Rollen — ADMIN, SUPER_USER, TRANSFORMATION_LEAD, USER (Teilnehmer ohne Login)
Sessions-Liste, Detail mit QR-Code, Artefakt-CRUD, Vorbereitungsgrad
Sessions-Liste, Detail, Planungsformular, Observations-Page (Platzhalter)
Session-Code-Eingabe, Artefakt-Sammlung, Scale → Agreement → Matrix → Freitext
Web Speech API für Spracheingabe in Artefakt- und Freitext-Felder
Provider-agnostisch (DeepSeek/Ollama etc.), Privacy-Layer vorgeschaltet
Pattern-basierte PII-Erkennung + Maskierung vor AI-Calls, Presidio-vorbereitet
Server-generierter QR-Code (SVG), Kurzlink-Redirect zu Session
EnableChange Demo GmbH, TL/SU Demo-Accounts, 5 Artefakte, DEMO-4D
Auto-generierte Architektur-Dokumentation aus Prisma-Schema + ADRs
Architecture Decision Records in .pi/adr/ — jede Entscheidung dokumentiert + abgewogen
Responsive + größere Touch-Targets — weitere Tests nötig
Fünfte Bewertungsrunde — Inhalte von Ralf
Live-Aggregation der Teilnehmer-Daten auf /session/[code]/overview
Bewertungen in DB speichern (aktuell nur React-State)
Datenexport und -import für TL/SU
Kunden-Verwaltung mit TL/SU-Einladung
Automatisierte PostgreSQL-Backups via Cron
Automatischer Deploy bei Push
Auto-generiert aus prisma/schema.prisma · PostgreSQL auf Hetzner
UseridString@id @default(cuid()emailString@uniquenameString?emailVerifiedDateTime?imageString?roleString@default("USER")createdAtDateTime@default(now()updatedAtDateTime@updatedAtaccountsAccountsessionsSessionsessionUsersSessionUserinstancesAssessmentInstanceobservationsObservationartifactResponsesArtifactResponsesuperUserInstancesInstanceSuperUserVerificationTokenidentifierStringtokenString@uniqueexpiresDateTimeotpCodeString?otpAttemptsInt@default(0)createdAtDateTime@default(now()AccountidString@id @default(cuid()userIdStringtypeStringproviderStringproviderAccountIdStringrefresh_tokenString?@dbaccess_tokenString?@dbexpires_atInt?token_typeString?scopeString?id_tokenString?@dbsession_stateString?userUser@relation(fields: [userId], references: [id], onDelete: Cascade)Relationen: user
SessionidString@id @default(cuid()sessionTokenString@uniqueuserIdStringexpiresDateTimecreatedAtDateTime@default(now()userUser@relation(fields: [userId], references: [id], onDelete: Cascade)Relationen: user
AssessmentInstanceidString@id @default(cuid()nameStringslugString@uniquecreatedAtDateTime@default(now()updatedAtDateTime@updatedAtcreatedByIdStringcreatedByUser@relation(fields: [createdById], references: [id])sessionsAssessmentSessionsuperUsersInstanceSuperUserRelationen: createdBy
InstanceSuperUseridString@id @default(cuid()instanceIdStringuserIdStringaddedAtDateTime@default(now()instanceAssessmentInstance@relation(fields: [instanceId], references: [id])userUser@relation(fields: [userId], references: [id])Relationen: instance, user
AssessmentSessionidString@id @default(cuid()instanceIdStringsessionCodeString@uniquestatusString@default("pending")startedAtDateTime?completedAtDateTime?maxDurationInt@default(120)createdAtDateTime@default(now()instanceAssessmentInstance@relation(fields: [instanceId], references: [id])observationsObservationusersSessionUserartifactsSessionArtifactresponsesArtifactResponseRelationen: instance
SessionUseridString@id @default(cuid()sessionIdStringuserIdStringjoinedAtDateTime@default(now()sessionAssessmentSession@relation(fields: [sessionId], references: [id])userUser@relation(fields: [userId], references: [id])Relationen: session, user
ObservationidString@id @default(cuid()sessionIdStringartifactIdString?authorIdString?authorRoleStringcontentString@dbdimensionStringcreatedAtDateTime@default(now()sessionAssessmentSession@relation(fields: [sessionId], references: [id])artifactSessionArtifact?@relation(fields: [artifactId], references: [id])authorUser?@relation(fields: [authorId], references: [id])Relationen: session, artifact, author
SessionArtifactidString@id @default(cuid()sessionIdStringtitleStringdefinitionString@dbaddedByString@default("TL")sortOrderInt@default(0)createdAtDateTime@default(now()sessionAssessmentSession@relation(fields: [sessionId], references: [id])responsesArtifactResponseobservationsObservationRelationen: session
ArtifactResponseidString@id @default(cuid()sessionIdStringartifactIdStringuserIdString?roundTypeString@default("scale")valueJsoncreatedAtDateTime@default(now()sessionAssessmentSession@relation(fields: [sessionId], references: [id])artifactSessionArtifact@relation(fields: [artifactId], references: [id])userUser?@relation(fields: [userId], references: [id])Relationen: session, artifact, user
/api/auth/[...nextauth]/api/sessions/[sessionId]/artifacts/api/sessions/[sessionId]/artifacts/api/sessions/[sessionId]/artifacts/[artifactId]/api/sessions/plan/api/ai/chat/api/ai/check-artifact/api/ai/assist-textsrc/
app/
(site)/ Public pages (Landing, Session, Impressum, System)
(internal)/ Auth-geschützte Seiten (Admin, TL, SU)
api/ REST-API-Routen
components/
ui/ Button, Card, Input (Radix+CTA)
VoiceInput.tsx Spracheingabe
QRCodeSVG.tsx QR-Code-Generator
Header/Footer Public-Layout
hooks/ useAiAssist (useArtifactCheck, useFreeTextAssist)
lib/ prisma.ts, auth.ts, cn.ts, ai.ts, privacy.ts, system-data.ts
__tests__/ Unit-Tests + Prisma-Mocks
types/ speech-recognition.d.ts
prisma/ schema.prisma + Migrationen
.pi/
adr/ Architektur-Entscheidungen (ADRs)
ARCHITECTURE.md Dauerhafte Constraints
PLAN.md Aktuelle Roadmap
LEARNINGS.md Fehler + Erkenntnisse