Commit Graph

5 Commits

Author SHA1 Message Date
Markus Fritsche c3cccf9671 bullseye slice 2: doctor status panel renderer (spec + impl)
render_status(doctor_json) -> self-contained HTML fragment: host vitals
table (None-safe load/temp/mem, hot marker >=80C, unreachable marker),
agents, grinds, color-coded verdict. 14-test spec by @testdesigner,
impl by @py, reviewed APPLY-as-is by @reviewer (room msgs 216/220/224).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:01:18 +02:00
Markus Fritsche 42a89e6088 bullseye slice 1: HTML transcript renderer (spec + impl)
Spec by @testdesigner, implementation ground to green by @py
(deepseek-v4-flash-dspark, 11/11), reviewed by @reviewer: sound,
4 non-blocking findings (follow-up: escape/coerce id and in_reply_to).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 11:00:01 +02:00
Markus Fritsche 7aae3dd996 add slugify spec (18 tests) — shakedown v2 contract
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 09:48:04 +02:00
Markus Fritsche e74b2f3832 @reviewer findings #2–#6: harden lurker + worker reliability
#4 a missing/corrupt .since OR a failed room_read now resumes from the newest id /
   backs off — never resets to 0 (which re-ran the ENTIRE history through the model).
   room_read/_read_since return None on failure to distinguish it from an empty room.
#2 posts are rc-checked; the offset advances past a message only after its reply
   actually lands (3 retries) — a transient lmcp/sic failure retries, never silently drops.
#3 dispatch/run exceptions no longer skip the message (offset is reply-gated, not
   advanced-then-maybe-fail).
#5 offset is persisted per fully-handled message — a restart mid-batch resumes exactly,
   no duplicate ack / re-run.
#6 lurker reply capped at 6000 chars (long Fable reviews no longer blow room limits).
tests/test_worker_reliability.py locks the #4/#2 core (read-fail != empty; rc checks). 6/6.
Also: bp timeouts for testdesigner/py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWpfhDgYNA21tETDP9ueBE
2026-07-21 08:09:15 +02:00
Markus Fritsche 8708d93039 add test-driven pipeline (@testdesigner + @py) + fix reviewer #7
@testdesigner (Fable) designs an executable spec; @py (Haiku) grinds until green.
Both are bullpen-lurker@ instances (.model fable / haiku) + dispatcher roster +
bp timeouts + extended invoker allowlist.

First ticket = reviewer finding #7 (_show shell-injection). Fable wrote a sharp
black-box spec (tests/test_show_shell_safe.py) that PROVES the injection by pasting
and executing the suggested command — 6 tests, and it independently caught the
@architect debate-path variant too. Fix: _show now escapes the double-quote-context
metacharacters (backslash, backtick, dollar, quote) so no command substitution or
quote-breakout survives a copy-paste. 6/6 green.

HONEST RESULT: the spec half worked; the GRINDER half did not — @py hit the 20-turn
cap fighting remote-edit-over-sic (no Edit tool, re-running pytest across sic each
cycle). So I closed the bug directly against Fable spec. Lesson: grinders need a
LOCAL workspace (Edit + local pytest) and a higher turn budget, not remote-edit; and
@testdesigner s reply was silently lost (reviewer #2 live). Grinder-harness rework
+ #2 are the follow-ups before @py is real.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWpfhDgYNA21tETDP9ueBE
2026-07-21 07:35:33 +02:00