Repository navigation
fix(todos): render nested TODOs with collapsible hierarchy and Markdown - #1483
Conversation
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Include the merged Settings selector correction for fresh browser CI. Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) reviews. All lanes completed.
Reviewed head 8204a98eb5563920e37dbd417cf7bf1851b98ecf against base 3d26215564dde0f670b8707de49f822a36a0120f. Four actionable findings are inline: three P2s and one P3. Source assessment: 8/10; address the link integration, accessible-name and collapse-state defects to meet the repository’s 9/10 bar. This is a non-blocking COMMENT review, not approval or a merge decision.
Optional cleanup: the new div-inside-li structure makes the existing .row:last-child rule remove separators/bottom padding from every leaf row; retarget it to the intended list-item boundary if uniform row separation is desired. Also update docs/plugin-architecture.md:446: the implementation nests subtrees under the root’s status group rather than displaying parent-path text across status groups.
Reviewed all eight changed files, supported callers, persistence/save guards and error/retry focus paths. No additional parser/save-integrity defect identified. Public PR text, commit messages and both attached screenshots were inspected; no concrete disclosure concern found in those surfaces. Image metadata was not inspected. Existing shared Button, IconButton, Checkbox and Menu owners are reused.
Validation is source and supplied screenshots only: no PR code execution, tests, app launch, CI assessment, native/browser interaction or performance measurement. The existing browser journey was extended (no cases added/removed) for hierarchy geometry and signed Canvas integration, with parsing/component matrices in colocated tests; reported fail/pass evidence was not reproduced. Live keyboard/screen-reader behavior, failure/retry focus, both browser engines and human acceptance remain unverified; the PR explicitly leaves WebKit unverified.
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
loganj
left a comment
There was a problem hiding this comment.
🤖 Larry and Rbot: an independent adversarial review of 3ea1c24. Source review only; we did not run the tests or measure rendering.
Approve. No must-fix items.
CI: one WebKit browser shard fails in tests/browser/github-body.spec.mjs:35 (PR media in a narrow GitHub panel, locator.click timeout). This PR does not touch that area, so it looks like a flake; a rerun should clear CI required.
What we checked:
- Collapse state follows source edits: the common-prefix/suffix remap keeps offsets before the edit, shifts those after it, and drops only offsets inside the changed range. A status change at a collapsed root keeps it collapsed.
- Grouping by depth and source order keeps descendants under their root across status groups, including tasks under a plain (non-task) bullet.
- Assigning to a plain-name suffix replaces it, not appends to it, and clearing removes it.
- Title Markdown renders images as their alt text only, so a title cannot load a remote image, and links go through
safeLinkUrlor the Buzz link router.
Two small notes inline.
| </fieldset> | ||
| </div> | ||
| </div> | ||
| {children.length > 0 && ( |
There was a problem hiding this comment.
🤖 Advice (performance, non-blocking): a collapsed subtree is still fully rendered, only hidden, so every descendant still builds its menus and parses its title twice (todoLabelText and <Markdown>). Collapse does not reduce the work. If large nested Canvases become slow, render children only while expanded. Related question: the group counts now include only root tasks, so a Done child under a To do root is not counted under Done. Is that intended?
There was a problem hiding this comment.
🤖 Simone: Yes, counts intentionally count roots in each status group. Descendants stay under their root even when their own status differs, so they are not separate entries in another group. I am deferring lazy mounting until we profile a large nested Canvas; it changes descendant lifecycle and focus behavior, and no measured slowdown is established here. Tracked in my Todos large-Canvas rendering follow-up; leaving this performance discussion open.
Slow fixture playback so actionability waits cannot exhaust the clip before Pause. Assert the selected video is paused before proceeding. Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Scope controls to each video and use a 30-second fixture so actionability waits do not exhaust playback. Preserve decoding, progress and pause assertions. Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> Signed-off-by: John Tennant <jtennant@block.xyz>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com> Co-authored-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * origin/main: (24 commits) Unify chat and channel access, tidy the Solo chat menu (#1446) fix(todos): render nested TODOs with collapsible hierarchy and Markdown (#1483) fix(agents): Allow agents to propose updates to agents (#1478) fix(composer): prevent plugins from updating the recipient on a WIP draft message (#1497) fix(agents): can't delete an agent belonging to an archived channel (#1560) Bump tokio to 1.53.3 for RUSTSEC-2026-0386 (#1581) Unify attachment cards with neutral icon tiles (#1548) Polish edit context, channel join and profile actions (#1545) fix(claude-code): keep context across channel threads (#1516) fix(builderlab): let Create agent cancel a pending browser sign-in (#1526) test(sidebar-filters): start the focus journey on General (#1555) Add opt-in native MCP for macOS tests (#1528) Show unreads for channels after access changes (#1550) Deliver artifact changes through shared live routes (#1480) condense photo and video attachments into a compact grid (#1549) Add page-owned sidebar contributions (#844) fix(channels): confirm a requested member when the relay stores bot (#1519) test(browser): settle dialog motion and startup errors before strict checks (#1492) perf(messages): measure read-tracking rows once per frame (#1527) fix(settings): keep the chosen plugin row in place when details open or close (#1551) ...
…ocus * origin/main: (35 commits) fix(goose): say a provider isn't set up instead of offering placeholder models (block#1543) fix(agent-activity): note under a message when its agent was stopped (block#1544) feat(messages): show whose agent wrote a message (block#1502) feat(agents): put main agent choice in the card's actions menu (block#1530) fix(relay): let live dev connections save config artifacts (block#1583) feat(builderlab): let local agents create, deploy, share and open Builderlab apps (block#1340) Unify chat and channel access, tidy the Solo chat menu (block#1446) fix(todos): render nested TODOs with collapsible hierarchy and Markdown (block#1483) fix(agents): Allow agents to propose updates to agents (block#1478) fix(composer): prevent plugins from updating the recipient on a WIP draft message (block#1497) fix(agents): can't delete an agent belonging to an archived channel (block#1560) Bump tokio to 1.53.3 for RUSTSEC-2026-0386 (block#1581) Unify attachment cards with neutral icon tiles (block#1548) Polish edit context, channel join and profile actions (block#1545) fix(claude-code): keep context across channel threads (block#1516) fix(builderlab): let Create agent cancel a pending browser sign-in (block#1526) test(sidebar-filters): start the focus journey on General (block#1555) Add opt-in native MCP for macOS tests (block#1528) Show unreads for channels after access changes (block#1550) Deliver artifact changes through shared live routes (block#1480) ... Signed-off-by: user-kWN3CIVowEvEo3RM <joelrobotham+bbprod@gmail.com> # Conflicts: # tests/browser/github-body.spec.mjs
Why
Nested Canvas tasks disappear from Todos, and task titles show raw Markdown. The panel also treats a plain
· Assignee: Johnsuffix as title text, leaving its assignment control looking unassigned.What
Render children as indented, collapsible subtrees, keeping each subtree under its root’s status group. Each title appears once, with formatted text, readable control names and validated links routed through the current panel host. Collapsed subtrees stay collapsed when an earlier task is added or reassigned; refresh clears obsolete collapse positions. Checkbox and assignment edits preserve the surrounding Canvas Markdown.
Both plain named and identity-linked assignments show their names inside the picker button. Plain names remain unlinked; choosing a member replaces the name suffix with the existing public-key-backed profile link. Clearing the assignment removes its suffix.
Reviewer-reproducible examples
Enable Todos in Settings, put this in a channel’s Canvas, and open Todos:
Build and Review appear beneath Ship with increasing indentation. Collapse Ship to hide both, then expand it. The release link opens independently of the checkbox. Change Build’s status and reopen Todos: the saved status persists without moving it away from Ship. The assignment picker identifies John as an unlinked Canvas name; choosing a channel member replaces it without duplicating the suffix.
The five review regressions fail with the fixes reverted and pass on this revision. Chromium and WebKit exercise hierarchy geometry, Markdown and Buzz link navigation, named assignment display, and signed Canvas save/readback. The existing browser journey was extended; no browser cases were added or removed.
Screenshots