Claude Modsunofficial directory

Context & memory·terminal·MIT

Katharsis

Classifies each message and shapes the reply: answer first, a word cap, codes that last.

Katharsis reply with coded AT1 and AT2 lines, code chips and its band, beside Claude Code's default reply
Screenshots from the Katharsis repository, MIT license

Katharsis is an output style that makes Claude decide what kind of message you sent before it replies. A status check, an approval, a bug report and a request for a diagnosis each get their own shape: the answer on the first line, a word ceiling for that type, and a code such as F3 or NA2 on every finding and next action, so “do NA2” is a complete instruction. A hooks module carries the per-turn reminder, keeps the codes on disk and adds a drawer to browse them.

The README’s test sends the same two messages, in the same sandbox repo, under the default style and under Katharsis. On Opus 5, the second reply drops from 449 words to 87 and opens with the test result. Across both turns Katharsis is also shorter on Opus 5.5, the run in the GIF above, and on Fable 5.1 and Fable 5, where it runs 224 words against 540. It is longer on Sonnet 5, 498 against 349. The replies are stored verbatim in the repo’s demo/ folder with the steps to reproduce them.

What it does

  • Eleven exchange types. The model picks one from a cue table in the style, then runs a script that prints that type’s guidance file: what opens the reply, what stays out, how long it may run. The script never classifies; it only prints the file and records the type.
TypeTypical messageCeiling
factual-questiona question with a short, checkable answer150 words
status-and-resumehow is it going, or carry on250
approvala go-ahead or a picked option250
thinking-out-loudtalking an idea through350
diagnosiswhy does this happen, or what do you think500
redirectdo it another way250
broken-reporta reply or a result is wrong250
work-requesta task to do400
canned-reviewa scripted review prompt naming a diff300
harness-probeanswer in one exact formthat form
defaulta greeting, a fragment, or three types at once250

The ceiling counts everything you read, coded lines included. When your message lists items, each one gets a line regardless.

  • Reference codes. Findings (F), assumptions (A), risks (R), caveats (C), actions taken (AT), verified (V), next actions (NA), blocked (B), your move (MV), waiting (W), excluded (X), state (S), trade-offs (T-O), errata (E) and questions (Q). Each coded line holds the claim and its evidence in one sentence, and numbers never restart within a session.
  • Acting instead of asking. The model makes the calls that are cheap to undo and reports them. It ends on a question only when a wrong guess would be expensive or reach past your machine, with the options and a recommendation inside it. You answer Q3 a, Q3 z with your own answer, or Q3 x to dismiss it.
  • A ledger and kref. A Stop hook writes every coded item to a ledger, and kref reads it back from bash mode: kref F3 for one item, kref search <word> across every session, --short, --chrono, --html or --json for other views. Codes still resolve after a compaction or in the next session.
  • The drawer. A band above the prompt counts the code types in the session, such as F:3|C:1|AT:2|Q:1. Hover a type for its latest 10 titles and press one to open it. /kdrawer [query] opens a pane with every item grouped by type, a search box, a type filter, a Status menu (all, open, resolved) and a short or full view. In a reply, each code on record becomes a link to the drawer, chips under the reply show a card per code on hover, and under the latest reply a Still open row lists unanswered questions, your moves, blocks and risks.
  • Checks on the reply. Stop hooks hold a reply once, asking only for the missing line, when it gives a code a different claim with no erratum, or when it opens by narrating instead of with the finding. Another prints one Katharsis check: line when the reply says tests, a build, a linter or CI passed but the last run failed, ran before a later edit or never ran, or when a count rests on grep -c or rg without -uu. No hook asks for a rewrite.
  • An overwrite guard. Around each Bash call that replaces a file no earlier call named (>, tee, cp, mv, dd of=), a hook copies the file first. If lines were lost, it keeps the copy, shows you and the model the cp command that restores it, and holds a reply that does not mention the loss once. This one runs in every session, with or without the style.
  • /katharsis:rules-check reads the instruction files Claude Code loads for the project and reports the rules that repeat or contradict the style, each with a suggested edit. It changes a file only after you approve that edit.

