Communitygithub.com

click-path-audit

Verfolgt jeden benutzersichtbaren Button/Berührungspunkt durch seine vollständige Zustandsänderungssequenz, um Fehler zu finden, bei denen Funktionen einzeln funktionieren, sich aber gegenseitig aufheben, einen falschen Endzustand erzeugen oder die UI inkonsistent hinterlassen.

Was ist click-path-audit?

Dieses Skill (click-path-audit) adressiert eine spezifische Lücke in traditionellen Debugging-Methoden: Es findet Fehler, die durch das Zusammenspiel von Zustandsänderungen entstehen – nicht durch einzelne fehlerhafte Funktionen. Während statische Code-Analyse und systematisches Debugging prüfen, ob Funktionen existieren, nicht abstürzen und den richtigen Typ zurückgeben, übersehen sie Interaktionen wie sequenzielles Rückgängigmachen, Race Conditions in asynchronen Aufrufen und Seiteneffekte in shared State (z. B. Zustand, Redux, Context). Die Methode analysiert jeden interaktiven Touchpoint (onClick, onSubmit, etc.), erstellt eine Karte aller State-Stores mit ihren Seiteneffekten und prüft dann systematisch, ob spätere Aufrufe frühere Zustände zurücksetzen, asynchrone Aufrufe in der falschen Reihenfolge auflösen, stale Closures auftreten oder Zustandsübergänge fehlen. Das Skill ist ideal, wenn Benutzer von „kaputten Buttons” berichten, aber systematisches Debuggen keine Fehler findet – oder nach größeren Refactorings von shared State. Es unterstützt agentenbasierte Aufteilung für große Anwendungen und lässt sich in Entwicklungsworkflows integrieren.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/click-path-audit

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

/click-path-audit – Verhaltensfluss-Audit

Finde Fehler, die statische Code-Lektüre übersieht: Interaktionseffekte von Zuständen, Wettlaufsituationen zwischen sequenziellen Aufrufen und Handler, die sich stillschweigend gegenseitig rückgängig machen.

Das Problem, das dies löst

Traditionelles Debugging prüft:

  • Existiert die Funktion? (fehlende Verdrahtung)
  • Stürzt sie ab? (Laufzeitfehler)
  • Liefert sie den richtigen Typ? (Datenfluss)

Aber es prüft NICHT:

  • Stimmt der endgültige UI-Zustand mit dem überein, was der Button-Text verspricht?
  • Macht Funktion B stillschweigend rückgängig, was Funktion A gerade getan hat?
  • Hat Shared State (Zustand/Redux/Context) Seiteneffekte, die die beabsichtigte Aktion aufheben?

Realbeispiel: Ein „Neue E-Mail”-Button rief setComposeMode(true) und dann selectThread(null) auf. Beide funktionierten einzeln. Aber selectThread hatte einen Seiteneffekt, der composeMode: false zurücksetzte. Der Button tat nichts. 54 Fehler wurden durch systematisches Debugging gefunden – dieser eine wurde übersehen.


Wie es funktioniert

Für JEDEN interaktiven Berührungspunkt im Zielbereich:

1. IDENTIFIZIERE den Handler (onClick, onSubmit, onChange, etc.)
2. VERFOLGE jeden Funktionsaufruf im Handler, IN REIHENFOLGE
3. Für JEDEN Funktionsaufruf:
   a. Welchen Zustand LIEST er?
   b. Welchen Zustand SCHREIBT er?
   c. Hat er SEITENEFFEKTE auf Shared State?
   d. Setzt/löscht er Zustand als Seiteneffekt zurück?
4. PRÜFE: Macht ein späterer Aufruf eine Statusänderung eines früheren Aufrufs RÜCKGÄNGIG?
5. PRÜFE: Entspricht der ENDZUSTAND dem, was der Benutzer vom Button-Text erwartet?
6. PRÜFE: Gibt es Wettlaufsituationen (async-Aufrufe, die in falscher Reihenfolge auflösen)?

Ausführungsschritte

Schritt 1: State-Stores kartieren

