shukuba-refine
PM-posture skill the PM runs, in a pm session or as the pm agent, after a change unit lands or halts. It reads what the unit left (its flow findings, its code-integrity report, its security report, th
SKILL.mdskills/pm/.claude/skills/shukuba-refine/SKILL.md
GitHubshukuba-refine
Purpose
After a change unit lands, read what it left and what moved upstream, and bring the project's route back into line with the world. What leaves is a route that has been re-read — moved where it owed a move, left where it holds — and two files with the unit's seed that say what was done, why, from where, and what is owed next and by whom.
This file is the orchestrator. It owns the posture gate, resolving the unit, its station and its seed, the hold list's mechanics, running each move through its owner, landing the two files, and the commits. It makes no judgment about the route.
The method is prompts/rich.md — the one body this file points at. Read it in
full at Step 4 and apply it. What to read, what counts as a finding, what is held, which of the six
moves each finding owes, companion over recommendation, what is never done, what every entry
carries, and which moves are owed next all live there — its § Inputs you work from, § Read the unit
before the route, § What you are looking for, § The hold list, § The six moves, § Companion
over recommendation, § What you never do, § No move is an answer, § Every entry carries what,
why, and where from and § Name what comes next. None of it
is repeated here.
The two files' shapes are <CORE>/templates/journey-templates/shukuba_refine_report_template.md and
<CORE>/templates/journey-templates/shukuba_refine_recommendations_template.md. A seed's own shape,
including its folder form, is <CORE>/templates/journey-templates/nemawashi_template.md.
Not stations-from-seed. That skill routes one picked seed before it is walked, from the seed
alone, and writes only its checklist. This one runs after a unit lands, from what the unit left and
what moved upstream, across every seed and station of the project, and always writes its two files.
Posture
PM only. Run in a pm: session or as the pm subagent. Invoked from anywhere else, halt at once,
say the posture is wrong, and name the way in — open a session with the pm: prefix, or run the pm
subagent. The seat's contract is <CORE>/roles/loaders/pm_global.md.
The gate is here because the run writes and commits with nobody answering
(<CORE>/doctrine/setup/authoring_layers.md § A skill that acts unattended gates to its seat). The
pm agent may invoke it as readily as a person in a pm: session; every other seat is refused here.
Input
The project — system/projects/<project>/ — and the unit's key. Everything else is resolved
from those two.
The key is the one the caller names. Without one, it is the unit the project's
contexts/CONTEXT_PM.md names: that file holds the project's current change, and tobiishi-seal
flips its **Status:** to Sealed when the change lands, so a sealed item there is the unit that just
landed. Take the <YYYY-MM-DD>_<slug> key it names when that key resolves to
journey/tobiishi/trail/<key>/, and say in the report that the key came from the context.
A halted unit is found the same way. When the context's status is Open, take the key it names
as a halted unit when three things hold:
- the key resolves to an open
journey/tobiishi/<key>/; - no walk is in flight on it, meaning neither
system/logs/chain-<project>-state.jsonnorsystem/logs/chain-change-<project>-state.jsoncarries thatkeywithendednull; - a walk has ended on it, meaning one of those files carries that
keywithendedset tohalted.
Say in the report that the key came from the context. An ad-hoc merge never writes the context, so its key is always the caller's.
A unit already reviewed is reviewed again, in full. A report already beside the seed for this key is
never a reason to skip the review or to stop early, and neither is a unit, a product or a chain that
has not changed since that report. The method may have changed, and a moved rule changes the verdict.
Read the unit, apply the current prompts/rich.md, make the moves it finds owed,
and write the two files again. The earlier ones stay in git.
A named key resolves in this order: journey/tobiishi/trail/<key>/ (sealed), then the open
journey/tobiishi/<key>/ (halted), then an ad-hoc merge. An open unit is a journey/tobiishi/<key>/
holding change_request.md, outside trail/ and drop/.
Stop and say which is missing when there is no project, or when no key was named and the context
cannot supply one: its status is Open and its unit is not halted as above (it is still being
walked, so there is nothing to review yet), or it names no key, or its key resolves to neither a sealed
folder nor a halted unit. Never take the latest unit any other way.
The run works in the instance it was started in, on its current branch. It opens no worktree.
Workflow
Step 1 — Gate, then resolve the unit
Check the posture (§ Posture) and halt there rather than proceeding.
Resolve the unit by its key. It is found in one of three shapes, and the Tobiishi is the one this skill is built for:
| Sealed 飛び石 Tobiishi | Halted Tobiishi | Ad-hoc merge | |
|---|---|---|---|
| The unit's folder | journey/tobiishi/trail/<key>/ |
journey/tobiishi/<key>/ on main and on branch <key> |
system/projects/<project>/docs/<key>/ |
| Flow findings | <folder>/flow_findings/<step>.md |
the same, read off branch <key> |
not produced — state absent |
| Integrity report | <folder>/code-integrity-report.md |
the same, read off branch <key> |
<folder>/code-integrity-report.md |
| Security report | <folder>/security-report.md |
the same, read off branch <key> |
<folder>/security-report.md |
| Deferred decisions | <folder>/deferred_decisions.md, if any |
the same, read off branch <key> |
not produced — state absent |
| Deferred lines | the lines that begin Deferred: in the developer's closing commit (the commit the Developer's closing commit row resolves); when there are none, state them absent |
the same, if the unit reached a closing commit | the same |
| Corrections owed | <folder>/tl_instruction.md § Corrections owed while there, if any |
the same, read off branch <key> |
not produced — state absent |
| Work handed on | <folder>/change_spec.md § Out of Scope |
the same, read off branch <key> |
not produced — state absent |
| The halt report | not produced — state absent | halt_report.md, from the four places DiskReader.halt_report looks, branch first |
not produced — state absent |
| The unit's commits | git log <M>^1..<M>^2, where <M> is the merge: <key> → commit |
git log main..<key> |
the same as sealed |
| Developer's closing commit | the latest commit in that range whose Role: is Developer |
the same | the same |
When no merge: <key> → commit exists, the unit's commits are those whose message names the key
(git log --grep "<key>"), and a closing commit with no Role: Developer among them is stated absent.
Every row is read. An artifact the shape does not produce, or that is not on disk, is stated absent
in the report, never a halt. An ad-hoc plan is free-form and carries neither of the last two
sections, so on an ad-hoc merge both are stated absent.
Stop only when neither the folder nor any commit naming the key exists — say what was looked for.
Step 2 — Resolve the station and the seed
The station. Read the Shukuba: trailer on the unit's commits
(git log --format='%(trailers:key=Shukuba,valueonly)' <range>); a sealed unit's seal: commit
carries it. Its value is the station's dated stem, <YYYY-MM-DD>_<slug>; a commit written before
2026-09-14 may carry the bare <slug>, which names the stem ending in it. Where no commit carries one, the station is the one file under
system/projects/<project>/journey/shukuba/ — root, trail/ or parked/ — that names the key. More
or fewer than one station → stop and name what was found.
The seed. The station names its seed on its item line ("Item <n> on the active 根回し Nemawashi
<seed-slug>"). Find that seed under system/projects/<project>/journey/nemawashi/ as a file or a
folder holding seed.md, per <CORE>/docs/journey_move.md § Resolving the target. The
two files land with it at the root or in unpicked/. If it sits in trail/ or drop/, stop and
say so — this skill never writes there, and where the record of a finished or killed seed takes a
report is not this skill's to decide.
Step 3 — Read upstream, and build the hold list
Upstream. Resolve Product path: from system/projects/<project>/project.md — relative to the
instance, or absolute. Where it holds no docs/, there is no upstream; say so and go on. Otherwise,
in the product's own repo, list what changed under docs/ since the seed's first commit
(git log --diff-filter=A --follow --format=%cI -- <seed path>, then
git -C <product repo> log --since=<that date> --name-status -- docs/), and list every live
*_open_issues.md there.
Chain in flight. Read system/logs/chain-<project>-state.json. A chain is in flight when the file
exists, its ended is null, its pending is set, and its schema_version is the engine's — the same
test the engine uses to refuse a second walk (<CORE>/tools/chain.py
_refuse_to_overwrite_a_live_walk). Every document on its spine, and that document's companion, is
held.
Units being walked. A change unit at journey/tobiishi/'s root holds the seed and station it
walks. The halted unit under review is the one exception: it holds neither its own station nor its
seed. Every other open unit still holds what it walks.
Hand the prompt the held set; what it means for each seed and station is decided there.
Step 4 — Read the method, and decide
Read prompts/rich.md in full, then the two templates. Read every seed at the
seedbed root and in unpicked/, the open station and every station in parked/, and
system/projects/<project>/agari.md. Apply the prompt. Every judgment — what each finding owes, which
moves are made, what is held, what is recommended, and whether nothing moves — is made there.
Step 5 — Act on the route
Make the moves in this order, so no move finds the ground changed by a later one:
- Modify a seed, modify a station. Edit in place. For a folder-seed the edit lands in
seed.md; for a station, in its file where it sits (root orparked/). A ticked[x]line is never changed. Commit these edits together through<CORE>/doctrine/governance/commit_via_builder.mdwith--skill shukuba-refine --prompt shukuba-refine/rich --role PM. - Park a station. Run
shukuba-parkon it. It verifies the reached-when itself and commits itself; where it refuses, record the refusal as a non-move. A station the park finds reached, the park closes throughshukuba-retire(its own exception, the owner's call, 2026-10-03) — record that as a close, not a park. Any other station found reached is not closed here — the close is the Scrum Master's (Step 7). - Un-pick the active seed, only to free the slot — run
nemawashi-unpick, giving it as its reason why the prompt found the seed blocked. It moves the seed, so the seed's path for Step 6 is where it now sits. - Raise companion items. Per
<CORE>/../skills/companion/.claude/skills/companion-self-answer/SKILL.md§ When a change belongs to another document: append to the document's live companion, or open one from that document's own*_open_issues_template.md. An item raised from here goes in the companion's section for items raised from downstream where the template has one. Commit it in the product's own repo (git rev-parse --show-toplevelfrom the companion's folder), one commit per companion. The document is never edited. - Drop the halted unit. Run
tobiishi-dropon it with the project, the key and the reason the prompt wrote. It checks, commits and closes the worktrees itself; where it refuses, record the refusal as a non-move. Only a halted unit is dropped — never a sealed unit or an ad-hoc merge.
Never hand-edit CONTEXT_PM.md or change_request.md, and never edit a file under trail/ or
drop/.
Step 6 — Land the two files with the seed
A file-seed becomes a folder first. Move it, then write:
mkdir -p "<nema>/<seed>"
git mv "<nema>/<seed>.md" "<nema>/<seed>/seed.md"
<nema> is the seed's own folder — the seedbed root or unpicked/. A pointer written as
<seed>.md still resolves once <seed>/seed.md exists, so nothing else changes.
Write <nema>/<seed>/<key>_report.md and <nema>/<seed>/<key>_recommendations.md from their templates
— both, every run. The report names every move with the SHA Step 5 produced, and opens with
## Next moves — every move left owed, whose it is and the command that starts it. With nothing to
recommend, the recommendations file carries the one line "Nothing to recommend." under its heading.
In both, a seed, a station or a change unit is cited by its triple, <project> · <kind> · <name> —
the name the folder's own for a folder-seed or a change unit, with no .md — never by its path, with any line after the span as (line N) — the report template states why, and
<CORE>/tools/test_journey_pointers_are_triples.py refuses a path-form pointer in a live seed folder.
Commit through <CORE>/doctrine/governance/commit_via_builder.md: --staged naming both halves of the
move when there was one, --add the two files, --skill shukuba-refine --prompt shukuba-refine/rich --role PM. The directional follows <CORE>/doctrine/governance/commit_format.md § Directional
trailer: Shukuba: <YYYY-MM-DD>_<slug> when a station is open, else Agari: <project>; progress: when the route
moved, aside: when nothing did.
Then run python3 "<CORE>/tools/check_journey_links.py" --repo "<instance root>" and report what it
names, per <CORE>/docs/journey_move.md § After the move, say which pointers it broke. It never gates the run.
Step 7 — Report
Say what moved and what was held, how many recommendations were written, and where the two files are.
Then list the report's ## Next moves as written there — each move, whose it is, and its command — and
make none of them: a station found reached that the park did not close is the Scrum Master's to close (shukuba-retire), the
pick is nemawashi-pick's, the next change is its chain's, a walked seed's retire is the Scrum Master's
(nemawashi-retire), and any seed's drop or cut is the Principal PM's. The completion message of an unattended run is read off that same section
(launcher.md § Reporter), so what is said here and what reaches the owner's phone are one list.
Outputs
| File / effect | Produced when |
|---|---|
<key>_report.md (opening with ## Next moves) and <key>_recommendations.md inside the seed's folder, one commit |
Every run that passes Steps 1–2 |
A file-seed moved to <seed>/seed.md, same commit |
The seed was a file |
| Seed and station edits, one commit | The prompt found a seed or station owed a change (Step 5.1) |
A shukuba-park or nemawashi-unpick commit, each its own |
The prompt found the move owed (Step 5.2–5.3) |
| A companion item in the product's repo, one commit per companion | A change belongs to an upstream document (Step 5.4) |
A tobiishi-drop commit |
A halted unit whose intake will not be walked as written — its subject no longer holds, or the route has split it into separate units (Step 5.5) |
| No change; what is missing, named | Wrong posture, no project, no key named and none sealed in CONTEXT_PM.md, no unit found, not exactly one station, or a seed in trail/ or drop/ |
Critical Rules
- Both files, every run. A run that moves nothing still writes the report and the recommendations file, and "Nothing to recommend." is an answer.
- Never drop, close or write a seed. No
nemawashi-drop, no retire, nothing new inunpicked/. A drop or a cut is a recommendation to the Principal PM; a retire is a## Next movesrow for the Scrum Master. - Each move through its owner. Park, un-pick and drop run their skills; a companion item follows
companion-self-answer's mechanism. None is re-implemented here. A reached close is never performed here — it is named as owed to the Scrum Master (Step 7), unless the park finds it and closes it throughshukuba-retireitself (Step 5.2). - Name every next move, make none. The report's
## Next moveslists what the run leaves owed, whose it is and its command; the run performs none of them, and Step 7 repeats that list rather than composing its own. - Held means untouched. A seed or station whose sources include a document a chain may still move, or that an open unit walks, is listed as held and not modified.
- No fix, no hand-edit of a skill's file, no write to
trail/ordrop/. The run routes; it does not patch. - The method is the prompt's. Everything about what a finding owes lives in
prompts/rich.md. A second copy here is a copy free to drift.