Skip to content

timeline: a Bot busy across the whole window reads as a turn-less Bot #2543

Closed

Description

@HugoXK

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 the counted === 0 wording for genuinely idle Bots.
  • plugins/timeline/test/digest.test.js — one case with two controls: health already 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

  1. HugoXK commented on Nov 5, 2026

    @HugoXK
    ContributorAuthor

    Claim-Id: c4482314c115496882c58bd83dfd98e4
    Branch: dev/3-timeline-busy-window
    Base: main (d400edb74798b71e233eccd46f221eaef782ff5d)

    Flight plan: one PR (Fixes #2543) from dev/3-timeline-busy-window, ready, maintainer_can_modify: true, red-first evidence in the body. Bug, T2 (plugins/timeline/** + docs/subsystems/** + changelog.d/**).

  2. HugoXK commented on Nov 5, 2026

    @HugoXK
    ContributorAuthor

    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

  3. added a commit that references this issue on Nov 5, 2026
    bbf8f2e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions