Commit Graph

40 Commits

Author SHA1 Message Date
gsxdsm
924bcb97d5 FN-7255: add task card context menus
Add shared task action menus across board and list task surfaces.

- Add reusable task context menu UI with open, copy, archive, delete, pause, duplicate, retry, refine, and dependency actions.
- Wire board cards, swimlanes, worktree groups, and list rows to expose consistent menu behavior.
- Reuse task-detail action handlers and cover menu interactions with dashboard tests.
- Document the new task context menu behavior and add a patch changeset.

Files changed:
 .changeset/fn-7255-card-context-menu.md            |   7 +
 docs/dashboard-guide.md                            |   6 +
 packages/dashboard/app/App.tsx                     |   2 +
 packages/dashboard/app/components/Board.tsx        |  61 ++-
 packages/dashboard/app/components/Column.tsx       |  43 +-
 packages/dashboard/app/components/Lane.tsx         |  11 +-
 packages/dashboard/app/components/ListView.css     |  25 ++
 packages/dashboard/app/components/ListView.tsx     | 438 ++++++++++++++++++-
 packages/dashboard/app/components/TaskCard.css     |  12 +
 packages/dashboard/app/components/TaskCard.tsx     | 472 ++++++++++++++++++++-
 .../dashboard/app/components/TaskContextMenu.css   |  57 +++
 .../dashboard/app/components/TaskContextMenu.tsx   | 346 +++++++++++++++
 .../dashboard/app/components/TaskDetailModal.tsx   | 235 ++++------
 .../dashboard/app/components/WorktreeGroup.tsx     |  60 ++-
 .../app/components/__tests__/ListView.test.tsx     | 159 ++++++-
 .../__tests__/TaskCard.cli-states.test.tsx         |   1 +
 .../app/components/__tests__/TaskCard.test.tsx     | 180 +++++++-
 .../components/__tests__/TaskContextMenu.test.tsx  | 205 +++++++++
 .../app/components/__tests__/board-mobile.test.tsx |   1 +
 .../app/components/dashboard/MainContent.tsx       |  12 +
 .../__tests__/MainContent.graph-popout.test.tsx    |   1 +
 .../dashboard/app/components/dashboard/types.ts    |   1 +
 packages/dashboard/app/hooks/useAppSettings.ts     |   8 +
 23 files changed, 2178 insertions(+), 165 deletions(-)

