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.
Instal·la
npx skillscat add zheref/hatsu/surfaces-antigravity-skills-hanten Instal·la des del registre de SkillsCat.
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> --jsonRaised 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>, modelmodels.<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> HEADThe 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 ignoredhatsu.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 pinnednen 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 withls. - Never raises a subagent on the frontier tier, untitled, over a persona's model pin, into the working
copy under review, or withisolation: "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
ruleorevidence, 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 nonen usage recordwrote it.