walkthrough
Skill1 starsChanged 5 months agoMITView on GitHub
UX-coverage audit. Catches the class of bug dead-code audits can't — state-machine gaps, missing features (no logout / password reset / settings), empty-state regressions, entry-state combinations nobody walked through after a wholesale UX pattern replacement, and pre-hydration render-state flashes (HTML hidden overridden by CSS display, FOUC, partial-init voids). Static analysis of code paths + a built-in feature-completeness checklist + render-state coverage.
30 other projects use a version of this.
Adopted by
Most recently taken up by
- taecontrol/skillstheir own version, first seen Nov 8, 2026
- marnickvda/pop-quiztheir own version, first seen Nov 8, 2026
- command-center-ai/skillstheir own version, first seen Nov 8, 2026
- marnickvda/know-it-alltheir own version, first seen Nov 8, 2026
- spencerldixon/skillstheir own version, first seen Nov 8, 2026
- udecode/dotaitheir own version, first seen Nov 7, 2026
Used with
Projects with it also use chips, redo and 9 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
udecodeSkillchips
Run the project's suggested-task ledger, the chips. /chips alone brings this session's open tasks up to date: it applies what the ledger helper says, settles stale and split tasks, cards what can start and reports the board, and /chips all also takes the ship-list tasks and the ones no live session owns, and merges duplicate tasks across the board. Use for /chips, /chips offer, start or drop, \"what chips are open\", \"suggest a task for X\", \"update the chips\", \"clean up the chips\", \"which chips are stale\", \"is this chip still worth doing\", \"merge duplicate chips\", at the last hand-back of a run that offered a task, and whenever pstack would file a tracked issue, a follow-up, a reflect Backlog item or an out-of-band PR.
Also in 3 projects that use this
Scylla23Skillredo
Re-run the last routed task one model tier up (haiku → sonnet → opus → fable). User-invoked escalation when the previous result missed. Pass --dry-run to preview without running.
Also in 3 projects that use this
Aetheria-Labs1Skillplan-page
Plan one storefront page from strategy through final copy, section order, proof, offers, template direction, responsive layout, and production asset requirements. Stops at an approved execution-ready specification.
Also in 3 projects that use this
SocialKit-APISkillvideo-transcripts
Extract transcripts from social videos through SocialKit across YouTube, TikTok, Instagram, Facebook, X/Twitter, LinkedIn, and direct video file URLs. Use when the user asks to transcribe, get captions or subtitles, pull the spoken text, or read what a video says, including one video or many at once. Returns full text plus timestamped segments. Not for posting, private accounts, or unrelated website scraping.
Also in 3 projects that use this
MicrosoftSkillcleanup
Also in 3 projects that use this
BlockSkilltest-audit
Invoke whenever writing, changing, reviewing, or sweeping tests in buzz-app. Authoring gate for new tests plus audit workflow for low-value, implementation-coupled, or duplicative tests and the test-only production seams they demand.
Also in 3 projects that use this
Other versions30 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 30
- udecode/plate★ 17ksame name
- udecode/dotai★ 1.2ksame name
- udecode/better-convex★ 452same name
- Mathews-Tom/armory★ 340same name
- smallnest/goal-workflow★ 283same name
- andrew-yangy/gru-ai★ 153same name
- oborchers/proqi★ 45same name
- huytd/skills★ 19same name
- wycats/ai-plugin★ 19same name
- wycats/vscode-ai-plugin★ 19same name
20 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
21 rules. 0 are common, 16 are distinctive, and 5 are very specific to this project.
0
Common
Most of the 30 edited versions we read keep these.
16
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 12
After a dead-code audit has cleaned up code-shape issues.
- Distinctive: line 30
If a name isn't in the table, the skill should resolve it as a literal path or search for it.
- Distinctive: line 54
Don't infer flows that aren't there — if there's no auth, don't audit auth.
- Distinctive: line 157
If a critical JS module 404s (cache invalidation, deploy race), what does the user see?
- Distinctive: line 158
If the async profile fetch fails, does the surface degrade or block?
- Distinctive: line 159
If a third-party module (auth client, analytics) is blocked or slow, does the page fail open or fail closed?
- Distinctive: line 171
Read the test suite and identify which entry-state combinations from 3b are exercised.
- Very specific: line 207
If --flow <name> was passed, do a deeper read on that one flow:
- Very specific: line 253
After Step 4 (and Step 5 if --flow was passed), partition findings by auto_fix.
- Distinctive: line 255
Verify a clean working tree on the project's main branch (git status clean, git pull --ff-only).
- Very specific: line 256
Create a branch named walkthrough-fixes-YYYY-MM-DD (or similar).
- Distinctive: line 258
Run the project's test suite.
- Distinctive: line 260
Stop. Report the branch name and the diff summary, and ask whether to push and open a PR.
- Very specific: line 265
For deferred (
auto_fix: false) findings: document them in a follow-up file inside the repo (e.g., … - Very specific: line 267
Skip Step 6 entirely: if --report-only was passed.
- Distinctive: line 281
Don't reinvent dead-code audits: If you're flagging unused code, dead branches, or duplication for its own sake, that's the wrong skill.
- Distinctive: line 288
Not a browser automation tool.
- Distinctive: line 289
Not a substitute for actual smoke testing on a deployed environment.
- Distinctive: line 290
Not a replacement for accessibility, performance, or SEO audits.
- Distinctive: line 291
Not an auto-merger. Step 6 commits on a branch and asks before pushing.
- Distinctive: line 295
If you keep a skill-run log, append an entry after each run:
“Common” is measured: kept by at least 6 in 10 of the 30 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
UX Walkthrough Audit
Scan a project's user flows for the bugs static-analysis tools miss. Dead-code audits catch duplicated and dead code; this skill catches runtime composition issues — features that don't exist, states that aren't reachable, voids that emerge from cascading UX changes, and entry-state combinations that nobody's walked through.
When to use this
After a dead-code audit has cleaned up code-shape issues. After a wholesale UX pattern replacement (one feature replacing another). Before declaring a product surface "done." When a real user reports something visually broken that no test caught.
Arguments
| Argument | Effect |
| (none) | Audit the current working directory's primary product surface |
project name (e.g. myapp) | Audit that project. Resolve via the alias table below or as a literal path. |
--scope <path> | Limit to a specific subdirectory (e.g. --scope src/components/checkout) |
--flow <name> | Audit one specific user flow (e.g. --flow signup, --flow chat, --flow checkout) |
--report-only | Skip the Step 6 auto-fix bundle. Produces findings only, no PR. |
Project Registry
| Alias | Path |
myapp | (add your projects here) |
If a name isn't in the table, the skill should resolve it as a literal path or search for it.
Process
Step 1: Detect the project
Identify the framework + primary product surface:
- Web app (Next.js, Astro, Flask/Jinja, etc.) → user flows live in templates + frontend JS
- React Native / Expo → user flows in screen components
- CLI → flows are commands + interactive prompts
Skip if the project doesn't have user-facing flows (a library, a script bundle, a static site without auth).
Step 2: Identify primary user flows
From the codebase, infer the major flows that exist:
- Authentication (signup, signin, signout, password reset, email verification)
- Onboarding (any multi-step flow that ends with the user inside the product)
- Primary product surface (the daily-use UI: chat, dashboard, list, etc.)
- Account management (settings, billing, subscription, profile)
- Deletion flows (cancel subscription, delete account, forget data)
- Payment (checkout, refund, billing portal)
- Content surfaces (blog, docs, marketing)
Don't infer flows that aren't there — if there's no auth, don't audit auth.
Step 3: Run all checks
3a. Feature completeness check
For each detected flow, apply a built-in checklist of features users expect. Flag anything missing.
Authentication flows (web app with accounts):
- Signup (any path: email/password, OAuth, magic link)
- Signin (separate from signup, for returning users)
- Signout / logout (UI surface that calls the signout function)
- Password reset flow (forgot-password → email → set-new-password)
- Email verification (if signup uses email/password)
- Account-already-exists handling at signup (returning user redirected to signin)
- Already-signed-in redirect from auth pages (don't make a logged-in user re-auth)
- Session expiry handling (gracefully prompt for re-signin, don't dump them on a broken page)
Account management (subscription product):
- Cancel subscription (UI, not just an email-the-team path)
- Update payment method (Billing Portal or local form)
- Change email
- Change password (for email/password users)
- Delete account / "forget my data"
- Export data (GDPR-friendly, but also a real feature for power users)
Primary product surface:
- Empty state for first-time users (welcome / nudge / starter prompts)
- Empty state for returning users with no fresh content
- Loading state (skeleton, spinner, or placeholder content)
- Error state (network failure, server error, content failed to load)
- 404 / not-found state (deep-link that doesn't exist)
- Recovery from interrupted state (mid-stream error, dropped connection)
Content / public surfaces:
- Privacy policy
- Terms of service
- Cookie consent (if analytics/tracking is loaded)
- Contact path (email, support form)
Implementation hint for detection: grep for the function name in the codebase. If signOut/logout is exported but has zero imports, it's a missing-UI feature, not just dead code. If cancel_subscription exists in the API but no template references its endpoint, the cancel UI is missing. Cross-reference exported helpers + API routes against UI surfaces that call them.
3b. Entry-state combination scan
For each primary surface, enumerate the entry-state combinations that the surface might be entered with. Flag combinations that:
- Aren't exercised by any test
- Aren't visible in any session log or PR description as having been smoke-tested
- Compose multiple recent UX changes (high regression risk)
For a typical authenticated product surface, the primary states are:
- Anonymous visitor (no session)
- Authenticated, no data yet (just signed up, brand-new)
- Authenticated, partial data (mid-flow, e.g., completed step 1, didn't finish step 3)
- Authenticated, full data + no recent activity (returning user, empty timeline)
- Authenticated, full data + recent activity (the happy path everyone tests)
- Authenticated, paywalled (subscription expired, access pending)
- Authenticated, deleted/suspended
For each, the question to ask: "What does the user see when they land here?" If you can't answer from reading the code + existing tests, that's a finding.
The cascade trap. When 3+ recent PRs replaced a UX pattern (not added to it — replaced), explicitly list every entry-state combination and verify the new pattern handles all of them. Cascading replacements are the #1 source of emergent state-composition regressions. Flag any entry state where the answer to "what does this user see?" depends on transient state.
3c. Dead-export check (catches missing-feature signals)
Cross-module dead-export grep — any exported symbol in a module that has zero importers anywhere else in the project. This often shows up in dead-code audits, but here it's a primary signal because a dead export often means a UI feature was anticipated and never built.
Run:
# JS/TS exports
for f in src/**/*.{js,ts,tsx}; do
grep -E "^export (async )?(function|const|class)" "$f" | extract symbol → grep symbol across project minus the defining file → flag if zero hits
done
# Python equivalent: __all__ lists, or "def name" at module top + cross-file usage checkAnything dead-exported is either (a) genuinely unused → real dead code, or (b) anticipated by infrastructure but the UI was never built → a missing-feature signal. Both are worth flagging.
3d. Render-state coverage (pre-JS, mid-JS, post-error)
Entry-state enumeration in 3b assumes "the page has finished loading." That assumption hides a whole class of bugs that users see for 50–500ms on every page load. Walk every primary surface through these render phases:
Pre-hydration state (HTML loaded, JS module not yet executed): For each surface that depends on JS to set initial visibility, check what's visible if the JS module fails to load, is delayed by a slow network, or is blocked by CSP:
- Any element where the HTML has the
[hidden]attribute but CSS setsdisplay: <non-none>(without:not([hidden])) — author CSS overrides the user-agent[hidden] { display: none }, so the element renders for the entire pre-hydration window. This is the chip-flash class of bug. - Any element with
style="display: none"inline — fine. Any element relying on a.hiddenclass that JS adds — fine. Any element relying on the bare[hidden]attribute when there's also a CSS rule withdisplay:for that selector — flash bug. - Static content that should never appear pre-auth (placeholder dummy data, sample chat threads, "loading..." text that's actually real content)
- FOUT / FOUC: any
@font-faceor<link>for a font that the surface depends on — is it preloaded? Does the cascade hide content until fonts ready?
Run:
# Find every selector with display: that should probably be :not([hidden])
rg -n "^\s*\.[a-zA-Z_-]+\s*\{" path/to/css/ -A 5 | rg -B 1 "display:\s*(flex|block|grid|inline)"
# Then cross-check against templates: does the same class appear with hidden attribute?
rg -n 'class="[^"]*<class>[^"]*"\s+hidden' path/to/templates/
# If yes + CSS doesn't gate on :not([hidden]) → flash bugMid-hydration state (JS partially executed, async data loading):
- Any surface that calls an async fetch for content (history, profile, status) — what does the user see between "JS booted" and "data arrived"?
- Layout shift during async swap — does the surface jump when content loads? CLS impact?
- Skeleton vs spinner vs nothing — what's the convention; does this surface honor it?
Post-error state (init throws, async fetch fails, JS module 404s):
- If a critical JS module 404s (cache invalidation, deploy race), what does the user see? A working-looking surface that does nothing on click? A blank surface?
- If the async profile fetch fails, does the surface degrade or block?
- If a third-party module (auth client, analytics) is blocked or slow, does the page fail open or fail closed?
- A dropped SSE / WebSocket mid-stream — is there a recovery path or does the user end up with half a message?
Concrete deterministic checks (no browser required):
- For every
class="..."token where the element ALSO hashidden, check the CSS for that class — if any rule setsdisplay: <non-none>without:not([hidden]), flash bug. - For every
<script type="module" src="...">, check that the module's first executed line is something that establishes the surface's visible state (not a no-op import). - For every async fetch in an init function, check that the surrounding container has a loading state (skeleton, spinner, or initial markup that's safe to show).
Flash bugs are RED severity. They run on every single page load for every user, and they're the dictionary definition of "looks unprofessional."
3e. Test-coverage gap (state-level, not line-level)
Read the test suite and identify which entry-state combinations from 3b are exercised. Flag combinations that have zero coverage. This isn't a substitute for end-to-end tests; it's a "do we have ANYTHING covering this state" check.
Step 4: Report
Group findings by category with severity:
RED (missing critical features / broken states):
- Missing logout, missing password reset, missing cancel-subscription UI
- Empty-state void on a state any user can land in
- A flow that has no exit / can't escape from
- A privacy or terms gap if the product collects PII
- An exported helper for a P1 feature with no UI calling it
YELLOW (UX gaps worth fixing):
- Missing account-management features (export, change email)
- Empty states without meaningful content
- Loading/error states that fall through to the default browser behavior
- Entry-state combinations not exercised by any test
GRAY (consistency / nice-to-have):
- Inconsistent flow signatures across surfaces
- Missing accessibility patterns (keyboard nav, focus visible)
- 404 page that doesn't match brand voice
For each finding, show:
- Flow / surface
- The specific gap
- File path(s) where the work would land
- Severity (RED / YELLOW / GRAY)
- Auto-fix eligibility (
auto_fix: true|false) — drives Step 6 bundling. See the auto-fix taxonomy in Step 6. - Linked issue if filing one (in the calling agent's discretion)
Auto-fix is a separate dimension from severity. A RED finding can be auto-fixable (chip-flash class — delete the offending CSS rule) or not (missing logout button — needs design judgment). Don't conflate the two.
Step 5: Optional — deep-walk a single flow
If --flow <name> was passed, do a deeper read on that one flow:
- Trace the entry points (routes, links, redirects in)
- Map every state the flow can produce
- For each state, identify the file(s) that render it
- Flag any state that lacks a corresponding test or smoke check
- Generate a manual smoke-test checklist the user can walk through
This is the closest this skill gets to "actually walking" — it produces a human-readable checklist that the user (or another agent with browser access) can execute against a deployed environment.
Step 6: Auto-fix bundle (default ON; suppress with --report-only)
Audits that only describe problems are weaker than audits that ship the easy fixes themselves and file the hard ones for later. Step 6 closes that loop.
For each finding emitted in Step 4, decide auto_fix: true|false using this taxonomy.
Auto-fixable (auto_fix: true)
These have a single mechanical, reviewable answer. The fix is short (≤10 lines per finding), reversible, and doesn't require design judgment.
| Finding pattern | Fix |
Render-state flash: class with [hidden] + CSS display: <non-none> without gate | Either delete the offending display: declaration if the class is rarely or never shown, OR add a [hidden] { display: none !important } rule to the project's reset block |
| Missing skip-to-content link on a page with a primary nav | Add <a href="#main-content" class="skip-link">Skip to content</a> after <body>, plus a .skip-link rule if not in the shared CSS |
Missing <main> landmark | Wrap the existing top-level content <div> in <main id="main-content"> — verify only one <main> per page after the change |
Missing rel="noopener" on target="_blank" external links | Append rel="noopener" to each <a target="_blank"> that doesn't already have it |
| Static placeholder text visible pre-JS that should never appear | Either move it to a [hidden] element JS reveals, or delete it if it's vestigial (cross-check with git log first to make sure it isn't intentionally there for SEO crawlers) |
Bare-[hidden] reliance with author CSS overriding it | Site-wide defense: add [hidden] { display: none !important } to the project's CSS reset block. Per-element fix: add :not([hidden]) to the offending selector |
Inline <footer> block instead of the project's canonical footer partial | Replace the inline block with the include. Pre-flight: read the canonical partial and confirm the inline block is a stale partial of it (missing links, slightly different markup). If the inline block has page-unique content not in the partial, downgrade to auto_fix: false (manual integration). |
| Page-CSS rule that overrides a global selector without page-scoping it | Delete the override if it doesn't add new behavior — let canonical drive. If the override DOES change behavior intentionally, downgrade to auto_fix: false. |
| Removable dead exports | Delete the export + its definition file if not imported anywhere; flag for human review if it's a public API surface |
Not auto-fixable (auto_fix: false)
These need design judgment, architectural decisions, or substantive refactoring. The fix is longer than 10 lines, branches into multiple right answers, or affects user expectations.
- Missing critical features (logout, password reset, cancel UI, account deletion)
- Empty-state void on a state any user can land in (needs UI design)
- Cascade-trap regressions where the right fix is a state-machine refactor
- A flow that has no exit / can't escape from
- Privacy or terms gap when the product collects PII (legal review)
- Dead exports that look like anticipated-but-never-built features (UI implementation needed)
- Entry-state combinations that lack any test coverage (test-writing is judgment work, not mechanical)
- Loading/error states that fall through to default browser behavior (UI design)
Workflow
- After Step 4 (and Step 5 if
--flowwas passed), partition findings byauto_fix. - If the auto-fixable set is non-empty:
- Verify a clean working tree on the project's main branch (
git statusclean,git pull --ff-only). - Create a branch named
walkthrough-fixes-YYYY-MM-DD(or similar). - Apply each fix. Each fix should be a small, reviewable hunk.
- Run the project's test suite. If tests fail, abort and report the failure — do NOT commit a broken fix.
- Commit with
walkthrough: <one-line summary of the fix categories>. - Stop. Report the branch name and the diff summary, and ask whether to push and open a PR. Do not push until the user says yes.
- On a yes: push the branch and open a PR titled
walkthrough: fix <category 1>, <category 2>, .... PR body must list:- Each finding fixed (1 bullet each, with file:line and the fix applied)
- Each finding deferred to follow-up (with a one-line description)
- A test plan for human review.
- Verify a clean working tree on the project's main branch (
- For deferred (
auto_fix: false) findings: document them in a follow-up file inside the repo (e.g.,docs/walkthrough-findings-YYYY-MM-DD.md). File them in an issue tracker only after the user approves the list. If 3+ deferred findings, create a single umbrella note plus sub-findings; otherwise list individually. - Output to caller: the branch name (or PR URL, if pushed) + a link to the follow-up document, NOT a full re-print of the report (that already happened in Step 4).
- Skip Step 6 entirely if
--report-onlywas passed.
When to abort Step 6 mid-flight
- Tests fail after applying fixes. Don't commit broken state.
- A "mechanical" fix turns out to need judgment (e.g., the class with
display:has 30 callers and you're not sure which ones use[hidden]). Move that finding toauto_fix: falseand file as a follow-up instead. - The user has an unmerged PR open on the project. Notify the user; don't open a parallel PR that conflicts.
- More than 5 fixes accumulated in one bundle — split into two PRs, one focused per concern (a 5-fix limit keeps the human review pass tractable).
Important rules
- This skill fixes the easy stuff and files the rest. Default behavior is to commit auto-fixable findings on a branch (Step 6), document the rest as follow-ups, and ask before pushing. Pass
--report-onlyto disable the commit step. The skill's value is closing the loop between "found a bug" and "patch is reviewable." - Don't propose fixes that drift from project conventions. Flag the gap; defer to the user / a follow-up issue for the implementation choice. Different products have different right answers (a logout link in the nav vs. a settings panel vs. a chat-header dropdown).
- Be honest about what static analysis can and can't see. This skill is fundamentally code-reading + checklist matching. It will not catch issues that depend on actual visual rendering, real network conditions, or third-party service quirks. For those, recommend visual regression tools (Percy / Chromatic) or an actual E2E pass.
- Don't reinvent dead-code audits. If you're flagging unused code, dead branches, or duplication for its own sake, that's the wrong skill. This skill's job is the missing-feature / unwalked-state class of bug.
- The cascade trap is the most common false negative for UX regressions. When you see in session logs that a UX pattern was wholesale-replaced (not extended) by a recent PR, give that flow extra attention.
- For new projects, the feature-completeness checklist is the highest-yield check. The first walkthrough on a young product almost always catches a real missing feature (logout, password reset, cancel UI, error states).
- For mature projects, the entry-state combination scan is the highest-yield. Mature products have all the features; the gaps are in state composition.
What this skill is NOT
- Not a browser automation tool. We don't load pages, take screenshots, or simulate clicks. That's a different category (Playwright, Cypress, Percy).
- Not a substitute for actual smoke testing on a deployed environment. The auto-fix bundle (Step 6) prepares verified changes, but production smoke-checks against a real browser are still the human's call.
- Not a replacement for accessibility, performance, or SEO audits. Those are orthogonal: code-shape, accessibility, performance, search-engine. This skill is UX-coverage.
- Not an auto-merger. Step 6 commits on a branch and asks before pushing; it never merges.
Skill Run Logging
If you keep a skill-run log, append an entry after each run:
Format: | YYYY-MM-DD | /walkthrough | target (details) | one-line result |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

