Skip to content

Verification: nesting work items and their PRs in the sidebar ​

Executed against claude/github-issue-300-ab9r0d, on the same toolchain CI's ui job uses (bun, the lockfile's pinned oxlint 1.78.0, vitest, vite).

Results ​

RowTypeResultEvidence
T1Unit — sessionTreepasssrc/api/model.test.ts: the two-level tree case updated to the new SessionNode shape (label: "#2", lastActivity: ""), plus a new case for a PR in another repository (label: "docs#47", lastActivity carried from lastEventAt); the treeless case unchanged and still green
T2Component / Reactpasssrc/App.test.tsx: nests each work item's pull requests under it in the sidebar and opens the PR's own session from its nested sidebar row, plus the trace-tab case re-asserted against links
T3Contractn/ano route, request or response shape touched — the diff outside ui/src is documentation only
T4Integration / e2e (service)n/anothing server-side changed
T5UI / visualpassChromium (Playwright) over the production build in demo mode, 1440×900 @2×: sidebar-nesting.png (default view), sidebar.png (sidebar with a PR selected), pr-selected.png (the canvas following it)
T6Accessibilitypassthe nested list is queried in the tests by getByRole("list", { name: "Pull requests for loop-lab#214" }) and the rows by role="link"; selection asserted through aria-current="page", not through class names
T7Regression — deep linkspassthe existing #/item/<unknown> and pre-283 #/sessions/<ref> cases pass unchanged with the trace now route-derived
T8Lint / typecheck / buildpassbun run lint (oxlint --type-aware) clean; bun run test 171/171; bun run build (tsc --noEmit + vite) green
T9Performancen/aone sessionTree call per render over the array the sidebar already maps
T10Migrationn/ano persisted shape; the hash grammar is unchanged
T11Security / abuse casespassA1: the viewed guard in WorkItemDetail falls back to the item's own session for a ref the item does not own — exercised by T7's unknown-ref case and read in self-review. A2: the chat bar's refFor is the same viewed value the panel renders (one value, no second state), and Transcript.test.tsx's "sends the text to the viewed ref" still passes

Raw output ​

text
$ bun run lint
$ oxlint --type-aware
                                     # no findings

$ bun run test
 Test Files  12 passed (12)
      Tests  171 passed (171)

$ bun run build
$ tsc --noEmit && vite build
dist/index.html                   0.64 kB │ gzip:  0.38 kB
dist/assets/index-CiVSji5W.css   27.49 kB │ gzip:  5.47 kB
dist/assets/index-G572Qq4X.js   279.15 kB │ gzip: 86.63 kB │ map: 1,242.96 kB
✓ built in 1.34s

$ npx markdownlint-cli2@0.18.1 <the docs this PR touches>
Summary: 0 error(s)

Test count: 168 → 171 (+1 unit for the foreign-repo label, +2 component for the nesting and the PR-row selection). No test was weakened: the two edits to existing assertions are the sessionTree shape (two new fields) and the trace tabs having become links, both of which are the change under test.

Notes ​

  • The T5 screenshots are captured from dist/ built with UI_BASE=/ and served statically, with the demo settings seeded into localStorage before load — the same data the bundled fixture serves the test suite, so the evidence and the assertions describe one board.
  • The fixture happens to cover every case the requirements name: loop-lab#214 carries a same-repo PR (#216) and one in another repository (loop-docs#47), loop-lab#223 is the ad-hoc (treeless) item, loop-lab#187 is armed with no session at all, and #207's session is closed — so its dot renders grey under a live parent.

Released under the MIT License.