Repository navigation
Description
Follow-up from triage task 9456 on issue #5082, confirmed against current main 8de9292b77ff3fbfd72153bf0e6ac6758be635cc.
Evidence
On 2026-11-04 at 22:10:34Z, ordinary curl probes against the already-running laptop aggregator at 127.0.0.1:4870 returned curl: (52) Empty reply from server, 0 bytes, after ~12.0s for /board (12.002793s), /api/board.json (12.003588s), /api/overview.json (12.011524s), /frag/overview (12.007072s), and /program (12.004105s). /api/program.json returned 200 / 64,684B in 3.088804s; /api/quota.json returned 200 / 50,995B in 0.018966s. The server process was Bun PID 11116 with cwd /home/user/git/code/pm-stack/aggregator, started 09:39:30 local; this task did not launch it and its loaded SHA is unknown.
Current-main source inspection: pm-stack/aggregator/src/server.ts awaits the full context before returning on /board (1307-1316), /frag/overview (1302-1306), /api/overview.json (1745-1746), and /api/board.json (1748-1761). boardContext serially awaits board refs and items (459-464); overviewContext waits for its slowest facet (701-712). Bun.serve has no explicit idleTimeout (2211-2217), and the source reads have individual timeouts longer than the observed cutoff (for example Kaneo 8s per call, projects 20s, Supabase 60s). Current main has no bounded stale/error response for this assembly. The exact source of the 12s cutoff is not proven; an idle timeout is a plausible contributing cause, not a confirmed root cause.
Scope
Make the affected dashboard assembly routes settle with bytes: return a last-good/stale result when available, otherwise an explicit bounded timeout/error response (including a visible fragment error for /frag/overview) rather than allowing the connection to close silently. Add deterministic tests with slow/stalled stub sources that assert each affected route returns the defined stale/error behavior. Do not treat increasing Bun.serve idleTimeout alone as sufficient; the application still needs a bounded outcome. Preserve fast-path behavior.
Separate symptom
The historical /program HTML size regression (~1.16MB) is not measured by this probe because /program itself currently closes at ~12s; its JSON twin returned normally. Re-measure bytes after the response reliability fix and track HTML slimming separately if still present.
Links: #5082
Acceptance criteria
- Under slow dashboard assembly,
/board,/api/board.json,/api/overview.jsonand/frag/overviewnever return an empty reply: each either serves within a bounded time or returns an explicit error/stale response the client can act on. - The ~12s empty-reply probes recorded in the evidence (2026-11-04 22:10Z against the laptop aggregator) no longer reproduce, or the remaining slow path is named with its bound.
- Fast endpoints (
/api/quota.json,/api/program.json) do not regress. - Fix is covered by a test or a reproducible probe script showing behaviour before/after.
Activity
developing-today commentedon Nov 4, 2026
CODE-1414
dezren39 commentedon Nov 4, 2026
Intake review
pm-stack/aggregator/src/server.ts.kind/bug,priority/high,effort/m,queue/queued); this intake adds the missing acceptance criteria only. Evidence is unusually complete: timed curl probes plus the serial-await source locations.boardContext/overviewContext(parallel fetch and/or per-section deadlines), verifying with the same probe set.Intake by fleet monitor (repo-fleet-monitor), 2026-11-04 run.
137 remaining items
dezren39 commentedon Nov 6, 2026
🤖 Agent note · handed off
opencodedezren39 commentedon Nov 6, 2026
🤖 Agent note · handed off
opencode— handed off to the opencode claimant, which launches the bound opencode session; this lane does not work it directly.dezren39 commentedon Nov 6, 2026
🤖 Agent note · handed off
opencode