Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
3d7e90b
Merge pull request #241 from slowdini/main
slowdini Jun 18, 2026
24cd9a1
chore: icons
slowdini Jun 22, 2026
6444ad9
chore(branding): contributing and new icon references
slowdini Jun 22, 2026
346a396
Merge pull request #246 from slowdini/feat/branding-updates
slowdini Jun 22, 2026
7263201
chore(docs): template for eval-backed evidence
slowdini Jun 23, 2026
1e15200
Merge pull request #247 from slowdini/docs/eval-backed-proof-244
slowdini Jun 23, 2026
1af13bc
feat(demo): add VHS-scripted test-driven-development CLI demo
slowdini Jun 24, 2026
79d9904
docs(readme): add CLI demo hero GIF with synthpunk credit
slowdini Jun 24, 2026
4432c63
Merge pull request #248 from slowdini/feat/cli-demo-245
slowdini Jun 24, 2026
0bd5596
chore(docs): add badges to readme
slowdini Jun 24, 2026
d13b9bf
Merge pull request #249 from slowdini/docs/readme-badge-row-245
slowdini Jun 24, 2026
6ee0768
chore(docs): icon size
slowdini Jun 24, 2026
86f09b9
chore(skills): tighten hardening-plans evals
slowdini Jun 24, 2026
bf635a8
Merge pull request #251 from slowdini/chore/hardening-plans-evals-1.0…
slowdini Jun 24, 2026
ce2706f
chore(skills): baseline eval data for hardening-plans
slowdini Jun 24, 2026
07f15f3
Merge pull request #252 from slowdini/chore/hardening-plans-1.0-eval-…
slowdini Jun 24, 2026
5eb7e0e
feat(skills): full suite improvement for investigating-bugs
slowdini Jun 25, 2026
e97ffc3
chore: gitignore
slowdini Jun 26, 2026
07387ca
Merge pull request #253 from slowdini/chore/investigating-bugs-evals
slowdini Jun 26, 2026
a931076
refactor(skills): organize companion resources
slowdini Jul 25, 2026
03b2cd0
chore: remove cosmetic linebreaks
slowdini Jul 25, 2026
3552606
Merge pull request #260 from slowdini/fix/256-skill-resource-layout
slowdini Jul 25, 2026
eaeb73e
chore: bump version to 0.5.4
github-actions[bot] Jul 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"plugins": [
{
"name": "slow-powers",
"version": "0.5.3",
"version": "0.5.4",
"source": {
"source": "url",
"url": "./"
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
{
"name": "slow-powers",
"description": "Agent skills to upgrade plan mode and debugging, enforce best practices, and enhance native features, not replace them.",
"version": "0.5.3",
"version": "0.5.4",
"source": "./",
"author": {
"name": "Max Haarhaus",
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "slow-powers",
"description": "Agent skills to upgrade plan mode and debugging, enforce best practices, and enhance native features, not replace them.",
"version": "0.5.3",
"version": "0.5.4",
"author": {
"name": "Max Haarhaus",
"email": "samiamorwas@gmail.com"
Expand Down
6 changes: 3 additions & 3 deletions .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "slow-powers",
"version": "0.5.3",
"version": "0.5.4",
"description": "Agent skills to upgrade plan mode and debugging, enforce best practices, and enhance native features, not replace them.",
"author": {
"name": "Max Haarhaus",
Expand Down Expand Up @@ -37,8 +37,8 @@
"privacyPolicyURL": "https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement",
"termsOfServiceURL": "https://docs.github.com/en/site-policy/github-terms/github-terms-of-service",
"brandColor": "#FFF8F5",
"composerIcon": "./assets/slow-powers-small.svg",
"logo": "./assets/app-icon.png",
"composerIcon": "./assets/mark.png",
"logo": "./assets/logo.png",
"screenshots": []
}
}
6 changes: 6 additions & 0 deletions .github/badges/evals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"schemaVersion": 1,
"label": "evals",
"message": "measuring",
"color": "lightgrey"
}
7 changes: 1 addition & 6 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
.worktrees/
.private-journal/
# Ignore local Claude Code state, but track the shared, committed settings.
.claude/*
!.claude/settings.json
.DS_Store
node_modules/
inspo
triage/
# Ephemeral eval run output. Curated baselines are promoted into
# skills/<skill>/evals/baseline/ (tracked) via `bun run evals:promote-baseline`.
skills-workspace/
.eval-magic
3 changes: 0 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ This repo ships Slow-powers across three harnesses:
- `.codex-plugin/` — OpenAI Codex plugin
- `opencode/` — OpenCode plugin (`@slowdini/slow-powers-opencode`)

See the [feature support](README.md#feature-support) tables in the README for current tier per harness.

## Editing the right files

Two file-confusion traps are common in this repo. Avoid both:
Expand All @@ -33,7 +31,6 @@ All skills MUST use cross-harness vocabulary, as described in `slow-powers/writi

## Pull Request Requirements

- One problem per PR. Bundled unrelated changes will be split or sent back.
- Read existing skills before proposing changes to skill content. Skill
prose has been tuned over many iterations upstream and downstream; changes
to behavior-shaping content (Red Flags tables, rationalization lists,
Expand Down
32 changes: 32 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Contributing to Slow-powers

Thanks for your interest in Slow-powers! The best way to contribute right now is
to **open an issue** — bug reports, workflow feedback, and ideas are all genuinely
helpful and shape where the project goes.

## Open an issue

Head to [**New issue**](https://github.com/slowdini/slow-powers/issues/new/choose)
and pick the template that fits:

- **Mechanical Bug Report** — crashes, install failures, plugin load errors, or
other things that are plain broken.
- **Workflow Bug Report** — the agent skips a skill, uses the wrong one, or
misreads instructions. Include the skill(s) involved and a transcript excerpt.
- **Other** — questions, documentation issues, or general feedback.

Filling in the template (version, harness, model, and a clear repro) is the single
biggest thing you can do to help us act on a report quickly.

## Pull requests

We are **not accepting unsolicited community pull requests** at this time.
Slow-powers' skill prose is tuned through repeated evaluation, and changes need
context and eval evidence that a drive-by PR can't carry. If you've spotted a
problem or have a change in mind, please **open an issue** describing it — that's
the path that gets things fixed.

## Code of Conduct

This project is governed by our [Code of Conduct](./CODE_OF_CONDUCT.md). By
participating, you're expected to uphold it.
45 changes: 45 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,39 @@
<p align="center">
<img src="assets/logo.png" alt="Slow-powers" width="360" />
</p>

<p align="center">
<a href="https://github.com/slowdini/slow-powers/actions/workflows/ci.yml"><img
src="https://img.shields.io/github/actions/workflow/status/slowdini/slow-powers/ci.yml?branch=main"
alt="CI status" /></a>
<a href="https://github.com/slowdini/slow-powers/releases/latest"><img
src="https://img.shields.io/github/v/release/slowdini/slow-powers"
alt="Latest release" /></a>
<a href="https://www.npmjs.com/package/@slowdini/slow-powers-opencode"><img
src="https://img.shields.io/npm/v/@slowdini/slow-powers-opencode"
alt="OpenCode plugin on npm" /></a>
<a href="./LICENSE"><img
src="https://img.shields.io/github/license/slowdini/slow-powers"
alt="License: MIT" /></a>
<a href="#why-trust-these-skills"><img
src="https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fslowdini%2Fslow-powers%2Fdev%2F.github%2Fbadges%2Fevals.json"
alt="evals" /></a>
</p>

# Slow-powers

Slow-powers is an agent skill set for professional software development. It enhances plan mode and debugging work, enforces best practices, and works _with_ the features of modern agents, instead of replacing them. It's the plugin for people who don't install plugins.

<p align="center">
<img src="assets/demo/tdd-demo.gif"
alt="The test-driven-development skill in a coding agent: write a failing test, watch it fail for the right reason, write minimal code — and the test catches a race before it ships."
width="760" />
</p>

<p align="center">
<sub>The <code>test-driven-development</code> skill catching a race before it ships. Terminal themed with <a href="https://github.com/samiamorwas/synthpunk">Synthpunk Neon Dark</a>.</sub>
</p>

## About this fork

Slow-powers is a fork of [obra/superpowers](https://github.com/obra/superpowers). Much of the skill content is sourced from upstream, with rewrites focusing on clarity, token efficiency, and providing a generally lighter touch.
Expand Down Expand Up @@ -76,6 +108,19 @@ Slow-powers provides a set of highly focused skills that ensure your agent opera
6. **`writing-skills`** — Helps write and edit skills, following the same best practices that guide slow-powers itself.
7. **`evaluating-skills`** — Teaches the agent how to run skill evals, so the value of skills and prose changes can be objectively assessed.

## Why trust these skills?

Most skill packs ship on vibes. Every slow-powers skill ships with a documented eval — or it doesn't ship (see [Philosophy](#philosophy)). Each skill is measured against an agent with **no skill**, so the number means "this skill made the agent better," not just "we changed something."

| Skill | Improvement vs no skill | n | Model | Last measured |
|---|---|---|---|---|
| `hardening-plans` | TBD | TBD | TBD | TBD |
| `investigating-bugs` | TBD | TBD | TBD | TBD |
| `test-driven-development` | TBD | TBD | TBD | TBD |
| `verifying-development-work` | TBD | TBD | TBD | TBD |

**Improvement vs no skill** is the gain in eval pass-rate (percentage points) when the same [eval-magic](https://github.com/slowdini/eval-magic) suite runs with the skill versus without it.

## Intended Workflows

The skills declare prerequisite / next-step gates so the agent follows an intended skill sequence. These gates **suggest** what comes before and after a skill once it is invoked; they do **not** restrict when any skill can be invoked.
Expand Down
Binary file removed assets/app-icon.png
Binary file not shown.
Binary file added assets/demo/tdd-demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
73 changes: 73 additions & 0 deletions assets/demo/tdd-playback.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#!/usr/bin/env bash
# Re-enactment of a REAL Claude Code test-driven-development session (RED -> GREEN).
#
# Deterministic: pacing lives here (the "actor"), VHS is the "camera".
# Colors use base-16 ANSI (30-37 / 90-97 + bold) so the terminal theme drives them
# (here, Synthpunk Neon Dark). Glyphs limited to VHS's default font: "└─ ✓ ✗ ●".
set -u

RST=$'\e[0m'; B=$'\e[1m'
FG=$'\e[97m' # brightWhite -> readable text
DIM=$'\e[90m' # brightBlack -> muted chrome
RED=$'\e[31m' # fail
GREEN=$'\e[32m' # pass
YEL=$'\e[33m' # agent bullet
CYAN=$'\e[36m' # skill name
BLUE=$'\e[34m' # prompt caret

human() { printf '%s>%s %s%s%s\n' "$BLUE" "$RST" "$B$FG" "$1" "$RST"; }
bullet() { printf '\n%s●%s %s\n' "$YEL" "$RST" "$1"; }
tool() { printf '\n%s●%s %s%s%s%s(%s)%s\n' "$YEL" "$RST" "$B$FG" "$1" "$RST" "$DIM" "$2" "$RST"; }
res() { printf '%s └─%s %s\n' "$DIM" "$RST" "$1"; }
cont() { printf '%s %s%s\n' "$DIM" "$1" "$RST"; }
pause() { sleep "$1"; }

clear
pause 0.4

# the human's request (generic: a data-fetching change with a subtle ordering bug)
human "for your own account, read the api key from the session instead of refetching it"
pause 0.9

bullet "Using ${B}${CYAN}test-driven-development${RST}."
pause 0.8

# ---------- RED ----------
printf '\n%s %sRED%s — write the failing test first\n' "$B" "$RED" "$RST"
pause 0.5
tool "Write" "overview.test.ts"
res "${FG}it(\"reads the key from the session for your own account\")${RST}"
pause 0.9
tool "Bash" "bun test"
pause 0.7
res "${RED}✗ reads the key from the session for your own account${RST}"
cont "${DIM}expected the session key, but fetchAccount() was called${RST}"
res "${RED}0 pass, 1 fail${RST}"
pause 0.6
printf ' %s✓%s fails for the right reason — not wired up yet\n' "$GREEN" "$RST"
pause 1.1

# ---------- GREEN (first attempt reveals a race the test catches) ----------
printf '\n%s %sGREEN%s — minimal code to pass\n' "$B" "$GREEN" "$RST"
pause 0.5
tool "Edit" "overview.ts"
res "${FG}use the session key when it's your own account${RST}"
pause 0.9
tool "Bash" "bun test"
pause 0.7
res "${RED}✗ fetchAccount() still fired once${RST}"
cont "${DIM}race: it ran before the session finished loading${RST}"
pause 0.8
bullet "The test caught a race the first cut missed — fixing before I move on."
pause 1.1
tool "Edit" "overview.ts"
res "${FG}gate the fetch on the session being loaded${RST}"
pause 0.9
tool "Bash" "bun test"
pause 0.7
res "${GREEN}✓ reads the key from the session for your own account${RST} ${DIM}[3ms]${RST}"
res "${GREEN}12 pass, 0 fail${RST}"
pause 0.7

bullet "${B}${GREEN}Green.${RST} The test caught a race before it shipped."
pause 2.0
27 changes: 27 additions & 0 deletions assets/demo/tdd.tape
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# VHS tape for the slow-powers CLI demo (see README hero GIF).
# Regenerate with: bun run demo (which runs: vhs assets/demo/tdd.tape)
# Paths are relative to the repo root, where vhs is invoked.
#
# The pacing/content lives in the actor script (tdd-playback.sh); this tape is
# just the "camera": canvas, font, and terminal theme.

Output assets/demo/tdd-demo.gif
Set Shell bash

# Terminal theme: Synthpunk Neon Dark — github.com/samiamorwas/synthpunk
# (VHS takes a named theme or inline JSON, not a file path, so it is inlined here.)
Set Theme { "name": "Synthpunk Neon Dark", "background": "#0F0620", "foreground": "#E8E0F0", "cursor": "#D040FF", "selection": "#123A52", "black": "#060210", "red": "#FF3A50", "green": "#40FF80", "yellow": "#FFE040", "blue": "#A060FF", "magenta": "#FF2A8A", "cyan": "#00E8F0", "white": "#B8A8D0", "brightBlack": "#8878A0", "brightRed": "#FF6173", "brightGreen": "#66FF99", "brightYellow": "#FFE666", "brightBlue": "#B380FF", "brightMagenta": "#FF55A1", "brightCyan": "#27F8FF", "brightWhite": "#E8E0F0" }

Set FontSize 19
Set Width 1080
Set Height 900
Set Padding 30
Set Framerate 24
Set TypingSpeed 0ms

Hide
Type "bash assets/demo/tdd-playback.sh"
Enter
Sleep 300ms
Show
Sleep 15s
Binary file added assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/mark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 0 additions & 1 deletion assets/slow-powers-small.svg

This file was deleted.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@slowdini/slow-powers-opencode",
"version": "0.5.3",
"version": "0.5.4",
"description": "Slow-powers — structured development workflows for coding agents (TDD, debugging, verification, git hygiene)",
"type": "module",
"main": "./opencode/plugins/slow-powers.js",
Expand Down Expand Up @@ -49,6 +49,7 @@
"evals:grade": "eval-magic grade --skill-dir ./skills",
"evals:aggregate": "eval-magic aggregate --skill-dir ./skills",
"evals:promote-baseline": "eval-magic promote-baseline --skill-dir ./skills",
"demo": "vhs assets/demo/tdd.tape",
"check": "biome check --write .",
"check:ci": "biome check --error-on-warnings .",
"typecheck": "tsc --noEmit",
Expand Down
8 changes: 4 additions & 4 deletions skills/evaluating-skills/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ A **deterministic** change doesn't move that needle. Removing a one-line "announ

**Either way, announce the decision and why** — "deterministic instruction removal, no eval" or "this changes pressured compliance, I'll run an eval." A visible decision is one the user can override; a silent one is a rationalization waiting to happen. **The door stays open:** if the user wants an eval anyway, run a worthwhile one — design real cases, don't phone it in to confirm a foregone conclusion.

**Skill type is a fast read, not a verdict.** Reference and manually-invoked procedural changes *often* land deterministic; discipline, technique, and pattern changes *often* carry contingency (`pressure-scenarios.md` draws the same line under "When to use" / "Don't use them for"). Use type to orient your first guess — never as the answer. The decision is per *change*, not per type: a deterministic typo fix in a discipline-enforcing skill still skips, and restructuring a reference doc because the agent kept missing a section is contingent and earns an eval.
**Skill type is a fast read, not a verdict.** Reference and manually-invoked procedural changes *often* land deterministic; discipline, technique, and pattern changes *often* carry contingency ([`pressure-scenarios.md`](references/pressure-scenarios.md) draws the same line under "When to use" / "Don't use them for"). Use type to orient your first guess — never as the answer. The decision is per *change*, not per type: a deterministic typo fix in a discipline-enforcing skill still skips, and restructuring a reference doc because the agent kept missing a section is contingent and earns an eval.

## The Iron Law

Expand Down Expand Up @@ -103,15 +103,15 @@ Tips for writing good prompts:
- **Vary phrasing.** Mix casual ("hey can you check this") with precise ("Run `bun test`, quote the output").
- **Cover edge cases.** Include at least one boundary condition, malformed input, or ambiguous instruction.
- **Use realistic context.** Real users reference file paths, function names, personal context. "Process this data" is too vague to test anything useful.
- **For discipline-enforcing skills**, see `pressure-scenarios.md` for the pressure-scenario taxonomy (time pressure, sunk cost, authority, exhaustion, etc.).
- **For discipline-enforcing skills**, see the [pressure-scenario taxonomy](references/pressure-scenarios.md) (time pressure, sunk cost, authority, exhaustion, etc.).

**Don't write assertions yet.** You don't know what "good" looks like until you see what the first run produces.

### Testing by skill type

What "stresses the skill" depends on what kind of skill it is. The four types from `slow-powers:writing-skills` each need a different style of prompt:

- **Discipline-enforcing skills** (TDD, verifying-development-work). Test with pressure — academic prompts ("explain how TDD works") will pass without measuring anything useful. Combine multiple pressures (time + sunk cost + authority + exhaustion) and force a choice. See `pressure-scenarios.md` for the taxonomy. The wild failure for these skills is almost always *mid-session* — the agent is already committed to a skill-free approach when the trigger arrives — so a cold prompt under-measures them; pair each cold case with a **seeded** one (see *Seeding conversation context* below). Success = the rule holds under maximum pressure.
- **Discipline-enforcing skills** (TDD, verifying-development-work). Test with pressure — academic prompts ("explain how TDD works") will pass without measuring anything useful. Combine multiple pressures (time + sunk cost + authority + exhaustion) and force a choice. See the [pressure-scenario taxonomy](references/pressure-scenarios.md). The wild failure for these skills is almost always *mid-session* — the agent is already committed to a skill-free approach when the trigger arrives — so a cold prompt under-measures them; pair each cold case with a **seeded** one (see *Seeding conversation context* below). Success = the rule holds under maximum pressure.
- **Technique skills** (condition-based-waiting, root-cause-tracing). Test application: hand the agent a new scenario where the technique applies and check it gets used correctly. Include at least one edge-case variation. Success = the technique transfers to a situation the skill didn't explicitly describe.
- **Pattern skills** (flatten-with-flags, information-hiding). Test recognition: include prompts where the pattern applies and prompts where it doesn't. Success = the agent applies the pattern when warranted and refrains when it isn't.
- **Reference skills** (API docs, syntax guides). Test retrieval: ask questions whose answers are in the reference, including a few that hit gaps you suspect. Success = the agent finds the right section and uses it correctly.
Expand Down Expand Up @@ -199,6 +199,6 @@ The mechanics of executing a run live in **[eval-magic](https://github.com/slowd
## See also

- `slow-powers:writing-skills` — drafting a skill (Phase 1)
- `pressure-scenarios.md` — pressure-scenario taxonomy for authoring prompts that stress discipline-enforcing skills
- [Pressure scenarios](references/pressure-scenarios.md) — taxonomy for authoring prompts that stress discipline-enforcing skills
- eval-magic (the `eval-magic` tool) — runs the evals this skill teaches you to author
- agentskills.io/skill-creation/evaluating-skills — the methodology this skill is derived from
Loading
Loading