From understood
Build a self-contained HTML walkthrough for presenting a change to a senior reviewer live, step by step through the real code. Use when the user invokes /walkthrough, or says they have to "walk someone through" a PR/feature/codebase, "present this on a call", "demo the code", or wants "a script for the review". Produces one HTML file of clickable file:line stops with scannable KEYWORD and KNOW MORE cues, never prose to read aloud. Part of the "understood" family of low-cognitive-load patterns.
How this skill is triggered — by the user, by Claude, or both
Slash command
/understood:walkthroughThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turns a change you have to defend into a document you can drive a live screen-share from.
Turns a change you have to defend into a document you can drive a live screen-share from.
The reader is the presenter, mid-call, talking. They glance at the page and look back at the editor. So the page carries cues, not sentences. Anything they would have to read aloud has already failed.
Exactly one file: a self-contained HTML page built from assets/template.html.
file:line, current position highlighted on scrollKEYWORD and KNOW MORE, both bullet fragmentsDefault output: ~/Downloads/<slug>-walkthrough.html, then served on a stable local origin and handed back as http://walkthrough.localhost:<port>/<slug>/. Honour an explicit path if the user gives one.
Read the real code. Every line number in this document is a promise. A stop that opens the wrong line in front of the reviewer costs more credibility than the whole document earns. Open each file, confirm the symbol is on the line you cite, and confirm the file exists on disk before writing its link.
Get the change. The diff, the PR, the branch. What is actually new versus what was already there.
Find the entry point. Not the most interesting file. The place the request or the data actually enters the system.
Two rules, in this order.
1. Order stops by the life of the request, not by file, layer, or importance. If work happens in phases separated by time (a synchronous request, then a queued background job, then a later user action), those are separate acts with their own headings. Making the phase boundary visible is often the single most valuable thing in the document, because it is where "does this block the user" gets answered.
2. Inside an act, every stop must be reachable from the previous one by go-to-definition. Open a file, click a symbol, land on the next stop. Never "now open this other file", the presenter loses their place and the audience loses the thread. If two stops are not connected by a call, either they belong to different acts or a stop is missing between them.
Say the hop out loud in the step text: Cmd-click Foo, Line 126, cmd-click bar, Back up to Baz, line 141.
<li>
<p><span class="action">Line 135</span>, cmd-click <code>chunkDocument</code> → <a class="path" href="...">worker.go:200</a></p>
<pre><code>...six lines at most...</code></pre>
<div class="key"><ul><li>...</li><li>...</li></ul></div>
<div class="more"><b>Question?</b><ul><li>...</li></ul></div>
</li>
Snippets are for pointing at, not reading. Six lines maximum, elided with ... where the middle does not matter. If the snippet needs more than six lines to make its point, the stop is really two stops.
The default block. What this code is for, in fragments.
qtx means this runs inside the submit's own database write".An anticipated question, bolded, with a fragment answer. These are the ones that save the call.
Match the reviewer's level. A senior reviewer, often the person who designed the system. Explaining fundamentals to them is condescending and it costs trust. Use the real term.
| Do not write | Write |
|---|---|
| turns the text into 3072 numbers | embeds the question into a 3072-dim vector |
| compares the numbers | cosine distance between the query vector and each stored vector |
| a special kind of index | the ANN index, and the dimension cap it enforces |
Ban the phrases that sound like meaning. These survive drafts because they read smoothly and say nothing:
worth reading · the same form · the same space · handles it · takes care of · properly · as expected · under the hood · both or neither
Each of them hides the fact. Replace with the fact.
Concrete nouns only. "One item per file" is two vague words. "One queue row per uploaded document, a salary certificate, a bank statement" is checkable. If a word means two different things in the same document (a queue row and a database row), disambiguate every occurrence.
Numbers earn their place or leave. A measured latency figure is worth saying. A pile of threshold values the presenter would have to recite is noise. Point at the comment in the code that holds them instead.
Every path and every bare line reference becomes an anchor:
<a class="path" href="cursor://file/ABSOLUTE/PATH/file.go:135">Line 135</a>
/:.[]()+_- safe, so route files with brackets and plus signs survive.assets/editor.py, Cursor preferred, VS Code fallback. Mention the one-replace switch between them.Built from the document, not hand-maintained.
<h2>, nested entries per stopfile:line, monospace, because that is what the presenter is hunting forworker.go:141assets/template.html, replace {{TITLE}}, {{SUBTITLE}}, {{NAV}}, {{BODY}}.<h2> an id, every stop <li> an id, then build the nav from those.Prefer direct edits over generating the file with a script. A scripted sweep is right for a mechanical pass over dozens of identical blocks; for anything else it is slower, riskier, and one bad substitution silently corrupts every anchor in the file.
Run all of these. Report the counts, do not claim it works.
href="...file..." target exists on diskHand back a URL, not a file path. A file:// path cannot be pasted into a call, does not survive a screen share, and the editor links behave better from an http origin.
python3 assets/serve.py <output.html> --open
It prints one line, the URL, and holds the port until interrupted:
http://walkthrough.localhost:8477/my-change-walkthrough/
Browsers resolve *.localhost to loopback on their own, no DNS and no /etc/hosts edit, and treat it as a secure context. That last part is the point: editor links (cursor://, vscode://) trigger the browser's "open this application?" dialog, and only a secure context gets the Always allow checkbox. The origin (host and port together) is what the browser remembers the approval for, which is why the host and default port never change and the slug lives in the path. Approve once, never prompted again.
Why the bundled server and not python3 -m http.server. That serves the whole directory, and these files usually land in Downloads. serve.py binds loopback only and answers every path with the one file it was given, so a stray request cannot list or fetch anything else.
Run it in the background, read the URL from its output, hand that to the user. Say the port dies when the process does.
Three things depend on where this is running. Detect them, do not assume.
Editor scheme. Do not assume, and do not ask. Run the bundled probe:
python3 assets/editor.py # prints "cursor://file" or "vscode://file"
Cursor wins when both are installed. A machine with both is almost always someone who moved to Cursor and never uninstalled VS Code, so Cursor is the live editor and VS Code is residue. VS Code is the fallback, not a tie-break.
The probe checks the CLI on PATH first, then the platform's install locations: app bundles on macOS (/Applications and ~/Applications), Programs directories on Windows, desktop entries on Linux. If neither is found it exits non-zero and prints nothing on stdout, which is a real answer: write the file:line text without anchors rather than emitting links that silently do nothing when clicked.
Getting this wrong is the worst failure this document has, because it only surfaces mid-call, on the first click, in front of the reviewer.
Path shape. Absolute paths, in the platform's own form. On Windows that means vscode://file/C:/Users/..., forward slashes, drive letter kept.
Opener. open on macOS, xdg-open on Linux, start on Windows. serve.py --open already picks by platform, so prefer passing the flag over shelling out yourself.
If port 8477 is busy, serve.py walks up to the next free port and says so on stderr; a different port is a different origin, so the browser will ask to allow the editor link once more on that origin. Pass that warning on rather than letting it surprise the presenter mid-call. If the browser cannot resolve walkthrough.localhost (rare, some non-mainstream browsers), http://localhost:<port>/<slug>/ reaches the same server.
Only if they carry weight:
Not documentation. Not a design doc. Not something anyone reads without a call happening. It has one job: keep a person oriented while they talk and click at the same time. Anything that does not serve that comes out.
Guides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Synthesizes the current conversation into a structured spec (PRD) and publishes it to the project issue tracker with a ready-for-agent label, without interviewing the user.
npx claudepluginhub bishwas-py/understood --plugin understood