From 588fbf6b3adca048afbf57ef616cc3558310fff2 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Wed, 5 Aug 2026 18:22:37 -0500 Subject: feat(rules): quiet output, and a dispatch gate for where output lands Tool output isn't free. It lands in the Emacs buffer I'm working in, so eleven hourly sentry cycles on 2026-08-05 filled my workspace with lines confirming nothing had changed. Two rules, each in the file that already owns the concern. interaction.md gets quiet output: a check returning the expected result prints nothing, and only deviations plus one summary line reach the terminal. It already governs styling, and volume is the larger cost. subagents.md gets a third dispatch justification beside cost and isolation. A repeated scheduled pass is dispatched for where its output lands, not for how hard the work is. The size gates don't apply, since a recurring check battery is always a known target in under ten calls. Verification gates are exempt, and that exemption is load-bearing. An exit code can lie, so a check that is evidence for a completion claim still gets read in full. sentry.org's pass runner now runs the walk in a background subagent, and says where the thread boundary falls. --- claude-rules/interaction.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'claude-rules/interaction.md') diff --git a/claude-rules/interaction.md b/claude-rules/interaction.md index b5798bd..746f5c9 100644 --- a/claude-rules/interaction.md +++ b/claude-rules/interaction.md @@ -97,6 +97,32 @@ In conversational output to the user, do not use Markdown bold (`**...**`) or in This governs **chat output**, not the Markdown source of rule files, specs, or docs the user reads in an editor — those keep normal Markdown formatting. The constraint is the terminal rendering of the live conversation. +## Quiet Output: A Check That Passes Says Nothing + +A check that returns the expected result prints nothing. Only deviations print, plus at most one summary line. + +**Why:** tool output isn't free. Craig runs Claude Code inside Emacs EAT, so every Bash stdout lands in the buffer he's working in, where the command's output and his work compete for one screen. The reverse-video rule above governs the styling of what reaches his terminal. This governs the volume, which is the larger cost. + +**The failure it closes** is reading "keep output minimal" as a rule about prose, and treating tool output as exempt because it isn't prose. Work ran eleven hourly sentry cycles on 2026-08-05, each about ten Bash calls printing in full. Nearly every line confirmed nothing had changed: roam current, staleness unchanged, lint at its known counts, tree clean. Craig's instruction that day was "I want you to switch to the quiet form ALWAYS." + +**How to apply:** + +- Let the exit code carry the pass, but capture the output rather than discarding it, so the failure branch can show what went wrong: + + out=$(cmd 2>&1) || { echo "DEVIATION: "; echo "$out"; } + + Don't write `cmd >/dev/null 2>&1 || echo "DEVIATION: ..."`. That throws the diagnostic away down the one branch that needs it, leaving only the placeholder you typed. +- Grep for problems rather than for confirmation. Piping a report through `grep DEVIATION` beats printing the report. +- Compare against the known-good value and print only a mismatch (a count, a SHA, a status string). +- One closing summary line is fine ("checks done", "3 of 11 passes had findings"). A per-item roll call confirming each success is not. +- When you genuinely need a command's output, filter it to the anomalies first. + +Quiet isn't silent. A deviation, a finding, and anything Craig asked to see all print in full. Suppressing those is the opposite failure and a worse one. The rule removes confirmations, never signal. + +**Verification gates are exempt, and the exemption is load-bearing.** [`verification.md`](verification.md) requires reading a check's whole output before claiming it passed, because an exit code can lie. A suite that silently skipped every test exits 0. A linter can exit 0 holding warnings. A gate running against a hand-maintained file list exits 0 without ever seeing your new file. So when the command is the evidence for a completion claim (the pre-commit test run, the linter, the type checker, a bug's reproduction steps), read the real output and say what it said. Quiet form governs routine checks that only confirm the expected state. It never buys a cheaper way to claim something passed. Where the two rules meet, `verification.md` wins. + +This is about the main thread's output, because that's what reaches his terminal. A background subagent writes to a file instead, which is why a repeated multi-step pass gets dispatched rather than run inline. See the Output-Destination Override in [`subagents.md`](subagents.md). + ## Showing Craig Visuals Craig runs Claude Code inside Emacs EAT (through tmux). EAT renders SendUserFile and inline terminal images as an `[image] path.png` text line — the visual itself never appears. In one session ~20 renders went out that way and Craig approved UI he had never seen (takuzu, 2026-07-11). Never rely on SendUserFile or inline image display to show a visual. SendUserFile stays fine for *delivering* a file; it just doesn't display one. -- cgit v1.2.3