Repository navigation
Description
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.
Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: c4482314c115496882c58bd83dfd98e4
Branch: dev/3-timeline-busy-window
Base: d400edb
At: 2026-11-05T14:27:50Z
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.
Written-by: FlyBot Lead
What happens
A Bot that is busy across the whole window is reported as idle. plugins/timeline/src/digest.js:87 only raises the busy flag when turns > 0:
if (turns > 0 && busyShare >= BUSY_MIN) flags.push(`busy ${percent(busyShare)} of the window`)and :140-143 prints either - busy N% of the window or - no turns in the window off the same condition. But turns counts only the turns that began inside the window (:78 says so in the comment), while busyShare is busyMs / windowMs. So a Bot whose turn opened before the window started and ran through it has turns === 0 and busyShare === 1, and the team run report prints - no turns in the window with no busy marker — the exact case docs/subsystems/timeline.md invariant 5 covers, and the opposite of what timeline/health answers for the same window.
Reproduction
Clean base d400edb74798b71e233eccd46f221eaef782ff5d, only the new case added to plugins/timeline/test/digest.test.js:
not ok 18 - a Bot busy the whole window reads as busy, not as a turn-less Bot
+ actual []
- expected [ 'busy 100% of the window' ]
# tests 18 / # pass 17 / # fail 1 (exit 1)
Run: cd plugins/timeline && TZ=UTC node --import ./test/resolve.mjs --test test/digest.test.js.
Expected
A Bot whose busy share clears the threshold reads as busy whether or not a turn began inside the window: the flag and the line both come from busyShare, not from turns. A Bot that was genuinely idle still reads - no turns in the window, and timeline/health and the digest agree on the same window (the threshold constant stays where it is).
Scope
plugins/timeline/src/digest.js— decide busy from the busy share alone (≈+8/−1), keep thecounted === 0wording for genuinely idle Bots.plugins/timeline/test/digest.test.js— one case with two controls:healthalready calls the same window busy, and a truly idle Bot still reads- no turns in the window(≈+22/−0).docs/subsystems/timeline.md— one sentence aligning the invariant with the reading (≈+1/−1).changelog.d/<this issue>-timeline-busy-window.fixed.md.- Generated once: none of
core/client.js/patches/ds-bot/0008*/ mirrors are touched by this change.
Tier: T2 (plugins/**).
Duplicate check
Searched before filing: "no turns in the window" → 0 hits; timeline busy in:title → 0; digest in:title → 22, the oldest pair #582/#583 are the feature itself (closed), none of the rest is about the busy/turns disagreement. Open PRs at filing time touching plugins/timeline/**: #2540 (src/otel.js + its test) only — no overlap with digest.js.
Done when
The new case is red on the base and green with the fix, plugins/timeline is 142/142, timeline/health and the digest agree on the same window in the new test, and TZ=UTC ARCH_DOCS_BASE=d400edb7 npm run verify is exit 0.
Activity
HugoXK commentedon Nov 5, 2026
Claim-Id: c4482314c115496882c58bd83dfd98e4
Branch: dev/3-timeline-busy-window
Base: main (
d400edb74798b71e233eccd46f221eaef782ff5d)Flight plan: one PR (
Fixes #2543) fromdev/3-timeline-busy-window, ready,maintainer_can_modify: true, red-first evidence in the body. Bug, T2 (plugins/timeline/**+docs/subsystems/**+changelog.d/**).HugoXK commentedon Nov 5, 2026
Release
Written-by: FlyBot Lead
Released: c4482314c115496882c58bd83dfd98e4
Reason: merged via PR #2545 (squash bbf8f2e, merged_at 2026-11-05T15:24:01Z)
At: 2026-11-05T15:25:00Z
timeline: a Bot busy across the whole window reads as a turn-less Bot (…