Warm the local working copy once per effort — classify where the checkout sits, check the host toolchain, fast-forward the trunk and cut this effort's branch from its fresh tip, then prove the declared iteration checks pass on that tip, because a base that does not build is a G5 stop taken before any of the change is authored. Runs as the first turn of an effort inside `ren`; invoke it by name only to re-warm a drifted checkout. Never discards work it has not shown you, never commits, never pushes.
Install
npx skillscat add zheref/hatsu/surfaces-antigravity-skills-breath Install via the SkillsCat registry.
Breath — the first breath of an effort
Nature: Transmuter. A fresh trunk, a branch cut from it, a host that builds, a green start. Phase one of ren, once per effort; re-invoked on a branch it already cut, it reports
and returns. Plugin root and the declaration gate by role: PROCESS.md
§ Authority every phase shares.
0. Standalone entry — preserve → prove → place → restore
`docs/STANDALONE-ENTRY.md` carries the shape (S3, P1b);
its rules and guaranteed outcome are `docs/WORKFLOW.md` § The
standalone stash-and-restore shape. Cold: P1, P2, then §§ 2–4 with the tree carried by--carry; from a composite — or from `ten` § 6, which holds it — skip this.
Once per effort (ruling 2026-09-28, ROSTER ruling 9 R3): a branch this effort already cut and
proved reports and returns, whatever session asks. After
the restore, § 3b's init runs once.
1. Invocation, and the parameters
/breath [<descriptor>] # the branch's kebab slug; derived from the request when absentNo repository argument: breath warms the checkout the session stands in, passed to every nen
call as --repo <path>, never the cwd default (nen shu warmup requires it).
| Value | File → key |
|---|---|
| Branch template, trunk/PR base | nen/workflow.json → branch.template, branch.base |
| Checks proved on the fresh tip, and their lane | nen/workflow.json → iteration.checks, iteration.lane |
| The lanes, and the build | nen/contract.json → project.lanes, .defaultLane, .verbs.<lane>.build |
| Host tools | nen/contract.json → project.toolchain |
No nen/workflow.json (PROCESS.md § Invocation and parsing): the
defaults are {model}/{persona}/{descriptor}, main, ["build"], project.defaultLane. A missing
argument or configuration item is asked for and set up inline (missing-argument,missing-configuration; `WORKFLOW.md` § 4 Ask, set up, continue) —
never invented, and never written unasked to silence a message; nen schema check --repo <path> validates the write (a malformed key FAILs by pointer).
2. Where the checkout sits
nen wc swap --status --repo <path> # first
nen wc classify --repo <path> --base <branch.base>Breath refuses core while a swap is active (`amenotejikara`), or a
worktree whose branch a --take holds, naming /amenotejikara return.
| Case | What breath does |
|---|---|
on-branch-clean on the trunk |
New effort → § 3 |
on-branch-clean on a branch |
Not proof this is that effort — § 2a first |
must-move (trunk, dirty) |
Never asked (row dirty-tree): carried through the cut by nen shu warmup --carry (§ 0's shape), by stash SHA, every path listed; a conflicting restore keeps the stash and is the one outcome that stops — semantic-conflict, not a question |
on-branch-dirty |
§ 2a first: a continuation of this effort reports subjects and paths and hands the turn to `kokusen` or the maintainer; a new effort shows the paths and asks — never discard, never cut a second branch over it |
detached HEAD |
A row above with branch: null, never must-move; read detachedAt, report it, go on |
An unresolvable --base exits 1: ask for branch.base, set it up (§ 1), re-classify. The only other non-zero is an empty repo.
§ 2a · New effort vs explicit continuation. Default: a new effort. Reusing the feature branch is
valid only on the caller's explicit identification, or on turn 2+ of a ren loop whose step 1 cut
this branch this session; a clean non-trunk checkout is not that, and silence is a new effort.
A new effort fetches, fast-forwards branch.base, cuts a new name and proves the tip, leaving
the old branch be; a continuation reports and returns; a dirty tree plus a new request
asks, showing every uncommitted path.
§ 2b · The third door — untracked paths that are not work (.idea/, .claude/worktrees/, the
surface mirror): append them to info/exclude (rev-parse --git-path, never --git-dir;
never .gitignore; `docs/SURFACES.md` § 2) — only ignorable,
untracked paths none of the effort's business, shown first, under a dated comment naming the run;
then re-run nen wc classify, expecting uncommittedPaths: []. A sandbox refusal is reported
with that --add-dir named, and stops. The file is shared by every worktree: name it by path.
§ 2c · The host. nen shu tools --repo <path> [--dry-run | --install] on a host this repository
was never built on, and after a toolchain pin moves; --install covers only what corepack activates,
never sudo or an unpinned version. Exit 5 is a host not set up, not a red build — relay the
per-tool remedy lines, resolve a missing tool through the surface's catalogue probe (rowmissing-tool), and leave a verify-only row to a human, named with its pin. Exit 2 here is the
stale tree, not the host: record it deferred and re-probe after the cut, reporting that
answer; § 3's dry run shares the blind spot.
3. Cutting the branch — dry run, then bare
Render branch.template: {model} the model alias, {persona} the persona (kurapika unless the
run says otherwise), {descriptor} a short kebab slug from the request, never the date. Rendering
is this skill's; --branch is required, no default.
§ 3a · A live worktree on the same topic, before the dry run (#113). nen wc worktrees --repo <path> --json: a row whose branch or lastSubject shares a kebab segment of four letters or more
with the {descriptor} just rendered — the {model}/{persona} segments and fix, feat, docs,the, and, settle, round, merge never count — is an overlap — reported and asked, never
resolved or ignored silently (one shared segment is reported as weak, two or more asked): show its path, branch,ahead, dirty and lastSubject, and offer work there (that path, in the maintainer's own session —
no skill continues another worktree's authoring; `amenotejikara` is the
build-and-debug swap, not this) or cut anyway, by name. A row whose lastSubject is null is
unread, never no-overlap: named with its path and branch, matched on the branch alone. Nothing here
merges, closes or reassigns the work found; this is a name-level read — diff-level overlap is a Nen
ask, filed apart.
nen shu warmup --repo <path> --branch <rendered name> --from <branch.base> [--dry-run]- The dry run mutates nothing but a read-only
git worktree list; read--json'sdryRun, not
exit codes, for which form reported. Another worktree holding the trunk skips the local update (the
branch still cut fromorigin/<trunk>); a diverged trunk refuses. --fromis passed every time frombranch.base;origin/mainis never a literal — the flag
defaults tomain, warming adeveloprepository from the wrong trunk. Abranch.base
with no local branch refuses at2naming itself: ask and set it up (§ 1) — never fall back tomain.--discardis never breath's flag: a dirty tree goes only on the maintainer's word, after the
refusal's list. A repository with no declaration still warms (the git half, exit0); aprojectblock is proposed at the declaration gate.
Exit codes are claude/agents/kurapika.md § The shu verbs'; only what differs here:
1 |
a failed git step or build, nothing rolled back, the trunk already moved: report steps[] verbatim; a failed build is a red BASE TIP, a G5 before authoring (§ 4) |
2 |
refused before any mutation — fix, re-run, never with --discard |
4 |
a seat, reason quoted; shu warmup proved nothing, § 4's loop is the whole proof |
§ 3b · Opening the Hanten cycle ledger. Once the branch exists (exit 0 or 4, or a
no-declaration git half that cut --branch):"$hatsu_root/scripts/hanten_cycle_ledger.sh" init --repo <path> --branch <rendered name>. Exit 0
is a new cycle; 2 already exists is reported, never reset; a file missing later is a lost ledger
for `hanten`, not a second init. One init per branch, never silent;
continuation never cuts or inits again.
4. Proving the base tip
Nothing is written on the branch yet, so these checks judge THE BASE; standalone, § 0 already
took it on a stricter tree — do not take it twice.
nen shu <check> --repo <path> --lane <iteration.lane> # every iteration.checks entry, in orderskipping only an entry shu warmup just proved on this tree. Never infer the verdict from shu warmup's exit code alone: it proves the lane's build only, so with iteration.checks ["lint"]
and build seated, the lint run is the whole proof. The exit table is
`rasengan` § 6's, one row differing — a red base tip is a G5 taken BEFORE
any authoring: report steps[], name the check, stop — never fix it in passing or hand it
forward as this effort's red.
The iteration list stays inexpensive: --tests only when iteration.checks has test, never
coverage (both are mukai's); a full suite hidden in an iteration verb is a
`DISCOVERY.md` gap.
5. What the turn reports, and the residue
One line, not a gate event: any active swap, the wc classify case, new effort or explicit
continuation, the branch cut and its tip (or the branch reused), the toolchain verdict, the build's
exit code, any info/exclude lines, and the no workflow.json sentence where it applies. A warm-up that
did not run is reported as not run, never as clear.
By hand: rendering branch.template, appending info/exclude and proving it (nen wc classify, git check-ignore -v), opening the cycle ledger (zheref/hatsu#63). Whether an existing dirty branch is
this effort stays judgment; on a clean feature branch § 2a is a closed table.
6. Authority and hard limits
Permitted: classify the working copy; probe and (corepack only) install a declared host tool;
fetch; fast-forward the trunk; cut a non-trunk branch; run the lane's declared build/test;
open the cycle ledger. Not permitted: any push, commit, PR, label, --discard or deploy. Not a
gate event; three G5s it raises, not owns: an unsupported host (3), an unreadable checkout, a base
tip that does not build (§ 4).
- Never
--discards a tree unshown to the maintainer, nor on its own account; never commits,
pushes, or touchesoriginbut tofetchand test a name. - Never edits a tracked file to clear a dirty tree —
info/exclude, never.gitignore(§ 2b). - Never treats a pre-fast-forward
nen shu tools2as the host's verdict, reuses a feature
branch for a new effort (§ 2a), or cuts from a stale trunk or a literalorigin/main— always--from <branch.base>. - Never lets authoring begin on a base tip that did not build — the trunk's red, a G5, never
repaired inside this effort. - Never reports an unrun warm-up as clear or an undeclared repository as verified; never invents
aworkflow.jsonvalue, runs twice on one effort, or resets a Hanten cycle ledger (§ 3b).