[FIX] §9's last two clauses: mute/off, and a shorter way to call him by name
! tarbuckle ! tarbuckle mute ! tarbuckle status
! tarbuckle what now ! tarbuckle off/on
§9 said mute and off were "available at all times" and there was no way to do either;
the spec listed it as owed twice before it was built. Now one switch, read by every
surface.
⚠ mute and off are NOT the same and the difference is presence versus speech. `mute`
silences the utterance and LEAVES THE BODY — he is still in the room, which is §8a's
entire argument for the status line: visible silence at near-zero cost. `off` removes
him. Collapsing the two would have deleted the distinction the body exists to make.
The mute switch is the one piece of state the fool is permitted to be steered by,
because §9 says muting is never a fault and a mute he could ignore is not a mute. It
conserves no draw and remembers nothing: a switch, not a memory.
The wrapper is on PATH so the steward runs it directly rather than through the executor.
That is the point of the surface, and the wrapper says so in its own header: a fool
relayed by the executor is the executor's paraphrase of a fool.
Body 32/32, mumble 26/26, seam 15/15, invoke 17/17, wrap 21/21.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J6hZXNYSxEfZseBGTni4sf
This commit is contained in:
co-authored by
Claude Opus 5
parent
2098743382
commit
33754673b8
Executable
+36
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
# Tarbuckle — the short way in. v2 §9: named invocation, mute, off.
|
||||
#
|
||||
# ! tarbuckle call him by name; he answers at length
|
||||
# ! tarbuckle what now ask him something
|
||||
# ! tarbuckle mute silence the utterances; he stays in the room
|
||||
# ! tarbuckle off remove him entirely
|
||||
# ! tarbuckle on bring him back
|
||||
# ! tarbuckle status what he is doing, and when he might speak next
|
||||
#
|
||||
# ⚠ Run this YOURSELF. A fool relayed by the executor is the executor's paraphrase of
|
||||
# a fool. The `!` prefix in Claude Code runs it in the session so the output is his.
|
||||
set -euo pipefail
|
||||
S="$HOME/dotfiles/scripts"
|
||||
M="$HOME/.claude/state/tarbuckle-mute"
|
||||
mkdir -p "$(dirname "$M")"
|
||||
case "${1-}" in
|
||||
mute) echo mute > "$M"; echo "muted — he stays in the room and says nothing. Never a fault." ;;
|
||||
off) echo off > "$M"; echo "off — removed from the status line too." ;;
|
||||
on|unmute) rm -f "$M"; echo "back." ;;
|
||||
status)
|
||||
st=$(cat "$M" 2>/dev/null || echo "listening")
|
||||
echo "state: $st"
|
||||
if [ -f "$HOME/.claude/state/tarbuckle-last-tick" ]; then
|
||||
python3 - "$HOME/.claude/state/tarbuckle-last-tick" <<'PY'
|
||||
import sys, time
|
||||
t = int(open(sys.argv[1]).read())
|
||||
print("next tick:", time.strftime('%H:%M', time.localtime(t + 20*60)), "(27% he speaks)")
|
||||
PY
|
||||
fi
|
||||
r="$HOME/.claude/state/tarbuckle-rejects.jsonl"
|
||||
[ -f "$r" ] && echo "silences: $(wc -l < "$r" | tr -d ' ') logged (net rejections + timeouts)" || true
|
||||
;;
|
||||
--help|-h) sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//' ;;
|
||||
*) exec python3 "$S/tarbuckle-invoke.py" "$@" ;;
|
||||
esac
|
||||
Reference in New Issue
Block a user