Ring the bell at the end of a turn — the three escalation rungs from nen/workflow.json (a push notification through the surface, an OS notification, an audible cue), the .nen/last-stop.json marker the Stop hook reads, and the in-session fallback where no hook is installed. Use when hatsu:ren reaches its sixth step, when hatsu:en reaches Ready, or when the maintainer invokes hatsu:jutaisho [at <gate>]. An ordinary turn rings rung 1 only, a turn that did nothing rings nothing, and a genuine gate gets all four parts of § 4 — the nen stop banner, the report link, lettered options with a star on the recommended decision, and the question through the surface's own option picker. Never prompts for hatsu:aka.
Install
npx skillscat add zheref/hatsu/jutaisho Install via the SkillsCat registry.
Jutaisho — the bell
Nature: Manipulator. Signalling decides whether the maintainer's attention is spent.
When the turn is over, tell me — and only actually interrupt me when it is mine.
The last step of `ren`'s turn and the step `en` fires at
Ready: the only place in the local plane allowed to make a noise, and a bell that rings every turn
is a bell nobody hears.
0. Standalone entry
Already total (`docs/STANDALONE-ENTRY.md` § 4): cold entry adds
only P1, and says whether anything happened — over a quiet checkout, nothing to announce.
Terminal: a gate's successor is the maintainer's decision, named in the options, never prompted.
1. Invocation
hatsu:jutaisho [at <G1 | G1-M | G2 | G3 | G4 | G5>]
nen parse jutaisho --grammar "at [<gate:G1|G1-M|G2|G3|G4|G5>]" --line "<the invocation, minus the prefix>"An empty --line or a bare at parses to gate: (clause absent), exit 0 — meaningful, not a
gap: no at <gate> is a turn bell, nothing asked
and no banner; with a gate it is a stop and § 4's whole shape is owed. An unparseable line or an
absent notifications item is asked for and set up inline (missing-argument,missing-configuration; `WORKFLOW.md` § 4 Ask, set up, continue).
| The run | Rungs that fire |
|---|---|
An ordinary turn — no at <gate> |
rung 1 only — the surface's own turn-end line |
A repository that asks for more (notifications.turn: "all") |
every rung in notifications.rungs |
A gate — at <gate> present, or the page's ask has a gate (below) |
every rung in notifications.rungs, plus § 4's banner |
The page's ask decides the bell — authored here, cited everywhere else. A report ask of any
kind reaches the surface's picker in this same turn, its options verbatim (same letters, order,
star); a page is never the only place a question is put. Only an ask whose gate is G1–G5 makes
this jutaisho at <gate>, with § 4's four parts. An ask from an ask-once-per-run row ofnen/decisions.json gets the picker and rung 1, and no banner.
Rung 1 is a line in a transcript the maintainer is already reading; rungs 2–3 take over the
machine, so an ordinary turn rings 2–3 only where a repository says so by name. "A turn
that needs nothing" is narrow — no at <gate> and nothing to say, no commit, no report
rendered, no step refused — and that turn rings nothing at all, not even rung 1.
2. The three rungs — nen/workflow.json → notifications
| Key | Meaning | Default |
|---|---|---|
notifications.rungs |
which rungs may fire, in order | ["push", "os", "sound"] |
notifications.sound |
the macOS system sound for rung 3 | Glass |
notifications.turn |
how loud an ordinary turn is: "rung1" or "all", a closed set validated by nen schema check and refused by pointer on anything else |
"rung1" |
| Rung | What it is | Who fires it |
|---|---|---|
1 · push |
the surface's own turn-end notification | the harness, or this skill through the surface; never nen |
2 · os |
an OS notification, title plus one line | the Stop hook off § 3's marker; § 5 in-session where there is none |
3 · sound |
an audible cue, notifications.sound |
the same |
| — | the banner and efforts table | nen stop (§ 4) |
- A rung the workflow does not list does not fire — reported as configured.
rungsandturndiffer:rungssays which exist here at all,turnhow many an
ungated run may use.turncan only withhold, never conjure, and a gate rings
everythingrungslists regardless of it.- nen fires none of rungs 1–3 and only reports rung 1, so
--notifiedis a claim about what
this skill already did — passed only after rung 1 went out. HATSU_ATTENTION=offrings rungs 2 and 3 nowhere and still consumes the marker.
3. The marker — .nen/last-stop.json
The harness Stop hook fires rungs 2–3: the skill writes the marker; the hook reads, fires and
removes it. The marker is written only when rungs 2–3 are actually owed — a gate,
or notifications.turn: "all" — because a marker on disk is a request to interrupt.
nen stop --who Kurapika --gate <gate> --notified --mark \
--title "<what happened, one line>" --body "<the ask, one line>" \
--report-url "<the spiritual-message report's link>" \
--options <options.json> [--propose-issue <issue.json>] <efforts.md>The marker is nen's file (nen.stop.mark/v0.2, one options[] entry recommended), never
hand-written (`PROCESS.md` § History). sound and rungs are not in it — the hook reads them fromnen/workflow.json — and nen stop show validates a marker while nen stop clear consumes one where
there is no hook.
.nen/is git-ignored, and the marker is the only file this skill writes anywhere.- A marker older than 10 minutes is stale, decided from mtime and removed without firing —
never queued or replayed — so it is written whole, in the turn it describes, never amended. whois the persona, never the name the surface introduced itself as.- One marker, overwritten: no queue.
- The hook is
hooks/hooks.json's (and thePreToolUsetrunk guard): read, never edited or
installed.
4. A stop — the four parts, all four or it is not a stop
1 · The nen stop banner and efforts table.
nen stop --who Kurapika --gate <G1|G1-M|G2|G3|G4|G5> --notified <efforts.md><efforts.md> is the markdown pipe table nen stop --template emits blank. Pass --notified
only if rung 1 actually fired.
2 · The report link — always, everywhere, never an option: the banner line, the chat line, the
marker's reportUrl and the OS notification body. A report is read, not decided, so the picker lists
only decisions that move the workflow. And the page must actually explain this stop:
before the link goes in, verify the rendered HTML carries the readable #g5-blocker content
`spiritual-message` § 4 specifies (zheref/hatsu#56); lacking it,
re-render with blocker filled and verify again. The stop never restates the page.
3 · Crazy Slots — lettered options, at least three, ⭐ on the recommended decision. Composed from
the session's context and the workflow's state, seeded by the matching row'spreferred[] in nen/decisions.json and never limited to it. Every option is an executable act
with its exact command and consequence — never a mood, never the report. Exactly one carries
the star, and the line says what would tip it. Every real stop also carries a proposed process
issue (--propose-issue, Netero's completeness shape) so the next session does not hit the same
stop. A condition whose row is autonomous never reaches this part: it was resolved by its default, and the
turn page says so with the row id.
4 · The question through the surface's own option picker (`docs/SURFACES.md`'s
native option picker row; nen surface capabilities --surface <s> names it) — never a paragraph
ending in a question mark; its options are the marker's, verbatim (§ 1). A DO or MERGE ask's picker never carries the act,
which is the maintainer's outside the session — a MERGE ask exists only for a PR the run did not author
(its own it merges, en § 5, ruling 2026-09-29 (3)).
Only a genuine stop interrupts — the five G5s `docs/WORKFLOW.md` § 4
lists, plus G1/G2/G3/G4 when one is genuinely due. Everything else is a turn bell.
5. Surfaces, and the fallback without a hook
Which side fires rungs 2–3 is one fact: was a hook file placed here?
(`docs/WORKFLOW.md` § 6.) The fallback's commands, sanitising and
read-stderr rules are `docs/surfaces/README.md` § Shared rules.
Here: the fallback is announced every time, an unfired rung is never rendered as fired, the marker
is removed by the side that consumed it (the hook, when it fired; the fallback, only where no hook
file is placed), and the stop still stands whichever path rang, § 4's four parts being the real bell.
Residue: osascript and afplay are harness shell, [unknown] to nen and refused by nen watch until; osascript's stderr, never its exit code, is the evidence.
Authority
Permitted: write .nen/last-stop.json through nen stop --mark; run nen stop; fire the
workflow's declared rungs; ask through the surface's option picker. Not permitted: any git or
GitHub write, any label, merge or push — jutaisho ends a turn, it never advances one — and no
delegation (`PROCESS.md` § Authority every phase shares).
Hard limits
- Never prompts for `aka` — offering it, hinting at it, or ending a turn with
"shall I push?" makes a human call an agent's suggestion. - Never escalates an ordinary turn past rung 1 with no gate and no
notifications.turn: "all"—
no OS notification, no sound, no marker, no banner, nonen stop— and a turn that did nothing
rings nothing at all, not even rung 1. - Never renders a stop with fewer than § 4's four parts, with ⭐ on the recommended decision,
never on the report, and never hands off a G5 link whose page lacks the blocker (hatsu#56). - Never passes
--notifiedfor a push notification that did not go out, never claims a rung
fired that did not, and never readsosascript's exit0as proof it fired (§ 5). - Never leaves its own marker behind where no hook file is placed, never writes
whofrom the
name the surface introduced itself as, and never interpolates an unsanitised value into the
fallback (§§ 3, 5). - Never suppresses a real stop because a turn bell already rang, and never fires its noise twice.
- Never rings rungs 2–3 in-session without saying so, and never escalates an ordinary turn just
because no hook file is placed.