Harlekin addef20e16 Phase 9 abgeschlossen: Übersicht, Beobachtungsliste, helles Thema, Messung
Die Übersicht beantwortet vier Fragen, die man morgens hat: woran arbeite ich,
was ist fällig, wo hat jemand geschrieben, was hat sich getan. Jede Liste
läuft durch visibleCaseWhere - das ist der Ort, an dem eine unachtsame
Abfrage am ehesten eine Akte verrät. Ein Test prüft jede einzeln gegen eine zu
hoch eingestufte Akte. Der bisherige Inhalt ("Dein Zugang") steht jetzt unter
/zugang.

Beobachten ist eine Merkliste, kein Recht: nur was sichtbar ist, lässt sich
merken, und steigt eine Akte später über die eigene Stufe, verschwindet sie
aus der Liste, ohne dass jemand aufräumt.

Das helle Thema tauscht nur die semantische Ebene; die Grundpalette bleibt.
Die Klassifizierungsfarben sind für hellen Grund eine Spur dunkler, im Farbton
aber dieselben - eine Stufe muss in beiden Themen wiedererkennbar sein. Drei
Zustände, "wie das System" ist der Auslieferungszustand, und ein Skript im
Kopf setzt die Wahl, bevor das erste Mal gemalt wird.

Die Messung misst nicht den Nutzer. web-vitals schickt Zahlen und das
Routenmuster, keine Kennung und keinen konkreten Pfad: wer wann welche Akte
geöffnet hat, steht im Zugriffsprotokoll, und eine zweite Spur daneben wäre
eine Überwachungsfunktion ohne Auftrag. Ausgewertet wird Median und 75.
Perzentil, nicht der Mittelwert.

Mobil: die breiten Tabellen scrollen in sich, statt die Seite breiter zu
machen. Ein e2e-Test hält fest, dass keine Seite waagerecht überläuft.

scripts/restore-test.sh spielt eine Sicherung in eine Wegwerf-Datenbank und
prüft ausdrücklich, dass Regeln und Trigger mitkommen: eine Wiederherstellung
ohne entry_no_delete wäre eine Datenbank ohne die Zusicherung, um derentwillen
das System gebaut wird. Einmal durchgespielt, alles angekommen.

186 Tests im Web-Paket, 17 in der Datenbank, 7 im Worker, 54 e2e.
Grösste Route 116,2 von 120 kB.
2026-09-03 10:28:50 +02:00
2026-09-01 00:01:49 +02:00
2026-09-01 00:01:29 +02:00
2026-09-01 00:01:29 +02:00
2026-09-01 00:01:29 +02:00

AfiS-Aktensystem

Fallakten-, Personalakten- und Ermittlungsverwaltung für die Abteilung für innere Sicherheit eines SCP-RP-Servers. Anmeldung und Berechtigungen laufen vollständig über Discord.

Los geht's

  1. Ordner in ein leeres Git-Repository legen
  2. Discord-Application anlegen, Bot einladen, Server Members Intent aktivieren
  3. Claude Code im Projektordner starten

Gehostet wird als ein Dockge-Stack auf dem Homeserver. Die fertige compose.yaml und die Einrichtungsschritte stehen in docs/11-betrieb.md. Die .env wird nicht im Repository gepflegt, sondern im .env-Reiter von Dockge; .env.example ist nur die Vorlage.

Claude Code liest CLAUDE.md von selbst. Die Fachdokumente liegen in docs/, der Bauplan in TASKS.md.

Erste Anweisung an Claude Code

Lies CLAUDE.md und alle Dateien in docs/. Fass in fünf Sätzen zusammen, was gebaut wird, und nenn mir alles, was in den Dokumenten widersprüchlich oder unklar ist, bevor du anfängst. Baue noch nichts.

Danach Phase für Phase aus TASKS.md. Siehe docs/12-arbeiten-mit-claude-code.md.

Aufbau

CLAUDE.md      Projektanweisung, wird automatisch gelesen
TASKS.md       Bauplan in neun Phasen
docs/          Fachdokumente, dazu 13-entscheidungen.md
compose.yaml   Der Dockge-Stack
.env.example   Vorlage für den .env-Reiter in Dockge

web/           Next.js 15, App Router
worker/        discord.js, Rollen-Abgleich
pdf/           Playwright, PDF-Erzeugung
packages/db/   Prisma-Schema, Migrationen, Seed
docker/        Dockerfiles für web, worker und pdf

Lokal entwickeln

Node 22 und pnpm 9.

corepack enable && pnpm install

docker run -d --name afis-db -e POSTGRES_DB=afis -e POSTGRES_USER=afis \
  -e POSTGRES_PASSWORD=afis -p 5434:5432 postgres:16-alpine

cp .env.example .env
# DATABASE_URL und DIRECT_DATABASE_URL auf localhost:5434 zeigen lassen

pnpm --filter @afis/db run build   # erzeugt den Prisma-Client
pnpm db:deploy && pnpm db:seed
pnpm dev

Prüfen wie die CI:

pnpm lint && pnpm typecheck && pnpm test
pnpm test:e2e

pnpm test legt sich eine eigene Datenbank afis_test an und lässt die Entwicklungsdatenbank in Ruhe. Grund in docs/13-entscheidungen.md.

Betrieb kurz gefasst

Verwaltung Dockge, ein Stack namens afis unter /opt/stacks/afis/
Erreichbarkeit Cloudflare Tunnel, kein offener Port am Router
Aktualisieren Dockge → Stack → Update, Migration läuft automatisch mit
Backup zwei Dauerläufer mit Cron: nächtlicher Dump plus restic offsite
S
Description
Aktensystem für die AfiS aus dem SCP-RP, mit Discord-Synchro
Readme
1.4 MiB
Languages
TypeScript 91.4%
PLpgSQL 4.5%
CSS 2.3%
JavaScript 0.7%
Shell 0.6%
Other 0.5%