Window: last 24h (extended 72h for recurrence). Runs: 50. Total actions: 414. Avg actions/run: 7.26.
50 run_start
50 done_audit_summary
50 run_complete
49 disk_worktree_snapshot
49 memory_snapshot
42 blocked_lane_classification_summary
11 operator_dev_loop_throttled
10 repo_dirty_observed
10 operator_dev_loop_finished
10 operator_ticket_exists
9 reopen_weak_done_ticket
9 active_lane_snapshot
9 recent_task_failure
9 needs_input_runtime_failure_reset
6 promote_dead_zone_ticket
5 todo_backlog_observed
5 blocked_lane_completed_marked_done
5 repo_dirty_all_known_generated
4 create_operator_ticket
4 terminal_ticket_runtime_closed
4 needs_input_reclassified_in_review
3 worktree_reaper_ran
2 stale_runtime_observed
2 stale_runtime_marked
2 stale_runtime_summary
2 active_lane_backlog_observed
2 breakglass_noop_healthy
1 skipped_overlap
todo_backlog_observed in critical check disables dev-loop throttleProblem: audit_ticket_flow records todo_backlog_observed on every run that has any runnable todo tickets (even 1). The critical check in maybe_launch_operator_dev_loop treats any todo_backlog_observed action as critical, bypassing the 4-hour throttle entirely. This explains the ~0.52 throttle ratio — the throttle is only effective during the rare windows when the board has zero runnable todos.
Location: maybe_launch_operator_dev_loop, the critical = (...) assignment.
Change: Gate the todo-backlog critical clause on actual severity. Replace:
any(a.get("action") == "todo_backlog_observed" for a in self.actions)
with:
any(
a.get("action") == "todo_backlog_observed"
and (
int(a.get("backlog_count") or 0) >= TODO_BACKLOG_COUNT_TRIGGER * 2
or int(a.get("oldest_age_minutes") or 0) >= TODO_BACKLOG_MINUTES_TRIGGER * 4
)
for a in self.actions
)
Expected effect: Dev-loop throttle becomes effective during normal board operations. Throttle ratio should drop from ~0.5 toward ~0.1–0.2. Dev-loop launches drop from ~10/day to ~4–6/day, saving model cost.
operator_ticket_exists from dev-loop trigger actionsProblem: operator_ticket_exists fires when the operator finds an already-open ticket for a known issue (e.g. persistent dirty-repo). This isn't a new signal — it confirms a tracked problem. Including it in trigger_actions causes dev-loop launch attempts on nearly every run for chronic issues.
Location: maybe_launch_operator_dev_loop, trigger_actions set literal.
Change: Remove "operator_ticket_exists" from the set. "create_operator_ticket" already covers genuinely new problems.
Expected effect: Fewer dev-loop trigger attempts, especially when [operator:dirty-repo:workspace] ticket persists across runs. Combined with fix #1, this substantially reduces the 11 throttled + marginal launches per 24h.
luci-home/memory-backup/ to _GIT_KNOWN_GENERATED_PREFIXESProblem: [operator:dirty-repo:workspace] is the noisiest operator-ticket marker at 28 recurrences in 72h. The workspace git status shows persistent modifications/untracked files under luci-home/memory-backup/ (visible in the repo's current dirty state). These are agent state files written by scheduled tasks, not anomalies requiring operator intervention. They aren't covered by the current 4-prefix allowlist, so the operator creates/maintains the dirty-repo ticket every cycle.
Location: _GIT_KNOWN_GENERATED_PREFIXES tuple (top-of-file constant).
Change: Add "luci-home/memory-backup/" to the tuple.
Expected effect: repo_dirty_all_known_generated count should rise from 5 toward 8–10 per 24h. [operator:dirty-repo:workspace] recurrences should drop sharply (perhaps to near-zero if these files are the primary remaining non-filtered source). Also eliminates the open/close cycling of the dirty-repo workspace ticket.
done with no failure. Could be false positives or valid catches — the data is ambiguous. Reopen cap of 1 prevents cycling. The evidence-pattern set already includes very broad tokens (updated, created, sent). No change recommended without inspecting individual ticket bodies.