Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
96800cd
fix: live-mode chart sawtooth (bucket math) + slider auto-pan freeze
HanSur94 May 12, 2026
48dc88f
feat(quick-260512-hrn): add Follow toggle button to FastSenseToolbar
HanSur94 May 12, 2026
0bb8376
feat(quick-260512-hrn): add test + fix snap ordering in setFollow
HanSur94 May 12, 2026
cb592d2
docs(quick-260512-hrn): record Follow toggle completion in STATE.md
HanSur94 May 12, 2026
8e05a48
feat(quick-260512-hrn): add Follow toggle to DashboardToolbar (user-v…
HanSur94 May 12, 2026
21dcddc
fix(quick-260512-hrn): leave 2% right-edge padding when snapping/foll…
HanSur94 May 12, 2026
b274375
feat(quick-260512-hrn-followup): live slider edge labels below the strip
HanSur94 May 12, 2026
34095cc
fix(quick-260512-hrn-followup): below-slider labels mirror SELECTION,…
HanSur94 May 12, 2026
459e19f
feat(quick-260512-hrn-followup): remove inner slider labels, add midd…
HanSur94 May 12, 2026
840c707
fix(quick-260512-hrn-followup): middle duration label shows full d/h/m/s
HanSur94 May 13, 2026
498a5f3
fix(quick-260513-ovt): preserve Y-axis limits while Follow is engaged
HanSur94 May 13, 2026
4798dd6
docs(quick-260513-ovt): record commit hash in STATE.md
HanSur94 May 13, 2026
ca5be95
fix(quick-260513-ovt): preserve widget X and Y views across Live ticks
HanSur94 May 13, 2026
2506303
docs(quick-260513-ovt): record broader Live-preserve scope in STATE.md
HanSur94 May 13, 2026
8d41c48
fix(quick-260513-ovt): flip default LiveViewMode to 'preserve' + make…
HanSur94 May 13, 2026
4244493
docs(quick-260513-ovt): record default flip + syncFollowState fix in …
HanSur94 May 13, 2026
63cdff4
fix(quick-260513-ovt): Follow toggle now reaches widgets on every page
HanSur94 May 13, 2026
2893a53
docs(quick-260513-ovt): record multi-page Follow fix in STATE.md
HanSur94 May 13, 2026
577bf95
fix(quick-260513-q7w): debounced post-resize refresh stops widgets go…
HanSur94 May 13, 2026
5638e95
docs(quick-260513-q7w): record debounced post-resize refresh in STATE.md
HanSur94 May 13, 2026
23f7ebf
docs(quick-260513-q7w): add row to Quick Tasks Completed table
HanSur94 May 13, 2026
99c8808
fix(quick-260513-q7w): two-pass post-resize refresh — detect + escala…
HanSur94 May 13, 2026
6d42df3
docs(quick-260513-q7w): record two-pass escalation in STATE.md
HanSur94 May 13, 2026
4eda604
fix(quick-260513-q7w): add 1.2s rerenderWidgets backstop timer
HanSur94 May 13, 2026
9ca8f3f
docs(quick-260513-q7w): record backstop timer + re-entrancy guard in …
HanSur94 May 13, 2026
bc305dc
fix(quick-260513-q7w): cancel resize timers on tab switch + guard aga…
HanSur94 May 13, 2026
3c2ca60
docs(quick-260513-q7w): record switchPage cancel + IsRerendering_ gua…
HanSur94 May 13, 2026
54d5aa0
fix(quick-260513-q7w): switchPage waits for in-flight rerenderWidgets
HanSur94 May 13, 2026
862b3c1
docs(quick-260513-q7w): record switchPage wait-for-rerender in STATE.md
HanSur94 May 13, 2026
20bcd4c
fix(quick-260513-q7w): rerenderWidgets must delete the OUTER cell pan…
HanSur94 May 13, 2026
13b3d64
docs(quick-260513-q7w): record zombie-panel root-cause fix in STATE.md
HanSur94 May 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions .planning/STATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ gsd_state_version: 1.0
milestone: v3.0
milestone_name: FastSense Companion
status: shipped
last_updated: "2026-05-11T14:20:05.000Z"
last_activity: 2026-05-11 -- Quick fix 260511-n1r: delete FigureDestroyedListener_ at top of DashboardEngine.delete() — fixes R2021b CI segfault in TestDashboardDirtyFlag (listener could fire on partially-destroyed obj during MATLAB GC)
last_updated: "2026-05-12T09:20:00.000Z"
last_activity: 2026-05-13 -- Quick task 260513-q7w: Debounced post-resize refresh + ROOT-CAUSE ZOMBIE-PANEL FIX. After widget realization w.hPanel points to the inner content panel; rerenderWidgets was only deleting that and leaving the outer cell + WidgetButtonBar chrome alive on the canvas, stacking up zombies across multiple rerenders that painted over switched-to pages. Now deletes the outer cell (hCellPanel) properly. Canvas children stay constant at 29 across 4 rerenders + resize + tab switch.
progress:
total_phases: 6
completed_phases: 2
Expand All @@ -20,7 +20,7 @@ Phase: 1028
Plan: Not started
Milestone: v3.0 FastSense Companion — SHIPPED 2026-04-30
Status: Awaiting next milestone (run `/gsd:new-milestone` to scope v3.x or v4.0)
Last activity: 2026-05-11 - Completed quick task 260511-n1r: Sever FigureDestroyedListener_ at top of DashboardEngine.delete() to prevent R2021b CI segfault — TestDashboardDirtyFlag 6/6, TestFastSenseCompanion 64/64
Last activity: 2026-05-13 - Completed quick task 260513-q7w: Debounced two-pass post-resize refresh. Initial commit 577bf95 added the ResizeDebounceTimer + cheap update()/refresh() sweep (mirrors SliderDebounceTimer). User reported "still white at very small window sizes" — so follow-up 99c8808 made the refresh callback two-pass: pass 1 = cheap update(); pass 2 = detect any FastSenseWidget whose first line has empty XData but whose Tag has samples (the visible "white" symptom), then escalate to per-widget refresh() and, if still white, to engine-level rerenderWidgets(). Synthetic test on the live demo: forced XData=[] on a real widget's line (941→0), refreshActivePageWidgetsAfterResize_ restored it (0→941). test_dashboard_time_sync_all_pages 5/5 PASS, test_dashboard_range_selector_integration 2/2 PASS.

### Quick Tasks Completed

Expand Down Expand Up @@ -56,6 +56,14 @@ Last activity: 2026-05-11 - Completed quick task 260511-n1r: Sever FigureDestroy
| 260511-ldu | PR #125 followup polish — extract bringFigureToFront_, tighten crosshair visibility, +2 tests, doc fixes | 2026-05-11 | 134a0d9 | — | [260511-ldu-pr-125-followup-polish-extract-bringfigu](./quick/260511-ldu-pr-125-followup-polish-extract-bringfigu/) |
| 260511-mjb | Fix 2 pre-existing TestFastSenseCompanion failures — findobj→findall for uifigure lookup; ObjectBeingDestroyed safety-net listener on DashboardEngine.hFigure (stops LiveTimer for delete(fig)/close all force paths) | 2026-05-11 | 8df1a67 | Verified | [260511-mjb-fix-2-pre-existing-testfastsensecompanio](./quick/260511-mjb-fix-2-pre-existing-testfastsensecompanio/) |
| 260511-n1r | Sever FigureDestroyedListener_ at top of DashboardEngine.delete() — fixes R2021b CI segfault in TestDashboardDirtyFlag (listener captured engine handle; on R2021b GC could destroy engine before its hFigure, then listener fired on deleted handle inside MATLAB's C++ dispatch layer) | 2026-05-11 | e7026bb | Verified | [260511-n1r-fix-r2021b-segfault-delete-figuredestroy](./quick/260511-n1r-fix-r2021b-segfault-delete-figuredestroy/) |
| 260512-c5x | Fix tail-truncation artifact in FastSense MinMax downsampling — append (segX(end), segY(end)) anchor in all four cores (MEX/pure-MATLAB/log-X/slider-preview) when bucket's min/max miss segX(end). Industrial plant demo reactor.pressure tail delta 10580s→0.97s; n=2*nb+1 when anchor needed | 2026-05-12 | c932acd | Verified | [260512-c5x-fix-tail-truncation-artifact-in-fastsens](./quick/260512-c5x-fix-tail-truncation-artifact-in-fastsens/) |
| 260512-cxc | Fix slider preview tail stuck at interior bucket midpoint (260512-c5x follow-up) — in getPreviewSeries capture anchorX before dropping the trailing point, then override xCenters(end):=anchorX so the slider tail tracks live data growth. Industrial plant demo slider-tail delta 414s→0.00s; tracks tick-for-tick after Reset | 2026-05-12 | f79642a | Verified | [260512-cxc-fix-slider-preview-tail-stuck-at-interio](./quick/260512-cxc-fix-slider-preview-tail-stuck-at-interio/) |
| 260512-egv | Fix slider drag broken after top-toolbar Reset — add TimeRangeSelector.reinstallCallbacks + call at end of DashboardEngine.rerenderWidgets. Root cause: HoverCrosshair's chained WBM pattern unwinds in install order (not LIFO) when rerenderWidgets deletes widget panels 1..N, leaving a dangling-handle closure on the figure WBM that swallows motion events before they reach trs.onButtonMotion_. Re-installing TRS callbacks at the outermost layer restores drag. Acknowledged trade-off: per-widget HoverCrosshair goes inert until next instantiation (out-of-scope refactor) | 2026-05-12 | 7ab7584 | Verified | [260512-egv-fix-slider-drag-broken-after-reset-due-t](./quick/260512-egv-fix-slider-drag-broken-after-reset-due-t/) |
| 260512-eu2 | Restore HoverCrosshair after Reset (260512-egv follow-up) — move TRS.reinstallCallbacks from end of rerenderWidgets to BETWEEN the delete-old-panels loop and the allocate-new-panels block. New chain post-rerender: newHcN→...→newHc1→trs.onButtonMotion_. Both slider drag AND per-widget HoverCrosshair work after Reset. Verified on live demo: POST-RESET WBM = HC's onFigureMove_, synth drag moves Selection by ~1.74 days, 2 live HoverCrosshair instances alive on active page | 2026-05-12 | dc84454 | Verified | [260512-eu2-restore-hovercrosshair-after-reset-by-mo](./quick/260512-eu2-restore-hovercrosshair-after-reset-by-mo/) |
| 260512-fd9 | Industrial plant demo opens with Live mode OFF by default — removed `engine.startLive()` from buildDashboard.m. Both dashboard and companion now start idle (engine.IsLive=0, companion.IsLive=0); user opts in via the top-toolbar "Live" button. Aligns the two windows on the same default; data writer + LiveTagPipeline keep running independently in the background | 2026-05-12 | ac0baaa | Verified | (inline) |
| 260512-hrn | Add Follow uitoggletool to FastSenseToolbar — between Live and Metadata — with setFollow(), syncFollowState(), IsPropagating-aware auto-disengage in FastSense.onXLimChanged, AppData stash at 4 attacher sites, and 9 function-style tests (test_fastsense_follow_toggle.m) | 2026-05-12 | 596d399, 0a4a516 | — | [260512-hrn-add-follow-toggle-button-to-fastsense-to](./quick/260512-hrn-add-follow-toggle-button-to-fastsense-to/) |
| 260513-ovt | Preserve widget X and Y views across Live ticks + Follow toggle reaches every page — (1) added LiveViewMode='follow' guard inside FastSenseWidget.autoScaleY_, (2) removed `autoScaleY_(y)` from FastSenseWidget.refresh/update, (3) removed `broadcastTimeRange(tStart, tEnd)` from DashboardEngine.onLiveTick, (4) flipped FastSenseWidget.LiveViewMode default 'reset'→'preserve', (5) made FastSenseToolbar.syncFollowState public so FastSense.onXLimChanged's auto-disengage hook actually syncs the Follow button, (6) made DashboardEngine.{allPageWidgets,activePageWidgets} public + onFollowToggle uses allPageWidgets() so Follow actually flips every FastSenseWidget across all pages on multi-page dashboards (was silently no-op via swallowed MethodRestricted). Live mode is now strictly "append data only"; Follow does width-preserving slide with 2% right-edge gap. test_fastsense_follow_toggle 10/10, test_dashboard_time_sync_all_pages 5/5, test_dashboard_range_selector_integration 2/2; verified end-to-end on industrial plant demo (Follow ON: XLim+0.140d toward tail, width preserved exactly, 2/2 widgets switched; OFF: 2/2 reverted) | 2026-05-13 | 498a5f3, ca5be95, 8d41c48, 63cdff4 | — | [260513-ovt-when-follow-button-is-pressed-y-axis-lim](./quick/260513-ovt-when-follow-button-is-pressed-y-axis-lim/) |
| 260513-q7w | Debounced post-resize refresh + ZOMBIE-PANEL fix that stops widgets going white during drag-resize and tab switching — TWO parallel timers on every figure resize event (300 ms cheap two-pass refresh + 1.2 s unconditional rerenderWidgets backstop). switchPage cancels both timers AND waits up to 3 s for in-flight rerenderWidgets to complete before mutating state. `IsRerendering_` flag prevents rerender-cascade scheduling. Re-entrancy guard aborts instead of self-rescheduling. **Root-cause fix**: rerenderWidgets now deletes the OUTER cell panel (via hCellPanel, falling back to hPanel for pre-realization widgets) — previous code deleted only `hPanel` which after realization points to the INNER content panel, leaving the outer cell + its WidgetButtonBar chrome alive on the canvas as "zombies" that stacked up over multiple rerenders and painted over freshly switched-to pages. test_dashboard_range_selector_integration 2/2, test_dashboard_time_sync_all_pages 5/5; canvas-children-count canary verifies zero zombie accumulation across 4 rerenders + resize + tab switch (constant 29) | 2026-05-13 | 577bf95, 99c8808, 4eda604, bc305dc, 54d5aa0, 20bcd4c | — | [260513-q7w-during-dashboard-figure-resize-fastsense](./quick/260513-q7w-during-dashboard-figure-resize-fastsense/) |

## Progress Bar

Expand Down
Loading
Loading