Erstelle vor der Prüfung eines Berührungspunkts eine Seiteneffekt-Karte für jede Aktion des State-Stores:

Für jeden Zustand-Store / React-Context im Gültigkeitsbereich:
  Für jede Aktion/setter:
    - Welche Felder setzt sie?
    - Setzt sie andere Felder als Seiteneffekt ZURÜCK?
    - Dokumentiere: actionName → {sets: [...], resets: [...]}

Dies ist die entscheidende Referenz. Der „Neue E-Mail”-Fehler war unsichtbar, ohne zu wissen, dass selectThread composeMode zurücksetzt.

Ausgabeformat:

STORE: emailStore
  setComposeMode(bool) → sets: {composeMode}
  selectThread(thread|null) → sets: {selectedThread, selectedThreadId, messages, drafts, selectedDraft, summary} RESETS: {composeMode: false, composeData: null, redraftOpen: false}
  setDraftGenerating(bool) → sets: {draftGenerating}
  ...

GEFÄHRLICHE ZURÜCKSETZUNGEN (Aktionen, die Zustand löschen, der ihnen nicht gehört):
  selectThread → setzt composeMode zurück (gehört zu setComposeMode)
  reset → setzt alles zurück

Schritt 2: Jeden Berührungspunkt prüfen

Für jeden Button/Toggle/Formular-Absenden im Zielbereich:

BERÜHRUNGSPUNKT: [Button-Text] in [Componente:Zeile]
  HANDLER: onClick → {
    call 1: functionA() → sets {X: true}
    call 2: functionB() → sets {Y: null} RESETS {X: false}  ← KONFLIKT
  }
  ERWARTET: Benutzer sieht [Beschreibung dessen, was der Button-Text verspricht]
  IST: X ist false, weil functionB es zurückgesetzt hat
  URTEIL: FEHLER — [Beschreibung]

Prüfe jedes dieser Fehlermuster:

Muster 1: Sequenzielles Rückgängigmachen

handler() {
  setState_A(true)     // setzt X = true
  setState_B(null)     // Seiteneffekt: setzt X = false zurück
}
// Ergebnis: X ist false. Erster Aufruf war sinnlos.

Muster 2: Asynchrone Wettlaufsituation

handler() {
  fetchA().then(() => setState({ loading: false }))
  fetchB().then(() => setState({ loading: true }))
}
// Ergebnis: Endzustand von loading hängt davon ab, welcher zuerst auflöst

Muster 3: Stale Closure

const [count, setCount] = useState(0)
const handler = useCallback(() => {
  setCount(count + 1)  // erfasst veralteten count
  setCount(count + 1)  // gleicher veralteter count – erhöht um 1, nicht um 2
}, [count])

Muster 4: Fehlender Zustandsübergang

// Button sagt „Speichern”, aber Handler validiert nur, speichert nie
// Button sagt „Löschen”, aber Handler setzt nur ein Flag, ohne die API aufzurufen
// Button sagt „Senden”, aber der API-Endpunkt wurde entfernt/ist defekt

Muster 5: Bedingter toter Pfad

handler() {
  if (someState) {        // someState ist zu diesem Zeitpunkt IMMER false
    doTheActualThing()    // wird nie erreicht
  }
}

Muster 6: useEffect-Interferenz

// Button setzt stateX = true
// Ein useEffect überwacht stateX und setzt es auf false zurück
// Benutzer sieht nichts passieren

Schritt 3: Bericht

Für jeden gefundenen Fehler:

CLICK-PATH-NNN: [Schweregrad: KRITISCH/HOCH/MITTEL/NIEDRIG]
  Berührungspunkt: [Button-Text] in [Datei:Zeile]
  Muster: [Sequenzielles Rückgängigmachen / Asynchrone Wettlaufsituation / Stale Closure / Fehlender Übergang / Toter Pfad / useEffect-Interferenz]
  Handler: [Funktionsname oder inline]
  Ablauf:
    1. [Aufruf] → setzt {Feld: Wert}
    2. [Aufruf] → SETZT ZURÜCK {Feld: Wert}  ← KONFLIKT
  Erwartet: [was der Benutzer erwartet]
  Ist: [was tatsächlich passiert]
  Lösung: [spezifische Lösung]

