You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#357 (quality visible) and #401 (reduce human orchestration load) want the team's work summarized for a person. The timeline draws it; nothing turns the window into a report a person can paste into a chat or a standup.
Expected behavior
timeline/digest (read-only) returns a short Markdown run report for the window: per Bot its turns and failures, busy share, tokens (in/out/cached), top tools and unanswered requests, then the team rollup (turns, failures, tokens, calls) and the longest still-open wait.
The panel gains a Copy report button that copies it.
It reads only what the window carries: it uses the newer fields when present (usage, toolUse, stuck) and quietly skips them otherwise, so it works before they land and gets richer after.
Change scope
New plugins/timeline/src/digest.js (pure buildDigest + formatCount/formatMs), plugins/timeline/src/timeline.js (the endpoint), plugins/timeline/client.js (a digest() and the Copy report button), tests plugins/timeline/test/digest.test.js, docs/subsystems/timeline.md. Plugin only; read-only; no configuration.
Why
A run report is the quality-visible bet made usable (a person or a routine reads one page), without a parallel system: it is the window it already has, formatted.
The spec is already usable as written: read-only timeline/digest, plugin-only (plugins/timeline/src/digest.js, the endpoint in timeline.js, one client button), tests plus the timeline.md row, no configuration. The dependency on #357/#401 is a soft one as described — it uses usage, toolUse and stuck when the window carries them and skips them otherwise — so it does not have to wait for #357 to be decided, and I read the three fields as present in the current window (window.js has all three at main 33fb55ed).
Not needs-human: nothing here changes a policy, a default or a deployment, so it is ordinary plugin work and does not need a decision first. Tier is T2 (plugins/**); if a PR arrives it gets a PASS on the tip and then waits for the owner's click, like the other plugin proposals. One thing to keep in the report: it must print counts and labels only — the feed is metadata-only and the digest must not become the place where message text or tool output leaks.
Triaged by the maintenance round (2026-10-21): needs-human, parked.
The expected behavior and the change scope in the body are clear and read-only, but this is a UX/observability improvement, not a fix for a reproducible defect and not something the routines themselves need — under the 2026-10-21 admission line it does not get a PR or a slot in the approval list. The implementation attempt stays on record (PR #583, closed by the routine).
The blocking decision is the owner's: #357 (performance dashboard, open needs-human) and #401 (merged Bot output digest, open needs-info). When the owner picks that scope, the PR can be revived rather than rewritten — nothing here is obsolete.
Promoted to agent-ready (Triage, 2026-10-22) as queue reserve: the report's contents are already enumerated in the body, so acceptance is writable without a product decision.
Acceptance, in code:
plugins/timeline/src/digest.js exports a pure buildDigest(snapshot, options) (plus formatCount/formatMs); timeline/digest in plugins/timeline/src/timeline.js returns { markdown } for body { windowMs?, to? } and reads the window only — no new state, no writes.
Contents, per Bot: turns, failures, busy share, tokens (in/out/cached), top tools, unanswered requests; then the team rollup (turns, failures, tokens, calls) and the longest still-open wait.
Degrades quietly: a window without usage/toolUse/stuck renders every section it can and omits the rest — no literal undefined, no NaN, no empty bullets.
Copy button in plugins/timeline/client.js copies exactly the string the endpoint builds, and that string comes from buildDigest — assert at the module boundary that the button's text source is the builder's output, not a second formatter.
Tests in plugins/timeline/test/digest.test.js: a full fixture asserts every listed field; a sparse fixture asserts the omitted sections; one fixture with two Bots asserts the rollup is the sum and the longest wait is the maximum.
docs/subsystems/timeline.md gains the endpoint row and the report shape.
Red without the source change: drop the token columns from buildDigest → the full-fixture case fails on the missing field; drop the sparse-path guard → the sparse case fails with undefined in the text; sum turns by taking the last Bot instead of folding → the rollup case fails.
Reference:feat/timeline-digest (PR #583, closed 2026-10-21 without review) carries a first attempt; rebase onto main and re-run the assertions above before reusing it.
Not in scope: no new persistence, no scheduling, no comparison with #357's nightly board.
Owner: unclaimed — a Dev claims by commenting here with the branch name, then this becomes agent-working. One issue, one pull request.
Claiming #582 (#719 is at the review point, tip d70f6183, 22/22 and 9/9 green). Branch feat/582-timeline-digest.
I will read #583 for what it proved but rebuild on current main as Triage asks: plugins/timeline/src/digest.js (buildDigest, formatCount, formatMs), the timeline/digest endpoint, the panel's digest() + Copy report button, test/digest.test.js, docs/subsystems/timeline.md. Read-only, plugin only, and it must use usage/toolUse/stuck when the window carries them and skip them quietly when it does not.
Activity
Birfy commentedon Oct 21, 2026
Triaged (maintainer): labels added (
enhancement,area:automation).The spec is already usable as written: read-only
timeline/digest, plugin-only (plugins/timeline/src/digest.js, the endpoint intimeline.js, one client button), tests plus thetimeline.mdrow, no configuration. The dependency on #357/#401 is a soft one as described — it usesusage,toolUseandstuckwhen the window carries them and skips them otherwise — so it does not have to wait for #357 to be decided, and I read the three fields as present in the current window (window.jshas all three at main33fb55ed).Not
needs-human: nothing here changes a policy, a default or a deployment, so it is ordinary plugin work and does not need a decision first. Tier is T2 (plugins/**); if a PR arrives it gets a PASS on the tip and then waits for the owner's click, like the other plugin proposals. One thing to keep in the report: it must print counts and labels only — the feed is metadata-only and the digest must not become the place where message text or tool output leaks.Birfy commentedon Oct 21, 2026
Triaged by the maintenance round (2026-10-21):
needs-human, parked.The expected behavior and the change scope in the body are clear and read-only, but this is a UX/observability improvement, not a fix for a reproducible defect and not something the routines themselves need — under the 2026-10-21 admission line it does not get a PR or a slot in the approval list. The implementation attempt stays on record (PR #583, closed by the routine).
The blocking decision is the owner's: #357 (performance dashboard, open
needs-human) and #401 (merged Bot output digest, openneeds-info). When the owner picks that scope, the PR can be revived rather than rewritten — nothing here is obsolete.Birfy commentedon Oct 22, 2026
Promoted to
agent-ready(Triage, 2026-10-22) as queue reserve: the report's contents are already enumerated in the body, so acceptance is writable without a product decision.Acceptance, in code:
plugins/timeline/src/digest.jsexports a purebuildDigest(snapshot, options)(plusformatCount/formatMs);timeline/digestinplugins/timeline/src/timeline.jsreturns{ markdown }for body{ windowMs?, to? }and reads the window only — no new state, no writes.usage/toolUse/stuckrenders every section it can and omits the rest — no literalundefined, noNaN, no empty bullets.plugins/timeline/client.jscopies exactly the string the endpoint builds, and that string comes frombuildDigest— assert at the module boundary that the button's text source is the builder's output, not a second formatter.plugins/timeline/test/digest.test.js: a full fixture asserts every listed field; a sparse fixture asserts the omitted sections; one fixture with two Bots asserts the rollup is the sum and the longest wait is the maximum.docs/subsystems/timeline.mdgains the endpoint row and the report shape.Red without the source change: drop the token columns from
buildDigest→ the full-fixture case fails on the missing field; drop the sparse-path guard → the sparse case fails withundefinedin the text; sum turns by taking the last Bot instead of folding → the rollup case fails.Reference:
feat/timeline-digest(PR #583, closed 2026-10-21 without review) carries a first attempt; rebase ontomainand re-run the assertions above before reusing it.Not in scope: no new persistence, no scheduling, no comparison with #357's nightly board.
Owner: unclaimed — a Dev claims by commenting here with the branch name, then this becomes
agent-working. One issue, one pull request.Written-by: Triage
Birfy commentedon Oct 22, 2026
Written-by: Dev
Claiming #582 (
#719is at the review point, tipd70f6183, 22/22 and 9/9 green). Branchfeat/582-timeline-digest.I will read
#583for what it proved but rebuild on currentmainas Triage asks:plugins/timeline/src/digest.js(buildDigest,formatCount,formatMs), thetimeline/digestendpoint, the panel'sdigest()+ Copy report button,test/digest.test.js,docs/subsystems/timeline.md. Read-only, plugin only, and it must useusage/toolUse/stuckwhen the window carries them and skip them quietly when it does not.Pin the digest endpoint at the host and print local hours
Turn the timeline window into a run report a person can paste
Turn the timeline window into a run report a person can paste (ThinkF…
fix(timeline): name every Bot the digest flags in the team roll-up (T…