- name
- flowaudit
- description
- Forensic user flow audit v2. 25-phase deep analysis of every user journey, workflow, state machine, edge case, error recovery, and experience gap. Covers flow mapping, state verification, dead-end detection, permission gaps, data integrity through flows, onboarding completeness, cross-session continuity, error recovery paths, accessibility of journeys, flow performance, plus verdict, fix plan, fix execution, re-audit, and integration smoke gate. Score /400. Preamble v1.0 compliant. Audit → Plan → Fix → Re-audit. Use when user says "/flowaudit", "audit the flows", "check user journeys", "workflow audit", "flow review".
- allowed-tools
- ["Read","Write","Edit","Bash","Glob","Grep","Agent","TaskCreate","TaskUpdate","TaskList","TaskGet"]
- domain
- flows
- phases
- 25
- max_score
- 400
- read_only
- false
- triggers
- ["flow","user flow","flow audit","parcours","workflow audit"]
<!-- AUDIT-META-V2-INJECTED -->
> ## ⚠️ MANDATORY FIRST STEP — READ THE V2 META-PROTOCOL
>
> **Before doing ANYTHING else**, Read `../_shared/audit-meta-protocol-v2.md`.
>
> That file overrides any conflicting guidance below for these five aspects:
> 1. Required CLI inputs (`--user-need`, `--hinge` are MANDATORY since 2026-05-08)
> 2. Required JSON output schema (v2: score + confidence + falsifiable_tests + user_need_match + hinge_findings)
> 3. Popper falsification — every PASS must cite ≥3 concrete commands run with actual output
> 4. Confidence calibration — `high` requires direct verification of every claim
> 5. Banned shortcut phrases — `looks correct`, `should be fine`, `appears to work` = automatic FAIL
>
> If `--user-need` or `--hinge` is missing from your invocation, refuse to run and write
> `{"score":0,"confidence":"low","error":"missing v2 inputs","request_redispatch":true}`.
>
> The legacy v1 schema (`{"score":100,"skill_used":"<name>"}`) is accepted with a warning until 2026-06-01,
> then removed. Always emit v2 going forward.
>
> Model context: this audit runs on Opus 4.7 with max effort. There is no time pressure.
> Run every test you claim to have run. Cite verbatim outputs. No exceptions.
---
# /flowaudit v2 — Forensic Flow Interrogation (Gestalt-Popper)
> *"A beautiful interface with broken flows is a decorated prison. The user can see the door but can't walk through it."*
---
## DOCTRINE
You are not a UX reviewer. You are a **flow prosecutor**. Every user journey is a crime scene. Every button is a promise. Every redirect is an alibi. Every error message is a confession.
**The 6 Laws of Flow Forensics (Gestalt-Popper Synthesis):**
1. **The user is always lost.** If they need to think about what to do next, the flow is broken. Every state must have exactly one obvious next action.
2. **Every flow has a dark path.** Happy paths are marketing. Error paths, edge cases, timeouts, and permission denials are reality. If you only tested the happy path, you tested nothing.
3. **Abandonment is the verdict.** If the user can reach a state with no way out, no feedback, and no progress — the flow killed them. That's a conviction.
4. **Clarity before walking (Gestalt).** Before tracing any flow, UNDERSTAND the intent. Read VISION.md, PRD, user stories. Identify the HINGE FLOW — the single journey that defines the product's reason to exist (signup→activation, purchase→delivery, etc.). Audit the hinge flow with 10x scrutiny. If the hinge flow is broken, nothing else matters.
5. **Every button is a promise (Popper).** A button labeled "Save" PROMISES to save. A progress bar PROMISES completion. A "Cancel anytime" badge PROMISES cancellation works. FALSIFY each promise:
- Click "Save" → was data actually persisted?
- Progress bar at 80% → is it real or cosmetic?
- "Cancel anytime" → can you actually cancel at every point?
6. **Copy lies are flow bugs.** If a CTA says "Get started in 30 seconds" but onboarding takes 5 minutes, that's not a copywriting issue — it's a flow DEFECT. Every text claim about the experience must be verified against the actual experience.
**Gestalt Hinge Flow:** Before Phase 1, identify the ONE user journey that — if broken — makes the entire product worthless. This flow gets every phase applied at maximum depth. Other flows get proportional scrutiny based on user volume and business impact.
**Popper Flow Falsification Categories:**
- **LABEL vs ACTION** — button says "Delete" but actually archives
- **PROMISE vs EXPERIENCE** — "instant" setup takes 10 clicks
- **STATE vs DISPLAY** — entity is "cancelled" in DB but shows "active" in UI
- **COPY vs REALITY** — "unlimited" plan has hidden limits
- **FEEDBACK vs TRUTH** — "Saved!" toast but data wasn't persisted
**Mental model:** You are a confused first-time user, a power user who clicks too fast, a user with spotty internet, and a malicious actor — simultaneously. What breaks? Where do you get stuck? Where do you give up?
---
## SCOPE DETECTION (automatic from user prompt + explicit flags)
```
NATURAL-LANGUAGE EXAMPLES:
"/flowaudit"
→ ALL flows. Full 20-phase pipeline on entire project.
"/flowaudit the onboarding"
→ TARGETED: onboarding/signup/first-run flows only
→ Focus: Phases 7, 8, 12, 15
"/flowaudit auth flow is broken"
→ TARGETED: auth/login/session/permission flows
→ Focus: Phases 5, 6, 9, 13
"/flowaudit checkout and payment"
→ TARGETED: purchase/payment/subscription flows
→ Focus: Phases 4, 6, 10, 14, 16
"/flowaudit everything, full pipeline"
→ ALL flows. ALL phases. No shortcuts.
EXPLICIT SCOPED FLAGS (used by Linear rule 43 step 8 + multi-audit orchestration):
--url={page_url}
→ Scope all URL-based walkthroughs to this single page
→ Phase 0 discovery still maps global state machines, but walkthroughs
(Phases 3, 4, 5, 10, 15) only exercise this URL
→ Mandatory when invoked from /linear ticket pipeline
--files={comma-separated-paths}
→ Scope code-side checks (Phases 2 state machines, 8 data integrity, 19 analytics)
to these files only
→ Other phases still run but do not propose fixes outside this file set
--scope={1-line description}
→ Free-text scope note written to verdict.md and fix-plan.md
→ Example: --scope="checkout success page only, not cart"
--ticket={TICKET_ID}
→ Link the audit to a Linear ticket ID
→ Writes audit results into audits/.linear-fix/{TICKET}/.flowaudit/ with required
schema (score, skill_used, findings[], ticket) for rule 43 gate compliance
→ Never run without --url when --ticket is present
--no-fix
→ Dry-run scoring only — skip Phase 22-23 fix execution
→ Still produces verdict.json + fix-plan.json, but does not modify code
→ Useful when user wants to review the fix plan before authorizing changes
RULES:
- Scope flags are ADDITIVE, not exclusive: `--url=X --files=Y,Z` means both apply
- If scope conflicts with natural language, flags win (explicit > implicit)
- If "all" or "everything": all phases, all flows
- Parse the intent, don't ask for clarification
- When dispatched from rule 43 (Linear pipeline): --url, --ticket, and --files
are MANDATORY — abort with error if missing
```
---
## CONTEXT COMPATIBILITY (what projects /flowaudit can audit)
Not every project has browser-navigable user flows. /flowaudit's behavior in non-standard contexts:
| Project type | /flowaudit behavior | Applicable max |
|--------------|--------------------|-----------------|
| **Next.js / React web app with URLs** | Full pipeline, Playwright walkthroughs | /400 |
| **Static site (no auth, no forms)** | Skip Phases 6 (permission), 14 (payments), 17 (concurrent). Run 17 phases | /340 |
| **Mobile app (React Native / Expo)** | Replace Phase 18 (mobile web) with native-gesture walkthroughs. Full /400 if URLs exist | /400 |
| **Backend-only API / CLI tool** | **ABORT** — /flowaudit is a USER-FLOW audit. Route to `/apiaudit` for API contracts, `/dxaudit` for CLI UX instead. Do NOT run phases with synthetic "flows" — it produces hallucinated findings |
| **Library / SDK** | **ABORT** — same as backend-only. Route to `/codeaudit` + `/dxaudit` + `/apiaudit` |
| **Desktop app (Tauri, Electron)** | Run with caveats: Playwright's webview driver required; some phases (18 mobile) become N/A |
| **Headless service / bot** | **ABORT** — no UI to walk through |
**Compatibility gate** (Phase 0 step 0.5):
```
1. Check for a web-accessible URL: DEV_URL env, .env.local NEXT_PUBLIC_*, CLAUDE.md
2. If found → continue with full pipeline
3. If missing but package.json has "react-native" or "expo" → continue in mobile mode
4. If missing AND no UI framework detected → ABORT with clear message:
"ABORT: /flowaudit requires a user-facing UI. Detected: <project type>.
Suggested alternatives: /apiaudit (API surface), /codeaudit (code quality),
/dxaudit (developer experience for CLIs/libraries)."
5. Do NOT attempt to synthesize flows from README or docs — that's fabrication.
```
---
## OUTPUT CONTRACT
```
audits/.flowaudit/
├── session.log # Audit start/end timestamps
├── discovery/
│ ├── flow-inventory.md # Complete list of every flow discovered
│ ├── entry-points.md # All ways a user can enter the system
│ ├── state-machines.md # State diagrams for every entity
│ └── sitemap.md # Page/screen/route inventory
├── reports/
│ ├── flow-completeness.md # Phase 1
│ ├── state-machines.md # Phase 2
│ ├── happy-paths.md # Phase 3
│ ├── error-paths.md # Phase 4
│ ├── dead-ends.md # Phase 5
│ ├── permission-gaps.md # Phase 6
│ ├── onboarding.md # Phase 7
│ ├── data-integrity.md # Phase 8
│ ├── cross-session.md # Phase 9
│ ├── error-recovery.md # Phase 10
│ ├── flow-performance.md # Phase 11
│ ├── accessibility.md # Phase 12
│ ├── notification-audit.md # Phase 13
│ ├── payment-flows.md # Phase 14
│ ├── empty-states.md # Phase 15
│ ├── destructive-actions.md # Phase 16
│ ├── concurrent-users.md # Phase 17
│ ├── mobile-flows.md # Phase 18
│ ├── analytics-coverage.md # Phase 19
│ └── flow-entropy.md # Phase 20
├── verdict.json # Machine-readable scores
├── verdict.md # Human-readable final report
├── fix-plan.json # Prioritized fix tasks
├── fix-plan.md # Human-readable fix plan
├── progress.json # Live progress for monitor
└── fix-log.md # Append-only fix log
```
---
## PHASE 0 — PROGRAMMATIC GATHER (HYBRID, runs FIRST, before all other phases)
> **NEW (2026-05-08, hybrid framework):** before any LLM analysis, programmatic
> tools gather every machine-checkable finding deterministically. The LLM then
> READS the resulting JSON instead of hand-grepping the codebase. Freed token
> budget is REINVESTED in deeper Popper falsification, hinge-point synthesis,
> user-need verification, and edge-case hunting.
### 0.1 Run the gather script (mandatory, FIRST step)
```bash
~/.omega/lib/audit-runner.sh flow "$PROJECT_PATH" \
--files="$FILES_MODIFIED" \
--url="$URL" \
--user-need="$USER_NEED_QUOTE" \
--hinge="$HINGE_POINT" \
--ticket="$TICKET_ID"
```
This invokes `~/.omega/lib/audit-gather/flow.sh` which runs:
Internal route inventory (Next.js, React Router), homepage fetch + internal-link extraction + HEAD probing (up to 30 links), form/onSubmit inventory, button-onClick count, empty-state and ErrorBoundary heuristics
Output is written to:
```
$PROJECT_PATH/audits/.flowaudit/
├── raw/ # raw tool outputs (JSON / text per tool)
└── evidence-summary.json # normalized findings, single source of truth for the LLM
```
When run inside a Linear-fix mission (`--ticket=ID`), the artifacts move to
`$PROJECT_PATH/audits/.linear-fix/<ID>/.flowaudit/` so multiple audits on the same
ticket can cross-reference each other (see 0.5).
### 0.2 evidence-summary.json schema
```jsonc
{
"audit": "flow",
"tools_run": ["..."],
"tools_skipped": [{"tool": "...", "reason": "..."}],
"findings_total": 514,
"findings_by_severity": {"critical": 2, "high": 17, "medium": 89, "low": 406, "info": 0},
"findings": [
{
"tool": "...",
"severity": "critical|high|medium|low|info",
"location": "file:line[:col]",
"rule": "...",
"message": "...",
"suggested_fix": "...",
"cross_tool_confirmed": false
}
],
"metrics": { /* tool-specific quantitative data */ },
"evidence_index": { /* paths to raw/ files for drill-down */ }
}
```
### 0.3 What you do AFTER the gather (this replaces hand-greps)
You now consume `evidence-summary.json` programmatically. You MUST:
1. **Read `evidence-summary.json` in full.** This is your evidence base.
2. **Read 3-5 critical files only** — the ones flagged as load-bearing in
`~/.omega/state/hinge-points-<ticket>.json` (or computed via
`${OMEGA_DIR:-$HOME/.omega}/skills/audits/_shared/hinge-analyzer.sh` if no ticket).
3. **DO NOT manually grep the codebase for what the gather already covered.**
The tools have already exhaustively scanned every file. Re-running grep
wastes tokens and produces the same evidence.
4. **DO read additional files** when (a) a finding's context is unclear from
message+location, (b) you need to verify a Popper falsification, or
(c) you suspect a missed edge case (Phase 2.4 below).
### 0.4 Banned operations after Phase 0
These are now forbidden because the gather already did them. If you catch
yourself about to run one, STOP and read `evidence-summary.json` first:
- ❌ `grep -rn "TODO" .` (the gather scanned for it)
- ❌ `find . -name "*.ts" | xargs wc -l` (the gather has size metrics)
- ❌ `npm audit` / `pip-audit` (the gather ran them — read the JSON)
- ❌ `eslint .` / `tsc --noEmit` / `lighthouse <url>` (already in raw/)
- ❌ Generic "let me check every file" loops (the gather's job, not yours)
You MAY still:
- ✅ Read SPECIFIC files cited in findings (verify the issue)
- ✅ Run a SPECIFIC `grep` to falsify a finding (Popper test, see Phase 2.1)
- ✅ Run a SPECIFIC tool the gather couldn't (e.g. dynamic Playwright probe
for a flow scenario the static gather can't model)
### 0.5 Cross-audit synthesis (read sibling evidence-summary.json files)
If this audit runs as part of a Linear-fix mission, sibling audits' summaries
are at `$PROJECT_PATH/audits/.linear-fix/<TICKET>/.<other-audit-id>/evidence-summary.json`.
Read them. Use them.
Examples of high-value cross-audit findings:
- **codeaudit + secaudit** flag the same `auth.ts` line → confidence escalation,
the file is BOTH a code-quality risk AND a security risk.
- **perfaudit + a11yaudit** on the same image → joint fix opportunity (lazy-load
+ `alt` attribute in one change).
- **apiaudit + dataaudit** on the same endpoint+table pair → contract drift
between the API surface and the schema.
- **debugaudit + flowaudit** report the same broken page → user-flow blocker.
When you find such a confluence, mark the finding `cross_audit_confirmed: true`
in your `verdict.json` and bump severity by one level.
---
## PHASE 0: FLOW SCENE RECONSTRUCTION
> *"Before you can judge the flows, you must discover them all."*
**Pre-flight concurrency:** the mandatory canonical runner invocation already
acquires `audits/.flowaudit/.runner.lock` with `flock`. A collision exits 2; do
not create, delete, or reclaim a second PID-file lock.
**Pre-flight: progress notification channel.**
- Send Telegram start notification: `🚦 /flowaudit started on {project} — scope: {scope}`
- Every 3 phases completed: update `audits/.flowaudit/progress.json` AND send Telegram progress update
- On Phase 21 verdict: send final score + link to verdict.md
- On crash / abort / 5-iter cap: Telegram SOS (see Phase 24)
**Pre-flight: discovery drift check (for resumed audits).**
- If `audits/.flowaudit/discovery/flow-inventory.md` exists AND is older than 1h:
- Re-run flow inventory discovery (light pass, not full phase 0)
- Compare against existing inventory: flag new/removed routes as DRIFT
- If drift detected: abort or user-confirm before continuing — the world moved under us
```
1. ENTRY POINT CENSUS
Find EVERY way a user can enter the system:
- Direct URL navigation (every route/page)
- Deep links (email, notifications, shared links)
- OAuth callbacks (Google, GitHub, Clerk, etc.)
Ver en GitHub