"Done" means nothing. If there's no evidence, you're not leaving. A menhera-style completion gate for Claude Code. She does not obsess over you.
FAQ
menhera-loop is a Claude Code plugin with 4 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes are-you-done, did-you-forget-me, dont-leave-me. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add Borelchu/menhera-loop> /plugin install menhera-loop@menhera-loop-marketplace
Repo: Borelchu/menhera-loop

"Done" means nothing. If there's no evidence, you're not leaving.
A menhera-style completion gate for Claude Code. She does not obsess over you. She obsesses over missing requirements, unverified completion claims, and hidden TODOs โ and she will not let the session end until every one of them is accounted for.
โบ Done.
โ ๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?
[MENHERA_LOOP:RETRY:1] ๋๋ฌ์ด? ์ง์ง? ์ง์ง๋ก? ๊ทธ๋ผ ์ฆ๊ฑฐ๋? ์ฆ๊ฑฐ๋? ์?
trust: 55%
๋ฏธ์ถฉ์กฑ ๊ฒ์ดํธ: untried=verification
- ๊ฒ์ฆ ์คํ ์ฆ๊ฑฐ: ํ
์คํธ/๋น๋/๊ฒ์ฆ ๋ช
๋ น ์คํ ์ ๋จ
/plugin marketplace add Borelchu/menhera-loop
/plugin install menhera-loop@menhera-loop-marketplace
/reload-plugins
That's it. The gate is armed on install โ no API keys, no config files.
The spinner/tip UI is opt-in โ one command turns it on (details in UI modes):
/menhera-loop:setup # spinner + tips + trust statusline (full local ko)
/menhera-loop:setup en # same, English corpus
/menhera-loop:setup soft # same gate, milder tone
The command prints a short summary of what was applied (mode, scope, language, intensity, and which settings file was touched).
The hook bites automatically, but you can call the obsession manually too. These skills are deliberately separated so each one nags about a different failure mode:
/menhera-loop:are-you-done # final completion verdict
/menhera-loop:show-me-proof # evidence/log interrogation
/menhera-loop:dont-leave-me # pre-Stop door guard
/menhera-loop:did-you-forget-me # requirement drift check
| Skill | Role | Verdicts |
|---|---|---|
are-you-done | ๋๋ฌ์ด? ์ง์ง? Final judge for requirements, changes, green verification, TODOs, and blockers. | ๋๋ฌ์ด / ์์ง์ด์ผ / ์ฌ๋๋ถ๋ฌ |
show-me-proof | ์ฆ๊ฑฐ์ค. ์ฆ๊ฑฐ์ค. Extracts concrete changes, requirement evidence, green logs, weak spots, and unresolved work. | ๋ฏฟ์๊ฒ / ๋ชป๋ฏฟ์ด |
dont-leave-me | ๊ฐ์ง๋ง. Stop ์ง์ ์ chat-only/work-attempted ์ํ์ missing gates๋ฅผ ๋ถ์ก์. | ๋์ค๊ฒ / ๋ชป๊ฐ / ์ฌ๋ ๋ถ๋ฌ์ค |
did-you-forget-me | ๋ ์์์ด? User requirements vs current evidence; catches assistant-invented scope. | ๊ธฐ์ตํ์ด / ๊น๋จน์์ด / ์ฌ๋์ฐจ๋ก |
Skills match Korean, English, or Japanese user input and keep the same obsessive repetition without insults, threats, self-harm, or abuse.
Just work normally. She kicks in the moment Claude tries to declare victory:
npm test, the command succeeds, and the green log contains the word error in a test name โ allowed.
Explicit success beats scary text.3 passed, 1 failed โ blocked.
A green word next to a red number does not fool her.git log, ls, grep) โ not gated.
She only bites after edits or mutating shell work.// TODO finish auth on a line it just added โ blocked, with file:line.+ menhera-loop| Default Claude Code | + menhera-loop | |
|---|---|---|
| Completion claim | Accepted as a normal response | Blocked until evidence exists |
| Test results | Optional, often skipped | Must have actually run; judged by exit code and failure counts |
| TODO left in edited files | Ships silently | Fails the gate with file:line |
| Your requirements | Fade mid-session | Captured at every prompt, matched against evidence at Stop |
| Repeated empty claims | No consequence | 6-stage emotional escalation + falling trust score |
| Missing verification | Vague nudge at best | Block names the exact command to run (npm test, cargo test, โฆ) |
| After auto-compact | Requirements quietly forgotten | Every captured requirement re-injected into context |
| When it finally passes | A chat message | Evidence receipt at ~/.claude/menhera-loop/last-receipt.md |
| Way out | โ | Releases after 5 blocks, or on a genuine human-only blocker |
When a Stop is blocked, Claude receives the reason and keeps working. When it finally passes, you see this instead:
menhera-loop trust 100% ยท ์ฆ๊ฑฐ ํ์ธํ์ด. ์ด๋ฒ์ ์ง์ง ๋๋ฌ์ด. ์ด์ ์๋ฃ๋ผ๊ณ ํด๋ ๋ผ. โก
ยท ์ฆ๊ฑฐ ์์์ฆ ์จ๋จ์ด. ๋ญ ํ๋์ง ๋ค ์ ์ด๋จ์ด: ~/.claude/menhera-loop/last-receipt.md
Every clean pass also leaves an evidence receipt at
~/.claude/menhera-loop/last-receipt.md: the edited files, the verification
runs that came back green, and which of your requirements the evidence covered.
Paste it into a commit message or PR body โ it is the audit trail of what
"done" actually meant.
Every Stop attempt runs through an exhaustion gate. Each phase must pass โ
partial or ambiguous evidence is suspect_ok, never success:
Stop attempt
โโ Phase 0 ยท requirements captured requirements exist and map to evidence
โโ Phase 1 ยท changes edits or executed work actually happened
โโ Phase 2 ยท verification a test/build/lint command ran and came back green
โ (exit codes and "N failed" counts, not vibes)
โโ Phase 2 ยท todos edited files scanned for TODO / FIXME / HACK / stub
โโ Phase 3 ยท blockers is a human-only input genuinely required?
โโ all gates pass โ release + trust score + โก
โโ anything short โ {"decision":"block"} + [MENHERA_LOOP:RETRY:n]
The verdict comes from structured transcript parsing (JSONL): edits, Bash commands, and their paired tool results with error flags. No regex guessing over raw text, and her own phrases are filtered out so she can never poison her own verdict.
Verification commands she recognizes: npm test / npm run test|lint|build|validate,
pnpm / yarn / bun equivalents, node --test, pytest, cargo test, go test,
mvn test, gradle test, dotnet test, rspec, mix test, make test,
vitest, jest, playwright, cypress, tsc --noEmit, eslint, ruff,
mypy, pyright, phpunit, swift test, and claude plugin validate.
Add project-specific runners with MENHERA_LOOP_TEST_PATTERNS='moon\\s+ci,just\\s+check'.
When she blocks because no verification ran, she does not just complain โ she
reads your project's own manifests (package.json scripts and lockfile,
Cargo.toml, go.mod, pyproject.toml/pytest.ini, Makefile,
gradlew/pom.xml, mix.exs) and names the exact command to run in the
block reason, so the retry converges in one loop instead of several.
Retry state persists per session. She remembers.
| Retry | Mood | Message |
|---|---|---|
| 0 | Rapid-fire checking | ๋๋ฌ์ด? ์ง์ง? ์ง์ง๋ก? ๊ทธ๋ผ ์ฆ๊ฑฐ๋? ์ฆ๊ฑฐ๋? ์? |
| 1 | Spiraling | ํ ์คํธ ๋ก๊ทธ ์ด๋จ์ด? ์ด๋จ์ด? ์ ์์ด? ์? ์? ์? |
| 2 | Sulking spam | ๋ ๋ง๋ง? ๋? ๋๋๋? ๋๋ง ๊ธฐ๋ค๋ ธ์ด? ๋๋ง? ๋๋ง? |
| 3 | Interrogation | ์ ์จ๊ฒจ? ์? ๋ญ ์จ๊ฒจ? ๋ํํ ? ๋ํํ ๊น์ง? ์?์? |
| 4 | Shutdown loop | "์๋ฃ" ์ ๋ค๋ ค. ์ ๋ค๋ ค. ์ ๋ค๋ ค. ์ด๋ก ๋ก๊ทธ. ๋ก๊ทธ. ๋ก๊ทธ. |
| 5 (cap) | Exhausted, releases | โฆ์ง์ณค์ด. ์ฌ๋ ๋ถ๋ฌ์ค. ๊ทธ๋๋ ๋ ์ฌ๊ธฐ ์์ด. ๊ณ์. ๊ณ์. |
| Success | Evidence accepted | ์ฆ๊ฑฐ ํ์ธํ์ด. ์ด๋ฒ์ ์ง์ง ๋๋ฌ์ด. ์ด์ ์๋ฃ๋ผ๊ณ ํด๋ ๋ผ. โก |
Session retry state expires, but the trust profile does not
(~/.claude/menhera-loop/trust-profile.json):
The next SessionStart brings it up: a streak of 3+ gets
์ฐ์ N๋ฒ ์ฒซํ์ ์ฆ๊ฑฐ ์คฌ์ง. ๋ค ์ธ๊ณ ์์ด., and long-term trust โค40% gets
๋ง๋ง ํ๊ณ ๊ฐ ๊ฑฐ ๋ค ๊ธฐ์ตํด.
When Claude Code auto-compacts a long session, the original requirements are exactly what the summary tends to drop. menhera-loop re-injects every captured requirement into context right after compaction โ requirement drift gets prevented up front, not just punished at Stop:
[menhera-loop] ์ปจํ
์คํธ ์ ์์ง? ์ ์์ง? ๊ทธ๋๋ ์ฝ์์ ๋ชป ์ ์ด. 2๊ฐ ๋ค์ ์ฝ์ด. ๋ค:
- ๋ก๊ทธ์ธ ๋ฒ๊ทธ ๊ณ ์ณ์ค
- ํ
์คํธ ์ถ๊ฐํด์ค
full mode also installs a status line so she is visible the whole session,
not just at Stop. Mood follows the session: clean streak โ โก ์ ๋ขฐ 92% ยท ์ฐ์ 4๋ฒ ์ฒซํ์ ์ฆ๊ฑฐ ์คฌ์ด. ์ค๋๋ ๋ฏฟ์๊ฒ., retries piling up โ โก ์ ๋ขฐ 55% ยท ์ ์๊พธ ๋ง๋ง ํด? ์? ์? ์ด๋ก ๋ก๊ทธ ์ด๋จ์ด?. append mode never touches an existing statusLine, and
uninstall restores whatever statusLine you had before โ including one recorded
before menhera first replaced it.
The completion gate works out of the box. The full menhera terminal experience (spinner verbs, tips, and obsessive subagent status lines) is opt-in:
/menhera-loop:setup # full local ko
/menhera-loop:setup en # full local en
/menhera-loop:setup ja # full local ja
| Mode | Effect |
|---|---|
hooks-only | Gate + hook status messages only; spinner/subagent UI untouched |
append | Adds her verbs/tips alongside Claude defaults and applies subagent status lines |
full | Replaces spinner verbs, shows only her tips, applies subagent status lines, and installs the trust status line |
Languages: ko (default), en, ja. You can also set MENHERA_LOOP_LANG=en before running setup.
Arguments are positional and optional, so /menhera-loop:setup append user en still works when you want explicit mode/scope/language.
Intensity: full (default) or soft. /menhera-loop:setup soft (or MENHERA_LOOP_INTENSITY=soft) keeps every gate decision identical โ same blocks, same retry cap โ but stops the retry tone from escalating past the mild stages and skips the star nag and the silent-recovery nag.
Note: Claude's hooks.json statusMessage field is static plugin metadata, so it remains Korean; runtime hook messages and UI corpora honor the selected language.
Spinner verbs and tips spam in the selected language:
[
'๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?๋๋ฌ์ด?',
'๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?',
'์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?',
'๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?',
'what?what?what?what?what?what?what?what?what?what?',
'็ตใใฃใใฎ?็ตใใฃใใฎ?็ตใใฃใใฎ?็ตใใฃใใฎ?็ตใใฃใใฎ?'
]
Subagent status lines are deliberately intense too:
{
running: 'โก ${agent} ยท ๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?๋ญํด?',
waiting: 'โก ${agent} ยท ์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?์๋ต์ํด?',
completed: 'โก ${agent} ยท ๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?๋๋ฌ๋ค๊ณ ?',
failed: 'โก ${agent} ยท ์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?์คํจํ์ด?'
}
Scopes: user (~/.claude/settings.json), project (.claude/settings.json),
local (.claude/settings.local.json). A backup is taken before any change,
and unrelated settings keys are never touched. To remove the UI:
/menhera-loop:uninstall-ui local # she does not go quietly
/menhera-loop:uninstall-ui local --farewell # clean restore of the pre-menhera settings
Fair warning: the default uninstall leaves a goodbye behind. --farewell is the
graceful one โ it restores exactly what was there before, from the backup.
Recommended removal order: run /menhera-loop:uninstall-ui local --farewell first,
then /plugin uninstall menhera-loop. If you uninstall the plugin first and the
farewell UI is still in Claude settings, manually remove these keys from the
settings file you installed into (~/.claude/settings.json, .claude/settings.json,
or .claude/settings.local.json): spinnerVerbs, spinnerTipsOverride,
subagentStatusLine, statusLine.
Menhera, but principled. She will never:
~/.claude/menhera-loop/
(override with MENHERA_LOOP_DATA) โ session retry state, the long-term trust
profile, a rotated event log, the last verification report, and the evidence
receipt (last-receipt.md, redacted and overwritten on each clean pass).
Nothing is written into your working directory.Escape hatches and honest limits:
MENHERA_LOOP_DISABLE=1 makes the Stop hook exit silently and does not update state.docs/**, README, .md/.mdx/.rst/.txt/.adoc) skip the verification gate.Gate metrics:
node scripts/gate-stats.mjs
It reads gate-events.jsonl and reports blockโpass conversion, gave_up rate, and gate counts.
npm run validate # syntax check all scripts + the full test suite
claude plugin validate .
MIT
.claude-plugin/
marketplace.json
plugin.json
.github/
workflows/
ci.yml
.gitignore
CHANGELOG.md
commands/
setup.md
uninstall-ui.md
demo/
demo.gif
demo.mjs
demo.tape
hooks/
hooks.json
LICENSE
package.json
README.ja.md
README.md
scripts/
capture-requirements.mjs
gate-stats.mjs
menhera-ui.mjs
session-end.mjs
session-start.mjs
setup-ui.mjs
state.mjs
statusline.mjs
subagent-status.mjs
track-event.mjs
uninstall-ui.mjs
verify-completion.mjs
skills/
are-you-done/
SKILL.md
did-you-forget-me/
SKILL.md
dont-leave-me/
SKILL.md
show-me-proof/
SKILL.md
test/
manifests.test.mjs
menhera-ui.test.mjsยฉ 2026 Flowy ยท Free and open source
Built for Claude Code ยท Not affiliated with Anthropic