Communitygithub.com

click-path-audit

Traza cada botón/punto de interacción del usuario a través de su secuencia completa de cambios de estado para encontrar errores donde las funciones individualmente funcionan pero se cancelan entre sí, producen un estado final incorrecto o dejan la interfaz en un estado inconsistente. Úsalo cuando: la depuración sistemática no encontró errores pero los usuarios reportan botones rotos, o después de cualquier refactorización importante que toque stores de estado compartido.

¿Qué es click-path-audit?

Esta habilidad realiza una auditoría de flujo de comportamiento (click-path audit) para detectar errores de interacción de estado que el análisis de código estático tradicional no puede encontrar. Resuelve el problema de que funciones individualmente correctas se cancelan mutuamente debido a efectos secundarios en estado compartido, condiciones de carrera entre llamadas secuenciales, o manejadores que deshacen silenciosamente lo que otros hicieron. Es especialmente útil para Zustand, Redux o contextos de React. El proceso consta de tres pasos: 1) mapear todos los stores de estado y sus efectos secundarios, 2) auditar cada punto de interacción (botón, toggle, formulario) trazando todas las llamadas en orden y verificando patrones de error como deshacer secuencial, carrera asíncrona, clausura obsoleta, transición faltante, ruta muerta condicional e interferencia de useEffect, y 3) reportar cada error encontrado con severidad, patrón y solución. Funciona con Claude Code, Cursor y Codex, y se integra con otras habilidades como depuración sistemática y desarrollo guiado por pruebas.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

/click-path-audit — Auditoría de Flujo de Comportamiento

Encuentra errores que la lectura de código estático no detecta: efectos secundarios de interacción de estado, condiciones de carrera entre llamadas secuenciales y manejadores que se deshacen silenciosamente entre sí.

El Problema que Resuelve

La depuración tradicional verifica:

  • ¿Existe la función? (cableado faltante)
  • ¿Falla? (errores en tiempo de ejecución)
  • ¿Devuelve el tipo correcto? (flujo de datos)

Pero NO verifica:

  • ¿El estado final de la interfaz coincide con lo que promete la etiqueta del botón?
  • ¿La función B deshace silenciosamente lo que la función A acaba de hacer?
  • ¿El estado compartido (Zustand/Redux/context) tiene efectos secundarios que cancelan la acción deseada?

Ejemplo real: Un botón "Nuevo Correo" llamaba a setComposeMode(true) y luego selectThread(null). Ambas funcionaban individualmente. Pero selectThread tenía un efecto secundario que reseteaba composeMode: false. El botón no hacía nada. La depuración sistemática encontró 54 errores — este se pasó por alto.


Cómo Funciona

Para CADA punto de interacción en el área objetivo:

1. IDENTIFICAR el manejador (onClick, onSubmit, onChange, etc.)
2. TRAZAR cada llamada a función en el manejador, EN ORDEN
3. Para CADA llamada a función:
   a. ¿Qué estado LEE?
   b. ¿Qué estado ESCRIBE?
   c. ¿Tiene EFECTOS SECUNDARIOS en estado compartido?
   d. ¿Resetea/limpia algún estado como efecto secundario?
4. VERIFICAR: ¿Alguna llamada posterior DESHACE un cambio de estado de una llamada anterior?
5. VERIFICAR: ¿El estado FINAL es el que el usuario espera según la etiqueta del botón?
6. VERIFICAR: ¿Hay condiciones de carrera (llamadas asíncronas que resuelven en orden incorrecto)?

Pasos de Ejecución

Paso 1: Mapear Stores de Estado

Antes de auditar cualquier punto de interacción, construye un mapa de efectos secundarios de cada acción del store de estado:

Para cada store Zustand / contexto React en el ámbito:
  Para cada acción/setter:
    - ¿Qué campos establece?
    - ¿RESETEA otros campos como efecto secundario?
    - Documentar: nombreAcción → {establece: [...], resetea: [...]}

Esta es la referencia crítica. El error del botón "Nuevo Correo" era invisible sin saber que selectThread resetea composeMode.

Formato de salida:

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

RESETEOS PELIGROSOS (acciones que limpian estado que no les pertenece):
  selectThread → resetea composeMode (perteneciente a setComposeMode)
  reset → resetea todo

Paso 2: Auditar Cada Punto de Interacción

Para cada botón/alternador/envío de formulario en el área objetivo:

PUNTO DE INTERACCIÓN: [Etiqueta del botón] en [Componente:línea]
  MANEJADOR: onClick → {
    llamada 1: funciónA() → establece {X: true}
    llamada 2: funciónB() → establece {Y: null} RESETEA {X: false}  ← CONFLICTO
  }
  ESPERADO: El usuario ve [descripción de lo que promete la etiqueta del botón]
  REAL: X es false porque funciónB lo reseteó
  VEREDICTO: ERROR — [descripción]

Verifica cada uno de estos patrones de error:

Patrón 1: Deshacer Secuencial

handler() {
  setState_A(true)     // establece X = true
  setState_B(null)     // efecto secundario: resetea X = false
}
// Resultado: X es false. La primera llamada fue inútil.

Patrón 2: Carrera Asíncrona

