Follow-up to #17, which shipped the warning (#88). This is the "better" option that issue named.
#88 makes a broken concept audible — a line on stderr naming the concept, the failure kind and the elapsed time. It does not make it visible: the dashboard merged panel still renders empty, because the caller still receives null and cannot tell "no results" from "broke".
executeForgeCommandDetailed already returns the discriminated result (ok, timedOut, exitCode, stdout, stderr, unavailable, durationMs). What is left is per-caller work, and each one is a UI decision rather than a mechanical swap:
Worth doing highest-blast-radius first. cleanup.ts is the one where a swallowed failure changes a destructive decision.
The dashboard side needs a "could not load" state per panel — an empty panel that means "broken" is worse than an error, because it is believable.
Follow-up to #17, which shipped the warning (#88). This is the "better" option that issue named.
#88 makes a broken concept audible — a line on stderr naming the concept, the failure kind and the elapsed time. It does not make it visible: the dashboard merged panel still renders empty, because the caller still receives
nulland cannot tell "no results" from "broke".executeForgeCommandDetailedalready returns the discriminated result (ok,timedOut,exitCode,stdout,stderr,unavailable,durationMs). What is left is per-caller work, and each one is a UI decision rather than a mechanical swap:lib/github.ts— 11 call sites, including bothrecently-mergedpaths that surfaced executeForgeCommand swallows a timeout as null with nothing on stderr, so a broken forge concept renders as empty data #17agent-farm/commands/cleanup.ts— 2pr-searchcalls, where a swallowed failure means a worktree is judged unmergedagent-farm/commands/spawn-worktree.ts—pr-search,issue-commentcommands/porch/checks.ts—pr-exists(Forgejo/Gitea forge parity: implement pr-search and pr-diff, fix the pr-exists hang #12 already fixed one null-reads-as-no-PR bug here)lib/team-github.ts,commands/sync.ts,agent-farm/commands/spawn.tsWorth doing highest-blast-radius first.
cleanup.tsis the one where a swallowed failure changes a destructive decision.The dashboard side needs a "could not load" state per panel — an empty panel that means "broken" is worse than an error, because it is believable.