Fusion-Task-Id: FN-7255
Fusion-Task-Lineage: 5b5714a9-3eb5-4df1-a466-0d2f839b6bd9
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 01:57:09 -07:00
gsxdsm
4ed84be7d1 fix(FN-6950): polish dashboard modal and chat chrome 2026-06-23 00:20:55 -07:00
gsxdsm
2d038e7ffa feat(FN-6950): polish dashboard responsive chrome 2026-06-22 23:58:38 -07:00
gsxdsm
f9043d733e fix(dashboard): polish workflow and chrome defaults 2026-06-22 19:48:50 -07:00
gsxdsm
4fd8d444fb fix(dashboard): polish app chrome and workflow defaults 2026-06-22 18:21:06 -07:00
gsxdsm
94c4a78615 fix(dashboard): lighter Planning footer (no border band); tighter List toolbar-to-quick-add gap
- .planning-view-footer drops its border-top divider + trims padding so the Start-Planning action flows with the content instead of reading as a large bottom footer band.
- List controls bottom padding + quick-add top padding reduced (space-md -> space-xs) so the toolbar sits close to the quick-add box.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 11:38:21 -07:00
gsxdsm
fefc91b30e fix(dashboard): center List toolbar buttons, match Chat divider exactly, shrink quick-add right padding
- Toolbar (Bulk Edit / View / New Task) is centered (dropped the margin-left:auto right-push).
- List divider now draws its 1px line via .list-split-sidebar border-right (identical to Chat's .chat-sidebar), with a transparent hover-tint handle; removed the doubled detail border-left.
- Quick-add input padding-right 70px (inherited from the global .description-with-refine textarea refine-button reservation) tightened to space-sm — no overlaid button there, so text reclaims the width.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 11:02:32 -07:00
gsxdsm
b679577fa0 fix(dashboard): consistent 1px sidebar divider across List, Chat, Mailbox
List handle drops its persistent tinted band (transparent default) and its grip line goes 2px->1px; Mailbox divider line goes var(--space-xs)->1px var(--border). All three now show a single clean 1px static divider with the wider handle as an invisible hover-highlight hit-area (Chat's pattern).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 10:37:28 -07:00
gsxdsm
4626f8e7fe feat(dashboard): list-view count/border cleanup, overview buttons match Stop AI Engine, center graph on load
- List view: remove the 'X of Y tasks' count from the desktop sidebar toolbar and the border between the controls row and the quick-add box (mobile count kept). Count-display tests now verify the filter via rendered rows.
- Command Center Overview: View Board / View Agents are btn btn-secondary (taller, centered) matching the Stop AI Engine button.
- Dependency graph: fit/center on load — the initial fit ran before the viewport was measured + before nodes were positioned (async), and never re-fit. Now fits only when fittable (nodes + measured viewport) and re-fits when the node set changes (covers async load + re-entering the view).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 09:59:26 -07:00
gsxdsm
13bd2e473a feat(dashboard): list-header one-row, file pop-out opens current file, taller overview buttons; fix redesign test suite
- List view header: count + Bulk Edit + View options + New Task on one compact btn-sm row; view-options shrunk; count compacted/secondary.
- File browser pop-out now opens the file you're currently viewing — current path shared via scoped storage (kb-dashboard-dock-files-current) with cross-instance live-sync.
- Dashboard Overview: View Board / View Agents are now btn btn-secondary (taller, centered) to match the Stop AI Engine button.
- Test suite: fix ~40 stale assertions from the redesign (App nav moved to LeftSidebarNav, Import Tasks embedded, removed Todos in-view header, SkillsView shared ViewHeader, gm embedded keyboard rule, ThemeSelector option drift) — test-only, nothing weakened. Pre-existing board-mobile InlineCreateCard failure left as-is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 09:47:27 -07:00
gsxdsm
ea7c14964c fix(dashboard): make the list-view split sidebar easy to resize
Widen the split resize column from 4px to --space-sm and add a centered grip line that brightens on hover/focus, so the task-list sidebar is easy to grab and drag.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 03:34:15 -07:00
gsxdsm
cdee83c3ec fix(dashboard): list narrowing, planning blend, insights header, graph out of dock
- List view split sidebar min-width 120->64 so it can be dragged much narrower; titles wrap to two lines in the split sidebar.
- Embedded planning blends like Command Center: no panel shadow/border/outline, transparent background, matching --space-lg padding.
- Insights view header wraps so action buttons drop to a new line instead of overlapping the title.
- Dependency graph no longer appears in the right dock (left-sidebar destination only).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 03:34:15 -07:00
gsxdsm
1ff87147b7 FN-6831: narrow list sidebar and wrap task titles
Refine the desktop list split pane so narrower sidebars still show readable task titles.

- Lower the list-view sidebar minimum width from 280px to 200px across resize and keyboard handling.
- Clamp desktop list task titles to two wrapped lines with overflow protection.
- Update ListView coverage for the smaller persisted/keyboard minimum and title-clamp CSS.

Files changed:
 packages/dashboard/app/components/ListView.css     | 10 +++++++++-
 packages/dashboard/app/components/ListView.tsx     |  2 +-
 .../app/components/__tests__/ListView.test.tsx     | 22 +++++++++++++++++-----
 3 files changed, 27 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-6831

Fusion-Task-Lineage: ac3e455d-8cb0-4f42-ac5c-d735e56d2b89
2026-06-21 03:40:56 -07:00
gsxdsm
c808177979 FN-6776: prevent workflow board legacy flash
Prevent workflow-enabled board surfaces from flashing the legacy layout during first paint.

- Hydrate Board and ListView workflow metadata from a per-project session cache before async revalidation.
- Gate legacy board/list rendering behind settings and workflow-lane metadata readiness, with neutral skeleton states for cold or empty workflow loads.
- Add regression coverage for no-legacy-flash behavior and cache validation, plus docs and changeset notes.

Files changed:
 .changeset/fn-6776-board-flash.md                  |   5 +
 docs/dashboard-guide.md                            |   1 +
 packages/dashboard/app/App.tsx                     |   4 +
 packages/dashboard/app/components/Board.css        |  69 +++++
 packages/dashboard/app/components/Board.tsx        |  53 +++-
 packages/dashboard/app/components/ListView.css     |  53 ++++
 packages/dashboard/app/components/ListView.tsx     |  52 +++-
 .../__tests__/board-no-legacy-flash.test.tsx       | 326 +++++++++++++++++++++
 .../utils/__tests__/boardWorkflowsCache.test.ts    |  71 +++++
 .../dashboard/app/utils/boardWorkflowsCache.ts     |  49 ++++
 10 files changed, 676 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-6776

Fusion-Task-Lineage: caa8e53f-9b6d-49a6-94ca-b694550b43ef
2026-06-20 15:42:16 -07:00
gsxdsm
fec197afdf FN-6774: remove colored card edge accents
Remove saturated edge stripes from stuck task and agent cards while preserving state legibility.

- Keep stuck task board cards and list rows on neutral borders with tinted backgrounds and existing status badges.
- Replace agent card status edge accents with subtle state backgrounds and a selected-card inset ring.
- Add CSS regression coverage to prevent colored edge-border variants from returning.

Files changed:
 packages/dashboard/app/components/AgentsView.css   | 46 ++++++++---
 packages/dashboard/app/components/ListView.css     |  5 +-
 packages/dashboard/app/components/TaskCard.css     |  5 +-
 .../__tests__/stuck-and-agent-card-border.test.ts  | 92 ++++++++++++++++++++++
 4 files changed, 133 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-6774

Fusion-Task-Lineage: da49ca64-2c10-4594-888f-332cf4f9c8c8
2026-06-20 04:51:57 -07:00
gsxdsm
7eceec00cc FN-6763: add themed workflow status switcher
Add a reusable dashboard workflow picker that shows inline task status counts across board and list views.

- Replace native workflow selects with a themed accessible dropdown component.
- Share workflow status count calculation between board and list views.
- Add styling, i18n labels, tests, and dashboard docs for the switcher behavior.

Files changed:
 docs/dashboard-guide.md                            |   3 +-
 packages/dashboard/app/components/Board.tsx        |  28 +--
 packages/dashboard/app/components/Lane.css         |   2 +
 .../dashboard/app/components/LeftSidebarNav.tsx    |   2 +-
 packages/dashboard/app/components/ListView.css     |  17 --
 packages/dashboard/app/components/ListView.tsx     |  31 ++-
 .../dashboard/app/components/WorkflowSwitcher.css  | 186 ++++++++++++++
 .../dashboard/app/components/WorkflowSwitcher.tsx  | 270 +++++++++++++++++++++
 .../app/components/__tests__/Board.test.tsx        |  60 +++--
 .../app/components/__tests__/ListView.test.tsx     |  79 +++++-
 .../components/__tests__/WorkflowSwitcher.test.tsx |  92 +++++++
 .../__tests__/workflowStatusCounts.test.ts         | 122 ++++++++++
 .../app/components/workflowStatusCounts.ts         |  54 +++++
 packages/i18n/locales/en/app.json                  |   9 +
 packages/i18n/locales/es/app.json                  |   9 +
 packages/i18n/locales/fr/app.json                  |   9 +
 packages/i18n/locales/ko/app.json                  |   9 +
 packages/i18n/locales/zh-CN/app.json               |   9 +
 packages/i18n/locales/zh-TW/app.json               |   9 +
 19 files changed, 930 insertions(+), 70 deletions(-)

Fusion-Task-Id: FN-6763
Fusion-Task-Lineage: 3503ea85-841a-4cd3-9960-1b22ef2cd4ea
2026-06-20 02:08:36 -07:00
gsxdsm
d0de886f11 FN-6529: reduce list task active highlights
List-view active task rows now use a calmer static highlight instead of the animated glow.

- Replace desktop list-row glow animation with a subtle background and inset border.
- Match the mobile list-card active styling to the toned-down static highlight.
- Rename the ListView test case to document the expected static highlight styling.

Files changed:
 packages/dashboard/app/components/ListView.css           | 16 ++++++++--------
 .../dashboard/app/components/__tests__/ListView.test.tsx |  2 +-
 2 files changed, 9 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-6529
Fusion-Task-Lineage: 67286eee-0360-41dd-be78-592b40eb5bee
2026-06-17 01:34:40 -07:00
gsxdsm
e138971030 fix: stabilize workflow board and loop recovery 2026-06-07 23:30:16 -07:00
gsxdsm
2d2024fb0f fix(dashboard): unfreeze animations broken by transition tokens used as durations
Spinners, status-dot pulses, and entrance animations across the dashboard
rendered frozen: transition tokens (--transition-slow: 0.3s ease) bundle a
duration AND an easing, and 15 animation declarations reused them as bare
durations. Substituting "0.3s ease" next to an explicit easing (linear,
ease-in-out, ease-out) — or inside calc() — makes the declaration invalid at
computed-value time, which per spec resolves the entire property to
animation: none with no console error.

- add duration-only tokens (--duration-instant/fast/normal/slow) and derive
  the --transition-* tokens from them so the two cannot drift
- switch all 15 broken animation declarations across 14 CSS files to the
  duration tokens, preserving effective durations
- add animation-duration-tokens.css.test.ts: sweeps every app CSS file and
  fails on transition-token-as-duration, calc() over a transition token, and
  transition token in animation-duration

Verified in a real browser against the production build: previously frozen
.status-dot--connecting and calc-based NodesView spinners now report running
animations; transition shorthands still resolve to "0.15s / ease".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 19:48:40 -07:00
gsxdsm
d37bebf8bf feat(FN-5516): merge fusion/fn-5516 2026-05-22 17:24:38 -07:00
gsxdsm
ed4d021d3d fix(dashboard): keep mobile nav visible on Android landscape and during keyboard
- Broaden mobile media query to include (max-height: 480px) so landscape
  phones (which exceed 768 CSS px wide) still render the bottom nav and
  mobile board layout instead of desktop horizontally-scrollable columns.
- Guard useMobileKeyboard against pinch-zoom (vv.scale > 1) — Android
  Chrome ignores user-scalable=no, and a focused textarea + zoom was
  false-positiving keyboard-open and hiding MobileNavBar.
- Read documentElement.clientHeight instead of stale window.innerHeight
  when computing keyboard overlap (Android multi-window can leave
  innerHeight cached at a wildly different value than the actual layout
  viewport — observed 2848 while html was 797).
- Add interactive-widget=resizes-content to the viewport meta so Android
  Chrome shrinks the layout viewport with the soft keyboard, matching iOS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 13:12:36 -07:00
Fusion
85d85923f9 feat(FN-4584): complete Step 2 — polish mobile bulk edit layout
Fusion-Task-Id: FN-4584
Fusion-Task-Lineage: b90690e0-6bd7-42be-a3b2-1fe411afdd1e
2026-05-15 02:18:23 -07:00
Fusion
a7b937508a feat(FN-4208): complete Step 2 — fix ListView badge state precedence
Fusion-Task-Id: FN-4208
Fusion-Task-Lineage: a195b416-f5c2-402e-939a-5d356a17ceec
2026-05-13 06:29:35 -07:00
Fusion
61b670acce feat(FN-4200): prevent failed tasks from blocking overlap dispatch in sched
The scheduler now excludes failed review tasks from blocking overlap dispatch, preventing stuck tasks from stalling downstream work. A CSS fix prevents the failed badge from incorrectly overriding the in-review status in the list view, with tests covering both the scheduler logic and the badge displ

Fusion-Task-Id: FN-4200
2026-05-12 17:04:33 -07:00
Fusion
edfef23964 feat(FN-001): complete Step 2 — mobile board CSS fix\n\n- Change scroll-snap-type from mandatory to proximity\n- Add overflow-anchor: none\n- Add width: 100% to mobile .board and .list-view\n- Update board-mobile.test.tsx scroll-snap assertion 2026-05-12 23:27:43 +08:00
Fusion
9a7e5cabf5 feat(FN-3479): finalize workflow token styling and API docs updates
- Expand architecture documentation for git route and custom provider APIs
- Revise ListView styles to use updated design-token driven spacing and sizing
- Refresh WorkflowResultsTab styling to align with workflow token revisions
2026-05-05 01:34:40 -07:00
Fusion
c9e937e735 feat(FN-3486): move new task action to trailing edge in ListView and refact
Merged two commits: relocated the new-task action button in ListView from the leading to trailing edge (FN-3486), and added a theme regression test for WorkflowResultsTab (FN-3462). Changes span ListView component and styles, WorkflowResultsTab CSS refactoring and tests, plus a dev-server-store upda

Fusion-Task-Id: FN-3486
2026-05-05 00:42:55 -07:00
Fusion
bca9749c1c feat(FN-3445): align bulk edit list styles with design tokens
Refactored ListView component CSS to use design token variables instead of hardcoded values, ensuring consistent styling with the dashboard's design system across all themes.

Fusion-Task-Id: FN-3445
2026-05-04 18:29:49 -07:00
Fusion
f50e7c5305 feat(FN-3223): add compact desktop sidebar controls for list view
The merge delivers three major feature clusters: hardened research lifecycle with idempotent cancel/retry and SSE support across the orchestrator and routes layer; unified header action clusters in AgentDetailView integrating planning mode disclosures; and a compact desktop sidebar for list view con

Fusion-Task-Id: FN-3223
2026-05-03 09:41:36 -07:00
Fusion
2ce4351724 feat(FN-3191): keep embedded task-link navigation in split pane
Fixes task link navigation in ListView so embedded links continue working when the split pane is active, including a new test case for FN-3191.

Fusion-Task-Id: FN-3191
2026-05-03 00:57:03 -07:00
Fusion
f6c8ac7a5a fix(FN-3221): streamline list defaults and gate bulk selection UI
- Reduce default ListView columns to title, status, and column while keeping optional columns user-configurable
- Move task ID into the title cell and add supporting ListView styles for stacked ID/title presentation
- Add explicit Bulk Edit mode toggle so selection checkboxes and bulk toolbar only appear when enabled
- Update ListView tests for new defaults, sorting behavior, conditional bulk-edit controls, and column span expectations

Fusion-Task-Id: FN-3221
2026-05-02 14:18:56 -07:00
Fusion
3e747f2190 feat(FN-3190): fix ListView split-pane UX follow-up issues
Fixes FN-3190 addresses follow-up UX feedback on the split-pane component in ListView, updating the layout styles and component logic with accompanying tests.

Fusion-Task-Id: FN-3190
2026-05-02 04:47:27 -07:00
Fusion
3cdd77cd55 feat(FN-3178): iconize fast badge and list indicators
Merged FN-3178: Added icon-based fast indicators to TaskCard and ListView components, replacing text badges with visual icons for quicker status scanning at a glance. Both the task card and list view layers were updated with matching CSS and component changes, along with corresponding test coverage.

Fusion-Task-Id: FN-3178
2026-05-02 02:01:52 -07:00
Fusion
d250f866d6 feat(FN-2729): unify node status indicator with NodeHealthDot
- Resolve merge conflicts in InlineCreateCard and QuickEntryBox using the existing node picker UX
- Replace ad-hoc node status rendering with NodeHealthDot in task creation surfaces
- Keep advanced quick-create controls and portal-based dropdown behavior intact
- Preserve related dashboard styling and tests included in the staged squash

Fusion-Task-Id: FN-2729
2026-04-29 08:15:01 -07:00
Fusion
437d5a51c1 fix(FN-2870): resolve dashboard merge artifacts
- Add list view node status indicator styles for bulk edit controls
- Remove duplicated memory dream trigger test blocks introduced during conflict resolution
- Keep dashboard test suite deterministic by retaining a single canonical memory dream trigger describe
2026-04-28 14:25:56 -07:00
Fusion
35694005ef feat(FN-2726): add bulk node override support in dashboard workflows
- Extend batch task update APIs and route handlers to accept nodeId overrides alongside model settings
- Update ListView bulk edit UX to load nodes and apply node overrides through batch updates
- Add node routing visibility improvements in task detail/settings UI and align related labels/styles
- Expand dashboard/API test coverage for node override batch updates and bulk edit behavior
2026-04-28 14:25:56 -07:00
Fusion
279d584072 feat(FN-2723): show node health in dashboard routing selectors
- Add node status indicators and labels to task creation, quick entry, task form, and settings node selectors
- Surface selected node health in list bulk-edit controls with status dot styling for online/connecting/offline/error states
- Update dashboard component CSS and shared styles for consistent node status presentation
- Include changeset documenting unavailable-node routing policy and default node behavior
2026-04-28 14:25:56 -07:00
gsxdsm
06e72b8ef8 feat(FN-2497): merge fusion/fn-2497 2026-04-25 11:10:51 -07:00
gsxdsm
cc8aa1f780 refactor(dashboard): extract component-specific mobile rules from styles.css
Sweep 1 of the styles.css split. Rules where the desktop counterpart already
lived in a component CSS file have been moved out of the global mobile @media
block in styles.css and appended to the matching component file's mobile
block. styles.css 4551 → 4488.

Affected components: Header, AgentsView, DocumentsView, ListView, QuickChatFAB,
QuickEntryBox, ScriptsModal, TaskDetailModal, TerminalModal, WorkflowResultsTab.

Truly global mobile rules (input font-size for iOS auto-zoom, html/body
overflow, root safe-area padding, base .btn touch targets, bare element
selectors) intentionally stay in styles.css. The remaining bulk of the mobile
block (settings, auth, board/card, inline-create) cannot move yet because
their desktop rules are still in styles.css — those will fall out as part of
the cards and settings extraction sweeps.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 08:43:54 -07:00
gsxdsm
c3d1716fdd refactor(dashboard): split monolithic styles.css into per-component files
Split app/styles.css from ~40k lines down to ~4.5k. Created 56 co-located
component CSS files in app/components/, each imported by its owning .tsx.
The remainder of styles.css holds genuinely global rules (design tokens,
.btn/.card/.modal/.form-input primitives, cross-component @media overrides).

- Lazy-load 13 heavy views (AgentsView, RoadmapsView, NodesView, etc.) via
  React.lazy + Suspense; prefetch all chunks on idle so first navigation is
  instant. Initial JS bundle: 1.58 MB → 1.16 MB (-26%). Initial CSS bundle:
  635 kB → 471 kB (-26%); the rest splits into 13 per-view chunks.

- Add app/test/cssFixture.ts exposing loadAllAppCss() + loadAllAppCssBaseOnly()
  so CSS regression tests load the full per-component bundle (mirroring Vite
  source order). Migrate 30+ tests off direct readFileSync('../styles.css').

- Enable test.css: { include: [/.+/] } in vitest.config.ts so component CSS
  imports actually inject styles in jsdom (fixes getComputedStyle assertions).

- Add ESLint rule (no-restricted-syntax) banning direct styles.css reads in
  dashboard test files; points at loadAllAppCss() instead.

- Restore lost utility classes (.text-muted, .text-secondary, .text-dim,
  .form-input) and rescue dropped chat tool-call rules into QuickChatFAB.css.

- Mobile fixes along the way: scroll containment for view containers
  (min-height:0 + -webkit-overflow-scrolling), QuickChatFAB full-screen on
  mobile (with safe-area-inset for iOS home bar), AgentsView single-row
  header layout, ActivityLogModal close button on right, model-combobox
  z-index above the mobile quick-chat panel.

- Bug fix: SkillsView toggle was display:none which hid the input from the
  accessibility tree; replaced with the visually-hidden pattern so screen
  readers + getByRole still find the checkbox.

- Bug fix: standalone Delete button in TaskDetailModal for triage-column
  tasks (Actions dropdown is hidden in triage state, so previously no way
  to delete a freshly-created task without status change first).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 19:39:20 -07:00