handler() {
  fetchA().then(() => setState({ loading: false }))
  fetchB().then(() => setState({ loading: true }))
}
// Resultado: el estado final de loading depende de cuál resuelve primero

Patrón 3: Clausura Obsoleta

const [count, setCount] = useState(0)
const handler = useCallback(() => {
  setCount(count + 1)  // captura count obsoleto
  setCount(count + 1)  // mismo count obsoleto — incrementa en 1, no en 2
}, [count])

Patrón 4: Transición de Estado Faltante

// El botón dice "Guardar" pero el manejador solo valida, nunca guarda
// El botón dice "Eliminar" pero el manejador establece una bandera sin llamar a la API
// El botón dice "Enviar" pero el endpoint de la API fue eliminado/roto

Patrón 5: Ruta Muerta Condicional

handleMouseEnter() {
  if (someState) {        // someState es SIEMPRE false en este punto
    doTheActualThing()    // nunca se alcanza
  }
}

Patrón 6: Interferencia de useEffect

// El botón establece stateX = true
// Un useEffect observa stateX y lo resetea a false
// El usuario no ve que pase nada

Paso 3: Reportar

Para cada error encontrado:

CLICK-PATH-NNN: [severidad: CRÍTICO/ALTO/MEDIO/BAJO]
  Punto de Interacción: [Etiqueta del botón] en [archivo:línea]
  Patrón: [Deshacer Secuencial / Carrera Asíncrona / Clausura Obsoleta / Transición Faltante / Ruta Muerta / Interferencia de useEffect]
  Manejador: [nombre de la función o inline]
  Traza:
    1. [llamada] → establece {campo: valor}
    2. [llamada] → RESETEA {campo: valor}  ← CONFLICTO
  Esperado: [lo que el usuario espera]
  Real: [lo que realmente sucede]
  Solución: [solución específica]

Control de Alcance

Esta auditoría es costosa. Delimítala adecuadamente:

  • Auditoría completa de la aplicación: Úsala al lanzar o después de una refactorización importante. Lanza agentes paralelos por página.
  • Auditoría de una sola página: Úsala después de construir una página nueva o cuando un usuario reporte un botón roto.
  • Auditoría centrada en un store: Úsala después de modificar un store Zustand — audita todos los consumidores de las acciones modificadas.

División recomendada de agentes para aplicación completa:

Agente 1: Mapear TODOS los stores de estado (Paso 1) — este es contexto compartido para todos los demás agentes
Agente 2: Dashboard (Tareas, Notas, Diario, Ideas)
Agente 3: Chat (DanteChatColumn, JustChatPage)
Agente 4: Correos (ThreadList, DraftArea, EmailsPage)
Agente 5: Proyectos (ProjectsPage, ProjectOverviewTab, NewProjectWizard)
Agente 6: CRM (todas las subpestañas)
Agente 7: Perfil, Configuración, Bóveda, Notificaciones
Agente 8: Suite de Gestión (todas las páginas)

El Agente 1 DEBE completarse primero. Su salida es la entrada para todos los demás agentes.


Cuándo Usarlo

  • Después de que la depuración sistemática encuentre "sin errores" pero los usuarios reporten UI rota
  • Después de modificar cualquier acción de un store Zustand (verifica todos los llamantes)
  • Después de cualquier refactorización que toque estado compartido
  • Antes del lanzamiento, en flujos de usuario críticos
  • Cuando un botón "no hace nada" — esta es la herramienta para eso

Cuándo NO Usarlo

  • Para errores a nivel de API (forma de respuesta incorrecta, endpoint faltante) — usa depuración sistemática
  • Para problemas de estilo/diseño — inspección visual
  • Para problemas de rendimiento — herramientas de perfilado

Integración con Otras Habilidades

  • Ejecutar DESPUÉS de /superpowers:systematic-debugging (que encuentra los otros 54 tipos de errores)
  • Ejecutar ANTES de /superpowers:verification-before-completion (que verifica que las correcciones funcionan)
  • Alimenta /superpowers:test-driven-development — cada error encontrado aquí debería tener una prueba

Ejemplo: El Error que Inspiró Esta Habilidad

Botón "Nuevo Correo" en ThreadList.tsx:

onClick={() => {
  useEmailStore.getState().setComposeMode(true)   // ✓ establece composeMode = true
  useEmailStore.getState().selectThread(null)      // ✗ RESETEA composeMode = false
}}

Definición del store:

selectThread: (thread) => set({
  selectedThread: thread,
  selectedThreadId: thread?.id ?? null,
  messages: [],
  drafts: [],
  selectedDraft: null,
  summary: null,
  composeMode: false,     // ← este reseteo silencioso mató el botón
  composeData: null,
  redraftOpen: false,
})

La depuración sistemática lo pasó por alto porque:

  • El botón tiene un manejador onClick (no está muerto)
  • Ambas funciones existen (no falta cableado)
  • Ninguna función falla (sin error en tiempo de ejecución)
  • Los tipos de datos son correctos (sin desajuste de tipos)

La auditoría de click-path lo detecta porque:

  • Paso 1 mapea que selectThread resetea composeMode
  • Paso 2 traza el manejador: llamada 1 establece true, llamada 2 resetea false
  • Veredicto: Deshacer Secuencial — el estado final contradice la intención del botón

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.

Skills relacionados