Katharsis band above the prompt with the Next actions popup listing NA1 and NA2 over the code counts

Katharsis drawer docked beside a reply, listing 12 items under Findings, Caveats, Actions taken and more

Install

Needs Claude Code 2.1.287 or later, plus bash and python3; kref also needs Node.js 22.18 or later.

claude plugin marketplace add OpenScribbler/Katharsis
claude plugin install katharsis@openscribbler

Then run /katharsis:setup in a session. It adds one entry to permissions.allow in ~/.claude/settings.json, Bash(~/.claude/katharsis/scripts/katharsis-exchange-style.sh:*), so the per-turn script does not ask for permission in every session. Running ~/.claude/katharsis/scripts/setup.sh --dry-run from a terminal prints the change without writing it.

Last, open /config, choose Output style and pick one of two:

  • katharsis:Katharsis drops Claude Code’s built-in software-engineering instructions, as any custom output style does by default.
  • katharsis:Katharsis coding keeps them.

The pick is saved to .claude/settings.local.json in the current project, so each project needs its own. To run kref from your own terminal, link it once:

ln -s ~/.claude/katharsis/bin/kref ~/.local/bin/

How it works

What it reads. The prompt hook (prompt.submit) reads the active output style through settings.read. When it is not Katharsis, the hook deletes its marker file and does nothing else, and the drawer draws nothing. When it is, the hook reads your message locally for three things: answers such as Q3 a, signs that you did not type the turn (a task notification, a bash-mode result, a skill load, a compaction resume), and a handoff file under /tmp/punt-<id>.md, whose ledger parent it reads to join two sessions into one numbering.

What it adds to the context. Each typed turn gets two lines asking the model to classify the message, read the matching guidance file and check the draft against it, plus the next free code numbers and the open question codes. An untyped turn inherits the last typed message’s type, which the hook records so the model skips the script. When the model changes, and after a compaction, it attaches a short note for Fable, Opus or Sonnet that counters habits Anthropic’s prompting guide names for that family. After a compaction it also lists up to 12 of the oldest open next actions, moves, waits, blocks and questions from the ledger, each cut to 200 characters, so the resumed turn does not rely on the summary.

Tokens. Each typed turn costs those lines, one Bash call and the guidance file it prints. A held reply costs one more short turn. From the third turn until it gets a title, and every 15 turns after that, the module also asks the model in a forked call (model.fork) to name the session in three to six words, once the reply is out. The author does not say what any of this costs.

What it writes. Everything goes under ~/.claude/katharsis-data/ (KATHARSIS_DATA moves it): the ledger, one JSONL file per session; a session record with its folder, git branch, times, plugin version, transcript path and the forked title; answers to questions and telemetry counts, neither with message text; detections, which keep up to 300 characters of the command, result or reply sentence behind each flag; and the copies of overwritten files, capped at 64 MiB and never deleted. A session-start hook keeps a symlink at ~/.claude/katharsis pointing at the install directory, which moves on every update. The hooks module runs git branch --show-current once per session and makes no network calls of its own.

A hook that fails passes your prompt through untouched.

The repo signs hashes of the setup skill, the output styles and the guidance files with Sigstore on every push and records them in the Rekor public log; SECURITY.md says what that covers.

Limitations

  • The author shows the band, the drawer and the chips only in the terminal.
  • Classification is the model’s call. The prompt hook repeats the instruction every turn because it fades over long sessions, and a Stop hook logs each turn that skipped it.
  • Without python3, setup fails and the ledger is not written.
  • Uninstalling leaves the symlink and ~/.claude/katharsis-data/ behind. Pick another style in /config in each project and remove the permission entry setup added.

Similar Claude Mods

The whole directory →