Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 210 additions & 0 deletions .claude/rules/sprint-7-ui-ux-acceptance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
# Sprint 7 UI/UX Acceptance Rule

## Status und Lebenszyklus

- Status: **ACTIVE_TEMPORARY**
- Applies to: EasyTree Jira Sprint 7, **Sprint ID 579**
- Primary acceptance issue: **EYT-148** („Sprint 7: Admin- und
Mitarbeiter-User-Journeys vollständig mit Playwright und realer Persistenz
abnehmen")
- Wächter: `apps/api/test/sprint7-acceptance-rule-guardrails.test.ts`
(Pflichtjob `unit-tests`) — Entfernen, Umbenennen oder wesentliches
Abschwächen dieser Datei macht CI rot.

**Removal Condition:** Diese Regel darf erst entfernt oder archiviert werden, nachdem Sprint 7 in Jira formal PO-abgenommen und geschlossen ist und alle wiederverwendbaren Anforderungen in dauerhafte Frontend-Qualitätsregeln überführt wurden.

## Quellen-Autorität (SSoT)

Diese Regel ist eine **Ausführungsregel für Coding Agents** — sie ist KEINE
neue Produkt-SSoT und ersetzt weder Jira noch Confluence.

- **Jira** (Projekt `EYT`, Board 72) besitzt Sprint-, Scope- und
Acceptance-Wahrheit.
- **Confluence** besitzt die Design-/Architektur-Baselines: Seite `8814623`
(„EasyTree – Basisdesign v2.0: Werkbank & Feld – ruhig verdichtet") und
Seite `8486960` („EasyTree – Zwei-Client-Architektur und Admin-Kalender").
- **GitHub** (`DYAI2025/EasyTree`, `origin/master`) besitzt Code-, Branch- und
CI-Wahrheit.
- **Runtime-Evidenz** besitzt Deployment- und Runtime-Wahrheit.
- **Coding-Agent-Ausgaben sind keine SSoT.**

Vor jeder Sprint-7-Arbeit den aktuellen Jira-/GitHub-/Confluence-Stand frisch
lesen; Auftragsprämissen veralten vor der Ausführung.

## Product Truth

Sprint 7 liefert finale produktive Oberflächen: Admin/Werkbank **Desktop-first**,
Mitarbeiter/Feld **Mobile-Web-first**.

Nicht zulässig als Produktabnahme: Clickdummies, Fake-Daten, Mockserver,
Netzwerk-Fixtures als Ersatz für reale Journeys, Placeholder-Screens,
synthetische Erfolgsmeldungen, LocalStorage-/Clientzustände als operative
Wahrheit. Nicht implementierte Backend-/Domainfähigkeiten dürfen nicht durch UI
vorgetäuscht werden.

## Bestehende Testarchitektur

Vor Änderungen mindestens inspizieren: `apps/web/e2e/`,
`apps/web/playwright.config.ts`, `apps/web/playwright.harness.config.ts`,
`apps/web/e2e/auth-journey/`.

Der einfache `web-smoke` ohne echte API/DB ist kein vollständiger
Sprint-7-Abnahmenachweis. Für Acceptance-Journeys ist die vorhandene
Real-Stack-Infrastruktur zu bevorzugen:

Browser → Next/Web → reale API → reale Authentifizierung → PostgreSQL/RLS

Keine zweite parallele E2E-Testarchitektur aufbauen, solange die vorhandene
erweiterbar ist.

## Test-per-Increment

Jede tatsächlich veränderte produktive Oberfläche muss, soweit für den Slice
relevant, beweisen: (1) reale Nutzerhandlung; (2) erwartetes sichtbares
Ergebnis; (3) echte autorisierte API-/Domain-Ausführung; (4) Reload bestätigt
Serverzustand; (5) bei relevanten gemeinsamen Zuständen zusätzlicher
Browserkontext; (6) Negativ-/Rechtereise; (7) finale Darstellung im
Basisdesign v2.0; (8) Responsive-Verhalten; (9) Accessibility;
(10) Screenshot aus der real ausgeführten Journey.

EYT-148 ist das finale aggregierte Gate, aber die Tests dürfen nicht bis zum
Sprintende aufgeschoben werden.

## Viewports

- Admin: Chromium `1440 × 900` und `1920 × 1080`.
- Mitarbeiter: Chromium Touch `320 × 800` und `375 × 812`.
- Sprint-Closeout zusätzlich gezielte WebKit-Smokes (Mitarbeiter `375 × 812`,
Admin `1440 × 900`), soweit die vorhandene Infrastruktur das robust zulässt.
- Keine unnötige vollständige Browsermatrix bauen.
- Reproduzierbare Acceptance-Läufe: Locale `de-DE`, Timezone `Europe/Berlin`.

## Accessibility

Für tatsächlich verwendete produktive Flächen prüfen: axe A/AA;
Tastaturbedienbarkeit; sichtbarer Fokus; sinnvolle semantische Reihenfolge;
Status nie ausschließlich über Farbe; kein unkontrolliertes horizontales
Seitenscrolling; mobile Hauptaktionen mindestens 56 px; Desktop-Aktionen
mindestens 40 px; keine erforderliche Hover-only-Bedienung auf Mobile;
`prefers-reduced-motion`; Klick-/Tastaturalternative für Drag-and-Drop.

**200-%-Zoom:** Ein automatisierter Reflow-Test ist zulässig, darf aber NICHT
als identisch mit realem Browserzoom bezeichnet werden. Der finale
PO-Acceptance-Report muss einen echten menschlichen 200-%-Zoom-Check als
Reviewpunkt enthalten.

## Zustände (States)

Wo der reale Vertrag den Zustand erzeugen kann: Loading, Empty, Error,
Forbidden, Unauthenticated, Stale, Partial, Retry. `Offline-read-only` nur
dort, wo eine reale fachliche Offline-Lesefähigkeit existiert — keine
Offline-Funktion erfinden, nur damit ein UI-State gezeigt werden kann.

## Visual Regression

Screenshots müssen aus realen Produktjourneys stammen. Keine Figma-, Penpot-,
Storybook- oder Mockup-Screenshots als Ersatz für Produktabnahme.

Verbindlicher Ablauf:

candidate screenshot → READY_FOR_PO_VISUAL_REVIEW → explicit human PO
approval → accepted golden baseline

Eine neue oder geänderte Golden Baseline benötigt explizite menschliche PO-Freigabe; ein automatisches Baseline-Update (etwa via --update-snapshots) ist verboten. Coding Agents dürfen einen Visual-Test niemals durch ein
Baseline-Update „reparieren".

## Browser Integrity

In positiven Journeys relevante Fehler überwachen: `pageerror`, unerwartete
`console.error`, unerwartete HTTP 5xx, fehlgeschlagene kritische Ressourcen,
Hydrationfehler, unerwartete Weiterleitungen. Negative Journeys müssen
erwartete 401/403- bzw. Forbidden-Zustände explizit beweisen.

## Autorisierung

Eine sichtbare Navigation oder Route verleiht niemals Rechte. Insbesondere:
Mitarbeiter erhalten keine Admin-/Kosten-/fremden Organisationsdaten; ohne
`costs.read` keine Kostenbeträge oder Kostensätze; Kosten-Navigation und
Kosteninhalte gemäß EYT-113 nur nach verifiziertem Recht. Serverseitige
Autorisierung bleibt bindend.

## EYT-148 Final Journey Gate

Der finale Sprint-7-Kandidat muss mindestens beweisen —

**Admin:** reales Login → zulässige Admin-Shell → Woche/Planung → realen
Einsatz anlegen → bestätigten Serverzustand sehen → Reload →
Konflikt-/Fehlerfall → konfliktfreien Plan veröffentlichen → veröffentlichten
Stand lesen → mit `costs.read` Kosten/Snapshot lesen → ohne `costs.read` kein
erfolgreicher Kosten-Zugriff.

**Mitarbeiter:** reales Login → Feld-Shell → Heute → ausschließlich eigene
autorisierte reale Daten → Woche, soweit der reale Employee-Read-Pfad
implementiert ist → Reload → gleicher Serverzustand → kein
Admin-/Kosten-/Fremddatenzugriff.

Noch nicht implementierte Fachfunktionen dürfen nicht als Fake-Journey ergänzt
werden.

## Testintegrität

### Reale Umgebung

Pflicht-Acceptance-Journeys laufen gegen eine isolierte
Nicht-Produktionsumgebung mit realer Authentifizierung, realer API und realem
PostgreSQL/RLS. Testdaten dürfen kontrolliert und reproduzierbar sein; die
Anwendung selbst darf keine Mock-/Fixture-Antworten als operative
Produktwahrheit verwenden.

### Gegenbeweis (Counterexample Proof)

Ein absichtlich gebrochener Auth-, Persistenz- oder Routingpfad muss mindestens einen passenden Journey-Test rot machen; ein grüner Test ohne nachgewiesene Fähigkeit, den relevanten Defekt zu erkennen, genügt nicht als EYT-148-Abnahmenachweis.

Die Gegenprobe erfolgt kontrolliert, reversibel und ausschließlich im
Test-/CI-Kontext — niemals durch Mutation einer produktiven Umgebung.

### Merge Blocking

Verpflichtende Journey-, Accessibility- und relevante Visual-Regression-Gates müssen vor finaler EYT-148-Abnahme tatsächlich merge-blockierend erzwungen sein; ein grüner freiwilliger CI-Job, den GitHub beim Merge ignorieren könnte, erfüllt dieses Acceptance-Gate nicht.

Stand heute erzwingt das aktive Ruleset die elf bestehenden CI-Kontexte
(inklusive `unit-tests`, in dem dieser Regel-Wächter läuft). Daraus folgt
NICHT, dass die vollständigen EYT-148-Journey-/Accessibility-/Visual-Gates
bereits existieren: Dieser Abschnitt beschreibt das erforderliche End-Gate für
EYT-148, keinen bereits erfüllten Zustand. Diese Gates werden im Verlauf von
Sprint 7 aufgebaut und sind spätestens vor finalem
`READY_FOR_PO_VISUAL_REVIEW` auf dem exakten Acceptance-Head grün und
merge-blockierend.

### Evidence Binding

Acceptance-Evidenz ist an den exakten Git-Head-SHA, die Umgebung,
Browser/Version, die Rolle und die relevanten Server-/Plan-/Snapshot-IDs
gebunden. Evidenz eines älteren Heads wird niemals auf einen neueren Commit
übertragen.

## PO Acceptance Evidence

Für den finalen Sprint-Kandidaten muss ein Evidence Package erzeugbar sein,
mindestens mit: `manifest.json`, `PO-ABNAHME.md`, Playwright-Ergebnis,
relevanten Server-/Plan-/Snapshot-IDs, Admin-Screenshots,
Mitarbeiter-Screenshots, State-Screenshots, Accessibility-Ergebnissen,
Visual-Diff-Ergebnissen, Traces bei Fehlern, Video der kanonischen
Admin-Journey, Video der kanonischen Mitarbeiter-Journey.

Das Manifest bindet mindestens: Git SHA, getestete Umgebung, Browser und
Version, Viewport, Rolle, Zeitpunkt, relevante Server-IDs,
Testdaten-/Seed-Bezug. Große Laufartefakte nicht ungeprüft dauerhaft ins
Repository committen; bevorzugt CI-Artefakte.

## Human Gate

Coding Agents dürfen technische Ergebnisse als PASS melden. Coding Agents
dürfen NICHT selbst setzen oder behaupten: „PO approved", „UX accepted",
„UI accepted", „design accepted", „Sprint 7 accepted".

Ein Coding Agent kann keine PO-/UI-/UX-Abnahme erzeugen; die visuelle und UX-seitige Sprintfreigabe ist Human-/PO-only.

Der höchste Agenten-Endstatus vor menschlicher Designabnahme lautet:

READY_FOR_PO_VISUAL_REVIEW
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,9 @@ _sprint2-transfer/
.open-next/
.wrangler/
.wrangler-dry/

# Claude-Code-Sitzungskonfiguration. Das Repo ist oeffentlich, und mit
# .claude/rules/ ist .claude/ erstmals teilweise getrackt: ohne diesen Eintrag
# veroeffentlicht ein `git add .claude` jeden spaeter in settings.local.json
# abgelegten Token. Dieselbe Falle wie penpot/ weiter oben.
/.claude/settings.local.json
19 changes: 19 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,25 @@ before acting on it. Do **not** use local `master` as the reference — compare
plus one shared deterministic validator. **EYT-91** is the seed-UUID bug. Publish itself is
explicitly deferred out of Sprint 4 ("Bewusst später" in EYT-50).

## Sprint 7 — Binding UI/UX Acceptance Gate (temporary)

Until Jira Sprint 7 (Sprint ID 579) is formally PO-accepted and closed,
`.claude/rules/sprint-7-ui-ux-acceptance.md` is binding for all Sprint-7
frontend/UI/UX/browser/accessibility/Playwright/visual-regression work. The
rule file contains the full executable contract; it is loaded into every
session via the import below.

@.claude/rules/sprint-7-ui-ux-acceptance.md

Key governance: acceptance journeys run the real Auth → API → PostgreSQL/RLS
path — no mocks, clickdummies or placeholders as product acceptance; EYT-148
is the final integrated UI/journey gate; Claude may report technical PASS but
can never create human PO acceptance — the highest agent state is
`READY_FOR_PO_VISUAL_REVIEW`; golden visual baselines require explicit PO
approval (never an automatic `--update-snapshots`); re-read the current
Jira/GitHub/Confluence state before acting. Guarded by
`apps/api/test/sprint7-acceptance-rule-guardrails.test.ts`.

## Commands

Node 22 (`.nvmrc`), pnpm 10.28.0 via corepack. **pnpm is the only permitted package manager.**
Expand Down
Loading
Loading