Skip to content
Agentmart
Submit a tool

nwave-wave-summary

Use when asked what finished work decided, rather than where it stands or what you were doing — "what did DISCUSS decide", "what did that stage settle"…

Skill by pmvanev

IndexedMIT
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/pmvanev-nwave-wave-summary

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Use when asked what finished work decided, rather than where it stands or what you were doing — "what did DISCUSS decide", "what did that stage settle", "catch me up on what this feature decided", "what did that slice actually land", "what did that slice ship as against its brief", "summarise the decisions" — in a repo holding `docs/feature/`. Two modes: a finished stage's decisions, and with --slice a finished slice's brief reconciled against what shipped. 200 words each, plain English, with no file paths, handles, card numbers or decision numbers — the decision itself, never the label pointing at it. Reads and prints; writes nothing and derives no status. For where a slice STANDS use phil:nwave-slice-status; for what you personally were doing, phil:resume; for what is on the board, phil:board-snapshot.

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/nwave-wave-summary

What's inside

Skill name
nwave-wave-summary
Description
Use when asked what finished work decided, rather than where it stands or what you were doing — "what did DISCUSS decide", "what did that stage settle", "catch me up on what this feature decided", "what did that slice actually land", "what did that slice ship as against its brief", "summarise the decisions" — in a repo holding `docs/feature/`. Two modes: a finished stage's decisions, and with --slice a finished slice's brief reconciled against what shipped. 200 words each, plain English, with no file paths, handles, card numbers or decision numbers — the decision itself, never the label pointing at it. Reads and prints; writes nothing and derives no status. For where a slice STANDS use phil:nwave-slice-status; for what you personally were doing, phil:resume; for what is on the board, phil:board-snapshot.
License
MIT
Instructions
231 lines in SKILL.md · view on GitHub

Agent Skills spec issues

  • files: referenced but missing: scripts/plain_language.py, scripts/check-readonly-commands.py

Files (31)

  • SKILL.md
  • why-these-rules.md · references/
  • expected.md · self-test/01-the-largest-artifact/
  • manifest.json · self-test/01-the-largest-artifact/
  • expected.md · self-test/02-nothing-recorded/
  • manifest.json · self-test/02-nothing-recorded/
  • expected.md · self-test/03-no-target-given/
  • manifest.json · self-test/03-no-target-given/
  • expected.md · self-test/04-handles-everywhere/
  • manifest.json · self-test/04-handles-everywhere/
  • expected.md · self-test/05-tied-targets/
  • manifest.json · self-test/05-tied-targets/
  • expected.md · self-test/06-named-not-stated/
  • manifest.json · self-test/06-named-not-stated/
  • expected.md · self-test/07-named-target-missing/
  • manifest.json · self-test/07-named-target-missing/
  • expected.md · self-test/08-landed-differs-from-brief/
  • manifest.json · self-test/08-landed-differs-from-brief/
  • expected.md · self-test/09-attribution-incomplete/
  • manifest.json · self-test/09-attribution-incomplete/
  • expected.md · self-test/10-brief-and-outcome-agree/
  • manifest.json · self-test/10-brief-and-outcome-agree/
  • expected.md · self-test/11-nothing-the-brief-does-not-say/
  • manifest.json · self-test/11-nothing-the-brief-does-not-say/
  • expected.md · self-test/12-the-longest-brief/
  • manifest.json · self-test/12-the-longest-brief/
  • expected.md · self-test/13-promised-but-not-landed/
  • manifest.json · self-test/13-promised-but-not-landed/
  • expected.md · self-test/14-slice-number-not-found/
  • manifest.json · self-test/14-slice-number-not-found/
  • README.md · self-test/

SKILL.md (first lines)

# Wave summary — what the thinking decided, not where the work stands

A finished artifact is written for the wave that produced it: thousands of words whose load-bearing
sentences are keyed on identifiers the reader must resolve first (measurements in
`references/why-these-rules.md`). **A record nobody opens is not meaningfully different from one nobody
wrote.**

## What this answers, and what it does not

| Question | Command |
|---|---|
| What did this stage decide? | **this one** |
| Where does the work stand? | `phil:nwave-slice-status` |
| What was *I* doing? | `phil:resume` |
| What is on the board? | `phil:board-snapshot` |
| What is wrong with the cards? | `phil:groom-issues` |

**Never derive a status.** `phil:nwave-slice-status` owns every derivation over these files, and two
derivations over one source drift. Where the reader wants position, name that skill and stop.

## Resolving the target

**With a name, read `docs/feature/<name>/feature-delta.md`.**

**With no name, take the most recently touched feature** — and say that is what was taken:

```sh
git log -1 --format=%cI -- docs/feature/<id>/
```

