zheref

hanten

Have the change read adversarially pre-PR — classify with `nen review scopes`, raise one reviewer per raised scope with budget left, collect findings in one shape, settle each by fixing or pushing back with a cited reason. Use when the maintainer invokes /hanten [for <scope>], asks to review the branch, or at /mukai's review step.

zheref 0 Actualitzat fa 3 setm.
GitHub

Instal·la

npx skillscat add zheref/hatsu/surfaces-antigravity-skills-hanten

Instal·la des del registre de SkillsCat.

SKILL.md

Hanten — the change, read by someone looking for what is wrong

Have somebody whose job is finding what is wrong read it, and settle everything they found —
fixed, or refused with a reason I can check.

No fixed mode: hanten holds the nature the change was authored in;
`mukai`'s second step, after murasaki, and invocable
alone. Pre-PR a finding costs an edit, not a review round — a review, not a gate.

1. Invocation

/hanten [for <scope>] [against <base>]
nen parse hanten \
  --grammar "for [<scope:code|ui|security|architecture|performance|release|surfaces|economics|all>] against [<base>]" \
  --line "<the invocation minus /hanten>"

against <base> names the base; with none, base and change set are P3's (origin/<branch.base>
fetched, the delta plus git status --porcelain; STANDALONE-ENTRY.md
§ 3). all is every scope the diff raises, for <scope> narrows, never widens; an unknown scope
(exit 2) asks with the nine as options; a missing argument or configuration item is set up inline
(missing-argument, missing-configuration; WORKFLOW.md § 4).

The cycle ledger is fail-closed: .nen/hanten/<branch-slug>.cycle.json, opened by
`breath` § 3b; decide/record/show refuse a missing file. Absent on a
feature branch → run breath, re-read; still absent → recover it in this turn per WORKFLOW.md § 4:
/tenkai diagnose there and the prior review evidence; a first cycle the maintainer confirms
through the native picker is "$hatsu_root/scripts/hanten_cycle_ledger.sh" recover-first --repo <path> --branch <branch> --confirmed-first-cycle (openedAs: confirmed-first-cycle-recovery); reviews that already ran
restore the original ledger, counts kept; history that cannot be established is a G5 naming the
restore path. Tenkai apply never creates a ledger; on the trunk, headless, or the script refusing, stop.
Never fabricate review history, never reset a budget. The PR-keyed ledger is § 2b's.

2. Classify — by path, then by content

nen review scopes --base origin/<branch.base> --repo <path> --json

Raised scopes, personas, tiers, budgets and paths come from that document — the
target's own review.scopes, over <base>...HEAD. Exit 1 (no review block): Tenkai's guided
readiness pass configures and validates review.scopes, then classification re-runs
(missing-configuration), never a review skipped; exit 2 a malformed block or unresolvable base.
unclaimed paths are named. Nobunaga's code scope and its tier swap are
WORKFLOW.md § 2 → review: say which tier ran.

Paths cannot raise these; hanten raises them by content (#73): a diff adding, editing or
removing a ## 0. section, any table that routes control flow, or the fall-through beneath one
raises a totality pass on architecture (every reachable input state matches exactly one row, the
fall-through named), Chrollo's; absent or unraisable, a § 3 gap; spent,
§ 2b's skipped-exhausted. A consumer diff touching .github/workflows/** raises security
(Feitan's row, never waived). A diff matching docs/ECONOMICS.md § 1's content
rows raises economics (Leorio's) with no path. The surfaces scope (surfaces/**,
Phinks) runs its two guards first, handing him their output: "$hatsu_root/scripts/surface_link_check.sh" <path> and
"$hatsu_root/scripts/surface_mirror_check.sh" <path>, <path> the checkout under review. A
content-raised persona joins § 2b's --applicable; print the classification, content rows
included, before raising anyone.

2a · The security scope's deterministic rows, before Feitan reads

Hanten runs Feitan's table — secret scan, dependency audit, secret shapes,
builder-touching workflow, each with its failure rule — and hands him the output. A
row that cannot run is not scanned, never clean
; values are $hatsu_root/contracts/scans.json's.

2b · Budgets — one effort, one ledger

A Hanten invocation is not a new review budget: remediation, a resumed session, a later ren turn
and mukai re-entering continue the same cycle. An effort is a branch PLUS its pull request
(ROSTER ruling 9 R2) — keyed <branch-slug>, then <branch-slug>-pr<N>, so a new PR number is a fresh
ledger, every budget full. Hanten opens the PR-keyed one itself, once: missing →
the ledger script's init --repo <path> --branch <branch> --pr <N> before the first decide; present
→ never re-init (exit 2); the branch-only ledger stays breath's, unread thereafter. Each scope's maximum is its own budget, per effort, never per session or repository (ruling
2026-09-28), counted by the ledger, not prose; one persona, one budget (his smallest): two scopes
he owns raised together are one raise for both.

"$hatsu_root/scripts/hanten_cycle_ledger.sh" decide --repo <path> --branch <branch> [--pr <N>] \
  --applicable <csv of personas the classification raised>

Raise only raise[]'s personas. A returned reviewer, raised or adapted, is record --outcome ran, a budget skip --outcome skipped-exhausted; either misused, exit 2. A spent reviewer meeting a new head gets one bounded delta pass: the diff since its last head, both
named, row delta, used never past the cap.

3. A scope whose persona has no definition is a gap

Three checks per persona: ls "$hatsu_root/claude/agents/<persona>.md"; the same ls for
_review-preamble.md (missing is a gap too); and the surface's own agent
registry
for hatsu:<persona>, which ls cannot answer. Raisable → raise;
present, not raisable → § 7's adapter, disclosed as weaker ("adapted": "…"); absent → a gap:
the persona, the raising paths, this scope not reviewed — never a pass, never improvised.

4. Raising a reviewer, and its cost

On Claude Code the reviewer is an Agent-tool subagent, one per scope, in parallel:
subagent_type hatsu:<persona>, description hanten · <persona> · <model alias>, model
models.<surface>.<tier> for the scope's tier (never frontier, not passed where the persona pins
one), isolation omitted, the prompt carrying the checkout path, scope, base, raising paths, § 5's
shape, the preamble's absolute path (and ECONOMICS.md's, where economics is raised),
"do not request a worktree", and nen: <path> with its
pin — the one ten § 2 bound, since a subagent inherits no PATH (#107), never a bare command -v nen — prefixing every block (preamble
§ 2). Unresolvable, the prompt names every Nen-owned check unread once; one failing at the reviewer's
end is the reviewer's to declare.

