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) flaggttest:*-Scripts, die intests.d/fehlen.Erzeugt aus
tests.d/— nie von Hand editieren (TKT-D-865, drkv BP-2): eine Zeile = eine Dateitests.d/<NNNN>-<slug>.md; die Tausenderstelle ist die Tabelle (1 Server · 2 Smokes · 3 Client · 4 E2E · 5 Solver · 6 Gates),<N>000-…-kopf.mdträ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.
| Befehl | Prüft | OP / §-Bezug |
|---|---|---|
npm run test:teilplan | Schritt-granulare Reservierung | §6 |
npm run test:do-migrations | DO-Blob-Migrations-Registry: Voll-Migration + Idempotenz + Versions-Gating | OP-DATA-1 / D5-2 |
npm run test:archiv | Generisches Archiv-Flag — nurAktive blendet archivierte aus, referenzstabil | OP-CRUD-1 C1 |
npm run test:preis | Auftragspreis = Summe der Leistungs-Grundpreise | OP-R7-6 |
npm run test:running-process | Archivierung stört laufende Prozesse nicht (Solver läuft, kein Schritt verloren) | OP-CRUD-1 C4 / E-CRUD-3 |
npm run test:nacharbeit | QS-Nacharbeit fließt als Zusatzschritt durch Scheduler+Mapping, verschiebt Fertigstellung | OP-UX-3 |
npm run test:qs-nacharbeit | QS-Nacharbeit direkt/zuweisbar — Stufen-Schwellwerte, Auto-Erledigen-Härtung, Abnahme-Gate | OP-QS-4 |
npm run test:abnahme | QS-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-gate | Sequenz-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:fairness | OP-OPT-7-Fairness aus Abwesenheits-Historie | OP-AUDIT-1 Slice 1 / OP-OPT-7 |
npm run test:vorschlag | Vorschlags-IDs / Lifecycle | §7 |
npm run test:preemption | Preemption-Rang + Unterbrechbarkeit | §6 |
npm run test:notfall | Notfall/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 auf | OP-ALERT-1 |
npm run test:mangel-status | Mangel-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:beweisfoto | Beweisfotos 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 Zwang | OP-QS-1 |
npm run test:konflikte | Weitere 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:edit | Optimistische Nebenläufigkeit (revVeraltet/naechsteRev): Speichern auf veralteter Basis-Version wird erkannt (erster Schreiber gewinnt, monotone rev); ohne baseRev rückwärtskompatibel | OP-EDIT-1 |
npm run test:pin | buildProblem trägt Pins (Gantt-Direktverschiebung 3b) | — |
npm run test:ausfall | Ausfall-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ügbarkeit | OP-OPT-7 Slice 2 |
npm run test:schicht-reserve | Aufrä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…120 | OP-SCHICHT-1 |
npm run test:indoor | Indoor-Trocknung-Pflicht verengt allowedBays (CP-SAT↔TS-Parität) | F07a |
npm run test:overflow | Folierbucht-als-Überlauf-Parkplatz im buildProblem | OP-OPT-5 Slice 2 |
npm run test:planvergleich | plaeneIdentisch — Szenario-Konvergenz auf echter Zuweisung | OP-OPT-6 |
npm run test:autoopt | Auto-Anwenden-Kriterium der Event-Re-Opt — nur terminneutrale Pareto-Verbesserungen (keiner später, ≥1 früher) | OP-OPT-9 |
npm run test:eligibility | Skills/Niveau/Vertrauen steuern Solver-Eignung + Plan | OP-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:insights | Insights-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:tageskapazitaet | Freie 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:subtract | Intervall-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 ms | RISK-28, OP-OBS-1 |
npm run test:last-altbestand | Last 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-retrieval | Doku-Retrieval-Kern (Keyword-Ranking + Berechtigungsfilter + Index) | OP-DOCS-2 |
npm run test:assistant-tools | Assistent-Tool-Call-Schleife (Dispatch je Werkzeug, Feedback-Referenz, Rundenlimit) | OP-AI-4 §6 |
npm run test:assistant-feedback | Feedback→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-parse | Ein-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:matching | Hybrid-Matching Live-Daten: Token-Matching + semantische Rangfolge (Cosine, Schwelle/topK) | OP-AI-4 |
npm run test:cors | CORS-Allowlist für Cross-Origin-Frontends (Doku-Widget, credentials, kein *) | OP-DOCS-2 |
npm run test:leistung | Leistungsnachweise/Mängel → Mitarbeiter-Statistik & Erfahrung | OP-R1-2 |
npm run test:progression | Skill-Niveau-Progression (per-Skill-XP + XP-gegatete Aufstiegs-Vorschläge) | OP-R1-3 |
npm run test:prozess | Editierbare Prozessschritt-Skill-Anforderungen wirken auf buildProblem.eligible | OP-R3-3 |
npm run test:kosten | Infra-Kosten-Aggregation (je Dienst/Monat, Trend, Top-Posten, Mehrwährung) + Provider-Mapper | OP-COST-1 Sicht B / OP-COST-2 |
npm run test:auth | Anmeldung: 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:obs | Logger-Wrapper (Scrubbing/Level/child/Sink-Isolation) + OTLP-Logs/Metrics-Payload | OP-LOG-1 / OP-OBS-1 |
npm run test:obs-client | Client-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.
| Befehl | Prüft | Bezug |
|---|---|---|
npm run spike | Scheduler-Spike (Greedy-Angebotsmodus) läuft durch | §5.2.2 |
npm run operativ | Operatives 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 replan | Eilauftrag-Verdrängung | OP-R7-3 |
npm run solve | Globaler Optimierer (Reihenfolge-Suche) | §6.2 |
npm run solve:cpsat | CP-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).
| Befehl | Prüft | Bezug |
|---|---|---|
npm run test:bildgate | Pre-Upload-Schutz-Kern (Qualität · Verpixelung · NSFW-Gate · Markierungen) | OP-QS-2 / OP-FEEDBACK-1 |
npm run test:fotoqueue | Offline-Foto-Upload-Queue-Zustandsmaschine (Upload→Registrierung→Original→fertig, Offline-Halt) | OP-OFFLINE-1 Stufe C |
npm run test:queue | Queue-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.
| Spec | Prüft | Bezug |
|---|---|---|
e2e/smoke.spec.ts | App 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.ts | Alle vier True-North-Workspaces (Lage/Fluss/Takt/Team) öffnen + rendern; kein Verbindungs-Fehler beim Navigieren | OP-E2E-1 |
e2e/rolle.spec.ts | Rollen-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.ts | Kern-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 Legende | OP-E2E-1 / OP-UX-4 |
e2e/a11y.spec.ts | Barrierefreiheit (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 549 | OP-E2E-1 / OP-A11Y-1 / OP-REDESIGN-1 |
e2e/dialog-fokus.spec.ts | Overlay-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 Dialog | TKT-OP-UX-8 / OP-A11Y-1 |
e2e/touch-tastatur.spec.ts | Bedienbarkeit 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 dahinter | TKT-OP-UX-8 / OP-A11Y-1 |
e2e/termin-feld.spec.ts | Termin-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.ts | Konflikte & 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üft | TKT-OP-UX-9 / OP-R8-1 |
e2e/zeitpunkt-feld.spec.ts | Zeitpunkt-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 stehen | TKT-OP-UX-8 |
5. Solver-Service (solver-service/, Python)
CI-Job Solver-Service (CP-SAT model self-test).
| Befehl | Prüft | Bezug |
|---|---|---|
python model.py | CP-SAT-Modell löst eingebettetes Beispiel + Asserts | A-5 |
6. Gates & Konsistenz-Checks (scripts/)
| Befehl / Script | Prüft | CI-Job | Blockt? |
|---|---|---|---|
npm run typecheck (tsc --noEmit) | Server-TypeScript typkorrekt | Server | ja |
bash scripts/check-no-console.sh | Kein rohes console.* im Laufzeitpfad (Logger-Wrapper-Pflicht) | Server | ja |
bash scripts/check-no-hex.sh | Keine rohen Hex-Farben (nur --tk-*-Tokens); Kommentar-Anteile (// · /* */ · <!-- -->) sind ausgenommen → PR-/Issue-Referenzen wie #409 lösen nicht falsch aus | Design | ja |
bash scripts/check-no-radius.sh | Keine 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) | Design | ja |
bash scripts/check-type-scale.sh | Keine 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) | Design | ja |
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) | Client | ja |
node design/tokens/build.mjs + git diff | tokens.css nicht veraltet (aus tokens.json generiert, Dark+Light) | Design | ja |
npm run persistence:check (check-persistence.sh → check-do-state-coverage.mjs + check-drizzle.sh) | DO-State-Coverage + Drizzle-Schema-Staleness | Server (Persistenz-Gate-Schritt, TKT-OP-CI-3) | ja |
npm audit --omit=dev --audit-level=high (Server + Client) | Keine High+-Vulns in Prod-Deps | Checks (Security-Audit) | ja |
pip-audit (Solver) | Keine bekannten Vulns im Python-Solver | Checks (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 --check | Jedes 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.mjs | Offene 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.mjs | R2-Bucket privat (kein öffentlicher Zugriff) | Deploy | ja (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-consistency | checks (ci-gate) | ja |
Docusaurus-Build (docs-site, onBrokenLinks: 'throw') | Kaputte Site-Links brechen den Doku-Deploy hart (Broken-Link-Gate) | docs-deploy | ja (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) — netzfrei | Checks (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.jsonund CI-Job in.github/workflows/ci.ymlund ein Fragmenttests.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.shwarnt (blockt nicht), wenn eintest:*-Script ausserver/package.jsonoderclient/package.jsonintests.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)