Skip to content

Nen reference

Every verb of the deterministic CLI, grouped by family, from Nen's own usage document.

Nen detects, computes, formats and verifies. It never decides anything that requires judgment: a human or an agent reads the verdict and decides what to do about it. Every verb accepts --repo <path>; the --json column says which verbs also print the same data as JSON.

Read from the repositories at commit: hatsu 3c582c18a4 (v0.159.0) · nen d7a720ddcd (v0.29.0) · handbooks 39b8e06d3c (v0.13) · 2026-11-04

Try it

Two commands that need nothing but a clone: no target repository, no network, no credentials.

$ nen commit format --type feat --subject "add readiness verb"
feat: add readiness verb

$ nen commit format --type feat --subject "add readiness verb" --json
{
  "message": "feat: add readiness verb"
}

source: nen:README.md § Try it

Verb index

nen pr

VerbPurposeReads--json
nen pr readyCON-32 readiness verdict for one pull requestnen/gates.json + nen/repos.json (or --gates/--reviewers/--gh-repo), github (gh api graphql/rest)yes
nen pr stalenessstale + Ready merge-permission arithmetic over a verified-wake historycaller-supplied --wakes-from JSON file, no schema/git/ghyes
nen pr body-checkchecks a PR body against caller-supplied requirement patterns, or, with no --requirements-from, against the headings of the repository's own PR template, each required present and filled (named as derived, with where it was read)caller-supplied --body-from/--requirements-from files; else the PR template (pull_request_template.md/.txt at the root, .github/ or docs/, or PULL_REQUEST_TEMPLATE/*.md/.txt) in the working tree, or at --base <ref> through git (rev-parse, ls-tree, cat-file)yes
nen pr sections resolveresolves a caller-owned section catalogue by kind, family and conditional facts--catalogue JSON; optional workflow.json pr.sections overridesyes
nen pr sections familyfolds taxonomy jobs into the catalogue family with the most jobs, ties by declared precedence--taxonomy and --catalogue JSONyes
nen pr fetchone typed snapshot of a PR: head sha, mergeability, check rollup, per-commit reviews, review threads, pending review requestsgithub (gh)yes
nen pr convergeread-only: compares the AC rows of every issue a PR closes with the PR body's verify rows, per criterion; the blocking rules are the caller's catalogue (defaults equal Hatsu's)github (gh pr view, gh api issue reads)yes
nen pr next-blockerthe first blocking condition, in fixed order (conflict, red check, owed round, unresolved thread, missing body requirement)nen/gates.json (or --gates), github (gh)yes
nen pr cascade-mainmerges (never rebases) the trunk into the current branch and pushes on a clean merge, or stops there under --no-pushgit (fetch/merge/push, reaches origin)yes
nen pr retargetgh pr edit --base, for a stacked PR after its predecessor mergesgithub (gh)yes
nen pr request-reviewsresolves each --add-reviewers login as a Bot or a collaborator, then requests it through gh pr edit --add-reviewer (User/Team) or GitHub's requestReviews mutation (Bot, botIds) — the one route --add-bots logins and node ids travel toogithub (gh api graphql to resolve + request; gh pr edit for the user route)yes
nen pr edit-bodyreplaces a pull request's body outright with a file's bytes, certifying the number IS a pull request before any writegithub (gh api read to certify, gh pr edit unless --dry-run)yes
nen pr edit-titlereplaces a pull request's title with a file's one line, certifying the number IS a pull request before any write and reading the title back after itgithub (gh api read to certify and read back, gh pr edit unless --dry-run)yes
nen pr mark-readymoves ONE existing draft pull request out of draft through GitHub's markPullRequestReadyForReview mutation, after certifying it is an open PR at the pinned head, and reports success only on a not-draft read back — never the CON-32 verdict, which stays pr ready'sgithub (gh api graphql: one certifying read; the mutation and a read back unless --dry-run)yes
nen pr threadsa pull request's review threads: list them all (paginated to completion, with path, line, author, first comment and url), reply to one, resolve one, or settle a batch from one filegithub (gh api graphql: one read walk; one mutation for reply/resolve, one reply and one resolve per entry for settle, unless --dry-run)yes
nen pr openopen exactly one pull request from a head the remote already holds at the local sha, refusing an unpushed head at exit 2; one already open for the head against the same base is returned as opened: existing at exit 0, against another base at exit 1git (symbolic-ref, rev-parse, ls-remote), github (gh pr list always; gh pr create unless --dry-run)yes
nen pr ledgerpost an effort's ledger slice (phases, usage totals, schema-checked findings, proof index; nen.pr.ledger/v0.1) as ONE PR comment, edited in place on a re-post; read it back from the authenticated login's comment only (ok / stale / could-not-read), and --restore the phase ledger on a fresh clonegithub (gh api pulls, user, graphql comments with author and editor; POST or PATCH a comment unless --dry-run), <git-common-dir>/.nen/phases|usage/, the --findings, --findings-schema and --proof filesyes
nen pr mergethe bounded merge, two forms. --release-unit: pr ready (in-process) + head pin + pr body-check (live body, one fetch) + release unit-check (policy from the PR's base) + whose-pr. --delivery: a run's own PR into a non-main, unprotected base — a protected base is refused by ruling (exit 2), then base + pr ready + head pin + pr body-check + whose-pr (viewer and run-form head). Every gate must pass; gh pr merge --merge --match-head-commit only under --rungithub (gh pr view, gh repo view, gh pr list, gh api contents/trees/user/branches/rules, gh pr merge unless plan-only), nen/gates.json, nen/workflow.json, nen/repos.json (a CODE#n ref)yes

nen gate

VerbPurposeReads--json
nen gate derivederive G2 vs G4 from a changed-file set against two caller-supplied path setsgit diff (for --range), no schema file -- path sets are flagsyes

nen split

VerbPurposeReads--json
nen split verifyprove the union of per-axis branch diffs equals one original diffcaller-supplied --original/--branches diff files, no git/ghyes

nen wc

VerbPurposeReads--json
nen wc classifyclassify the working copy as must-move / on-branch-dirty / on-branch-cleangit (branch, status, ahead-count)yes
nen wc squashfold every commit since git merge-base <onto> HEAD into one, validated message, refused if dirty / --onto not an ancestor / any commit already on the upstreamgit (status, merge-base, log, fetch, reset --soft, commit -F, interpret-trailers --parse --no-divider, config trailer.separators and cat-file commit for the folded commit's trailer read-back -- exit 3 on an injected one, #273), nen/workflow.json under --repoyes
nen wc catch-upfetch origin/<base> and rebase (nothing published) or merge (something is) the current branch onto it; stop on a conflict with both sides of every path, its class (manifest / changelog / mirror / other, by nen/contract.json's mechanical block) and the abort line, never picking one -- exit 3 when every path is mechanical, with the commands to run printed and none run; re-run on the same tree to continue a staged resolution, --abort to back outgit (status, fetch, rev-list, rebase / merge, diff --diff-filter=U, show :2:/:3:, rebase --continue / commit --no-edit, --abort), nen/contract.json's mechanical block under --repo (only on a conflict)yes
nen wc publishpush the current branch under its own name to the remote its upstream names (origin, or --remote, when it has none), refusing a detached HEAD, the trunk as local name or as destination, an upstream of another name unless --set-upstream (which publishes to <remote>/<own name> — --remote, else origin, else the upstream's remote — and retracks it there), any refspec/force shape, and reporting needsForce at exit 1 instead of forcinggit (symbolic-ref, fetch, merge-base, rev-list, push, reaches the upstream's remote)yes
nen wc prunevalidate an explicit cleanup plan and remove named remote branches; worktree/local-branch/tracking-ref removals refuse; host links are read-onlyplan file, local Git refs/worktrees, exact configured remote branch readsyes
nen wc worktreeslist every checkout of the project, core first: core/in mark, branch or detached, uncommitted count, +ahead/-behind against origin/<base>, HEAD, last commit and age, pathgit (rev-parse --git-common-dir, worktree list, status, rev-list, log)yes
nen wc swapbring a worktree's committed tree into the core checkout (view: HEAD detached; --take: the branch), --return it with core's parked work restored, --status; core's work parked in a pinned commit, never stashed; exit 3 on a dirty treegit (worktree list, status, read-tree/add/write-tree/commit-tree through a temporary index, update-ref, reset --hard, clean -fd, checkout, diff)yes
nen wc worktreekeep ONE detached worktree at <core>/.nen/worktrees/<name> at origin/<base>'s fetched tip -- created, reused, moved, or (its registration outliving its directory) that one registration dropped and recreated; refused, never discarded, when dirty, and refused for a stray directory, a symlink or a sibling registration; --copy-from-core copies gitignored, untracked regular files from core after proving the source in core and the destination at the tip and in the worktree, through a temp file and a renamegit (rev-parse --git-common-dir/--git-dir, check-ref-format, fetch, ls-remote, rev-parse, ls-files, check-ignore, ls-tree, worktree list/add/remove, status -z, diff --name-only, checkout --detach), the files named by --copy-from-core in core, the copy record in the worktree's git diryes
nen wc overlapfile disjointness of parallel efforts, computed: each effort's merge-base diff against --base (default origin/<branch.base>), plus an always-overlapping list counted as every effort's; verdict disjoint / stack(<order>) (git's chain when the branches chain, else the --efforts order) / unknown; --declared paths stand in before authoringgit (diff --name-only -z <base>...<effort>, merge-base --is-ancestor), nen/workflow.json under --repo (alwaysOverlaps; branch.base without --base), the --declared fileyes
nen wc aheadthe commits and diff stat beyond a NAMED reviewed head, read from the clone with no fetch; verdict ahead <n> (exit 0) / even (exit 3) / diverged -- the reviewed head is not an ancestor, never a count (exit 1) / unreadable -- a ref the clone does not hold, never zero (exit 2)git (rev-parse --verify <ref>^{commit}, merge-base --is-ancestor, rev-list --count <of>..<head>, diff --numstat -z --no-renames <of> <head>)yes

nen stage

VerbPurposeReads--json
nen stage triageflag secret-shaped, binary, out-of-scope and unmentioned-deletion files before staging; report git-ignored paths separately, never counted toward the exit code; --range <base>..<head> triages a committed range instead of the working copy — names and blob sizes over every change any commit made (in-history for a finding not in the net change), deletions and mentions over the net diff from the merge base — an unresolved, malformed or unrelated range exit 2 and never a fall backgit status --porcelain; with --range: git rev-parse, merge-base, rev-list --count, log --raw, diff --raw, cat-file --batch-checkyes
nen stage listthe exact add list — every modified, added, renamed, deleted and untracked path triage called clean, minus flagged and git-ignored ones, each exclusion named with its reasons, unmerged paths, embedded repositories and undecodable names held off with the list withheld, a worktree rename's original included; --repo must be the top; newline (C-quoted where needed) or --nul form to feed git add --pathspec-from-file=- verbatim, withheld on a flag (exit 1), exit 3 when emptygit status --porcelainyes
nen stage check--exclusive: exit 1 when an issue (or any of --issues) carries two stage-family labels at once, the family read from nen/labels.json (<namespace>:stage/<leaf>), exit 2 when it declares none; names both, picks neithernen/labels.json under --repo, github (gh issue view --json labels)yes

nen backlog

VerbPurposeReads--json
nen backlog fetchfetches open issues + open PRs fresh over 'gh api' (never cached) and assembles one row per effortgh (issues, pulls, paginated)yes
nen backlog orderapplies backlog-loop's severity/blocks/consumer/age priority order to a pre-fetched row setlocal file (--rows-from)yes

nen board

VerbPurposeReads--json
nen board buildassembles a Board from already-computed rows (gate from 'gate derive', colour from 'color status')local file (--rows-from)yes
nen board renderrenders a Board snapshot as the padded-markdown table the retired shell board script establishedlocal file (--board-from)yes
nen board difffield-level diff of two Board snapshots, by row idlocal files (--before, --after)yes

nen epic

VerbPurposeReads--json
nen epic next-waveflips a completed child, redraws the progress bar, computes the next releasable wavelocal file (--body-file), optional write (--out)yes

nen effort

VerbPurposeReads--json
nen effort classifyclassifies one epic/child against senkei's five-class (plus undecidable) taxonomy from caller-supplied factslocal file (--input)yes

nen loop

VerbPurposeReads--json
nen loop slotscounts how many CI and local concurrency slots are free, from a caller-supplied efforts file or -- --from-run -- one built from a run's manifest and live reads (PR state, pr ready, the stop marker), and explicit caps, a local slot freeing by --repo's declared idle.localSlotFrees (under an idle profile) or monitor.localSlotFreeslocal file (--efforts), or the run manifest, github (gh pr view, pr ready's reads) and git (worktree list) with the stop markers it names; nen/workflow.json under --repoyes
nen loop iterateclaims one iteration of an izanagi loop against its own up to <N> cap, refusing the claim past it<git-common-dir>/.nen/loop/<id>.json and <id>.opened (reads and writes under a lock; .nen/loop/ under --repo only outside a git repository)yes

nen phase

VerbPurposeReads--json
nen phaserecords when a workflow phase began and ended for one effort, with the elapsed milliseconds and exit code, in a per-effort ledger<git-common-dir>/.nen/phases/<effort>.json (under --repo outside git; reads and writes); git rev-parse/worktree list to find it, no ghyes

nen session

VerbPurposeReads--json
nen sessionrecords caller-reported session identity and effort dial per effort, and shows the ledger<git-common-dir>/.nen/sessions/<effort>.json (under --repo outside git); git rev-parse/worktree list to find it, no gh or harness readsyes

nen usage

VerbPurposeReads--json
nen usagerecords what a surface and model spent on an effort -- token counts, minutes, the source of the numbers, or notReported -- in a per-effort ledger, and shows the ledger with totals per surface and model<git-common-dir>/.nen/usage/<effort>.json (under --repo outside git; reads and writes); git rev-parse/worktree list to find it, no ghyes

nen warmup

VerbPurposeReads--json
nen warmupwarms a REGISTRY: detects stale/unpinned consumer versions, plus an optional handbook-question sweep. Reads only. Not nen shu warmup, which warms a working copynen/repos.json, optional local filesyes

nen watch

VerbPurposeReads--json
nen watch untilpolls one read-only observation command — or, with --pr, one pull request's readiness facts through pr ready's own read, or its merge (--until merged) — until its condition holds, paced and boundedwhatever --command names (typically git or gh); with --pr, GitHub GraphQL + REST (token from --token-env, default GH_TOKEN), as pr readyyes

nen label

VerbPurposeReads--json
nen label applyapplies one label or a batch of ref/label pairs and appends an after-the-fact ledger linenen/labels.json; gh only with --runyes

nen labels

VerbPurposeReads--json
nen labels synccreates missing labels and updates only differing taxonomy labelsnen/labels.json; gh read even with --dry-runyes
nen labels renamerenames labels in place, preserving every issue association, idempotentlygh label list (always), gh label edit unless --dry-runyes

nen classify

VerbPurposeReads--json
nen classify labelsvalidates a classification taxonomy file and prints the label set it defines (axis or family prefix + key, colour, description)local file (--taxonomy)yes
nen classify installcompares the taxonomy's labels with nen/labels.json (present, drift, absent, foreign), rewrites the declaration with --write, or syncs only those labels to GitHub with --sync once the declaration is landedlocal file (--taxonomy), nen/labels.json; gh only with --syncyes
nen classify statuswhich issues carry a label on every axis, which are missing one, which carry an unknown key, and whether the declaration and GitHub both hold the taxonomy's labelslocal file (--taxonomy), nen/labels.json, gh (issue reads, label list)yes
nen classify applyvalidates a classification plan whole, then applies it as labels (listing low-confidence rows, skipping labels already present), one ledger line per applicationlocal file (--taxonomy, --plan), nen/labels.json, gh (issue reads; gh issue edit only with --run)yes

nen direct

VerbPurposeReads--json
nen direct registryvalidates a model-direction registry file and prints it: the snapshot date, each alias (provider, family, surface/tier, snapshot quote), the surfaces and the live-lookup sourceslocal file (--registry)yes
nen direct resolveresolves a classification (languages, jobs, repository kind) to a recommended alias, surface and effort: derives the domain, reads each (job, language) cell, aggregates, spells the alias from nen/workflow.json, scores the effort, and reports any mismatch with the session (exit 0, never blocks); --record files the result under <git-common-dir>/.nen/direct/local files (--registry, --taxonomy), nen/workflow.json under --repoyes
nen direct matrixenumerates every (job, domain, language) answer resolve gives, for a consumer that renders the whole table: per job and domain the witness issue that derives it (or unreachable), the route, fallback and phase, and per language column (* the shared one) the pair, the aggregate, the winner and runner-up resolved and the effort -- computed by resolve's own functions, owning no rulelocal files (--registry, --taxonomy), nen/workflow.json under --repoyes
nen direct answerwrites the maintainer's picker answer (continue or stop) and its time into the record direct resolve --record filed, replacing an earlier answer and leaving every other field unchanged; a missing record is a failure<git-common-dir>/.nen/direct/<encoded id>.json (under --repo outside git; reads and rewrites); git rev-parse/worktree list to find it, no ghyes

nen schema

VerbPurposeReads--json
nen schema checkloads and validates the files a repository is expected to carry under nen/, reporting each one's verdict and any legacy schemas/ leftover, and a consumer's .claude/rules/ canon mirror against its bindingsnen/labels.json, repos.json, colors.yml, gates.json, contract.json (optional), workflow.json (optional), .claude/canon-values.yml (optional) and its git historyyes
nen schema setwrites ONE value into a nen/ JSON declaration by RFC 6901 pointer -- an existing scalar replaced, a member added to an existing object, an item appended to an array (/-), or an object or array replaced whole by one of its kind -- every other byte kept, the result validated by that file's own loader before anything is written, then written atomically and read back; a gate-change pointer needs --gate-change; --dry-run writes nothingthe named nen/ declaration under --repo (reads and rewrites); no git/ghyes

nen color

VerbPurposeReads--json
nen color statusresolves one row's colour token by the repository's own nen/colors.yml precedencenen/colors.ymlyes

nen repo

VerbPurposeReads--json
nen repo resolveresolves a repository token (code, slug, short name, or 'all') against the registry, or the cwd's own originnen/repos.json; git (no-token form)yes
nen repo inventorysenkei's live enumeration: epics + children, integration branches, open PRsgh (issue list, api sub_issues/branches/compare, pr list)yes
nen repo scenarioreads back the scenario recorded for one --target in the registrynen/repos.jsonyes
nen repo familyone product family from the registry's families[]: the spec repository (role spec, gate G2) and each member's code resolved to owner/name with its platformnen/repos.json under --repoyes
nen repo classifyone verdict about a repository: role (canon / consumer / spec / unregistered), kind (product / process / library / unknown), stack, lanes, and the gate a change there stands atnen/repos.json + nen/contract.json under --repo; git remote get-url origin when no --targetyes

nen ref

VerbPurposeReads--json
nen ref formatformats the &lt;CODE&gt;-&lt;IS|PR&gt;-#&lt;N&gt; notation, checking the code against the registry firstnen/repos.jsonyes
nen ref parseparses a token in object notationnoneyes
nen ref resolvewhere one canon citation (<path> § N, § Title, #anchor, HR-n, CON-n) lands, or unresolved with candidates; never re-aims onethe cited Markdown file under --rootyes

nen release

VerbPurposeReads--json
nen release preflightevery getsuga §2 release-cut precondition, checked and reported wholegithub (gh variable get, git ls-remote), CHANGELOG.md, changelog.d/, git log --merges, git ls-tree/cat-file (the CHANGELOG's history, for the release-PR allowance)yes
nen release resolve-targetresolve a release token (main/last-commit/checkout/hash/branch) to a SHA and test trunk ancestrygit (fetch/rev-parse/merge-base, reaches origin)yes
nen release self-checkwhether a release PR should list itself in its own rangegit (merge-base ancestry, local only)yes
nen release unit-checkwhether a pull request's changed files stay inside --repo's declared release.unitPathsgithub (gh api --paginate --slurp repos/{owner}/{repo}/pulls/{n}/files), nen/workflow.json, nen/repos.json (a CODE#n ref)yes

nen changelog

VerbPurposeReads--json
nen changelog fragment-requiredwhether a change owes a changelog.d/ fragment (CON-33(a))git diff/caller files, CHANGELOG.md at base+head, optional nen/repos.json-shaped --base-repos/--head-reposyes
nen changelog collatecollate every changelog.d/ fragment into a new dated CHANGELOG.md section (CON-33(b))changelog.d/, CHANGELOG.mdyes
nen changelog completenessevery PR merged in a range has a CHANGELOG entry or an (un)collated fragment (CON-33(c)), except the range's terminal PR when its merge introduced the dated sectiongit log --merges, git ls-tree/cat-file (the CHANGELOG's history, for the release-PR allowance), CHANGELOG.md, changelog.d/yes

nen tag

VerbPurposeReads--json
nen tag cutcut an annotated git tag pinned at an explicit SHA, never auto-pushedgit (tag/ls-remote/merge-base; --push also reaches origin)yes

nen fanout

VerbPurposeReads--json
nen fanout computewhich registered consumers (nen/repos.json) are affected by workflows changed in a release rangenen/repos.json, git diff, .github/workflows/yes
nen fanout recordthe same computation, appended to an audit ledger filenen/repos.json, git diff, .github/workflows/, ledger fileyes

nen report

VerbPurposeReads--json
nen report dataone document describing a branch against a base: commits, changed files (with a caller-supplied tier), the evidence seam, the lane's coverage report if it is on disk, the build proof, the last recorded stop, and -- only when one of the five register flags is given -- the issues and pull requests the effort is about; then where the effort is (worktree, stage, gate, turn, local clock), derivedgit (rev-parse/symbolic-ref/remote get-url/log/diff), the zoneinfo file the zone names, nen/repos.json for the gate, nen/contract.json for the lane, .nen/proof/&lt;lane&gt;.json, .nen/last-stop.json, the declared coverage artifact, a caller-supplied --tiers file; under --target/--prs/--issues/--backlog also github (gh api, gh pr view) and nen's own in-process readiness gate; under --objects-from a caller-supplied file insteadyes
nen report renderfill a template with a data document and write the result: {{token}}, {{{token}}}, {{#each}}, {{#if}} and nothing else, refusing an unknown token by name; --variant injects a declared variant's section flags and --graph injects a validated architecture-delta graphcaller-named --template + --data (+ --graph) files, nen/workflow.json's reports.sections under --variant; writes --out, inside --repo, unless --dry-runyes
nen report mermaidprint the mermaid text for a graph document and nothing elsea caller-named --graph file; writes nothing; no git/ghno

nen review

VerbPurposeReads--json
nen review scopeswhich review scopes a branch diff raises, off the repository's own review.scopes block, plus the changed paths no scope claimsnen/workflow.json's review block, git diff --name-only; writes nothing; no ghyes

nen audit

VerbPurposeReads--json
nen audit depsa directory's dependency pins read from its lockfile or Package.resolved (never by running its package manager) and, with --query, asked about at the declaring contract's OSV querybatch endpoint; four exits: clean, findings, wiring, not scannedthe --contract row (an absolute JSON file), package.json and the lockfile directly under --repo (pnpm, yarn, npm) or Package.resolved (root, .xcodeproj, .xcworkspace), OSV over https (with --query); never git, gh or the package manageryes

nen surface

VerbPurposeReads--json
nen surface mirror generaterender every &lt;name&gt;/SKILL.md under a skills directory into another agent surface's own layout (codex, cursor, antigravity): the body verbatim but for its relative links, re-aimed for the depth each copy lands at, the frontmatter reduced to the keys that surface documents, invocation mentions respelled, personas written where the surface keeps them — plus, per flag, the surface's hook manifest (--hooks), rules file (--rules), permission pack (--permissions) and model aliases (--models), and a --stamp in the markercaller-named --source + --agents directories and pack files; writes --out; no git/ghyes
nen surface mirror checkregenerate that mirror in memory and diff it against the committed --out: missing / extra / stale (generated for another surface, with --stamp for another version, or by a build before relative links were re-aimed) / hand-edited — or, with --installed in place of --out, against an INSTALLED copy on this host (a plugin cache directory, a consumer's .codex/, .cursor/, .agents/) under its own contract, so a warm-up copies only on drift; --surface claude-code compares a plugin tree verbatim — and, with --plugin <name>, judges a Claude Code plugin cache or skills-directory install in the plugin's own layout against an independent source, six verdicts on six exitscaller-named --source + --agents + --out or --installed; with --plugin: --source's trees, the copy, <config>/plugins/*.json and <config>/skills/<name>, plus read-only git rev-parse/symbolic-ref probes of the stand-in and served checkouts; writes nothing at all; no ghyes
nen surface installmake, re-point or report a host's FIRST-PARTY install of a plugin from a checkout, per surface: the Claude Code skills-directory link with the hand-over of a prior marketplace copy, the Codex marketplace and plugin, the Antigravity global plugin link -- never replacing what it did not make, never editing a settings file, every write read backthe checkout's manifests; the surface's own directory (--config-dir) and registry files; claude / codex / agy and one git rev-parse; writes a link under --config-dir and runs the surface's install CLI unless --dry-run; no ghyes
nen surface statusthe version each surface serves for a plugin, read back from claude plugin list --json, codex plugin list or the linked plugin.json, and whether it is a given checkout; with --trees, the copies Claude Code SERVES judged as check --plugin judges themthe surface's directory and registry files; claude / codex / agy list and validate commands; with --trees, the copies and the source; writes nothing; no ghyes
nen surface capabilitieswhat a running session on a surface can do -- picker, subagent, hook events and decision key, worktree isolation, artifact, notify, permissions file and shape, agent model key, rules file and limit, description budget -- as data with a citation per rownothing; a table this binary shipsyes

nen runner

VerbPurposeReads--json
nen runner inventoryevery self-hosted runner a repository has, each name parsed as <machine>-<consumer>R<slot> or runner 0, grouped by the pools --repo's runners block declares (online, free, and the runners still without the pool's own label) plus the unpooled, and the runner package GitHub offers with its SHA-256github (gh api GET runners, every page, and runners/downloads); nen/workflow.json with --repo or --poolyes
nen runner planwhich runners to add: the lowest free slots for a machine and consumer code, install dirs under the root in the host's separators, the service identity (or ask), the pool's mode, and the package with its SHA-256 -- the nen.runner.plan/v0.2 contract, --out writes it; on the pool's own host, a stderr warning (exit 0) when the account already runs another repository's runners of different visibilitynen/workflow.json (runners), nen/repos.json (product_codes), github (gh api GET), this host's runner services (powershell Get-CimInstance / systemctl, read-only); writes --out onlyyes
nen runner scriptrender a plan's host script -- PowerShell 5.1 (elevated; locks the runner root first, asks the password once, mints each token itself, hands both to config.cmd through the environment, never argv; an interactive Windows plan asks no password and registers logon tasks instead of services), bash for Linux (sudo) and macOS (as yourself) -- and print the one launch line; never runs ita caller-named --plan file; writes --out unless --dry-run; no ghyes
nen runner verifypoll the runners list until every expected name is present, online and labelled -- with --pool, with every label of that pool, its own pool-<id> included; never exits 0 on a partial passgithub (gh api GET runners); nen/workflow.json with --poolyes
nen runner workflowrender a pool's preflight workflow from a caller's @@NAME@@ template, refusing a leftover placeholder or invalid YAML, and a changed file without --forcenen/workflow.json (runners), a caller-named --template; writes .github/workflows/<preflightWorkflow> (or --out) unless --dry-runyes
nen runner preflightdispatch the pool's preflight workflow, find the run it created by id, and wait for its verdict; a job still queued at the deadline is named -- no free runner picked it upgithub (gh repo view, gh run list, gh api GET runs/jobs; gh workflow run unless --dry-run)yes
nen runner enableset a pool's enable variable only after re-reading a completed, successful run of its own preflight whose jobs asked for its labels, dispatched on the default branch with the default branch's own workflow blob; read back, idempotentnen/workflow.json (runners), github (gh api GET runs/jobs/contents, gh repo view, gh variable get; gh variable set unless --dry-run)yes
nen runner relabeladd a pool's own label, pool-<id>, to runners registered before it existed (#340) -- only runners named with --runner (--run without it is exit 2); a dry run without --runner lists the candidates; every write read backnen/workflow.json (runners), github (gh api GET runners and runners/<id>/labels; gh api POST runners/<id>/labels with --run)yes

nen run

VerbPurposeReads--json
nen run rerun-failedre-run a workflow run's failed jobs (gh run rerun --failed)github (gh)yes
nen run startstart a batch run's manifest (nen.run/v0.1) at <git-common-dir>/.nen/runs/<id>.json with its repository and launch-time idle answers (HR-5); the same answers again is the resume, other answers or another repository refusedgit (rev-parse --git-common-dir); writes the manifest unless --dry-runyes
nen run appendrecord one PR the run opened, whatever its base, read live (base, branch, head); a PR created before the run started is refused; idempotent on the same facts, updated on a moved head or base, refused on another issue, kind or effortgit (rev-parse --git-common-dir), the manifest, github (gh pr view); writes it unless --dry-runyes
nen run parkrecord an effort parked on an unanswered ask-once row (HR-5's park state), oncegit (rev-parse --git-common-dir), the manifest; writes it unless --dry-runyes
nen run importread Hatsu's futon run manifest (hatsu.futon.run/v0.2) into this one, every PR read live, so one manifest owns the run; idempotent, the Hatsu file never written; a conflict or an unread PR refuses the whole importgit (rev-parse --git-common-dir), <git-common-dir>/hatsu/futon/run-<id>.json or --from, github (gh pr view); writes the manifest unless --dry-runyes
nen run verifyread every PR the run recorded live and report open, merged and closed-unmerged with the unmerged list; an unread PR is exit 1 and counted nowherethe manifest, github (gh pr view); moves a legacy-path manifest once unless --dry-runyes
nen run budgetwall-clock minutes since the run's start and the efforts' recorded tokens against a ceiling (flags, or idle.budget); an unread token sum is unevaluated; --claim refuses at exit 1 once reached or unevaluatedthe manifest, <git-common-dir>/.nen/usage/<effort>.json, nen/workflow.json (idle.budget, only for a ceiling not flagged); moves a legacy-path manifest once unless --dry-runyes
nen run recorda caller's resumable run record (hatsu.spec.run/v0.1) validated against a schema shipped as data — the run id matched whole before any path is built, schema, caller and runId before the fields — and read or written whole at 0600 in a 0700 XDG state directory${XDG_STATE_HOME:-$HOME/.local/state}/<schema dir>/; the --from file; WRITES the record under write unless --dry-runyes

nen issue

VerbPurposeReads--json
nen issue open-pr-checkwhich candidate issues carry an OPEN pull request that closing would orphangh (pr list)yes
nen issue filefile an issue with labels and assignee IN the create call, refusing any label the target taxonomy does not carry or that a forbidden family namesnen/labels.json; gh (issue create)yes
nen issue commentpost one caller-supplied comment on one issue (or, deliberately, one PR) numbergh (issue comment / api)yes
nen issue attach-subattach children as GitHub sub-issues under a parent, certifying every number as an ISSUE (never a PR) before the first writegh (api reads, sub_issues POST)yes
nen issue consolidate-closethe file-&gt;attach-&gt;close choreography: union labels, reduce one severity family to its strongest label, guard every child for an open PR, close each with a commentnen/labels.json; gh (api reads, sub_issues POST, issue close/comment)yes
nen issue chain-positionclassify where an OPEN issue sits on its delivery chain, from its labels alonegh (api read)yes
nen issue terminusclassify which object ends an issue's delivery run (its own PR, each child's PR, or one integration-branch delivery PR)gh (api read)yes
nen issue reconcileread-only, proposes only: which OPEN issues a MERGED pull request already closes, each proposal citing the PR, its merge commit and the closing referencegh (repo view, issue list, api graphql search and per-PR commit queries, api compare, api labels when --hold-labels is given, pr list for delivery PRs and the open-PR guard)yes
nen issue edit-bodyreplaces an issue's body outright with a file's bytes, certifying the number is an ISSUE (never a PR) before any writegh (api read to certify, issue edit unless --dry-run)yes
nen issue body-checkread-only: does an issue body carry every section its kind requires in the caller's catalogue, with content patterns, contiguous and measurable numbered rows, and vague-word advisories--body-file or gh (api read), the --requirements-from catalogueyes
nen issue questionsread-only: counts an issue body's open OQ-{n} rows, resolved ones and [NEEDS ...] markers, one issue or a comma-separated batch; exits 1 while any question is open, NEEDS-marked or malformed--body-file or gh (api read)yes
nen issue criteriaread-only: lists an issue body's AC-{n} acceptance-criterion rows with their text; a body with none is not verifiable--body-file or gh (api read)yes

nen idea

VerbPurposeReads--json
nen idea filefile an idea issue (reusing issue file's own choreography), then read it back over the API and diff title/body/labels against what was submittednen/labels.json; gh (issue create + api read)yes

nen scaffold

VerbPurposeReads--json
nen scaffold initstand an EXISTING repository up: the directory skeleton, the trailer-enforcing commit-msg hook, the trunk-guarding pre-commit hook, a canon-values.yml template, nen/contract.json's project block, nen/workflow.json's policy, the schemas/-&gt;nen/ copy migration, the stack's CI workflow, .gitignore upkeep, and a closing shu tools CHECK that installs nothingnen/contract.json + nen/workflow.json (both hooks are generated FROM the policy) + the legacy schemas/ copies; the bundled profiles pack and templates/; writes to disk under --repo; spawns the version probes the target declares (never on --dry-run)yes
nen scaffold newwrite a FRESH tree for one stack into an empty --dir: the template's files with {{name}} substituted, the CI workflow, .gitignore, both git hooks, nen/workflow.json's policy, and nen/contract.json as shu detect proposes it off the marker just written -- every post-step PRINTED, none runthe bundled profiles pack and templates/; writes to disk under --dir; spawns nothing at allyes
nen scaffold migratewrite each ABSENT nen/colors.yml and nen/gates.json from a seed that widens nothing (no colour category; a Copilot round owed at head on every PR, a delivery carve-out matching no author), read each back through its loader, and never open an existing file -- idempotent; the command schema check names for each missing onewrites to disk under --repo; spawns nothingyes

nen canon

VerbPurposeReads--json
nen canon resolveresolve a target repo's always-load handbook set plus its ONE stack handbook, from the scenario nen/repos.json records for itnen/repos.jsonyes
nen canon pinread the canonical handbooks repository a consumer mirrors and the TAG it is pinned to, from the pinned field on that repository's maintained_tools entry -- data a sync checks the canon out at, and a drift check holds the mirror to; with --write <tag>, MOVE that pin -- one value, every other byte kept -- only to a tag the canon checkout carriesnen/repos.json; with --write, the canon checkout canon checkout resolves (read-only, isolated git; fetches nothing) and an atomic write of nen/repos.json unless --dry-runyes
nen canon checkoutresolve WHERE the canon checkout is on this machine -- --canon-checkout, then the variable the pinned entry's checkout_env names, then its checkout path template -- and verify it is a clean checkout of the pinned source at the pinned tag, reporting every stepnen/repos.json + the environment; read-only, isolated git (rev-parse, remote get-url on the checkout and the consumer, status, ls-files); fetches nothingyes
nen canon mirror generaterender every canonical rule file, {{TOKEN}}s bound, into the rules location of EACH agent surface the consumer declares (a directory of marked files, or one marked block inside AGENTS.md), writing only changed files, deleting marked orphans, refusing to touch a hand-written file--rules-dir, or --stack-dir/--leaf inside the canon checkout canon checkout resolves (read-only git) + --canon-values; the surface table (src/surface/rules.ts); writes under --repo; no ghyes
nen canon mirror checkrender the mirror in memory and diff every declared surface's committed copy against it: ok / missing / extra / stale / hand-edited per file, foreign for the consumer's own--rules-dir, or --stack-dir/--leaf inside the resolved canon checkout (read-only git) + --canon-values; the surface table; reads under --repo; --markdown-out writes its table (and its parent directory) there; no ghyes
nen canon linta canon repository's prose held to a caller-owned rules contract (each rule's class picks the check) behind a shrink-only baseline; fenced code and quoted words exempt; never green over a file it could not readnen/workflow.json canon.lint, the --rules contract and the files it names (version source, decisions, rulings, declared values), the --baseline and --base-baseline, the Markdown its include globs match under --root; with --base, git (merge-base, diff, show)yes
nen canon clause checka clause id space (HR-{n}, CON-{n}) held unique -- definitions counted, citations never, gaps a notice -- and, with --leaves, every changed clause matched by a change in each file citing it or a no-leaf-change: line--file under --repo; --base as a file or git show <ref>:<path>; with --leaves, git (ls-files, diff) and the --body-from fileyes

nen quality

VerbPurposeReads--json
nen quality toolinglook up the e2e/adversarial/perf tooling recorded for a scenario in a caller-supplied tablecaller's own --table JSON (never a table shipped in nen)yes
nen quality perf-compareclassify a measured-vs-baseline regression at QA-13's fixed 10%/25% thresholdsnone (pure arithmetic over the two numbers given)yes
nen quality method-checkvalidate a QA-15 method block: device/OS stated, Release with no debugger, n&gt;=5 with the first discarded, median+p90, thermal+network statedcaller's own --input JSON method blockyes

nen commit

VerbPurposeReads--json
nen commit formatformat and validate ONE Conventional Commits message's shape (type, subject, scope, breaking, trailers) the repository's subject-case rule (commitlint's own when readable as data, else commits.subjectCase), and its body/footer line lengths, wrapping --body to them (commitlint's own when readable as data, else commits.bodyMaxLineLength, else 100) -- never its contenton every run: nen/workflow.json under --repo (the attribution-trailer policy, commits.subjectCase and commits.bodyMaxLineLength), and the commitlint config commitlint would load from --repo's root (data forms parsed; JS/TS never executed)yes
nen commit checkis this working copy the one a green build proved? compares .nen/proof/<lane>.json's tree against the tree now.nen/proof/<lane>.json under --repo, git (add/rm/write-tree into a scratch index)yes
nen commit writecommit the index with a message file validated under commit format's own rules plus every --trailer, refusing a red --require-proof and an empty index; git commit -F is the one writenen/workflow.json under --repo (the trailer policy, commits.subjectCase and commits.bodyMaxLineLength), the commitlint config at --repo's root (subject-case, body-max-line-length, footer-max-line-length), .nen/proof/<lane>.json and the scratch-index hash under --require-proof, git (diff --cached, commit -F, rev-parse, interpret-trailers --parse --no-divider, config trailer.separators and cat-file commit for the written commit's trailer read-back -- exit 3 on an injected one, #273)yes

nen spec

VerbPurposeReads--json
nen spec numberthe next free {nnn} in a spec repository: the highest taken on origin/<base> (as last fetched) or by an open PR's files, plus one; names a collision, picks no winnergit (rev-parse, ls-tree) under --repo; nen/workflow.json branch.base; github (gh pr list --json number,files); git remote get-url origin when no --targetyes
nen spec checka spec folder or the constitution held to citation-or-marker, plus Spec Kit analyze's computable passes (duplicate ids, placeholders, inferred tier in a MUST/SC, FR↔task both ways, the caller's vague terms) and the open markers ranked by clarify's taxonomy; CRITICAL exits 1spec.md/tasks.md or .specify/memory/constitution.md under --repo; the --vocabulary file; no git/ghyes
nen spec cite-checkevery [src:] range in a folder resolves at its own sha in the member checkout the checkouts file names; excerpt hashes against capture/<CODE>/inventory.json; --at reports [STALE] candidatesthe folder's .md files and nen/repos.json under --repo; the --checkouts file; git (remote get-url, rev-parse, cat-file) in each member checkoutyes
nen spec index<root>/INDEX.md regenerated from each folder's spec.md header; reports current / stale / hand-edited / absent; --write refuses over a hand editspec.md headers and INDEX.md under --repo; WRITES <root>/INDEX.md under --write unless --dry-runyes
nen spec inventoryone row per owned file fact of a member at a commit — {id, kind, path, lines, sha, excerptSha256, tier, ruleId}, no excerpts — from the build system's own membership (Xcode build phases and synchronized groups, Gradle include list and source sets, tsconfig files/include/extends/references) classified by the scenario handbook's capture-reader appendix; totals per kind, unknown never omittedgit (rev-parse, ls-tree, cat-file, remote get-url) in the member checkout; WRITES --out when givenyes
nen spec diffadded, removed and changed rows by stable id between two inventories of one member, each changed field named; a different sha alone is no change, so identical inputs give an empty diffthe two inventory files; no git/ghyes
nen spec convergea folder's citations of one member re-read at a newer inventory's sha: gaps missing · partial · contradicts · unrequested (against capture/<CODE>/inventory.json), ticked tasks listed as claims, never evidence; --write only appends [STALE @ <sha>] companions and one dated convergence phase, and a second run changes nothingspec.md/tasks.md, nen/repos.json and capture/<CODE>/inventory.json under --repo; the inventory and --checkouts files; git (remote get-url, rev-parse, ls-tree, cat-file) in the member checkout; WRITES spec.md and tasks.md under --write unless --dry-runyes
nen spec coveragecapture form: covered/total per row kind per member and requirement↔task/test traceability both ways, each with its denominator; delivery form: every F<nnn>-SC-### of an issue has one ## Spec row in the PR body, satisfied with a passing test or deferred with a reason and a follow-up — an outside id exits 2capture: folders and nen/repos.json under --repo, the inventory files; delivery: the two body files and --test-report; no git/ghyes
nen spec parityone row per FR and member from each folder's parity.md, each state held to what SP-6 says it carries (a citation, UX-13, a CL-nnn or PT ruling, both citations, the files searched), a missing row or column open; --target adds each row's live issues and PRsparity.md/spec.md and nen/repos.json under --repo; github (gh issue list, gh pr list) with --targetyes
nen spec tasks groupstasks.md grouped by story and platform, each group's state (open, clarifying, captured, delivered) and dependencies in topological order, and per story group the dispatch title and an issue body quoting its scenarios as fenced source dataspec.md/tasks.md under --repo; git rev-parse HEAD for the pinned shayes
nen spec trace<root>/traceability.md for one family: per FR and SC, each member's parity state or citation count, the tasks and open markers; reports current / stale / hand-edited / absent and --write refuses a hand editspec.md/tasks.md/parity.md and nen/repos.json under --repo; WRITES <root>/traceability.md under --write unless --dry-runyes

nen decisions

VerbPurposeReads--json
nen decisions summaryrows per class and per gate and the G5 ids of nen/decisions.json, so prose never carries those numbersnen/decisions.json under --repoyes

nen tests

VerbPurposeReads--json
nen tests mapeach acceptance criterion of an issue body with the tests whose names carry its id (mapped · unmapped · unrequested); --require-red reads one run as the red checkpoint, --before-report reads two as red-first · green-only · failing · untestedthe issue body and test report files (any shu test-report format); no git/ghyes

nen shu

VerbPurposeReads--json
nen shu detectread the markers on disk and PROPOSE a nen/contract.json project block; never writes without --write and never overwrites onethe target repo's own files (framework configs, package.json, project files); writes nen/contract.json only with --writeyes
nen shu buildcompile or assemble a lane, from the invocation its declaration statesnen/contract.json (project block); spawns the declared argv unless --dry-runyes
nen shu testrun a lane's test suite, from the invocation its declaration statesnen/contract.json (project block); spawns the declared argv unless --dry-runyes
nen shu ui-testrun a lane's UI/E2E suite, from the invocation its declaration statesnen/contract.json (project block); spawns the declared argv unless --dry-runyes
nen shu lintrun a lane's linter and format check, from the invocation its declaration statesnen/contract.json (project block); spawns the declared argv unless --dry-runyes
nen shu typecheckrun a lane's static type check, from the invocation its declaration statesnen/contract.json (project block); spawns the declared argv unless --dry-runyes
nen shu archiveproduce a lane's distributable artifact, where its declaration states onenen/contract.json (project block); spawns the declared argv unless --dry-runyes
nen shu releasepublish a lane's artifact, where its declaration states a publication stepnen/contract.json (project block); spawns the declared argv unless --dry-runyes
nen shu devstart a lane's DEBUG build; long-running, on this terminal. With --target <name> it launches a declared DEVICE instead: the declared probe, the verb, then the target's after-stepsnen/contract.json (project block, plus project.launch for --target); inherits stdio unless --dry-run; spawns the declared device probe and after-steps only with --targetyes
nen shu runstart a lane's PRODUCTION build locally; long-running, on this terminal. Takes the same optional --targetnen/contract.json (project block, plus project.launch for --target); inherits stdio unless --dry-runyes
nen shu deploysend a build to a declared, NAMED target -- TWO flags and no single-flag path to acting: --target is required and has no default, --run is required before anything is sent, and a lane whose deploy is a seat refuses with its own reason whatever --target saysnen/contract.json (project block + project.targets: the destination's args, the env NAMES it requires, or the sentence saying it has no command line); spawns the declared argv only with --runyes
nen shu coveragerun a lane's coverage command and PARSE the report it produced into one shape -- totals, per-target rows, and --threshold's met, which never moves the exit code; --touched --base <ref> narrows the rows to the files a change touched (a git-diff read after the run) and, with --threshold absent, bands each row against nen/workflow.json's coverage ladder -- or, where that file is absent, nen's published 80/85/90 defaults -- instead; never gating either waynen/contract.json (project block); spawns the declared argv unless --dry-run, then READS the report the verb's artifacts name (and, under --touched with no --threshold, nen/workflow.json through the shared loader)yes
nen shu test-reportrun a lane's declared TEST command and PARSE the results it produced into one shape -- a row per test and the four counts. It declares nothing of its own: it runs project.verbs.<lane>.test and reads THAT row's artifacts, one file or a whole directory of XMLnen/contract.json (project block); spawns the declared test argv unless --dry-run or --from-artifacts, then READS the results the test verb's artifacts nameyes
nen shu evidencematch git diff --name-status <base>...HEAD against project.evidence.globs, deriving each survivor's suite/scene and grouping suite -> scenes; empty is exit 0, never an errorgit diff (through the seam only -- no declared invocation, no lane); nen/contract.json (project.evidence)yes
nen shu toolscheck the host toolchain a declaration pins (exit 5 when anything is missing or wrong, exit 7 when nen is behind the dependency block's pinned_ref inside its minimum), and with --install use the closed corepack, Bashcov-only lane-local gem and general user-local gem-user modesnen/contract.json (project.toolchain + dependency); spawns each declared version probe unless --dry-run; spawns an installer only with --installyes
nen shu warmupwarm a WORKING COPY: clean, fetch, fast-forward the trunk, cut the named branch, verify the declared build -- the one shu verb that mutates git state. Not nen warmup, which sweeps a registry and reads onlygit in --repo (unless --dry-run); nen/contract.json (project block) for the build/test halfyes

nen dev

VerbPurposeReads--json
nen dev testrun this checkout's own vitest suite via bun run testpackage.json + vitest.config.ts under --repono (stdio)
nen dev lintrun this checkout's own eslint via bun run lintpackage.json + eslint config under --repono (stdio)
nen dev replayreplay the imported dedupe corpus slice against nen's own normalizeTitle/findCanonical and report any disagreementtests/fixtures/dualrun-slice/dedupe/*.json (or --slice-dir)yes

nen parse

VerbPurposeReads--json
nen parse <skill>parse an arbitrary skill's invocation against a caller-supplied --grammar template, echo the parse, or refuse with a corrected linenoneyes
nen parse futonparse futon's own grammar and resolve its repo token against the target repo's nen/repos.json, refusing a 'then &lt;terminal&gt;' clause on a repo that is not the caller's own; reports an optional --idle (HR-5) and --dry-run (#520)nen/repos.jsonyes
nen parse izanagiparse izanagi's MUTATING-loop grammar, refusing when 'up to &lt;N&gt;' is absentnoneyes
nen parse izanamiparse izanami's READ-ONLY-loop grammar and classify every command in it against izanami's own allow/refuse tablenoneyes

nen bootstrap

VerbPurposeReads--json
nen bootstrapfetch, checksum-verify and cache a pinned nen binary by running bootstrap/nen.sh, relaying its verified path and exit code unchangedbootstrap/nen.sh under --repo; network (GitHub release assets + SHA256SUMS)no (stdio)

nen wake

VerbPurposeReads--json
nen wake verifyscan open PRs whose author matches --author-pattern for a swallowed (action_required/startup_failure, never-executed) workflow run, auto-redriving what is safe and flagging the rest for a humangh (pulls, actions/runs, issue comments; --run also writes reruns + comments)yes
nen wake fireedge-trigger one object by removing then re-applying a label, then post an optional settle commentgh (issue edit x2, api comment; --run required to write)yes

nen stop

VerbPurposeReads--json
nen stoprender the gate-stop banner plus a padded-markdown efforts table read from a file/stdin, or (--template) a blank table to fill in; --mark also records the stop for a host hooka local efforts.md file or stdin; git rev-parse --git-common-dir under --mark. --mark WRITES .nen/last-stop.json under --repo and <git-common-dir>/.nen/marks/<effort>/<gate>.json; list reads both, clear removes themyes
nen stop answerrecord the answer a stop received -- the question, every option with its consequence, and a picked key or the typed reply verbatim -- as one record with a never-reused id R-YYYY-MM-DD-nn; answer show lists an effort's records. Records, never choosesgit (rev-parse --git-common-dir); the --question-file/--typed-file under --repo; WRITES <git common dir>/.nen/stops/<effort>/<n>.json and <git common dir>/.nen/stop-ids/<id> unless --dry-runyes

nen exits

VerbPurposeReads--json
nen exitsevery exit code above the shared 0/1/2 scheme, verb -> code -> meaning, read from the registry; USAGE's exit table is held to itnothing outside the binaryyes

Built in the open by zheref. MIT license.

Versions and commands on this site are read from the repositories at build time. hatsu 0.159.0 · nen 0.29.0 · handbooks v0.13 · 2026-11-04

Independent open-source project. Not affiliated with or endorsed by any anime or manga rights holder.