Stability Improvements, KPI/Filter/Search Fixes, and Column Reordering#11
Stability Improvements, KPI/Filter/Search Fixes, and Column Reordering#11drkatz wants to merge 36 commits intow3dev33:masterfrom
Conversation
Amp-Thread-ID: https://ampcode.com/threads/T-019cbf9a-3cd5-77c8-8b9d-6f836e505ef3 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cbf9a-3cd5-77c8-8b9d-6f836e505ef3 Co-authored-by: Amp <amp@ampcode.com>
…dler Replaces the debounce + isProcessing pattern in both watcher and SSE backends with a shared createQueuedHandler that guarantees: - At most one onChanged() in flight at any time - Exactly one follow-up rerun when events arrive during processing - Bounded consecutive reruns (max 5) to prevent unbounded loops - Self-write cooldown still respected Closes beads-task-issue-tracker-mtu.2 Amp-Thread-ID: https://ampcode.com/threads/T-019cbff6-d495-705b-bcf7-1f2af08ac9e5 Co-authored-by: Amp <amp@ampcode.com>
…gh churn Introduce usePollScheduler composable that gates all poll triggers (watcher, adaptive timer) through a shared backpressure gate with configurable min interval (default 2s). This prevents expensive pollForChanges() from running in tight loops during sustained .beads file churn. - requestPoll() enforces min interval, defers excess triggers - requestImmediatePoll() bypasses gate for manual refresh - Deduplicates rapid triggers (first defers, rest skip) - Lightweight instrumentation via stats (executed/skipped/deferred counters) - 6 unit tests covering all scheduler behaviors Closes: beads-task-issue-tracker-mtu.3 Amp-Thread-ID: https://ampcode.com/threads/T-019cbff9-c082-734b-9377-29bcc2c5a2b2 Co-authored-by: Amp <amp@ampcode.com>
- Create usePipelineDiagnostics composable tracking watcher batches, emitted/suppressed events, poll start/finish/duration, deferred runs, mtime check hit rate, and self-write cooldown skips - Instrument usePollScheduler, useChangeDetection, and pollForChanges with diagnostic recording calls - Add Pipeline tab to DebugPanel with compact 4-column diagnostic view (Watcher, Scheduler, Poll execution, Mtime check) with color-coded values and auto-refresh - Rate-limit console.debug logging to at most once per 5 seconds - Add 11 unit tests for the diagnostics composable Closes beads-task-issue-tracker-mtu.4 Amp-Thread-ID: https://ampcode.com/threads/T-019cbfff-8830-77cf-ac91-503d663048a1 Co-authored-by: Amp <amp@ampcode.com>
- Add vitest churn stress tests validating bounded pipeline behavior under sustained rapid triggers (500+ events over simulated time) - Add shell script for manual/CI .beads write churn generation - Add comprehensive runbook with reproduction steps, expected metrics, tuning guide, and rollback instructions Amp-Thread-ID: https://ampcode.com/threads/T-019cc007-348f-77a7-9ec1-8892d5020d9d Co-authored-by: Amp <amp@ampcode.com>
On non-macOS platforms, window manager controls (close/minimize/maximize) are positioned top-right and overlap the app header's action buttons. Detect platform and apply pr-20 + right-20 positioning on Linux/Windows (mirroring the pl-20 used for macOS traffic lights on the left). Fixes: beads-task-issue-tracker-xqu Amp-Thread-ID: https://ampcode.com/threads/T-019cc00d-7739-767c-8980-9bcbb92470ad Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9ab-00c2-733a-9fb7-be12f06c3f15 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9ab-0508-70d6-a357-45c08f4b7cd5 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9aa-fbc6-7469-abdc-e071f533dc71 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9b4-3b9d-74bb-9d44-e105db47bfc4 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9b4-4422-7102-9f89-11e5808e45d9 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9b9-c9af-733f-8a7b-a241ae46f8f6 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9c1-4b95-763f-ba69-bd962cbfe920 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9c1-4b95-763f-ba69-bd962cbfe920 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9c5-f01e-770f-810c-b31a4f0ae52a Co-authored-by: Amp <amp@ampcode.com>
Replace 'truncate' with 'leading-tight' on KpiCard title so labels like 'In Progress' display fully instead of being ellipsized. Fixes: beads-task-issue-tracker-8rm Amp-Thread-ID: https://ampcode.com/threads/T-019cc9ca-cb73-77f1-8ec6-29caee0e69c5 Co-authored-by: Amp <amp@ampcode.com>
Remove overflow-x-auto and add p-0.5/-m-0.5 padding/margin to KPI grid containers so ring-2 box-shadow renders fully visible on all edges. Applied to both desktop sidebar and mobile DashboardContent grids. Amp-Thread-ID: https://ampcode.com/threads/T-019cc9c6-c90e-730e-a74b-cb509cf49f78 Co-authored-by: Amp <amp@ampcode.com>
Switch from grid-cols-5 to flex-wrap so tiles have heterogeneous widths. Use whitespace-nowrap instead of truncate so labels like 'In Progress' stay on one line. Remove w-full so tiles shrink-fit. Amp-Thread-ID: https://ampcode.com/threads/T-019cc9ca-cb73-77f1-8ec6-29caee0e69c5 Co-authored-by: Amp <amp@ampcode.com>
Use px-2.5 py-1.5 instead of uniform p-1.5 so tile content has proper breathing room from the border on all sides. Amp-Thread-ID: https://ampcode.com/threads/T-019cc9ca-cb73-77f1-8ec6-29caee0e69c5 Co-authored-by: Amp <amp@ampcode.com>
Add shrink-0 to prevent flex from compressing wider tiles like 'IN PROGRESS', which was squeezing out horizontal padding. Amp-Thread-ID: https://ampcode.com/threads/T-019cc9ca-cb73-77f1-8ec6-29caee0e69c5 Co-authored-by: Amp <amp@ampcode.com>
- Switch grid layout to flex-wrap so tiles don't shrink below readable size - Use outline instead of ring for active state to prevent clipping by overflow-hidden - Add 75px minimum width to KPI tiles Amp-Thread-ID: https://ampcode.com/threads/T-019cc9c6-d539-71c4-8f00-78fb367b19a4 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9c6-d539-71c4-8f00-78fb367b19a4 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cc9c6-d539-71c4-8f00-78fb367b19a4 Co-authored-by: Amp <amp@ampcode.com>
…ate Ban icon Amp-Thread-ID: https://ampcode.com/threads/T-019cc9c6-d539-71c4-8f00-78fb367b19a4 Co-authored-by: Amp <amp@ampcode.com>
When clicking the Open KPI tile, issues with status='open' but with active blockedBy dependencies were incorrectly shown. Now filterIssues excludes dependency-blocked issues when 'blocked' is not in the status filter. Amp-Thread-ID: https://ampcode.com/threads/T-019cc9fe-e76d-7158-94bc-b3b49d8afb57 Co-authored-by: Amp <amp@ampcode.com>
Instead of clearing all filters, the All tile now populates the filter bar with all status filters as visible chips. Amp-Thread-ID: https://ampcode.com/threads/T-019cca02-a2ae-739a-94bb-a8caaa440a94 Co-authored-by: Amp <amp@ampcode.com>
The bd CLI list output doesn't include a blocked_by field — it only has a dependencies array with type: 'blocks' entries. The Tauri/Rust backend already computed blockedBy from these, but the Nitro server path passed through raw.blocked_by (always undefined), causing dependency-blocked issues to appear as unblocked. Also adds missing deferred/pinned/hooked to normalizeIssueStatus. Amp-Thread-ID: https://ampcode.com/threads/T-019cca02-a2ae-739a-94bb-a8caaa440a94 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cca0c-cc6c-74d5-b8d1-cffa5cfbf927 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cca0c-cc6c-74d5-b8d1-cffa5cfbf927 Co-authored-by: Amp <amp@ampcode.com>
Reka-ui's DropdownMenuCheckboxItem uses modelValue (not checked) to control the checked state. The :checked prop was being ignored, causing the checkmark indicator to never render for active filter selections. Fixes: beads-task-issue-tracker-6fr Amp-Thread-ID: https://ampcode.com/threads/T-019cca20-73d7-74f8-b334-e2f58130c2c4 Co-authored-by: Amp <amp@ampcode.com>
FilterChips were hidden via v-if="!isSearchActive" when search input had text. Removed this condition so filters remain visible during search. The FilterChips component already has its own v-if="hasFilters" guard. Fixes: beads-task-issue-tracker-tt4 Amp-Thread-ID: https://ampcode.com/threads/T-019cca2b-0af9-753f-9029-0090cc87dc65 Co-authored-by: Amp <amp@ampcode.com>
Previously, entering a search term would return all matching issues regardless of active status/type/priority/assignee/label filters. Now search results are intersected with all active filters, so only issues matching both the search term AND filter criteria are shown. Amp-Thread-ID: https://ampcode.com/threads/T-019cca30-5031-73e9-83ae-5c3a7a8c859f Co-authored-by: Amp <amp@ampcode.com>
- Add up/down arrow buttons to each column item for reordering - Column order persisted per-project via useProjectStorage - Add reorderColumns helper to useColumnConfig composable Co-authored-by: Amp <amp@ampcode.com> Amp-Thread-ID: https://ampcode.com/threads/T-019cca40-3ed1-73ef-98d8-3c130e3b237f
|
Thanks for this substantial PR! Solid work overall — the pipeline architecture and KPI logic are well thought out. Here's what I found during review: Bugs
Needs Manual Verification
Dead Code / Cleanup
UX Questions
What Looks Good
Nice contribution — looking forward to a v2 with the fixes above! |
|
A note on the broader context: Thanks again for the effort here — it's clear you've put real thought into this. Many of the changes (KPI tiles, always-visible filter chips, blocked quick-list, etc.) reflect personal workflow preferences, and that's totally valid. Different users have different needs — for instance, I prefer only showing filter chips when they're actively filtering, while you prefer them always visible. Neither approach is wrong, it's a matter of taste. That said, I'm not actively developing this project further (especially around the bd integration), so I don't think it makes sense to merge a PR of this scope into the main repo. It would set expectations of maintenance and direction that I can't commit to. The best path forward is probably to keep your fork as your own adapted version. If others in the community are interested, the discussion is open — but for now I'll leave the main repo as-is. Appreciate the contribution and the ideas! |
|
Thanks @w3dev33 for the review, good points and things to consider. I was working on these changes and pushed a few hours after the announcement for PaiR came out - Figured I'd PR just in case it was helpful. I will be continuing to maintain my fork as I encounter issues and find things to improve. |
|
Thanks for the gracious response! Of course, feel free to keep evolving your fork of Beads however you see fit — it's great to see someone pushing it further. If you're curious, you might also want to check out PaiR, the successor app. It already has quite a few improvements over this version. You're more than welcome to try it out and share any suggestions — present or future. Feedback is always appreciated! |
Summary
This PR consolidates a broad set of improvements focused on application stability under heavy update churn, dashboard/KPI correctness, filter/search behavior consistency, and issues table usability.
The scope includes backend watcher and polling pipeline hardening, UI diagnostics and stress tooling, KPI/filter logic fixes, search behavior fixes, and table column reordering support.
What Was Fixed
app/composables/useChangeDetection.ts.app/composables/usePollScheduler.tsand integrating it inapp/pages/index.vue.app/composables/useIssues.tsandapp/utils/issue-helpers.ts.app/utils/issue-helpers.ts,app/components/dashboard/DashboardContent.vue, andapp/pages/index.vue.app/utils/issue-helpers.ts.blockedBymapping from dependencies in server transformation logic inserver/utils/bd-transformers.ts.:model-valueusage in filter dropdown components underapp/components/issues/*FilterDropdown.vue.app/components/issues/IssueListPanel.vue.app/utils/issue-helpers.ts.app/components/dashboard/KpiCard.vue,app/components/dashboard/DashboardContent.vue, andapp/pages/index.vue.app/components/layout/AppHeader.vuewith related platform-side adjustments insrc-tauri/src/lib.rsandsrc-tauri/tauri.conf.json.app/components/issues/*,app/composables/*,app/utils/issue-helpers.ts, andsrc-tauri/src/lib.rs.What Was Added
app/composables/usePipelineDiagnostics.ts.app/components/layout/DebugPanel.vue.tests/composables/churn-stress.test.ts.tests/composables/usePollScheduler.test.tsandtests/composables/usePipelineDiagnostics.test.ts.tests/composables/useChangeDetection.test.ts.docs/churn-stress-runbook.mdandscripts/churn-stress.sh.app/components/dashboard/QuickList.vue.app/components/issues/ColumnConfig.vuewith persistence support inapp/composables/useColumnConfig.ts.app/composables/useFilters.tsandapp/pages/index.vue.What Was Refined
app/components/dashboard/DashboardContent.vueandapp/pages/index.vue.StatusBadgetooltip and removing redundant icon usage in issue table/details components.Validation
pnpm testpasses.pnpm buildpasses.masterto enable clean PR comparison.