Zum Hauptinhalt springen

Test-Übersicht (Taktano) — alle automatischen Prüfungen

Kernaussage: Dies ist die lebende, vollständige Liste aller automatischen Tests, Selbsttests und CI-Gates des Repos — was sie prüfen, wie man sie lokal ausführt und in welchem CI-Job sie laufen. Verbindliche Regel (OP-DOCS-9 / CLAUDE.md §Tests & CI): Jede neue oder entfernte automatische Prüfung wird hier mitgeführt — je PR gegenprüfen (wie CHANGELOG/HANDOFF/Timesheet). Ein mechanischer Warn-Check (scripts/check-doc-consistency.sh) flaggt test:*-Scripts, die in tests.d/ fehlen.

Erzeugt aus tests.d/ — nie von Hand editieren (TKT-D-865, drkv BP-2): eine Zeile = eine Datei tests.d/<NNNN>-<slug>.md; die Tausenderstelle ist die Tabelle (1 Server · 2 Smokes · 3 Client · 4 E2E · 5 Solver · 6 Gates), <N>000-…-kopf.md trägt Abschnitt + Tabellenkopf. Gebaut nach dem Merge (dokumente-nachziehen.yml).

Zielgruppen: IT-Dev/Architektur · IT-Ops · DevOps (CI/CD). Prinzip: Tests laufen on-demand lokal und in CI (.github/workflows/ci.yml, Node 22 / Python 3.12). Neue Tests beiden Wegen hinzufügen (Script + CI-Job) und als Fragment in tests.d/ eintragen.

Die meisten Server-/Client-Tests sind reine, netzfreie Selbsttests (tsx …-demo.ts mit assert-Prüfungen); sie brauchen keine laufende Umgebung. „Smoke" = führt einen echten Ablauf einmal durch (kein Assert-Gate, aber Durchlauf-Nachweis).


1. Server-Selbsttests (server/, npm run test:*)​

Reine Kern-Tests mit assert. CI-Job Server (typecheck + scheduler-spike), sofern nicht anders vermerkt.

