vscode: mark recently-created backlog rows with [new] (<24h)#949
Merged
Conversation
… test steps (consult)
amrmelsayed
added a commit
that referenced
this pull request
May 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PIR Review: Mark recently-created backlog rows (< 24h)
Fixes #930
Summary
The Backlog sidebar tree now flags freshly-filed issues: any row whose
createdAtis within the last 24 hours of render-time "now" leads with amonochrome
[new]prefix, and every row with a parseablecreatedAtgains aCreated <age>line on its hover tooltip. The marker is computed at rendertime against a fresh
Date.now(), so an item ages out of[new]on the nexttree refresh with no persistent state or per-user dismissal. The
[new]textprefix (rather than an icon swap) was chosen so it coexists with the existing
account/issuesassignment icon — the primary goal was letting an engineerspot a new issue assigned to them, which an icon swap would have hidden.
Files Changed
packages/vscode/src/views/backlog-recency.ts(+65 / -0) — new, vscode-freepure helpers
packages/vscode/src/__tests__/backlog-recency.test.ts(+82 / -0) — new,vitest unit tests
packages/vscode/src/views/backlog.ts(+12 / -2) —makeRow:[new]labelprefix +
Created <age>tooltipCommits
5ff73ac4[PIR vscode: mark recently-created backlog rows (created within last 24h) #930] Lead row with [new] prefix (before the issue number)54637402[PIR vscode: mark recently-created backlog rows (created within last 24h) #930] Update thread — implement phase0b03226b[PIR vscode: mark recently-created backlog rows (created within last 24h) #930] Render [new] prefix + Created-age tooltip on backlog rows417156f9[PIR vscode: mark recently-created backlog rows (created within last 24h) #930] Add backlog-recency pure helpers + unit tests04dcc581[PIR vscode: mark recently-created backlog rows (created within last 24h) #930] Plan revised — follow vscode: builder row legibility — phase prefix + gate-specific icons for at-a-glance protocol/state visibility #810 [new]-prefix pattern93b5768a[PIR vscode: mark recently-created backlog rows (created within last 24h) #930] Plan draftTest Results
build(porch check): ✓ passtests(porch check): ✓ passbacklog-recency.test.ts)check-types(tsc --noEmit): ✓ passlint(eslint src): ✓ passdev-approvalgate via therunning worktree (Extension Development Host / dev server).
Architecture Updates
No arch changes — this is a self-contained, additive change to one view's row
construction (
BacklogProvider.makeRow) plus a sibling pure-helper file. Itintroduces no new module boundary, data flow, or pattern: it reuses the
established "pure logic in a vscode-free file, vitest-tested in
__tests__/,consumed by the vscode-dependent provider" convention already set by
backlog-filter.ts.codev/resources/arch.mdalready documents thatconvention; nothing to add.
Lessons Learned Updates
No durable lessons captured — the implementation followed existing conventions
end to end (the
backlog-filter.tspure-helper pattern for testability, andthe #810 "monochrome bracket-text prefix coexisting with the row icon" design
language for the marker). One process note worth recording inline rather than
in
lessons-learned.md(too situational to generalize): a fresh builderworktree needs
@cluesmith/codev-coreand@cluesmith/codev-typesbuiltbefore the vscode package's
tsc/esbuildcan resolve their subpath exports —the first
porch donefailed thebuildcheck for exactly this reason andpassed once core+types were built. This is pre-existing worktree build-ordering
behavior (confirmed via
git stashthat thestatus.ts/workspace.ts/terminal-adapter.tserrors exist without this diff), not introduced here.3-Way Consultation Disposition (PIR single-pass)
Verdicts: gemini=REQUEST_CHANGES, codex=REQUEST_CHANGES, claude=APPROVE
(full text in
codev/projects/930-vscode-mark-recently-created-b/930-review-iter1-*.txt).PIR consults once — this was not independently re-reviewed, so the human is the
final check at the
prgate.[new]placement before#id(gemini + codex) — not a code defect.Both flagged that the shipped
[new] #<id> <title>order deviates from theplan's original
#<id> [new] <title>. This was a deliberate revision thereviewer requested at the
dev-approvalgate (commit5ff73ac4); Claude'sAPPROVE explicitly recognized it as gate-approved. The legitimate kernel was
plan↔code drift: the approved plan still documented the old order. Fixed
by reconciling the plan to the shipped order (no code change — the placement
is the human's gate decision). Gemini's secondary note that leading the row
with
[new]offsets the#idleft-alignment for fresh rows is the inherent,accepted tradeoff of the requested placement.
valid, addressed. Rewrote that section with concrete Extension Development
Host steps (build subpath deps →
pnpm compile→ F5 → open Backlog tree)instead of the web-oriented "Run Dev Server" instruction.
Things to Look At During PR Review
backlog.ts:124-130): the[new]prefix leads the label whileiconPathstill dispatchesaccount(assigned) vs
issues(otherwise). A new + assigned row reads👤 [new] #N <title> … assigned to you. This was the resolved design call —an earlier draft proposed a
$(sparkle)icon swap, rejected because it wouldclobber the assignment icon and hide newness on exactly the rows that matter.
backlog-recency.ts):isRecentlyCreated/relativeAgeboth guardDate.parsereturningNaN(missing / empty /malformed
createdAt) and defensively treat future timestamps asnot-recent /
0s ago. Malformed input yields no prefix and an unchangedurl-only tooltip — no thrown error. Covered by tests.
Backlog tree re-renders (SSE-driven
OverviewCache.onDidChange, or a configrefresh). There is no 24h
setTimeout; an item drops[new]on the nextrefresh after crossing the threshold. This matches the issue's acceptance
criterion Scaling Crisis - AI Autonomy Decreases as Projects Grow #3 ("lose the marker on the next refresh") and was explicitly
confirmed with the reviewer at the gate.
relativeAgere-implements the ~6-linetiered format from
view-artifact.ts:135rather than importing it, becausethat helper lives in a vscode-dependent module and hardcodes
Date.now()(not injectable for deterministic tests). The format strings match so wording
stays consistent. A future consolidation could extract a shared
now-injectable formatter, but that was out of scope here.How to Test Locally
This is a VSCode extension UI change (the Backlog tree in the Codev
sidebar), so verify it in the Extension Development Host rather than a web dev
server:
pir-930→ View Diff.pnpm --filter @cluesmith/codev-core buildand
pnpm --filter @cluesmith/codev-types build(subpath deps), then inpackages/vscoderunpnpm compile.packages/vscodein VSCodeand press F5 (Run → Start Debugging), or pick the "Run Extension" launch
config. A second VSCode window opens with the dev build of the extension.
expand the Backlog view (connect it to a Tower workspace if prompted, so
real backlog items load).
[new]before its#id; hoveringshows
Created <Xh ago>.accounticon and shows[new]plus theassigned to youdescription (the primary goal).[new]); its tooltip still showsCreated <Xd ago>.formatter (vscode: Backlog tree title-count should reflect the active view mode, not the total spawnable set #911) all still render correctly with
[new]prefixes present.createdAtrenders with no prefix and aurl-only tooltip — no error.