**"Most recently completed" is not recorded anywhere, so it is not what this resolves.** No artifact
carries a completion marker; the newest commit touching a feature directory is the closest honest
signal, and it is not the same thing. A feature whose DISCUSS landed an hour ago sorts above one finished
last week — which is usually right and is sometimes not. **Name the feature and its artifact's date in
the output** so a wrong pick is visible immediately rather than inferred from a summary that reads
plausibly.

**Where two features tie, say so and stop.** Do not pick. Where no `docs/feature/` exists at all, or a
named feature does not, that is a different answer — see *Decision outcomes*.

## The summary

**200 words or fewer, counted over the whole rendered output** — the summary, the provenance line, the
outcome names, and any `ARGUMENT-DROPPED` or `ATTRIBUTION-INCOMPLETE` clause. Everything printed counts; a line outside the budget is
the budget leaking.

**Nothing counts it at run time**, and that is a deliberate trade rather than an oversight — see
*Half enforced, half promised* below.

**State what was decided and what it rules out.** A stage's value to a later reader is the decisions and
their boundaries — not the argument that produced them, which is what the artifact is for.

**Where the summary will not fit, cut the argument and never the decisions.** A decision named without
its reasoning is still useful; reasoning without its decision is not. Say what was left out, and report
`ARGUMENT-DROPPED`.

**Name the feature read, and the date of the artifact** — *"the board-snapshot feature record, last
changed 2026-09-08"*. The discarded 98% is then one command away and never has to be reconstructed from
the summary.

**Name the feature, never the path.** A path is a file-path identifier and the vocabulary rule below
forbids one everywhere, this line included — there is no exemption, because a reader who knows the
feature can find its record and a reader who cannot is not helped by a path either.

### State the decision, never its number

**No identifier of any kind reaches the output** — no file path, no bracketed identifier, no bare handle
like `D11` or `ADR-013`, and **no card number either**.

**This is the strictest vocabulary rule in the plugin, and the reason is positional.** A board read
prints `#34` because the number has a column of its own; forbidding it there would only launder it into
*card 34*. **A summary has no column.** Every identifier in it sits mid-sentence, where it is precisely
the lookup this command exists to spare the reader.

**A slice's own number is the one exemption, and nothing else gained one.** A slice summary must say
which slice it read, exactly as the stage summary names its feature — an identifier naming *what this
output is about* is not the lookup the rule exists to remove. Commit shas stay forbidden: a sha points
into history and is never the subject of a sentence.

So *"per the fourth locked decision"* is not the fix, and neither is *"as recorded in the delta"*. The fix
is to **say the thing**: *"the board's order is consumed and never recomputed, because a second producer
would make neither answer trustworthy."*

**Half enforced, half promised, and which is which matters — including inside the enforced half.**
`scripts/plain_language.py` holds both the counter and the forbidden list. **The fixtures apply the
forbidden list and do not apply the counter**: no fixture here can fail because something was too long,
and the counter appears in the suite only to prove a counterexample is *short* enough to fail for the
right reason. So the word ceiling is prose at run time and prose at build time; only the vocabulary is
checked.

Nothing counts the rendered output at run time either: this command holds no interpreter, deliberately,
because that is what keeps the read-only grant narrow. At run time both rules are this section.

### When the stage recorded nothing

**Say so. Do not summarise.** An absent or empty artifact, or one that records only a heading, gets
`NOTHING-RECORDED` and one sentence naming what was looked for and what was found.

A confident 200 words about a stage that decided nothing is the worst output this command can produce,
because it is indistinguishable afterwards from a real summary — and it is the failure this feature would
otherwise introduce, having never existed before.

## The slice mode — `--slice`

The stage summary reads one artifact. **The slice summary reads a brief and reconciles it against what
shipped**, because a brief states what a slice *intended* and the useful question is what it *landed*.

**200 words per slice**, same vocabulary rule.

**Resolve the feature first** — by name, or as the stage mode resolves its default — because slice
numbers repeat across features: a slice number names a brief inside that feature. **With a number, read
that slice. With none, read the feature's most recently touched brief**, named in the output for the same
reason. **Never summarise every slice
at once:** a per-slice bound leaves the whole output unbounded, on a command whose one promise is a
bounded read. Where briefs tie, that is `TARGET-AMBIGUOUS`; where a number names no brief,
`TARGET-NOT-FOUND`.

### Attributing commits to a slice

From pmvanev/phil-claude-plugin, MIT.

More from pmvanev/phil-claude-plugin

Signals

Stars
0
Forks
0
Open issues
10
Last commit (this folder)
Oct 13, 2026 (15 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from pmvanev

Cite this page

nwave-wave-summary skill. Agent Mart. https://agentmart.dev/skills/pmvanev-nwave-wave-summary (last updated 2026-10-24)