BefehlPrüftOP / §-Bezug
npm run test:teilplanSchritt-granulare Reservierung§6
npm run test:do-migrationsDO-Blob-Migrations-Registry: Voll-Migration + Idempotenz + Versions-GatingOP-DATA-1 / D5-2
npm run test:archivGenerisches Archiv-Flag — nurAktive blendet archivierte aus, referenzstabilOP-CRUD-1 C1
npm run test:preisAuftragspreis = Summe der Leistungs-GrundpreiseOP-R7-6
npm run test:running-processArchivierung stört laufende Prozesse nicht (Solver läuft, kein Schritt verloren)OP-CRUD-1 C4 / E-CRUD-3
npm run test:nacharbeitQS-Nacharbeit fließt als Zusatzschritt durch Scheduler+Mapping, verschiebt FertigstellungOP-UX-3
npm run test:qs-nacharbeitQS-Nacharbeit direkt/zuweisbar — Stufen-Schwellwerte, Auto-Erledigen-Härtung, Abnahme-GateOP-QS-4
npm run test:abnahmeQS-Vollständigkeits-Gate vor Abholung (alle Schritte erledigt+dokumentiert, kein Mangel unbehoben — offen/in Nacharbeit blocken, OP-QS-1)OP-QS-GATE
npm run test:step-gateSequenz-Backstop (istAktuellerSchritt/istOffenerSchritt): nur der Schritt am Front der offenen Reihenfolge ist abschließbar (laufende immer aktuell, echte Parallel-Schritte teilen die früheste Startzeit), out-of-order-Abschluss serverseitig abgelehnt (Defense-in-Depth zum Client-Gating)OP-STEP-1
npm run test:fairnessOP-OPT-7-Fairness aus Abwesenheits-HistorieOP-AUDIT-1 Slice 1 / OP-OPT-7
npm run test:vorschlagVorschlags-IDs / Lifecycle§7
npm run test:preemptionPreemption-Rang + Unterbrechbarkeit§6
npm run test:notfallNotfall/Schaden-Alert — Hard-Stop laufender Schritte + erzwungene Eskalation + Fahrzeug-Sperre; regulärer Klärfall sperrt nicht; keine Herabstufung; Notfall-Beweisfoto-Pflicht (Freigabe erst mit ≥1 Foto); Lösen hebt die Sperre aufOP-ALERT-1
npm run test:mangel-statusMangel-Status-Workflow offen→in_nacharbeit→behoben (markieren idempotent + kein Rückschritt; behoben bei Schritt-Abschluss; Abnahme-Gate blockt bis behoben)OP-QS-1
npm run test:beweisfotoBeweisfotos am Mangel (M05) — Schritt-Fotos projiziert/isoliert + mangel-eigene Fotos; Pflicht-Foto: schwerer/kritischer Mangel braucht ≥1 Beweisfoto (auch nach Behebung), erfüllbar über Schritt-Foto ODER mangel-eigenes Foto → Abnahme-Gate blockt sonst; leicht/mittel ohne ZwangOP-QS-1
npm run test:konflikteWeitere Konflikt-Typen: Überbuchung (Slot-Kapazität) · Skill-Lücke (Engpass ≤1 Träger) · Standzeit-Verletzung · Mitarbeiter fehlt · Arbeitsplatz fehlt · Sperre kollidiert · Fahrzeug in gesperrter Bucht (parkendes Auto in nicht-aktiver Bucht) · Fahrzeug vor kommender Sperre (Vorlauf) · Sperre-Validierung (validiereSperren)OP-R8-1, OP-UMPARK-2
npm run test:konflikt-autoloese„Alle automatisch lösen": Hebel-Rang (skip>eil>unterbrechen>abholtermin) + Sicherheits-Prüfung (kein neu verursachter Konflikt)OP-R8-7 Slice 1
npm run test:editOptimistische Nebenläufigkeit (revVeraltet/naechsteRev): Speichern auf veralteter Basis-Version wird erkannt (erster Schreiber gewinnt, monotone rev); ohne baseRev rückwärtskompatibelOP-EDIT-1
npm run test:pinbuildProblem trägt Pins (Gantt-Direktverschiebung 3b)—
npm run test:ausfallAusfall-Kategorisierung (Pause/Geschlossen/Krank/Urlaub/Wartung) + Gantt-Ausfall-Fenster (ganttAusfallFenster: Gantt-Schritte, mind. bis heute, ± 7 Tage Puffer — RISK-28)—
npm run test:bereitschaftÜberlauf/Bereitschaft zählt nicht zur Default-VerfügbarkeitOP-OPT-7 Slice 2
npm run test:schicht-reserveAufräum-Reserve am Schichtende (aufraeumReserveMin, Default 30, admin-konfigurierbar): verkürzt die planbare Verfügbarkeit am spätesten Slot (nicht an Pausen-Slots) → wirkt via avail auf TS-Scheduler UND CP-SAT-Solver; erzeugt ein „Aufräumen"-Gantt-Band; Klemmung 0…120OP-SCHICHT-1
npm run test:indoorIndoor-Trocknung-Pflicht verengt allowedBays (CP-SAT↔TS-Parität)F07a
npm run test:overflowFolierbucht-als-Überlauf-Parkplatz im buildProblemOP-OPT-5 Slice 2
npm run test:planvergleichplaeneIdentisch — Szenario-Konvergenz auf echter ZuweisungOP-OPT-6
npm run test:autooptAuto-Anwenden-Kriterium der Event-Re-Opt — nur terminneutrale Pareto-Verbesserungen (keiner später, ≥1 früher)OP-OPT-9
npm run test:eligibilitySkills/Niveau/Vertrauen steuern Solver-Eignung + PlanOP-R1-1 Phase E
npm run test:optimizing„Optimierung läuft…" endet nur bei vorgerücktem rechenStempel (30-s-Ping bricht nicht ab)—
npm run test:insightsInsights-Engine (True-North-Antworten, inkl. zeitbasierter Auslastungs-Quote — belegt ∩ verfügbar gekappt, Fenster heute + 14 Tage (auslastungsFenster, Z1), zählt alle Aufträge außer abgebrochen (schritteFuerAuslastung, F2); Nacht-Halle-Check nachtHalleReste — hochwertige Fahrzeuge ≥ Schwelle nicht in der Halle; Nacht-Halle-Konfig nachtHalleKonfigEffektiv/istNachtHalleSlot — Schwelle-Klemmung + Bucht-Allowlist vs. Indoor-Fallback)OP-AI-4 Säule 3 / OP-SCHICHT-1
npm run test:tageskapazitaetFreie Kapazität je Kalendertag (tagesKapazitaet): Tagesraster · Teilung am Tagesrand (Schritt über Mitternacht) · geschlossene Tage (keine Schicht ⇒ offen=false, Quote 0 statt NaN) · Tagessummen = Fenstersumme der Auslastungs-Quote (eine Wahrheit für Kalender und Kachel)OP-UX-4 / OP-AI-4
npm run test:subtractIntervall-subtract (Scheduler-Grundbaustein): die lineare Implementierung liefert exakt dasselbe wie die frühere quadratische (20 000 deterministische Zufallsfälle inkl. Null-Länge-Randfällen) und bleibt bei 10 Jahren × 2 Slots/Tag unter 500 msRISK-28, OP-OBS-1
npm run test:last-altbestandLast mit großem Alt-Datenbestand (3 Jahre Betrieb, ~4 400 Aufträge / >20 000 Teilschritte auf Seed-MA/-Buchten): Auslastungs-Quote (auslastungsQuoteAusBestand, derselbe Kern wie im DO) und Gantt-Ausfall-Fenster/-Bänder liefern mit 3 Jahren Historie exakt dasselbe wie mit 3 Monaten (deterministisch — fängt eine Rückkehr zur Ganze-Historie-Rechnung, per Gegenprobe belegt) + Zeitbudget je < 1 s (Quote/Bänder, Kapazitäts-Prognose)RISK-28, RISK-25
npm run test:assistant-retrievalDoku-Retrieval-Kern (Keyword-Ranking + Berechtigungsfilter + Index)OP-DOCS-2
npm run test:assistant-toolsAssistent-Tool-Call-Schleife (Dispatch je Werkzeug, Feedback-Referenz, Rundenlimit)OP-AI-4 §6
npm run test:assistant-feedbackFeedback→GitHub-Issue-Mapping (Titel/Body/Labels, kein Klartext-PII) + Issue-Suche + Feedback-Übersicht (Listen-Pfad · Route-Rücklese · offen/geschlossen-Mapping · Tooltip-Details/Bild-Extraktion detailsAusIssueBody/bilderAusIssueBody)OP-DOCS-7
npm run test:annahme-parseEin-Satz-Annahme-Parsing (Takt-Kommando): LLM-Tool-Schema enum-gebunden an den echten Leistungs-Katalog + defensive Antwort-Validierung (kein erfundener Katalog-Eintrag, kaputte Zeiten verworfen)OP-UX-4
npm run test:matchingHybrid-Matching Live-Daten: Token-Matching + semantische Rangfolge (Cosine, Schwelle/topK)OP-AI-4
npm run test:corsCORS-Allowlist für Cross-Origin-Frontends (Doku-Widget, credentials, kein *)OP-DOCS-2
npm run test:leistungLeistungsnachweise/Mängel → Mitarbeiter-Statistik & ErfahrungOP-R1-2
npm run test:progressionSkill-Niveau-Progression (per-Skill-XP + XP-gegatete Aufstiegs-Vorschläge)OP-R1-3
npm run test:prozessEditierbare Prozessschritt-Skill-Anforderungen wirken auf buildProblem.eligibleOP-R3-3
npm run test:kostenInfra-Kosten-Aggregation (je Dienst/Monat, Trend, Top-Posten, Mehrwährung) + Provider-MapperOP-COST-1 Sicht B / OP-COST-2
npm run test:authAnmeldung: Rolle→Fähigkeit fail-closed (jede unbekannte Eingabe ⇒ keine Rechte), E-Mail-Normalisierung (eine Adresse = ein Konto), Magic-Link-Mail (Link in Text und HTML, escaped, Gültigkeit genannt), Versand dormant ohne Binding/Absender + Fehler wird gemeldet statt geworfen, Diagnose-Cookie-Parsing (cookieNamenAus: nur Namen, nie Werte — kein Token-Leak), WS-Handshake-Token (signeWsToken/verifiziereWsToken: Round-Trip, falsches Secret/manipulierte Signatur/kaputtes Format/Ablauf ⇒ null, kein Klartext im Token), Magic-Link-Zwischenseite (zuBestaetigungsUrl: Mail-Link zeigt auf /anmelden/bestaetigen statt auf den token-verbrauchenden Verify-Pfad; Token/callbackURL bleiben erhalten), Landing-Host-Weiche (istLandingHost: taktano.com/www.taktano.com ⇒ true, app.taktano.com ⇒ false — Wurzeldomain zeigt Landing-Page, App-Host die App), Live-Diagnose (messeLiveVerbindung: Dauer vs. 4-s-WS-Limit, Zeitlimit ⇒ ok:false statt Hängen, DO-Ausnahme ⇒ Fehlertext) · Mail-Deckel je Konto (RL-2: Fixed-Window-Kern — Limit greift, Fenster läuft ab, Zeitsprung rückwärts hebt ihn nicht auf; dormant ohne D1)OP-AUTH-1
npm run test:obsLogger-Wrapper (Scrubbing/Level/child/Sink-Isolation) + OTLP-Logs/Metrics-PayloadOP-LOG-1 / OP-OBS-1
npm run test:obs-clientClient-Telemetrie-Mapper: Payload-Härtung (Level-Whitelist, Anzahl-Deckel, Längen) + Mapping → taktano-client (PII-Scrubbing)OP-OBS-1 Slice C1

