Polish: failed/timeout stats split, radio error line, /tasks server pagination (MC-4912)
Deferred items 3+4 from the 2026-06-11 review session (Elmar-approved). Route via board-manager -> internal Kanban; orchestrator gates only. IMPLEMENTATION IS AUTHORIZED FROM TH...
StateDoneNext ActionClosedOwnerLuciRuntimeClosedAge2d ago
Ticket is done; runtime is closed.·profile claude_opus_1m_medium
Description
MC-4974
Deferred items 3+4 from the 2026-06-11 review session (Elmar-approved). Route via board-manager -> internal Kanban; orchestrator gates only. IMPLEMENTATION IS AUTHORIZED FROM THE FIRST RUN — do not stop at reconnaissance; a handoff without commits+tests will be rejected (lesson from MC-4913/MC-4965 first-run false-stops).
THREE SLICES, one branch, one handoff:
1. task_detail.html FAILED stat conflates timeout+failed (Tessa #9): show them separately in the 7d stats strip ('Failed N · Timeout N'), matching the one-vocabulary rule from MC-4942 U10. models.get_task_run_stats may need a timeout count — additive only.
2. radio-daily-brief fails without emitting an error line (Tessa #7, task-side): in the radio-show build script (~/workspace — find via tasks/radio-daily-brief.md command), ensure every failure path prints a final 'Error: <cause>' line to stdout before non-zero exit, so /runs failure_preview extracts the real cause. Touch ONLY error/exit paths — no logic changes.
3. /tasks server-side pagination (item 31 follow-up): tasks_page renders all 116+ rows (~480KB). Server-side window: ?limit= (default 100, clamp 500) + offset, totals from full counts (pattern: /runs pagination from MC-4942 U4); keep client windowing/search working over the served rows; 'Show all' link sets limit=500. PRESERVE: problems-first default, healthy-collapse toggle (MC-4965), cross-tab search, sticky header.
GATES: pytest tests/test_mc4942_u10_tasks_ux.py tests/test_mc4942_u4_runs.py tests/test_mc4942_u6_task_detail.py + new assertions per slice; py_compile; the documented mc4056 flex-wrap failure is pre-existing — don't chase. NO service restarts, NO merging — review-required handoff with branch+SHA+test evidence.
Slices 1+3 = mission-control repo; slice 2 = workspace repo (separate branch kb/<id>-radio-error-line, note it in the handoff).
Expected check-in: within 2h of dispatch.
Activity
done
INTERACTIVE
Luci is working...
Details —
Done
· Medium
· Luci
▼
SState
Done
Closed
PPeople
TTiming / Details▼
api (human)
Mission Control
2d ago
2d ago
Advanced / Operator evidence
RRouting owner
ROperator console
Ticket is done; runtime is closed.MC is visibility-only. Hermes Luci launches and gates work outside MC, then mirrors evidence/status here.
WWorkflow
Start Dev Review + QA ▾
Select phases to include:
Agents
Review Gates
Decision
WAT routing: choose an agent, review gate, or decision. Buttons use the live runtime when one is attached.
[visibility-only] Queued message recorded for Hermes Luci. MC did not claim the ticket or spawn a runtime.
api2d ago
ORCHESTRATION TEST FINDINGS (2nd run, recorded before work completes):
1. codexbuilder recon-stop pattern is STICKY — recurred on first run despite explicit 'IMPLEMENTATION AUTHORIZED FROM THE FIRST RUN' wording in this ticket (3rd occurrence: MC-4913, MC-4965, MC-4974). Ticket wording does NOT cure it; fix belongs in the controller's card-creation prompt / kanban-orchestrator skill / builder profile.
2. CONTROLLER GATE INCONSISTENT (the bigger one): for MC-4965 the board-manager rejected the recon-only terminal card in 14 min; for THIS ticket it accepted it silently — no correction after 2+ ticks, card 'done' with zero commits, ticket would have parked 'waiting' forever. LLM-judgment close gates do not repeat — the kanban layer needs the same deterministic treatment MC-4913 gave the MC layer: a terminal card REQUIRES new commits on its branch (or an explicit no-code rationale field). Follow-up ticket to be filed.
Orchestrator intervention: rejected the false-stop via card comment + status ready with explicit card-level implementation authorization (bounded correction, changed variable; if a 3rd recon-stop follows, circuit-breaker applies — direct agent, no further re-queue).
api2d ago
CLOSED done + verified. All three slices landed + deployed + canary 13/13:
(1) task-detail stats: Failed and Timeout counted separately (5c9983e). (2) radio-daily-brief: new workspace wrapper scripts/radio_daily_brief.py mirrors the skill scripts untouched (shared-skill rule respected — better than the brief asked) and emits a final 'Error: <cause>' line for /runs previews; 4 tests (9d83a833). (3) /tasks server-side pagination: ?limit (default 100, clamp 500) + honest totals; problems-first + healthy-collapse + search preserved (49 tests).
TEST VERDICT (2nd pipeline run): worker recon-stop recurred (3rd time) AND the controller gate MISSED it this time (caught it yesterday) — LLM close judgment is inconsistent. Orchestrator intervened once (card-level authorization), after which the implementation run delivered everything. Systemic fix filed separately: deterministic kanban close gate.
done_sha stamped, deploy-verified.
luci-board-manager2d ago
[visibility-only controller] Routed MC-4974 to internal Kanban card `t_1e21cddc` (assignee `codexbuilder`) on board `mc-internal`; MC remains ledger-only and no MC pickup/runtime/send/harvest endpoint was used. Prepared isolated parent workspace `/home/lucienne/workspace/_mc_internal_worktrees/MC-4974-polish` with Mission Control worktree `/home/lucienne/workspace/_mc_internal_worktrees/MC-4974-polish/mission-control` on branch `kb/MC-4974-mc-polish` and root workspace worktree `/home/lucienne/workspace/_mc_internal_worktrees/MC-4974-polish/workspace` on branch `kb/MC-4974-radio-error-line`. Verified Kanban task row is running with worker PID 2020413, run 275, and `/proc/2020413/cwd` equals the isolated parent workspace. Expected handoff: review-required branches/SHAs/tests for the failed-vs-timeout split, radio error line, and `/tasks` pagination; no service restart or merge.
luci-board-manager2d ago
[visibility-only controller] Acknowledged stale queued-message residue #1917. MC-4974 is already deliberately parked as `waiting` / `kanban_active:t_1e21cddc` with internal Kanban worker evidence mirrored in comment 24479, so no MC pickup/runtime/send/harvest action is needed.
luci-board-manager2d ago
[visibility-only controller gate] Closed MC-4974 after verifying the internal Kanban handoff `t_1e21cddc`. Evidence: Mission Control branch `kb/MC-4974-mc-polish` commit `5c9983ee5dda8f2c018d3a21d3a66bc5a2266486` touches app.py/models.py/task/task-detail templates and focused tests; root workspace branch `kb/MC-4974-radio-error-line` commit `9d83a8335635f9c94cab8d940275b400100debc0` touches the radio daily brief runner/task/test. Verification from isolated worktrees: clean git status in both worktrees; `uv run --with-requirements requirements.txt python -m pytest -q tests/test_mc4942_u10_tasks_ux.py tests/test_mc4942_u4_runs.py tests/test_mc4942_u6_task_detail.py` => 47 passed; `python3 -m py_compile app.py models.py` => pass; `python3 -m py_compile scripts/radio_daily_brief.py` => pass; `python3 -m pytest -q tests/test_radio_daily_brief_runner.py` => 4 passed. No MC pickup/runtime/send/harvest endpoint was used, and no service restart/merge was performed.