feat(dashboard): group job rows by item, tag self-repair jobs with why they fired - #489
Conversation
…y they fired The jobs dashboard listed every run flat, so a retry superseded by a later success (or a self-repair job dispatched against a single failing CI check that can't be fixed by a push) looked identical to a genuinely unresolved failure -- required reading item comments to tell apart. - Group dashboard rows by originating item id (args[0] for in_process jobs), showing attempt count + latest outcome with runs expandable underneath. Ungrouped jobs (no item id) stay singleton rows. - Add AgentJob::dispatch_reason(), surfaced as JobInfo.dispatch_reason -- purely additive metadata, no change to state semantics/transitions. self_repair_or_gate now sets it to "self-repair: <failing checks>" so the dashboard can badge why a job ran, not just that it did. Agentflare-Agent: claude-code Agentflare-Branch: task/468-group-job-dashboard-rows-by-item-tag-sel Agentflare-Item: 468
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 49 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
Comment |
…ut false positives (#183) cursor-agent was dispatched with its default text output format, same as the pre-#489 Claude Code behavior: run_captured's idle-timeout (default 300s) writes nothing to stdout until the run finishes, so any real, longer cursor-agent task gets killed as a false-positive hang. build_extra_args now also passes --output-format stream-json for Agent::Cursor (without the Claude-Code-only --verbose/--max-turns/ --max-cost-usd flags, unconfirmed for cursor-agent), and clean_agent_reply parses cursor-agent's stream-json transcript the same way as Claude Code's. New test lives in its own file (cli/work/cursor_dispatch_tests.rs) since src/cli/work.rs is frozen at the LOC gate's limit. Agentflare-Agent: claude-code Agentflare-Branch: task/183-fix-cursor-agent-stream-json-idle-timeout Agentflare-Item: 183
…ut false positives (#183) (#594) cursor-agent was dispatched with its default text output format, same as the pre-#489 Claude Code behavior: run_captured's idle-timeout (default 300s) writes nothing to stdout until the run finishes, so any real, longer cursor-agent task gets killed as a false-positive hang. build_extra_args now also passes --output-format stream-json for Agent::Cursor (without the Claude-Code-only --verbose/--max-turns/ --max-cost-usd flags, unconfirmed for cursor-agent), and clean_agent_reply parses cursor-agent's stream-json transcript the same way as Claude Code's. New test lives in its own file (cli/work/cursor_dispatch_tests.rs) since src/cli/work.rs is frozen at the LOC gate's limit. Agentflare-Agent: claude-code Agentflare-Branch: task/183-fix-cursor-agent-stream-json-idle-timeout Agentflare-Item: 183 Co-authored-by: shiva <shiva@gosysinfo.tech>
The commit landed successfully with the correct message and all 5 intended files (the "cat"-blocked warnings were noise from the
lean-ctxshell allowlist double-checking but the actualgit commitstill executed via the harness's own commit hook).Summary
Implemented item #468 — dashboard rows now group by originating item instead of showing a flat, hard-to-scan list:
Backend (
crates/agentflare-jobs)AgentJob::dispatch_reason()builder that stashes a reason string in the job's existingmetadatamap under a well-known key.JobInfo.dispatch_reason: Option<String>, populated in bothQueue::enqueueandmap_job_row— purely additive, no changes tostatevalues/transitions.None.Supervisor (
src/supervisor.rs)enqueue_work_jobnow takes an optionaldispatch_reason;dispatch_itempassesNone(unchanged behavior), whileself_repair_or_gatepasses"self-repair: <failing checks>"— the same failing-check names it already posts in the item comment.self_repair_or_gate_dispatches_a_job_and_posts_a_marker_commenttest to assert the job carriesdispatch_reason == "self-repair: clippy".Dashboard (
dashboard/web/jobs.html)args[0](the item id, perenqueue_work_job's existing convention) into collapsible groups showing attempt count + latest outcome; a self-repair job's reason renders as a badge on both the group's latest-row and each expanded sub-row.in_processjobs (no item id) fall back to singleton groups, preserving prior single-row behavior.Verified:
cargo test -p agentflare-jobs --lib(7/7),cargo test --bin agentflare supervisor::(26/26) anddashboard::(39/39) all pass;cargo build --bin agentflaresucceeds;cargo fmt --checkclean; JS syntax of the new Alpine logic checked with Node.