git -C <target repo> worktree add --detach <target repo>/.claude/worktrees/hanten-<persona> HEAD

The isolated checkout makes never edits non-test source a property of where the reviewer stands,
removed when the review returns; never isolation: "worktree", which isolates the plugin's repo.
Say what was raised before the reviews return: scopes, personas, aliases, gaps, each used/max.
As each returns, one nen usage record — never a transcription after the round (#100;
WORKFLOW.md § The effort's ledgers): --effort <branch> (only the cycle ledger is PR-keyed),
--surface, --model <alias>, --input/--output, --source "hanten § 4: <persona>, <readout>", the
readout the surface's own figure at return (Claude Code: the Agent tool's totals), or
--not-reported.

5. One fixed finding shape

Every reviewer returns findings in one shape; hanten records nothing else (example: preamble
§ 4):

Field What it must carry
rule a rule id (UX-3, SEC-…, ECON-4, a WCAG SC, a HIG reference), never a bare preference
severity critical | high | medium | low | nit (Hisoka's ladder)
path, line where, exactly; no location is a note
evidence what was observed or measured, a number with its method; never the rule restated
proposedFix what would settle it, proposed, never applied

A "finding" without rule or evidence is a note. The record is one ignored
hatsu.hanten.findings/v0.1 document at <reports.dir>/hanten/<branch-slug>.json: scopes[] (persona,
tier, model, used/max, invocation = ran | delta | skipped-exhausted, plus adapted, gap or
the security scans) and findings[] (the six fields plus hanten's id, scope, persona,
disposition), plus reports[] — one {scope, persona, invocation, head, path} per report file
written, additive in v0.1. Leorio's report returns in his reply; hanten writes it per effort, a
delta pass appended, as ECONOMICS.md § 5 says.
Hanten is the sole discovery writer; Kurapika alone applies
`docs/DISCOVERY.md`.

6. Settle every finding — fixed, or pushed back with a reason

state When detail carries
fixed the change was made what changed, where
pushed-back the finding does not hold a cited reason — the rule misread, a constraint they could not see, a contradicting measurement; never "disagree" or "out of scope" alone
deferred it outlives this branch the tracked item, or its durable pending record. An untracked deferral is unsettled

A push-back is an argument, not a veto. Every disposition reaches the PR body through
`shibari`; a fixed one is proved by iteration.checks, one editing a dieted
file quotes its "$hatsu_root/scripts/prose_size_check.sh" --headroom <path> line (#119). A finding
is work, not a gate.

An unsettled finding is a G5 (nen/decisions.json row unsettled-finding, CON-47), only when
investigation proves no disposition is choosable without the maintainer: record it, what was tried,
the alternatives, and stop in `jutaisho` § 4's shape, all four parts. Never
one re-grading a severity.

One Copilot round is requested after hanten settles (sharingan § 6's policy); hanten hands over.

7. On a surface that is not Claude Code

§ 4's mechanism is Claude Code's; the contract is PROCESS.md § Surfaces
and pickers
: the worker at the scope's tier, a copy of the repo under review, § 5's shape, the pinned
nen by absolute path (§ 4) or none where the worker carries it (preamble § 2).

Authority

Preamble § 7 is every reviewer's refusal list. Hanten may read the working copy, raise reviewers,
write the findings record and Leorio's report, the cycle and usage ledgers, edit the working copy to
settle a finding, and render the stop. It may not push, commit, PR, label,
merge, tag, deploy or vote (PROCESS.md § Authority every phase shares).

Hard limits

  • Never reports a scope reviewed without its persona and the preamble, improvises a persona, or
    answers § 3's registry question with ls.
  • Never raises a subagent on the frontier tier, untitled, over a persona's model pin, into the working
    copy under review, or with isolation: "worktree"; never an exhausted reviewer.
  • Never skips a scan or guard row silently, calls a not-run row clean, or waives the workflow gate.
  • Never records a finding missing rule or evidence, lets a reviewer file an issue, leaves one
    undisposed, re-grades a severity away, or accepts an uncited push-back.
  • Never presents an in-session pass as a raised reviewer, by-hand work as a verb's output, or a
    spend as recorded when no nen usage record wrote it.