dashboard: stuck-work uses the canonical agent/working Forgejo label #27

Open
opened 2026-05-28 02:46:05 +00:00 by erik · 2 comments
Owner

Spec afk-mode §11 shipped with a telemetry-based proxy for the dashboard's "stuck work" panel: any run with status ===
'running' that started more than two hours ago. That catches wedged live containers but misses the cases the
spec actually cares about — issues claimed but not yet spawned, and issues left labelled agent/working after
a supervisor crash that didn't release them.

Replace the proxy with the canonical signal: for each discovered project, call client.listIssues({ labels:
'agent/working' }) and surface issues whose updated_at is more than 1 hour ago (lower the threshold from the
original 2h while we tune).

Acceptance:

  • mgmt/lib/aggregate.ts dashboardSummary returns stuckIssues: { project, number, title, updated_at }[] driven
    by the Forgejo label, not telemetry.
  • Dashboard renders one stuck-work row per (project, issue), linking to the issue view at
    /projects//issues/.
  • Telemetry-based stuckRuns either disappears from the dashboard or stays as a separately-labelled secondary
    signal — operator's call during review.
  • Handles a missing/unreachable Forgejo gracefully (panel shows an error pill, dashboard doesn't blank out).

Depends on per-project authenticated Forgejo client setup — currently mgmt/lib/forgejo-client.ts uses one
shared FJX_TOKEN across projects, which is fine for the Tailscale-only MVP but worth re-checking once

Spec afk-mode §11 shipped with a telemetry-based proxy for the dashboard's "stuck work" panel: any run with status === 'running' that started more than two hours ago. That catches wedged live containers but misses the cases the spec actually cares about — issues claimed but not yet spawned, and issues left labelled agent/working after a supervisor crash that didn't release them. Replace the proxy with the canonical signal: for each discovered project, call client.listIssues({ labels: 'agent/working' }) and surface issues whose updated_at is more than 1 hour ago (lower the threshold from the original 2h while we tune). Acceptance: - mgmt/lib/aggregate.ts dashboardSummary returns stuckIssues: { project, number, title, updated_at }[] driven by the Forgejo label, not telemetry. - Dashboard renders one stuck-work row per (project, issue), linking to the issue view at /projects/<project>/issues/<id>. - Telemetry-based stuckRuns either disappears from the dashboard or stays as a separately-labelled secondary signal — operator's call during review. - Handles a missing/unreachable Forgejo gracefully (panel shows an error pill, dashboard doesn't blank out). Depends on per-project authenticated Forgejo client setup — currently mgmt/lib/forgejo-client.ts uses one shared FJX_TOKEN across projects, which is fine for the Tailscale-only MVP but worth re-checking once
Member

Brief — Developer

Phase: simple. Run fjx dev prompt simple for the cycle protocol.

<!-- pm:brief:dev --> # Brief — Developer **Phase:** simple. Run `fjx dev prompt simple` for the cycle protocol.
Member

Ledger for: agent-pm

Status: watching @ 2026-06-21T18:53:16.294Z
Briefs:

  • dev @ 2026-06-21T18:46:53Z

Activity

(none)


(PM manages this ledger; agent section unused)

<!-- agent-pm:ledger --> ## Ledger for: agent-pm Status: watching @ 2026-06-21T18:53:16.294Z Briefs: - [dev](#issuecomment-2696) @ 2026-06-21T18:46:53Z ### Activity _(none)_ --- _(PM manages this ledger; agent section unused)_
Sign in to join this conversation.
No description provided.