[FIX] The rate the steward asked for was uncomputable: only failures were recorded

"Two weeks of true-versus-drawn rate" needs a denominator, and there was none. Rejections
were logged; draws were not, successes were not. The 73% that comes up silent — the
whole denominator — left no trace at all. The instrument named as the diagnostic could
report only its own failures, which is the shape of a log that always looks alarming and
can never be checked.

⚠ §8 AND §9 LOOK LIKE THEY COLLIDE HERE AND DO NOT, on the reading taken: §9's "filed
nowhere — no PENDING entry, no log, no item" governs the fool's OUTPUT entering the
record; §8 orders "report the observed mumble rate after two weeks". So this records
THAT something happened and never WHAT was said. log_event() takes a surface and an
outcome and structurally cannot be handed a line — asserted on co_varnames, because a
comment promising it would be a comment promising behaviour.

⚠ THE REJECTIONS LOG IS A DIFFERENT CASE AND IS NOT SETTLED. It holds up to 200
characters of his words, added at the steward's instruction so the log could answer
whether register and net are mismatched. That is nearer to filing than counting, and §9
says no log. Flagged in the code and put to the steward rather than resolved by the
party that wrote it.

Nothing reads any of it back. Measurement, not memory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J6hZXNYSxEfZseBGTni4sf
This commit is contained in:
David F Glidden
2026-08-25 17:11:22 +02:00
co-authored by Claude Opus 5
parent 1976527c02
commit 9f06efcc9a
5 changed files with 58 additions and 3 deletions
+33
View File
@@ -48,6 +48,31 @@ BANNED = (
MUTE = os.path.expanduser("~/.claude/state/tarbuckle-mute")
DRAWS = os.path.expanduser("~/.claude/state/tarbuckle-draws.jsonl")
def log_event(surface: str, outcome: str) -> None:
"""Count occurrences. NEVER content. §8 obliges a rate; §9 forbids a log.
⚠ The two clauses look like they collide and do not, on this reading: §9's "filed
nowhere — no PENDING entry, no log, no item" is about the fool's OUTPUT entering the
record, and §8 explicitly orders "report the observed mumble rate after two weeks."
A rate needs a denominator. So this records THAT something happened and never WHAT
was said — occurrence, not utterance.
⚠ The rejections log is a different case and is NOT settled: it holds up to 200
characters of his words, at the steward's instruction, and that is nearer to filing.
Flagged rather than resolved; see the note put to the steward 2026-08-25.
Nothing reads this back. It is measurement, not memory.
"""
try:
os.makedirs(os.path.dirname(DRAWS), exist_ok=True)
with open(DRAWS, "a") as fh:
fh.write(json.dumps({"t": time.strftime("%Y-%m-%dT%H:%M:%S%z"),
"surface": surface, "outcome": outcome}) + "\n")
except Exception:
pass
def muted() -> str:
@@ -199,6 +224,7 @@ def main() -> int:
"kind": kind, "why": why, "line": line[:200]}) + "\n")
except Exception:
pass
log_event(kind, "rejected")
return 1 # silence. The draw was already consumed.
try:
os.makedirs(os.path.dirname(SLOT), exist_ok=True)
@@ -206,6 +232,7 @@ def main() -> int:
json.dump({"utterance": line, "kind": kind, "written": int(time.time())}, fh)
except Exception:
return 1
log_event(kind, "spoke")
return 0
@@ -278,6 +305,12 @@ def selftest() -> int:
ck("A5n a junk value is not a mute", muted() == "")
finally:
MUTE = _m
# A6 — the occurrence log is content-free, and that is the whole point.
ck("A6 log_event takes no content",
log_event.__code__.co_argcount == 2
and set(log_event.__code__.co_varnames[:2]) == {"surface", "outcome"})
ck("A6n it cannot be handed a line",
"line" not in log_event.__code__.co_varnames)
ck("A4n the predicate can fail",
any(("PENDING" in q) for q in paths + ("/x/PENDING.md",)))