Fundament: Doku, Testanpassungen, Restbereinigung

- AGENTS.md und README.md auf Craftvia umgeschrieben (Regeln, Andockpunkte,
  Stack mit Garage, tsx-Tests, Gate, Demo-Logins)
- ISMS-Dokumente entfernt (SPEC, Prototypen, Lane-Prompts, Übergaben, Konzepte
  Incidents/Framework); Fundament-Doku (Deploy, Sicherheit, Backup, Identity) bleibt
- Fundament-Tests an Craftvia-Rollen/Branding angepasst, Resttreffer
  certvia/isms in Skripten und Kommentaren bereinigt

Gate: prisma generate, migrate status, tsc, lint, build, 22/22 Testskripte grün.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 11:44:58 +02:00
co-authored by Claude Opus 5
parent ba7d6ac3ed
commit 1701db0a62
20 changed files with 131 additions and 73 deletions
+3 -4
View File
@@ -10,7 +10,7 @@ import { closeMailProvider } from "../src/server/mail/provider-smtp";
* SEC1 — Abnahmetest der Mail-Strecke (`npx tsx scripts/test-mail.ts`).
*
* Prüft ohne laufende App:
* 1. Alle Templates rendern in de und en, HTML **und** Text, mit Certvia-
* 1. Alle Templates rendern in de und en, HTML **und** Text, mit Craftvia-
* Branding und Dachmarken-Fußzeile.
* 2. Transaktionsmails tragen KEINEN Abmelde-Hinweis, Benachrichtigungen schon.
* 3. Ein echter Versand landet im lokalen SMTP (Mailhog/Mailpit) und das
@@ -41,7 +41,6 @@ const SAMPLE = {
email_changed_notice: { name: "Erika Muster", newEmail: "neu@example.test", when: "heute" },
mfa_changed: { name: "Erika Muster", change: "aktiviert", when: "heute" },
notification: { name: "Erika Muster", subject: "Neuer Auftrag", body: "Text", actionUrl: "https://example.test/t", eventType: "work_order_assigned" },
incident_notification: { name: "Erika Muster", subject: "Neuer Vorfall gemeldet", body: "Text", actionUrl: "https://example.test/i", refNo: "INC-2026-0042" },
test: { name: "Erika Muster", when: "heute" },
} as const;
@@ -54,8 +53,8 @@ async function main() {
const ok =
r.subject.length > 0 &&
r.html.includes("<!doctype html>") &&
r.html.includes("Certvia") &&
r.html.includes("Ein Produkt von GEFIM") &&
r.html.includes("Craftvia") &&
r.html.includes("Handwerk. Digital auf Kurs.") &&
r.text.length > 0 &&
!r.text.includes("<");
check(`${key}/${locale}`, ok, `subject="${r.subject}"`);