Skip to content

Show project and thread on board rows; group, sort, fold, desk filter (#175, #158) - #203

Merged
smarzban merged 13 commits into
mainfrom
tsk/t216-show-project-and-thread-on
Oct 12, 2026
Merged

smarzban merged 13 commits into
mainfrom
tsk/t216-show-project-and-thread-on

Conversation

@smarzban

@smarzban smarzban commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner

Closes T216 (#175, #158; also covers T217). Base main, no store change, all state per board session (no config defaults: those are T238 on dispatch).

One implied call to veto cheaply: ←/→ folding and Enter-to-open on a sub-header need the cursor to rest on an open sub-header, so every sub-header is now a cursor stop (was: folded ones only). Cost: one extra j/k stop per open group. It is one branch in push_group_rows (src/ui/queue.rs) if the owner wants it back.

What ships

  • Row labels, every width: each task row carries a dim #thread · project (desk for desk tasks), omitting what the view already says (project board → no project; thread filter/grouping → no thread; project filter/grouping → no project). It flows inline two cells after the title's last word, on the title's last line; when it doesn't fit there it starts the next line at the title's indent and wraps like the title. No right-aligned column, no width switch, nothing truncated (a selected narrow row no longer collapses to …). The narrow board rail beside an open task page (110+) carries the label too.
  • Peek: the └─ closing line shows the row's full label (└─ #release · tsk, same omission rules), so the thread doesn't vanish when a row is peeked; the row itself drops its inline label while peeked, so it paints once.
  • Keys: bare g group by (desk none · project · thread, project board none · thread, thread View none · project), bare s sort by (recent · project · thread · title, own dimension hidden), bare f fold/unfold the cursor's group (sub-group, inbox, or archived), Shift+F fold/unfold all. ctrl+s/ctrl+f unchanged (same letter, different modifier class, like d/ctrl+d). Palette: group by…, sort by…, fold / unfold group.
  • Groups: dim foldable sub-headers inside NEEDS YOU / IN MOTION / ON DECK and the inbox (its sub-groups nest under the inbox's own fold), hottest first; section header keeps its total, sub-headers their own count. Done drawer and archived stay ungrouped. Grouping drops its dimension from labels only in sections that actually group (done drawer and archived keep it). Project groups key on path identity, so spellings of one repo make one group. Every sub-header is a cursor stop (see the note at the top). Shift+M on a sub-header unfolds it and marks the whole group as one set.
  • Sub-headers open their board: Enter or a double-click on a project sub-header opens that project's board; desk opens the desk; a #thread sub-header opens that thread's cross-project view (same as choosing it with v). no thread opens nothing.
  • Mouse on headers (owner rule): on any fold header (sub-header, inbox, archived) a single click only selects it, never folds. A double-click opens a sub-header that opens something and never folds it; on a header that opens nothing (no thread, desk on the desk, inbox, archived) a double-click folds/unfolds instead. Otherwise folding is keyboard-only (←/→, h/l, f, Shift+F). Fix: a header's own second press used to wipe its armed double-click (every left press that was not an index-row click disarmed both double-clicks), so double-click never opened; each target's own second press now keeps its arm (BoardModel::cancel_other_double_clicks, both the plain and the wide-focus mouse paths). A left press disarms both seats (outer board and preview), keeping only the arm the press continues on the seat it lands on, so a press elsewhere in the focused Rail preview disarms the preview's header double-click. In the Split preview the first click slides to Rail and can move the header; the second click is kept on the header the user saw by the same reflow gesture task rows use. In the Projects-tab preview, a thread sub-header hands the request to the outer board (the preview can't show a thread view itself), which closes the preview; an unsaved preview draft refuses, like the other project-switch paths.
  • Folding moves to ←/→ (and h/l): on any fold header (sub-header, inbox heading, archived heading) → unfolds a folded one and ← folds an open one, cursor stays on the header (tree-view). With nothing to do (→ on an open header, ← on a folded one) the key keeps its normal meaning: wide stage slider, peek open/close. The intercept sits before the slider route, so the slider is never blocked. Enter on the inbox/archived heading does nothing now. f / Shift+F unchanged. Help reads close / peek · fold / unfold a header and h/l close/peek/fold. With the cursor on a fold header the status row shows enter open (only when the sub-header opens something) and ← fold / → unfold; the arrow seat clicks like the key. ← on a task row inside a group keeps its peek-close/slider meaning (header-only folding, coordinator's call).
  • Desk filter: t (or the new desk chip) opens threads · projects tabs (←/→), choices combine (alpha #ship), narrows every section incl. the drawer and counts.
  • Header controls on every task list: group: none ▾ and sort: recent ▾ beside the filter chip, always shown (click → that picker). Desk and project boards: on the tab row. Thread View: beside its View control. Projects-tab preview: on its own header row beside the project name, with its own thread filter chip (Split and Rail; a Split click slides to Rail and opens the picker, like the preview's other controls).
  • Narrow widths (per control, defaults drop first): tiers in order: (1) every control in full words, (2) every control keyed g:none ▾ s:recent ▾, (3) only the controls not at their own default (group ≠ none, sort ≠ recent, desk filter ≠ all) in full words, (4) the same keyed. The first that fits beside the tabs wins. If even (4) doesn't fit, the non-default controls take their own row under the tabs and defaults rejoin them there if the row has room; when every control is at its default, nothing costs a row (a 40×10 board keeps every row it had on main until you group/sort/filter). Only when the non-default set alone overflows a row do controls drop from the left, filter last. Preview header (one row): the name shortens to ≥8 cells, then the same tiers, then left-drop. So a chosen g:thread never disappears while a default s:recent stays.
  • Desk, project boards, thread View, and the wide Projects preview each keep their own group/sort/fold state.

Calls beyond the brief (please check)

  • Inbox groups too (F-6 reversed by the owner after testing): g → project/thread applies inside the inbox like ON DECK; f, Shift+F, Shift+M, ←/→, click/double-click and Enter work on its sub-headers. f inside a grouped inbox folds the cursor's sub-group (←/→ on the inbox heading folds the whole inbox); Shift+F folds the inbox with everything else and a hidden row lands on the inbox heading. The desk inbox ignores project grouping, like ON DECK · desk (desk tasks only).
  • Controls that make no sense on a view are left out, not greyed: project board offers group none · thread and sort without project; thread View offers group none · project and sort without thread; the Projects overview lists projects, so it shows only its View chip; done drawer/archived never group.
  • Rows under ON DECK · desk and the desk inbox omit the desk label (section already says it).
  • Shift+M on a folded sub-header unfolds it before marking, so marks never rest on hidden rows; inside multi-select it adds the group to the existing set.
  • Shift+F treats inbox and archived as groups.
  • Sort: desk sorts after projects, unthreaded after threaded; N notices still lead.
  • Layout commands are absent from the palette over an open task page; t stays inert on the thread View.
  • Help label for t is now filter; old g fold moved to f/Shift+F (CHANGELOG Changed).
  • Web demo: bare keys are verbs there, so demo uses g group, Shift+S sort, Shift+F fold all, ←/→ to fold, click to select, Enter/double-click to open (double-click folds a header that opens nothing); f stays archive.
  • desk sub-header opens the desk; on the desk itself Enter there changes nothing (search, marks and fold stay). no thread opens nothing (silent, no status message).
  • The unsaved-work refusal on Enter/double-click guards the preview seat (the same guard tab switches use). A parked draft on the outer board is not refused here, as it isn't for tab switches either; it stays parked.

Before / after (80×24 desk golden, main → this PR)

@@ -1,16 +1,16 @@
 ┌────────────────────────────────────────────────────────────────────────────────┐
 │                                                                                │
-│ desk  ·  tsk ▾  ·  projects                                              all ▾ │
+│ desk  ·  tsk ▾  ·  projects             group: none ▾   sort: recent ▾   all ▾ │
 │                                                                                │
 │ NEEDS YOU ───────────────────────────────────────────────────────────────────2 │
 │                                                                                │
-│  ■ T5 Wire dispatch cleanup receipts                                           │
-│  ▲ T6 Docs refresh pass after F9 ships                                         │
+│  ■ T5 Wire dispatch cleanup receipts  herdr                                    │
+│  ▲ T6 Docs refresh pass after F9 ships  herdr                                  │
 │                                                                                │
 │ IN MOTION ───────────────────────────────────────────────────────────────────2 │
 │                                                                                │
-│▸ ● T1 Smoke-test worktree dispatch                                             │
-│  ● T2 Edit target binding pin                                                  │
+│▸ ● T1 Smoke-test worktree dispatch  tsk                                        │

desk_group_project_sort_thread_78x24 (grouped dimension dropped from the label)

┌──────────────────────────────────────────────────────────────────────────────┐
│                                                                              │
│ desk  ·  tsk ▾  ·  projects        group: project ▾   sort: thread ▾   all ▾ │
│                                                                              │
│ NEEDS YOU ─────────────────────────────────────────────────────────────────2 │
│                                                                              │
│ ▾ herdr · 2                                                                  │
│▸ ■ T5 Wire dispatch cleanup receipts  #dispatch                              │
│  ▲ T6 Docs refresh pass after F9 ships                                       │
│                                                                              │
│ IN MOTION ─────────────────────────────────────────────────────────────────2 │
│                                                                              │
│ ▾ tsk · 1                                                                    │
│  ● T1 Smoke-test worktree dispatch  #release                                 │
│ ▾ herdr · 1                                                                  │
│  ● T2 Edit target binding pin  #dispatch                                     │
│                                                                              │
│ ON DECK · desk ────────────────────────────────────────────────────────────1 │
│                                                                              │
│  ○ T7 Global backlog note  #release                                          │
│                                                                              │
│                                                                              │
│──────────────────────────────────────────────────────────────────────────────│
│ desk                                                                         │
│ enter open · ctrl+d done · ctrl+b unblock · ctrl+o inbox · + add · ? help    │
└──────────────────────────────────────────────────────────────────────────────┘

desk_group_project_sort_thread_40x24 (labels at 40 columns, wrapping to the title indent)

┌────────────────────────────────────────┐
│                                        │
│ desk  ·  tsk ▾  ·  projects            │
│                                        │
│       g:project ▾   s:thread ▾   all ▾ │
│                                       ▌│
│ NEEDS YOU ─────────────────────────2  ▌│
│                                       ▌│
│ ▾ herdr · 2                           ▌│
│▸ ■ T5 Wire dispatch cleanup           ▌│
│       receipts  #dispatch             ▌│
│  ▲ T6 Docs refresh pass after F9      ▌│
│       ships                           ▌│
│                                       ▌│
│ IN MOTION ─────────────────────────2  ▌│
│                                       ▌│
│ ▾ tsk · 1                             ▌│
│  ● T1 Smoke-test worktree dispatch    ▌│
│       #release                        ▌│
│ ▾ herdr · 1                            │
│  ● T2 Edit target binding pin          │
│       #dispatch                        │
│────────────────────────────────────────│
│ desk                                   │
│ enter open · ctrl+d done · ctrl+b unbl…│
└────────────────────────────────────────┘

Peek, live in t216-after (88 columns)

▸ ▲ T8 Benchmark cold start
    │ no notes yet
    └─ #perf · beacon
  ▲ T6 Release candidate smoke  #release · beacon

project_inbox_group_thread_78x24

┌──────────────────────────────────────────────────────────────────────────────┐
│                                                                              │
│ desk  ·  tsk ▾  ·  projects         group: thread ▾   sort: recent ▾   all ▾ │
│                                                                              │
│ IN MOTION ─────────────────────────────────────────────────────────────────1 │
│                                                                              │
│ ▾ #release · 1                                                               │
│▸ ● T1 Smoke-test worktree dispatch                                           │
│                                                                              │
│ ON DECK ───────────────────────────────────────────────────────────────────5 │
│                                                                              │
│ ▾ #release · 1                                                               │
│  ○ T3 Prototype the queue-style board UI                                     │
│ ▾ no thread · 1                                                              │
│  ○ T4 Cut rust-toolchain pin into CI docs                                    │
│                                                                              │
│ ▾ inbox · 3                                                                  │
│ ▾ #release · 2                                                               │
│  ◌ Sketch the inbox grouping                                                 │
│  ◌ Note the release checklist gaps                                           │
│ ▾ no thread · 1                                                              │
│  ◌ Triage the capture backlog                                                │
│──────────────────────────────────────────────────────────────────────────────│
│ tsk                                                                          │
│ enter open · ctrl+d done · ctrl+n next · ctrl+o inbox · ctrl+b block · ? help│
└──────────────────────────────────────────────────────────────────────────────┘

projects_preview_split_110x30

┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                            │                                                                 │
│ desk  ·  tsk ▾  ·  projects     Overview ▾ │  tsk                     group: none ▾   sort: recent ▾   all ▾ │
│                                            │                                                                 │
│   PROJECT            NEED MOTION DECK DONE │  IN MOTION ───────────────────────────────────────────────────1 │
│                                            │                                                                 │
│ ▸ tsk · here            ·      1    2    1 │ ▸ ● T1 Smoke-test worktree dispatch                             │
│   herdr                 2      1    ·    · │                                                                 │
│                                            │  ON DECK ─────────────────────────────────────────────────────2 │
│                                            │                                                                 │
│                                            │   ○ T4 Cut rust-toolchain pin into CI docs                      │
│                                            │   ○ T3 Prototype the queue-style board UI                       │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│                                            │                                                                 │
│──────────────────────────────────────────────────────────────────────────────────────────────────────────────│
│ /repos/tsk                                                            index ▸ project    → project · ← close │
│ enter open · / search · ? help                                                                               │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

How to test

Isolated store (main has no config.toml, so only TSK_STATE_DIR matters). Labels show at any width; narrow the pane to watch them wrap.

cargo build --release
T=$(mktemp -d); mkdir -p $T/state $T/alpha $T/beta
export TSK_STATE_DIR=$T/state TSK_NO_UPDATE_CHECK=1
B=./target/release/tsk
$B add -t "alpha shipping work" -p $T/alpha --thread ship
$B add -t "alpha cleanup" -p $T/alpha
$B add -t "beta api" -p $T/beta --thread ship
$B add -t "beta blocked thing" -p $T/beta --thread api
$B add -t "desk chore" --desk --thread ship
$B add -t "alpha inbox idea" -p $T/alpha --thread ship
$B add -t "alpha inbox loose" -p $T/alpha
$B add -t "Investigate why the login retry loop keeps firing after the session token refresh succeeds" -p $T/beta --thread ship
for n in 1 2 3; do $B status T$n started; done; $B status T4 blocked
env TSK_STATE_DIR=$TSK_STATE_DIR $B

On the board:

  1. Each row shows #thread · project two spaces after its title; the long beta title wraps and its label follows on the last line or the next one at the title indent. ON DECK · desk / inbox rows show only #ship. Narrow to 40 columns: labels stay, wrapping; nothing ends in ….
    1a. → (below 110 cols) peeks a row: the └─ line reads #ship · alpha and the row's inline label disappears.
  2. g → project: sub-headers ▾ alpha · 2 etc. in NEEDS YOU / IN MOTION; header shows group: project; grouped rows drop the project. The desk inbox stays flat under project grouping (desk tasks only).
  3. s → title: rows reorder inside each group; header group: project · sort: title.
  4. f on an alpha row folds alpha (▸ alpha · 2), cursor on the header. → unfolds it (cursor stays), ← folds it again; ← once more does nothing new (at 110+ cols it's the slider's left end). ↑/↓ stop on open sub-headers too.
    4a. Enter on ▾ alpha opens the alpha board (tab 2). Back on the desk (1), g → thread, Enter on ▾ #ship opens the #ship thread view; Enter on ▾ no thread does nothing. Single-click a sub-header: selects it, no fold. Double-click ▾ alpha: opens the alpha board, no fold. Double-click ▾ no thread (or desk on the desk, the inbox heading, archived in the drawer): folds it; again: unfolds.
    4b. At 110+ cols, on an open sub-header → slides the stage as usual; on a folded one → unfolds first, a second → slides.
  5. Shift+F folds every group incl. the inbox; again unfolds all. Enter on the inbox heading does nothing; ←/→ fold/unfold it.
  6. Fold alpha, Shift+M on its header → alpha unfolds, both rows marked; with multi-select already on, it adds to the set.
  7. t → ←/→ tabs: projects → alpha, then threads → #ship: chip reads alpha #ship ▾, only T1 left; done drawer (d) narrows too.
  8. 2 (pick alpha): g offers none · thread, s has no project; project board state is separate from the desk.
  9. Every header shows group: … ▾ sort: … ▾ beside the filter (desk, 2 project board, 3 thread View); click each → its picker. Click a sub-header → selects it (no fold).
  10. Inbox: on the alpha board g → thread: the inbox shows ▾ #ship · 1 / ▾ no thread · 1 under ▾ inbox · 2; f on an inbox row folds its sub-group; Shift+M on the folded sub-header marks it; Shift+F folds everything incl. the inbox.
  11. Projects tab (3) at 110+ columns: the preview's header row shows group: none ▾ sort: recent ▾ all ▾ next to the project name; clicking one slides to the preview and opens that picker, and the choice is the preview's own. In the Rail preview, g → thread, Enter on ▾ #ship leaves the preview for the #ship thread view.
  12. Narrow the pane: around 76 cols the pair reads g:none ▾ s:recent ▾; at 40 cols default controls disappear, and after g → thread they come back on their own row. With a long thread filter (t → a long thread) plus g → project, narrowing drops sort: recent first; group: project shortens to g:project but stays.

Verification

  • cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test: green. Every new regression test was watched failing with its fix reverted by hand: labels (re-adding the 78-column gate), the … fix (keeping the head line's padding), always-selectable sub-headers (old push_group_rows), ←/→ routing (removing the key intercept), Enter-to-open (old no-op), double-click, and the preview→outer request (not draining it). The peek test replaces one that asserted the old project-only └─ line. Earlier rounds: inbox grouping, header controls, per-control drop order, preview controls through Rail and the Split handoff.
  • Review round (Pi 446b2dd..2c33de3): new regression tests, each watched failing with its fix reverted: rail labels, the header verb bar, the desk no-op, the dirty-preview refusal through the outer hop (double-click; fold restored, draft and preview kept), the Split-preview double-click across the slide (the test asserts the slide moved the header), and a label that itself wraps (full text, title indent, inside the row). scripts/parity-pty-smoke.py now expects the full #release · tsk-parity peek line and passes at 40/78/109/110.
  • Fall-through: app::tests::arrows_fold_a_header_in_place_and_otherwise_keep_their_slider_and_peek_meaning checks → on an open header → StageRight (wide) / PeekDetail (narrow), ← on a folded one → inert at the slider's left end / CollapseDetail, and h/l the same.
  • site/: npm test 49/49, npm run build ok, prettier clean. Playwright parity (npm run test:parity) 49/49 locally plus new demo tests for inline labels at 40/78 and header ←/→/Enter. The parity reference frames are now 40 rows tall: the browser demo never scrolls, and with labels on every row the 24-row app frame grew a scrollbar that narrowed its wrap.
  • Live Herdr smoke (release build, isolated store, 88-col pane): inline and wrapped labels (T13/T15), peek └─ #perf · beacon; desk grouped by thread: ← folds ▾ #perf, a second ← does nothing, → unfolds, a second → falls through, Enter opens the #perf thread view; grouped by project, Enter on ▾ beacon opens the beacon board. Not run live: the 110+ slider fall-through (the pane is 88 wide; covered by the app routing test), the preview thread hand-off (covered by a dispatch test), and a sub-header double-click inside a Herdr pane. Real-terminal double-click was checked instead on the release binary in a pyte PTY (SGR presses 80 ms apart, isolated copy of the t216-after store, 100×30): a single click on ▾ herdr-file-viewer-long leaves it open; a double-click opens its board; a double-click on ▾ desk on the desk folds it.
  • Mouse-rule round: a_real_double_click_on_a_sub_header_opens_or_folds_it_at_every_width drives two real presses through board_mouse_click_intent_after_focus at 80 and 120 columns (#ship opens the thread view; no thread folds); it fails with the old disarm. New integration tests: single click selects only (sub-header, inbox, archived), double-click opens without folding, double-click folds no thread, desk on the desk, the inbox, and archived. ToggleArchivedGroup/ToggleInboxGroup no longer have a key or click; they stay as documented test-fixture intents. Parity: new spec for click-selects/double-click opens-or-folds; the archived drawer spec now double-clicks.
  • Review round (Pi 4dd1d5c..da39cdf): a_press_elsewhere_another_header_or_the_window_disarms_a_header_double_click (full board) and a_press_elsewhere_in_the_rail_preview_disarms_its_header_double_click (focused Rail preview) cover a press on a task row, a click on another header, and window expiry, through the app's mouse handler; the preview test fails with only the outer seat disarmed. The demo resets its header double-click on any non-header click, and the demo spec covers it (fails without the reset; its gestures now wait out the 350 ms window, since Playwright's back-to-back click and double-click were themselves forming a double-click).

Draft replies (not posted; owner approves wording first)

#175: Board rows now show their thread and project: every task row carries a dim #thread · project label after its title, at any width, that leaves out whatever the view already says, and g / s group and sort the board by project or thread (with f / Shift+F to fold groups). Thanks for the push on this.

#158: We went with threads rather than multi-repo projects: a thread name can span repositories and the desk, so an initiative is one thread. The desk now has a filter (t) with threads and projects tabs that combine, and g groups the desk by thread, so you can see one initiative across every repo at a glance.

#175, #158)

Wide rows (78+ columns) end with a dim #thread · project label that omits
whatever the view already says and drops rather than truncating the title.
Bare g groups the live sections by project or thread, s sorts by recent,
project, thread, or title, f folds the cursor's group, and Shift+F folds or
unfolds every group. Sub-groups fold like the inbox, Shift+M on a folded
sub-header marks the group, and t on the desk opens a threads/projects
filter. All session-only; no store change.
…, mirror grouping in the web demo

The desk peek still names only the project and a project board's peek only
the thread; row labels are computed separately. Group by, sort by, and fold
leave the palette while a task page owns input. The web demo gains row labels,
group/sort pickers, sub-group folding, and the tabbed desk filter.
@vercel

vercel Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
herdr-tsk Ready Ready Preview Oct 12, 2026 9:37pm UTC

…t+M inside multi-select, archived labels

- Project groups key on path identity, so spellings of one repository share a group.
- Grouping drops its dimension only in sections that group; the inbox, done drawer,
  and archived rows keep it. Archived rows carry the same label as done rows.
- Shift+M on a folded sub-header adds the group to an active multi-select set.
- Tests: header layout and desk-filter tab/option clicks, painted desk filter chip,
  the all-folded seed fallback, and sync_from_domain under grouping.
@jovric jovric Bot added the enhancement New feature or request label Oct 12, 2026
…s fold

- The `#thread · project` label follows the title two cells after its last
  word at every width, or starts the next line at the title's indent; nothing
  is truncated. A peek's closing line carries the same full label.
- Every group sub-header is a cursor stop. Enter or a double-click opens the
  sub-header's project board, the desk, or its thread's cross-project view;
  a preview seat hands that request to the outer board.
- Left/h folds and right/l unfolds the fold header under the cursor (a
  sub-group, the inbox, archived), ahead of the peek and the wide slider; with
  nothing to do the key keeps its usual meaning. Enter no longer folds.
…ss the slide

- Rail rows beside an open task page carry the inline label too.
- The status row on a fold header offers `enter open` (when the sub-header
  opens something) and `← fold` / `→ unfold`, instead of the stale
  `enter expand` / `enter collapse`; its arrow seat clicks like the key.
- A Projects-preview sub-header double-click survives the Split-to-Rail slide,
  using the same reflow gesture task rows use.
- Enter on the desk's own `desk` sub-header on the desk changes nothing, so a
  pinned search and marks stay.
- Tests for the dirty-preview refusal through the outer hop, a label that
  itself wraps, and stale comments fixed. The PTY smoke expects the full
  `#thread · project` peek line.
The desk sub-header on the desk is already open, so its bar no longer shows
`enter open`; the bar and Enter share one condition.
…ens nothing

A single click on a sub-header, the inbox, or archived now only selects it. A double-click
opens a sub-header's board; on a header that opens nothing it folds or unfolds instead.
The header's own second press no longer disarms its double-click.
A left press used to disarm only the outer board's pending double-clicks, so a header
click in the focused Rail preview stayed armed across a press elsewhere in the preview.
Disarm both seats, keeping only the arm the press itself continues. The demo resets its
header double-click on any other click.
@smarzban
smarzban merged commit a1a9d21 into main Oct 12, 2026
8 checks passed
@smarzban
smarzban deleted the tsk/t216-show-project-and-thread-on branch October 12, 2026 22:18

This branch was successfully deployed

1 active deployment
Preview — fec23245 Deployed Oct 12, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant