README erklärt das Projekt, Zusicherungen unter Nummern

Die README beschrieb das Vorgehen statt der Anwendung. Sie erklärt jetzt, was
das System kann, wie es aufgebaut ist und wie man es lokal und im Betrieb
fährt.

Dazu tragen die acht Zusicherungen dort ihre Nummern - Berechtigungsprüfung in
der Abfrage, kein DELETE im Verlauf, Protokollpflicht ab Stufe 3, Magic Bytes
statt Dateiendungen, Skelette statt Spinner, Existenz als Information, keine
Geheimnisse im Repository, keine Einmal-Container. Achtzehn Dateien verwiesen
für ebendiese Regeln auf eine Datei, die nicht mehr mitverfolgt wird; sie
zeigen jetzt auf die README.

Arbeitsunterlagen bleiben auf der Platte, werden aber nicht mehr verfolgt. Die
Ausschlussregel steht in .git/info/exclude statt in .gitignore, damit sie nicht
selbst im Repository steht.
This commit is contained in:
Harlekin
2026-09-04 08:42:07 +02:00
parent 18c9a71fda
commit 38be773636
20 changed files with 80 additions and 48 deletions
@@ -139,7 +139,7 @@ ALTER TABLE "DocumentSectionVersion" ADD CONSTRAINT "DocumentSectionVersion_sect
--
-- Dieselbe Zusicherung wie beim Verlaufseintrag: kein DELETE, weder über
-- die Anwendung noch über rohes SQL. Wer ein Dokument loswerden will, zieht
-- es zurück; der Grabstein bleibt sichtbar. Siehe CLAUDE.md, harte Regel 2.
-- es zurück; der Grabstein bleibt sichtbar. Siehe Zusicherung 2 der README.
-- ===========================================================================
CREATE RULE document_no_delete AS ON DELETE TO "Document" DO INSTEAD NOTHING;
+3 -3
View File
@@ -512,7 +512,7 @@ model PersonnelFile {
}
/// Auswahl der Status-Etiketten, im Adminbereich pflegbar. Die Namen sind
/// Daten, keine Oberflaechentexte — siehe CLAUDE.md, Sprachkonvention.
/// Daten, keine Oberflaechentexte — siehe die Sprachkonvention: Code englisch, Oberflaeche deutsch.
model PersonnelStatusTag {
key String @id // "tot", "gekuendigt"
name String // "Tot", "Gekuendigt"
@@ -573,7 +573,7 @@ model FoundationClearance {
/// eine CHECK-Bedingung in der Migration.
///
/// Anhaengend wie ein Verlaufseintrag: es gibt kein DELETE, eine Zuruecknahme
/// laesst einen Grabstein stehen. Siehe CLAUDE.md, harte Regel 2.
/// laesst einen Grabstein stehen. Siehe Zusicherung 2 der README.
model Document {
id String @id @default(uuid(7))
documentNumber String @unique // SAV-2026-0007
@@ -821,7 +821,7 @@ model RecentView {
/// Eine Tabelle statt eines direkten Aufrufs, weil der Worker ein eigener
/// Prozess ist und laufen oder auch gerade neu starten kann. Ein Eintrag, der
/// nicht rausging, bleibt liegen und wird beim naechsten Durchlauf abgeholt.
/// Kein Einmal-Container, siehe CLAUDE.md, harte Regel 8.
/// Kein Einmal-Container, siehe Zusicherung 8 der README.
///
/// **Hier steht nie ein Inhalt.** Nur Kennungen und die Art des Ereignisses;
/// den Text baut der Worker daraus, und Discord kennt unsere Klassifizierung
+1 -1
View File
@@ -10,7 +10,7 @@ import { resolveTestDatabaseUrl } from '../dist/testDatabase.js'
* Wird von `pnpm test` vorgeschaltet.
*
* **Neu aufsetzen, nicht nur anlegen.** Verlaufseinträge, Akten und
* Protokollzeilen sind nach harter Regel 2 aus CLAUDE.md nicht löschbar — was
* Protokollzeilen sind nach Zusicherung 2 der README nicht löschbar — was
* ein Testlauf anlegt, bleibt für immer stehen. Nach einigen Dutzend Läufen
* standen 2487 Akten in der Datenbank, und Tests, die eine auf zehn Einträge
* begrenzte Liste prüfen, fanden ihre eigene Akte nicht mehr darin. Solche
+1 -1
View File
@@ -3,7 +3,7 @@
* Entwicklung.
*
* Der Grund ist nicht Ordnungsliebe: `CaseEntry`, `CaseEntryVersion` und
* `AuditLog` lassen sich nach Regel 2 aus CLAUDE.md nicht löschen. Was ein Test
* `AuditLog` lassen sich nach Zusicherung 2 der README nicht löschen. Was ein Test
* dort anlegt, bleibt für immer stehen. In einer gemeinsamen Datenbank
* verstopfen die Testakten binnen weniger Läufe die Fallliste, und aufräumen
* lässt sich das nicht mehr.
+1 -1
View File
@@ -2,7 +2,7 @@ import { afterAll, beforeAll, describe, expect, it } from 'vitest'
import { createPrismaClient, type PrismaClient } from '../src/index.js'
/**
* Prüft die harten Regeln aus CLAUDE.md dort, wo sie wirklich gelten: in der
* Prüft die harten Regeln der README dort, wo sie wirklich gelten: in der
* Datenbank. Die Anwendung kann man umgehen, diese Regeln nicht.
*
* Läuft gegen eine echte Postgres-Instanz. Ohne DATABASE_URL wird übersprungen.