2. Server-Smokes (server/)​

Führen einen echten Ablauf einmal durch (Durchlauf-Nachweis). CI-Job Server.

BefehlPrüftBezug
npm run spikeScheduler-Spike (Greedy-Angebotsmodus) läuft durch§5.2.2
npm run operativOperatives Modell (Auftrag-Lifecycle inkl. Selbsttests Klärfall/Klärungs-Engine-Routing (melden-pausiert · zurück · QS-Sprung · ab-hier-weiter · Einschub · Abbruch)/Zuweisung/Fahrzeugannahme-Check-in/Umpark-Platzierung (G-4)/Vier-Augen (Prüfschritt-Erkennung · Ausführenden-Set · Verletzung · Chef-Freigabe))§5.1 · OP-R3-1 · OP-UX-5 · OP-UMPARK-1 · OP-QS-6
npm run replanEilauftrag-VerdrängungOP-R7-3
npm run solveGlobaler Optimierer (Reihenfolge-Suche)§6.2
npm run solve:cpsatCP-SAT-Solver-Demo (nur lokal, nicht in CI — braucht SOLVER_URL/Service)A-5

3. Client-Tests (client/)​

CI-Job Client (Selbsttests + Build + E2E in einem Job, TKT-OP-CI-3).

BefehlPrüftBezug
npm run test:bildgatePre-Upload-Schutz-Kern (Qualität · Verpixelung · NSFW-Gate · Markierungen)OP-QS-2 / OP-FEEDBACK-1
npm run test:fotoqueueOffline-Foto-Upload-Queue-Zustandsmaschine (Upload→Registrierung→Original→fertig, Offline-Halt)OP-OFFLINE-1 Stufe C
npm run test:queueQueue-Reihenfolge der Ressourcen-/persönlichen Queues (läuft→pausiert→geplant nach Plan-Start · Positions-Nummern · frei-ab-Sentinel null)OP-OPT-9
npm run build (ng build)Angular-Produktions-Build kompiliert fehlerfrei—

