research-plan-implement v5.0.0
This is a breaking release. /iterate-plan is gone, /design is now /design-doc, and artifacts moved from thoughts/shared/ to a flat .rpi/.
Upgrading
/plugin marketplace update research-plan-implement-workflow
/plugin
Then Manage → research-plan-implement → Update. In your project, re-run /setup: it pins your installed version, shows the delta before touching a file, and carries your own edits into the regenerated skills. It asks before moving your artifacts root and before removing a renamed skill.
Three independent changes ship together.
Where artifacts live. thoughts/shared/ was inherited from HumanLayer's original
workflow, where it named a place for an agent's working notes. Two things were wrong
with it. The name described a mood rather than a content type, and the
directory-per-type hierarchy meant four mkdirs and four globs to express something a
filename already says. Artifacts now live flat in .rpi/, and the agents that read them
no longer have a directory name baked into their own.
How much prose the workflow produces. The previous version was too willing to write
it. /prepare-pr wrote PR descriptions long enough that the "read this carefully"
section stopped being read carefully, and /implement-plan finished each phase holding
the whole design rationale in context and parked it in the source as comments. Both are
now bounded.
How many skills there are. /iterate-plan described revising a plan as a workflow
phase. It isn't one — editing a file is not a phase, and every step the skill described
was either generic agent behavior or a restatement of /create-plan. It's gone, and the
two rules worth keeping moved into /create-plan.
Changed
-
Default artifacts directory is
.rpi/, and it's flat. The type moved from
the directory into the filename's last segment:thoughts/shared/plans/2026-01-05-auth.md -> .rpi/2026-01-05-auth-plan.mdNames are
YYYY-MM-DD-[TICKET-]description-{research,design,plan,review}.md.
Date-first sorts one feature's whole chain together, which is the order you
actually read them in. A hidden root that only this workflow writes to also
takes a one-line.gitignoreentry — under a shared directory you'd be
ignoring by glob and silently catching hand-written docs with it. -
/implement-planand/prepare-prlocate review metadata by swapping a
plan's-plansuffix for-reviewrather than mirroring a basename across
two directories. Same deterministic lookup, one less directory. -
thoughts-locatorandthoughts-analyzerare nowartifact-locatorand
artifact-analyzer. The location is the user's to choose, so the agent names
no longer assert one./research-codebaseand/iterate-planreference the
new names. -
The two agents are always generated. They were previously conditional on a
thoughts/directory the workflow wrote to regardless, so the condition never
meant anything. -
artifact-locatorcategorizes by filename suffix instead of by directory, and
carries the one caveat a hidden root introduces: an unscoped search skips
.rpi/, so the directory has to be named explicitly (path: ".rpi"). Scoped
that way it reads normally even when gitignored. -
Setup states the
.rpi/default rather than asking how to structure a
directory, and takes an override for the root only. The naming convention is
fixed — the metadata lookup above depends on both ends agreeing. -
The gitignore recommendation is one line,
.rpi/. -
/prepare-prbuilds one numbered list of stops instead of a prose review
guide. A stop is a file, a line or range, a type, and a claim to test — not a
description of what the code does. The list is built once and rendered in up to
three places:- Inline review comments on the PR — the detail, anchored to the line it's
about, posted as oneCOMMENTreview viagh api .../pulls/<n>/reviews. Each
stop becomes a resolvable thread, so a reviewer ticks stops off as they go. - A numbered index in the PR description — one line per stop, capped at
60 lines for the whole description. Mechanical files get one line, not an
inventory; "Suggested Review Order" is gone because the numbering is the order. - A tuicr session, when the author walks it.
- Stop types carry intent:
issue,note,suggestion, andyagni— the last
for an abstraction, config, or layer with one caller that could be inlined until
it has two. --no-stopskeeps the whole guide in the description. That's also the behavior
/setupgenerates for projects on a forge without inline review comments.
- Inline review comments on the PR — the detail, anchored to the line it's
-
/implement-plandefaults to writing no comments. A comment now has to clear
two tests before it's written: would a competent reader be surprised, and is it
under three lines. Narration, history ("previously X, now Y"), symmetry notes,
justification of the ordinary, and restated design decisions are called out by name
as things not to write. Every phase ends with a re-read that deletes the comments
that don't clear both bars. A deliberate simplification with a known ceiling goes in
the phase's### Completionblock under Waived or unproven, where/prepare-pr
already looks — not into a source comment. -
/implement-planfixes root causes, not symptoms. A phase that names a bug names
a symptom; the skill now checks every caller of the function it's about to touch
first, on the grounds that one guard in the shared function is both the smaller diff
and the real fix. -
/create-planplans the smallest thing that works. Before specifying new code for
a phase it checks, in order, for an existing helper or pattern in the codebase, the
standard library or framework, and an already-installed dependency. An interface with
one implementation or a config value nobody sets goes under What We're NOT Doing
for the user to overrule. -
/guide'sreviewtopic and phase tips describe the stop model. -
The
/designskill is now/design-doc. Same inputs, same ~200-line
artifact, same-design.mdoutput — only the skill's name changed. Every
cross-reference in the other skills points at it, and the herdr phase glyph is
still 🎨.- Upgrades write
.claude/skills/design-doc/and remove the old
.claude/skills/design/after asking. Local edits have to be carried
across first — a rename can't merge them for you. - Aliases, scripts, and team docs that invoke
/designneed updating by hand.
- Upgrades write
Added
-
Upgrade asks before moving anything. An existing install picks one of
three: keep the root it has, adopt.rpi/, or name its own. Setup recovers the
current root by grepping the installed skills rather than assuming
thoughts/shared/. -
Choosing to move relocates, renames, and relinks. Because the type moves
from the directory into the filename, a prefix swap isn't enough: every
cross-reference — plan to its design and research, review metadata to its plan,
design doc to its.htmlmockup — is rewritten per type. The migration handles
untracked files (the old default recommended gitignoringthoughts/, so most
of them are), skips rather than overwrites an occupied destination, reports
anything that isn't.mdor.html, and leaves everything outside the
workflow's own directories alone. -
prepare-pr/tuicr-walkthrough.md— a progressive-disclosure sibling for walking a
PR with the author in tuicr, stop by stop. Because
the stops are posted as GitHub review threads,tuicr pr <n>renders them natively
and there is no seeding step; resolving a thread ticks it off in both places. Covers
session discovery, the six ways a stop silently disappears (a resolved thread, a reviewed
hunk, hidden reviewed files, an exclusion filter, a stale in-memory copy, anddd— the
only one that actually deletes anything), applying fixes mid-walk, and a local-seeding
fallback for walks with no PR or a non-GitHub forge. Entirely optional — iftuicr
isn't installed the skill says so once and moves on, and the stops are on the PR either
way. Written against tuicr 0.24.0. -
Commit convention is detected once at setup, with a real example subject line from the
repo's own history, and/prepare-pruses it instead of re-inferring one per PR. Conventional
Commits was the standing guess and plenty of repos don't use it.
Removed
-
/iterate-plan. Six skills now instead of seven. Its two rules worth keeping moved
into/create-planunder Revising an existing plan:- Keep the plan internally consistent when you edit it — a new phase carries an empty
### Completionblock, a scope change updates "What We're NOT Doing", and a revision
that changes what the interface shows goes back to/design-doc. - Never edit a filled-in
### Completionblock. This is the one that had to move.
A completed phase's block is a record, often written by an agent that has since
exited, and the next fresh agent reads it as its only memory of that phase — a
rewritten block is indistinguishable from a true one. The rule lived only inside
/iterate-plan, so the people most likely to break it, anyone editing a plan by
hand, were the people who never saw it.
Upgrades will not delete the skill for you;
upgrade.mdlists it under retired files
and asks. An install that keeps it keeps offering a command nothing else references. - Keep the plan internally consistent when you edit it — a new phase carries an empty
Fixed
/guide's workspace probes failed under zsh.ls -lt .rpi/*-research.md 2>/dev/null
aborts withno matches foundwhen nothing matches, because zsh fails an unmatched glob
before the command runs — so the redirect never applies. Bash's default hides it, which is
why it survived. Every fresh install hit it on the first/guide, when.rpi/is
necessarily empty. The three probes now filterlsoutput instead of globbing./guide <skill-name>didn't resolve to a topic. Topics are named for the phase
(design,review), so the skill names users had just been trained to type —design-doc
most of all, having just been renamed — missed and got the topic list back. Skill names are
now accepted as aliases.
Notes
- Ideas adapted from ponytail (MIT): the
reuse-before-writing ladder, root-cause-over-symptom, and treating an abstraction with
one caller as a reviewable finding. Ponytail'sponytail:marker convention was
deliberately not adopted — the### Completionblock and review metadata already
carry deliberate shortcuts into the PR, and a second mechanism for the same job would
drift from the first.