zheref

breath

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.

zheref 0 Updated 3w ago
GitHub

Install

npx skillscat add zheref/hatsu/breath

Install via the SkillsCat registry.

SKILL.md

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, § 3a's init runs once.

1. Invocation, and the parameters

hatsu:breath [<descriptor>]  # the branch's kebab slug; derived from the request when absent

No 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 hatsu: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 (row
missing-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.

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's dryRun, not
    exit codes, for which form reported. Another worktree holding the trunk skips the local update (the
    branch still cut from origin/<trunk>); a diverged trunk refuses.
  • --from is passed every time from branch.base; origin/main is never a literal — the flag
    defaults to main, warming a develop repository from the wrong trunk. A branch.base
    with no local branch refuses at 2 naming itself: ask and set it up (§ 1) — never fall back to
    main
    .
  • --discard is 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, exit 0); a
    project block 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

§ 3a · 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 order

skipping 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 touches origin but to fetch
    and 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 tools 2 as the host's verdict, reuses a feature
    branch for a new effort
    (§ 2a), or cuts from a stale trunk or a literal origin/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
    a workflow.json value
    , runs twice on one effort, or resets a Hanten cycle ledger (§ 3a).