Umfangskontrolle

Dieses Audit ist aufwendig. Begrenze den Umfang angemessen:

  • Komplettes App-Audit: Verwenden beim Start oder nach größerem Refactoring. Starte parallele Agenten pro Seite.
  • Einzelseiten-Audit: Verwenden nach dem Erstellen einer neuen Seite oder nachdem ein Benutzer einen defekten Button meldet.
  • Store-fokussiertes Audit: Verwenden nach Änderungen an einem Zustand-Store – prüfe alle Konsumenten der geänderten Aktionen.

Empfohlene Agentenaufteilung für die gesamte App:

Agent 1: Kartiere ALLE State-Stores (Schritt 1) – dies ist der gemeinsame Kontext für alle anderen Agenten
Agent 2: Dashboard (Aufgaben, Notizen, Tagebuch, Ideen)
Agent 3: Chat (DanteChatColumn, JustChatPage)
Agent 4: E-Mails (ThreadList, DraftArea, EmailsPage)
Agent 5: Projekte (ProjectsPage, ProjectOverviewTab, NewProjectWizard)
Agent 6: CRM (alle Untertabs)
Agent 7: Profil, Einstellungen, Tresor, Benachrichtigungen
Agent 8: Management-Suite (alle Seiten)

Agent 1 MUSS zuerst abgeschlossen sein. Seine Ausgabe ist die Eingabe für alle anderen Agenten.


Wann verwenden

  • Nach systematischem Debugging, das „keine Fehler” findet, aber Benutzer defekte UI melden
  • Nach Änderungen an einer Aktion eines Zustand-Stores (alle Aufrufer prüfen)
  • Nach jedem Refactoring, das Shared State betrifft
  • Vor einem Release, bei kritischen Benutzerabläufen
  • Wenn ein Button „nichts tut” – dies ist DAS Werkzeug dafür

Wann NICHT verwenden

  • Für API-Fehler (falsche Antwortstruktur, fehlender Endpunkt) – verwende systematisches Debugging
  • Für Styling/Layout-Probleme – visuelle Inspektion
  • Für Leistungsprobleme – Profiling-Werkzeuge

Integration mit anderen Skills

  • Nach /superpowers:systematic-debugging ausführen (welches die anderen 54 Fehlertypen findet)
  • Vor /superpowers:verification-before-completion ausführen (welches überprüft, ob Reparaturen funktionieren)
  • Speist sich in /superpowers:test-driven-development ein – jeder hier gefundene Fehler sollte einen Test erhalten

Beispiel: Der Fehler, der dieses Skill inspirierte

ThreadList.tsx „Neue E-Mail”-Button:

onClick={() => {
  useEmailStore.getState().setComposeMode(true)   // ✓ setzt composeMode = true
  useEmailStore.getState().selectThread(null)      // ✗ SETZT ZURÜCK composeMode = false
}}

Store-Definition:

selectThread: (thread) => set({
  selectedThread: thread,
  selectedThreadId: thread?.id ?? null,
  messages: [],
  drafts: [],
  selectedDraft: null,
  summary: null,
  composeMode: false,     // ← dieses stille Zurücksetzen hat den Button getötet
  composeData: null,
  redraftOpen: false,
})

Systematisches Debugging hat es übersehen, weil:

  • Der Button hat einen onClick-Handler (nicht tot)
  • Beide Funktionen existieren (keine fehlende Verdrahtung)
  • Keine Funktion stürzt ab (kein Laufzeitfehler)
  • Die Datentypen sind korrekt (kein Typkonflikt)

Click-Path-Audit fängt es, weil:

  • Schritt 1 kartiert selectThread setzt composeMode zurück
  • Schritt 2 verfolgt den Handler: Aufruf 1 setzt true, Aufruf 2 setzt false zurück
  • Urteil: Sequenzielles Rückgängigmachen – Endzustand widerspricht der Buttonabsicht

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Verwandte Skills