Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion codec_tasks.html
Original file line number Diff line number Diff line change
Expand Up @@ -1013,7 +1013,9 @@ <h2 id="actFilesTitle">Files</h2>
}
var meta = [];
if (total) meta.push(Math.min(idx, total) + ' of ' + total + ' checkpoints');
if (p.elapsed_s != null) meta.push((live ? 'running for ' : 'took ') + _actDur(p.elapsed_s));
// "running for" only while it runs; a waiting, paused or blocked project shows when it started.
var running = p.status === 'running' || p.status === 'crashed_resumed';
if (p.elapsed_s != null && (running || !live)) meta.push((running ? 'running for ' : 'took ') + _actDur(p.elapsed_s));
if (p.created_at) meta.push('started ' + _actWhen(p.created_at));
if (p.silenced) meta.push('notifications off');
h += '<div class="act-meta">' + meta.map(function (m) { return '<span>' + escHtml(m) + '</span>'; }).join('') + '</div>';
Expand Down
2 changes: 1 addition & 1 deletion docs/known-issues.md
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ you copy a web link") from the skill's `SKILL_OBSERVATION_TRIGGER`, falling back
to the skill's name. Found in the Mac merge pass. Revisit: the next item that
touches triggers.

## The Activity board says "running for" a project that is waiting (2026-10-07)
## The Activity board says "running for" a project that is waiting (2026-10-07) — FIXED (only while it runs)

Tasks > Activity (P3.8) shows "running for N min" under every project, including
one waiting for approval or paused, where it is the time since it started. Fix:
Expand Down
4 changes: 4 additions & 0 deletions tests/test_activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,8 @@ def _jsdom_available() -> bool:
const bar = d.querySelector('.act-card[data-agent="run1"] .act-bar');
out.bar = [bar.getAttribute('aria-valuenow'), bar.getAttribute('aria-valuemax'), bar.firstChild.style.width];
out.meta = d.querySelector('.act-card[data-agent="run1"] .act-meta').textContent;
out.metaPaused = d.querySelector('.act-card[data-agent="bud1"] .act-meta').textContent;
out.metaDone = d.querySelector('.act-card[data-agent="old1"] .act-meta').textContent;
out.last = d.querySelector('.act-card[data-agent="run1"] .act-last').textContent;
out.crews = [...d.querySelectorAll('#actCrews .act-card')].map(c => [c.querySelector('.act-title').textContent,
c.querySelector('.act-state').textContent, [...c.querySelectorAll('button')].map(b => b.textContent)]);
Expand Down Expand Up @@ -287,6 +289,8 @@ def test_the_activity_tab_renders_projects_crews_and_grants_under_jsdom():
assert d["buttons"]["old1"] == ["Files"], "a finished project only lists its files"
assert d["bar"] == ["2", "5", "40%"]
assert "2 of 5 checkpoints" in d["meta"] and "running for 2 min" in d["meta"]
assert "running for" not in d["metaPaused"] and "started" in d["metaPaused"], "a paused project is not running"
assert "took 10 min" in d["metaDone"]
assert d["last"] == "Checkpoint 2 done"
assert d["crews"][0] == ["Daily briefing", "Running", ["Stop"]] and d["crews"][1][:2] == ["Deep research", "Interrupted"]
assert d["chips"] == ["example.com", "web_search"]
Expand Down
Loading