4. E2E-/UI-Tests (client/, Playwright — echter Full-Stack)​

Browser-Tests (Chromium) gegen den echten lokalen Full-Stack: wrangler dev serviert den gebauten Angular-Client + Worker + Durable Object + WebSocket-Live-State mit Seed-Daten (lokal ohne Cloudflare Access → der WS verbindet, HTTP 101; produktiv stirbt er am Access-302). Lokal: npm run e2e (in client/ — baut den Client + startet wrangler dev selbst). Im CI-Job Client (Selbsttests + Build + E2E, TKT-OP-CI-3), hängt am ci-gate (blockt Merge; läuft bei Client- oder Server-Änderung). Config: client/playwright.config.ts; Specs: client/e2e/*.spec.ts. OP-E2E-1.

SpecPrüftBezug
e2e/smoke.spec.tsApp bootet, WebSocket verbindet live, Seed-Entität sichtbar, kein „Nicht verbunden"-Banner (Regressions-Wächter für den Produktiv-WS-Fehler)OP-E2E-1 / OP-OFFLINE-1
e2e/navigation.spec.tsAlle vier True-North-Workspaces (Lage/Fluss/Takt/Team) öffnen + rendern; kein Verbindungs-Fehler beim NavigierenOP-E2E-1
e2e/rolle.spec.tsRollen-Gate end-to-end: werker sieht die Administration gesperrt, chef schaltet sie frei (Rolle → Fähigkeit → ?rolle=-WS-Query → Server-Gate)OP-E2E-1 / OP-AUTH-1
e2e/annahme.spec.tsKern-Fluss „Auftrag in einem Satz": Overlay → Beispiel → Server-Dry-Run (Machbarkeit/Slot/Reserve/Preis) → Annehmen → Server-Antwort („<AU-…> ist im Takt." oder klarer „Annahme abgelehnt"-Toast). Geprüft wird der End-to-End-Round-Trip (Server antwortet, UI reagiert), nicht die Machbarkeits-Entscheidung selbst (umgebungsabhängig, Solver/State); „keine Antwort" = WS-/Round-Trip-Bruch → Fehler. Zweiter Test: Bausteine per Dropdown mit Suche wählen/korrigieren (freier Kundenname · Leistung aus dem echten Katalog). Dritter Test: Termin-Bausteine — Monatskalender sichtbar, Tippen im datetime-local schließt ihn nicht, Enter übernimmt den getippten Termin, der Abholungs-Kalender startet im Monat der Anlieferung und lässt sich nicht davor zurückblättern, Popup vollständig im Fenster (Regressions-Wächter für die Review-Funde F-1…F-4). Vierter Test: der Kalender trägt die Tages-Auslastung aus dem Server-State (insights.kapazitaetTage) samt LegendeOP-E2E-1 / OP-UX-4
e2e/a11y.spec.tsBarrierefreiheit (axe, WCAG 2.0/2.1 A+AA) über die vier Workspaces — blockt bei serious/critical, außer dem als OP-A11Y-1 zurückgestellten systemischen Alt-Bestand (color-contrast · nested-interactive · no-focusable-content, als Annotation protokolliert). Jede neue/andere serious/critical-Regel blockt. Bezug BFSG/EN 301 549OP-E2E-1 / OP-A11Y-1 / OP-REDESIGN-1
e2e/dialog-fokus.spec.tsOverlay-Grundlage (TKT-OP-UX-8 Etappe 3 / UI-5): der Fokus liegt beim Öffnen im Dialog, die Tab-Falle hält ihn dort, nach dem Schließen steht er wieder auf dem öffnenden Knopf — und die Dialogfläche trägt kein transform (sonst säße ein aus ihr geöffnetes position:fixed-Popup wieder in ihrem Clipping, F-4). Verifiziert negativ: ohne die Direktive tkOverlayFokus schlägt der Test fehl. Dritter Fall (Etappe 5): das Feedback-Formular trägt role="dialog"/aria-modal, hält den Fokus und lässt sich mit Esc schließen — stellvertretend für die sechs Overlays, die vorher keine Dialog-Semantik hatten; der Assistent bleibt dabei role="complementary" (kein Dialog). Zweiter Fall (CodeRabbit-Nachzug): nach einem Inhalts-Wechsel im offenen Dialog (Annahme-Overlay: Eingabe → Erfolgs-Ansicht) bleibt der Fokus drin — vorher fiel er auf <body> und das nächste Tab landete hinter dem DialogTKT-OP-UX-8 / OP-A11Y-1
e2e/touch-tastatur.spec.tsBedienbarkeit mit Finger und Tastatur (TKT-OP-UX-8 Etappe 4 / UI-6 · UI-7): kein Bedienelement unter 24 px (WCAG 2.2 2.5.8) über acht Screens — gemessen an der echten Bounding-Box, nicht am CSS; die drei begründeten Ausnahmen (Gantt-Blöcke „Essential“, Inline-Links „Inline“, kompakte Fortschritts-Kette „Equivalent“) stehen als Liste im Test, damit eine neue Ausnahme durch ihn muss. Dazu: Pfeiltasten/Bild↓ im Monatskalender, und Esc schließt das Dropdown ohne den Dialog dahinterTKT-OP-UX-8 / OP-A11Y-1
e2e/termin-feld.spec.tsTermin-Feld im Annahme-Overlay (TKT-OP-UX-8 Etappe 6 / UI-11 · UI-12): das Uhrzeit-Feld ist ein Textfeld (kein datetime-local mehr, also kein Browser-Locale) und liest 8 · 08 · 8:30 · 830 · 0830 · 8.30 · 17:45 · 23:59; eine unbrauchbare Eingabe lässt das Popup offen, markiert aria-invalid und nennt ein Beispiel statt still zu verwerfen; das Popup klappt nach oben auf und verdeckt damit nicht mehr Slot, Preis und „Annehmen"TKT-OP-UX-8 / OP-UX-4
e2e/konflikte-klaerfaelle.spec.tsKonflikte & Klärfälle (TKT-OP-UX-9): die Zahl am Tab ist die Summe der Gruppen darunter (und bei 0 steht genau ein Leer-Zustand, keine kopflose Restliste); gleichartige Konflikte erscheinen als eine Zeile je Art, deren Fall-Zahlen die Gruppe ergeben, und aufgeklappt stehen alle Einzelfälle wieder da; ein Zustand wird in Liste und Detail gleich benannt, und die Primäraktion des Klärfall-Details ist nicht grün (--tk-green, seit OP-REDESIGN-1 ist Rot die Primärfarbe). Der dritte Fall legt sich seine Datenlage über den echten Pfad selbst an (Annahme-Check-in → Klärfall eskaliert melden) und nimmt sie danach über die Klärungs-Engine zurück. Alle vier Zusicherungen einzeln negativ gegengeprüftTKT-OP-UX-9 / OP-R8-1
e2e/zeitpunkt-feld.spec.tsZeitpunkt-Feld statt datetime-local (TKT-OP-UX-8 UI-11 / O-3), geprüft am Gantt-Dialog „Schritt verschieben": deutsches Format wird gelesen und auf die Normalform gebracht, kein natives Feld mehr im DOM, und ein nicht existierender Tag (31.02.) wird gemeldet (aria-invalid + Hinweis) statt still verworfen — die Eingabe bleibt stehenTKT-OP-UX-8

5. Solver-Service (solver-service/, Python)​

CI-Job Solver-Service (CP-SAT model self-test).

BefehlPrüftBezug
python model.pyCP-SAT-Modell löst eingebettetes Beispiel + AssertsA-5

6. Gates & Konsistenz-Checks (scripts/)​

Befehl / ScriptPrüftCI-JobBlockt?
npm run typecheck (tsc --noEmit)Server-TypeScript typkorrektServerja
bash scripts/check-no-console.shKein rohes console.* im Laufzeitpfad (Logger-Wrapper-Pflicht)Serverja
bash scripts/check-no-hex.shKeine rohen Hex-Farben (nur --tk-*-Tokens); Kommentar-Anteile (// · /* */ · <!-- -->) sind ausgenommen → PR-/Issue-Referenzen wie #409 lösen nicht falsch ausDesignja
bash scripts/check-no-radius.shKeine abgerundeten Ecken im Cockpit: weder Tailwind-rounded-* noch rohe border-radius-Werte — das Redesign ist radius 0 durchgehend (design/CLAUDE.md). Erlaubt bleiben var(--tk-radius-*) und 0; bewusste Formen (rotierender Lade-Ring) tragen den Marker tk-allow-radius. Kommentar-Anteile sind ausgenommen wie beim No-Hex-Gate (TKT-OP-UX-8 / OP-REDESIGN-1)Designja
bash scripts/check-type-scale.shKeine freien Schriftgrößen: weder text-[Npx] noch rohe font-size-Werte im Cockpit — nur die zehn Stufen der Skala (tk-fs-hero … micro) bzw. var(--tk-fs-*). Ausnahme über tk-allow-fs (TKT-OP-UX-8 / OP-REDESIGN-1)Designja
npm run test:zeiteingabe (client/)Nachsichtiges Lesen von Datum/Uhrzeit (TKT-OP-UX-8 UI-11 / O-3): 8 · 830 · 8.30 · 1.3.2027 9:30 · 1.3.27 · 1.3. werden gelesen, Unsinn abgelehnt — inklusive echter Kalenderprüfung (der 31.02. wird abgelehnt statt still auf den 03.03. zu rutschen) und Rundreise (was angezeigt wird, wird auch wieder gelesen)Clientja
node design/tokens/build.mjs + git difftokens.css nicht veraltet (aus tokens.json generiert, Dark+Light)Designja
npm run persistence:check (check-persistence.sh → check-do-state-coverage.mjs + check-drizzle.sh)DO-State-Coverage + Drizzle-Schema-StalenessServer (Persistenz-Gate-Schritt, TKT-OP-CI-3)ja
npm audit --omit=dev --audit-level=high (Server + Client)Keine High+-Vulns in Prod-DepsChecks (Security-Audit)ja
pip-audit (Solver)Keine bekannten Vulns im Python-SolverChecks (Security-Audit)ja
bash scripts/check-doc-consistency.sh [--strict]Doku↔Doku/Code-Konsistenz, zweistufig (OP-DOCS-14 Teil 3): hart, blockt mit --strict = tote Links · Version/Build-SoT; warnt = Konflikt-Marker-Reste · Landkarte-Vollständigkeit (bis 3 Ebenen, _-Partials aus) · _category_.json je Ordner · sidebar_position-Eindeutigkeit je Ordner · Zielgruppen-Parität (glossar.mjs↔Lesepfade.md) · Test-Übersicht-Vollständigkeit (Quelle tests.d/) · Log-Zeilenlängen > 2000 Z. · Footer-Rückfall-Wächter (README/HANDOFF ohne handgepflegtes „Letztes Update“-Datum, TKT-OP-PM-4) · Landkarte-Rücklink (gen-doc-footer.mjs --check) · Kopf-Standard architektur/ (im Block direkt nach der H1: Status · Bezug · Zielgruppe · True North + genau 1 Kernaussage je Doc, agents.md §2.1)Checks (Doku-Konsistenz)ja (--strict, am ci-gate)
node scripts/gen-doc-footer.mjs --checkJedes Leaf-Doc unter docs/ trägt den statischen „↩ Doku-Landkarte"-Rücklink (Generator ohne --check schreibt fehlende Footer; Timesheet/generierte Dateien ausgenommen)Doku-Konsistenz (Teil von check-doc-consistency)via Warn-Check
node --test scripts/gen-ops.test.mjsOffene Punkte aus Issues (TKT-D-862): Status-Ableitung (offen/in Arbeit/erledigt/verworfen), Alt-ID aus [OP-…]-Titel, Statistik + Grafik, eingefrorener ops/-Altbestand ohne Issue nur abgeschlossen — netzfrei; die Seite selbst baut dokumente-nachziehen.yml (kein Staleness-Gate mehr)Checks (Doku-Konsistenz)ja (blockt)
npm run sbom (Server + Client CycloneDX)SBOM-Erzeugung (Lieferkette)SBOM (nur auf main-Push)—
node scripts/check-r2-private.mjsR2-Bucket privat (kein öffentlicher Zugriff)Deployja (vor Deploy)
npm run test:grafana-dashboards (push-grafana-dashboards.mjs --check)grafana/dashboards/*.json valide (JSON · title/uid · uid eindeutig · API-Payload baubar) — der Push selbst läuft im Deploy-Job (dormant ohne GRAFANA_URL/GRAFANA_DASHBOARD_TOKEN)Server (Check) · Deploy (Push)ja (Check)
checks (Aggregator, Job ci-gate; bis 09-26 „CI Gate", TKT-D-863)Kein erforderlicher Job fehlgeschlagen (skipped = ok bei Docs-only); seit OP-DOCS-14 Teil 3 inkl. doc-consistencychecks (ci-gate)ja
Docusaurus-Build (docs-site, onBrokenLinks: 'throw')Kaputte Site-Links brechen den Doku-Deploy hart (Broken-Link-Gate)docs-deployja (Deploy-Pfad)
python3 -m unittest discover -s scripts -p 'test_*.py'Python-Tests der Nachzieh-Skripte: Timesheet-Summen (timesheet_summen.py, TKT-D-865 — Summe + ISO-KW-Verdichtung aus timesheet.d/, fail-closed ohne Dauer, Block idempotent) · Funktionsumfang (funktionsumfang_bauen.py, TKT-D-865 — Status aus dem Issue ✅/🟡/⛔, Gruppierung nach feature.d/_abschnitte.md, fail-closed ohne #Issue/mit Status im Fragment/unbekanntem Issue, echte Fragmente wohlgeformt) — netzfreiChecks (Doku-Konsistenz)ja (blockt)

7. Alles lokal ausführen​

# Server (im server/-Verzeichnis)
cd server
npm run typecheck
for t in teilplan do-migrations archiv preis running-process nacharbeit qs-nacharbeit \
abnahme fairness vorschlag preemption pin ausfall bereitschaft indoor overflow \
planvergleich autoopt eligibility optimizing insights assistant-retrieval assistant-tools \
assistant-feedback cors leistung progression prozess kosten obs obs-client; do npm run test:$t; done
npm run spike && npm run operativ && npm run replan && npm run solve

# Client (im client/-Verzeichnis)
cd ../client && npm run test:bildgate && npm run test:fotoqueue && npm run test:queue && npm run build

# Gates (im Repo-Wurzelverzeichnis)
cd .. && bash scripts/check-no-console.sh && bash scripts/check-no-hex.sh && bash scripts/check-no-radius.sh && bash scripts/check-type-scale.sh \
&& bash scripts/check-doc-consistency.sh

8. Regel: Übersicht mitführen (verbindlich)​

  • Neuer Test → Script in package.json und CI-Job in .github/workflows/ci.yml und ein Fragment tests.d/<NNNN>-<slug>.md (eine Tabellenzeile; freie Position in der passenden Tausender-Tabelle, Schritt 10).
  • Entfernter/umbenannter Test → das Fragment anpassen bzw. löschen — diese Seite nie direkt editieren.
  • Mechanischer Rückhalt: scripts/check-doc-consistency.sh warnt (blockt nicht), wenn ein test:*-Script aus server/package.json oder client/package.json in tests.d/ fehlt.
  • Der semantische Teil (stimmt „Prüft"/OP-Bezug?) bleibt Agenten-/Reviewer-Pflicht (OP-DOCS-9).

Bezug: CLAUDE.md §Tests & CI · docs/konventionen/agents.md · OP-DOCS-9 (Doku-Konsistenz) · .github/workflows/ci.yml.


↩ Zurück zur Doku-Landkarte · Lesepfade · Register (alle OPs)