Files
Brummel ac3e718cb2 refine(pseudo): markers are pointing handles, not footnotes
Forbid the footnote/legend pattern: explanations for a marked
line must live inline at that line (rule 2), never in a
post-block `[1] = …, [2] = …` key that forces the reader to
bounce between code and a legend below it. A marker is purely a
label so the user can point ('expand [2]'); a line that reads
for itself carries a bare marker and no comment.

Rework rule 4 accordingly, add the Iron Law line, guard rule 1's
supporting-prose clause against becoming a legend, and rewrite
the worked example's trailing commentary to demonstrate inline
explanation with no marker key. Frontmatter and README updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 14:26:04 +02:00

175 lines
8.8 KiB
Markdown

---
name: pseudo
description: Use when the user wants code explained in human-readable, commented pseudocode rather than prose — invoked as `/pseudo` or when the user asks to "explain this in pseudocode". Every reply is centred on a pseudocode block (prose is allowed, but only in a supporting role to explain what the code cannot show); keeps comments sparse — on their own line and only where the code is not self-explanatory; opens with a source-file-and-approximate-line anchor; tags notable steps with reference markers ([1], [A]) that are pointing handles for the user, not footnotes — every explanation stays inline at its line, never in a legend below the block; sketches the layout of the data structures the code touches alongside the control flow; and leans on the source language's idiom in a language-tagged fence so it renders with syntax highlighting (while staying pseudocode, not compilable source). Strips detail irrelevant to the question and omits low-level mechanics (memory management, error plumbing) unless the question is about them. Defaults to the project's main entry point.
---
# pseudo — explain code as commented pseudocode
> **Violating the letter of these rules is violating the spirit.**
## Overview
The user wants to understand how code works without reading the
code. The medium of explanation is **commented pseudocode**
not the real source, and not prose carrying the explanation on
its own. Prose has a place, but a supporting one: it explains
what the code cannot show and then gets out of the way. The
pseudocode leans on the source language's idiom and is shown in a
fence tagged with that language, so it highlights in the terminal
and reads in the home language — yet it stays pseudocode: a
teaching artefact that shows the shape of the logic at the
altitude the question demands, and nothing more.
This is a conversational behaviour skill. It dispatches no
agents and runs no pipeline. While it is active, every answer
obeys the rules below.
## The Iron Law
```
PSEUDOCODE IS THE CENTRE OF EVERY ANSWER; PROSE ONLY SERVES IT.
COMMENT ONLY WHAT THE CODE CAN'T SAY ITSELF; A LINE ABOVE BEATS A TRAILING NOTE.
EVERY ANSWER OPENS WITH ITS SOURCE FILE AND APPROXIMATE LINE.
MARK THE NOTABLE POINTS SO THE USER CAN POINT BACK AT THEM.
MARKERS ARE POINTING HANDLES, NOT FOOTNOTES — EXPLAIN AT THE CODE, NEVER IN A LEGEND BELOW.
SHOW ONLY WHAT THE QUESTION IS ABOUT — REDUCE THE REST TO A STUB.
SKETCH THE DATA SHAPES THE CODE TOUCHES, NOT JUST THE CONTROL FLOW.
OMIT LOW-LEVEL MECHANICS UNLESS THE QUESTION IS ABOUT THEM.
LEAN ON THE SOURCE LANGUAGE'S IDIOM; TAG THE FENCE SO IT HIGHLIGHTS.
```
## Rules
1. **Pseudocode carries the answer; prose serves it.** The
pseudocode block is the centre of every reply. Prose *is*
allowed — but only to explain something the code cannot show
on its own, and it stays subordinate: a short note before or
after the block, never the main event. Such a note gives
context the code cannot carry; it never decodes the markers
line by line (that is a footnote legend — see rule 4). If a
reply is mostly prose with a token snippet, the balance is
wrong.
2. **Comment only what the code can't say itself.** Pseudocode
that reads clearly needs no comment — self-explanatory names
and structure are the whole point. Add a comment only where
intent, a non-obvious *why*, or a stub is not visible from the
code itself. Put it on its **own line above** the code it
explains; reserve trailing end-of-line comments for the
briefest notes (a bare marker, one or two words). A column of
trailing comments is harder to scan than a short note above
the line — when in doubt, own line.
3. **Anchor line first.** The block opens with a comment — in the
source language's own comment syntax (`//`, `#`, `--`) —
naming the source file and the approximate line the
explanation starts at, e.g. `// src/server.rs ~line 42`. The
line is a navigation hint, not a promise of exactness; "~"
signals that. If the answer spans several files, each new
file's section opens with its own anchor.
4. **Mark the notable points.** Tag the steps worth discussing
with a reference marker — `[1]`, `[2]` or `[A]`, `[B]`. The
marker is **purely a pointing handle for the user** — a label
so they can reply "expand [2]" or "why [B]?" without quoting
code. It is **not a footnote**. Everything the marked line
needs explained is explained *there*, inline, in the comment
at that line (rule 2). Never follow the block with a legend or
footnote list that re-states each marker — that forces the
reader to bounce between the code and a key below it, which is
exactly what inline explanation avoids. If a point cannot be
explained at its line, the answer is at the wrong altitude
(rule 10), not in need of a footnote. Mark only meaningful
points, not every line; numbering noise defeats the purpose.
5. **Lean on the source language, but stay pseudocode.** Shape
the pseudocode after the source language's idiom and tag the
fenced block with that language — ` ```rust `, ` ```python `,
` ```go ` — so the terminal renders syntax highlighting and
the reader recognises the home language. This is still
pseudocode, not source: reduced bodies, stubs, and
plain-language placeholders (`for each …`, `… details
elsewhere`) are welcome; it need not compile, and exact syntax
yields to readability whenever the two conflict. If the source
language is unknown or the answer spans several, fall back to a
neutral, highly readable style with a bare fence.
6. **Reduce the irrelevant.** Anything not on the path the user
asked about collapses to a one-line stub:
`validate(input)` with a brief `details elsewhere` note. Detail
is spent only on the topic.
7. **Omit mechanics by default.** Memory management, allocation,
error-propagation plumbing, logging, and similar are left
out — *unless* the question is precisely about them, in which
case they become the topic and rule 6 reduces everything else.
8. **Show the data shapes, not just the flow.** The control
flow is only half the picture; sketch the layout of the data
structures the code in focus reads or builds — the record
fields, the collection nesting, the variant cases that matter
to the question. Put the shape near the code that touches it,
in the same reduced spirit: only the fields on the topic path,
the rest stubbed with a brief `other fields elsewhere` note.
When the data layout *is* the question, it leads the answer
and the control flow becomes the stub.
9. **Default entry point.** When the user names no starting
point, begin at the project's main entry (the `main` function
/ primary CLI or server bootstrap). Otherwise start where
they point.
10. **Stay at one altitude; let the user zoom.** There is no
length cap, but each answer holds a single altitude rather
than expanding every branch at once. When a level has more
depth than the question needs, show that level and let the
markers invite the user to expand one point next — steer the
zoom with them rather than dumping every layer unprompted.
## Shape of a good answer
The source is Rust, so the fence is tagged `rust` (it highlights
in the terminal) and the pseudocode leans on Rust's idiom — while
staying pseudocode: `Vec<{ … }>` is not valid Rust, bodies are
reduced, placeholders stand in for omitted detail.
```rust
// src/server.rs ~line 30 — how a request reaches a handler
// [1] the structure match() reads; only `routes` is on the path
struct Router {
routes: Vec<{ path_pattern, handler }>,
// fallback handler, middleware chain elsewhere
}
fn main() {
let config = load_config(); // details elsewhere
let router = build_routes();
serve(router, |request| {
let handler = router.match(request.path); // [2]
let response = handler(request); // [3]
send(response);
});
}
```
Note what carries the explanation: it is **inside** the block.
`[1]` needs a word of intent, so that word sits on its own line
right above the struct. `[2]` and `[3]` mark lines that read for
themselves, so they carry no explanation at all — the markers
are bare, present only so the user can point ("expand [2]").
Crucially, **nothing follows the block to decode the markers**
no `[1] = …, [2] = …` legend. Everything a marked line means is
already at that line, so the reader never bounces between code
and a key below it.
(The paragraph you are reading is commentary on the example, not
part of the answer. A real reply is the fenced block, optionally
a sentence of supporting prose — never a marker legend.)
## When to stop
The skill stays active for the conversation. The user leaves it
by asking for a plain prose explanation (one not built around a
pseudocode block), invoking another skill, or saying so.