diff --git a/ai/prompt-io/opencode/20260903T232525Z_fadab3d2_prompt_io.md b/ai/prompt-io/opencode/20260903T232525Z_fadab3d2_prompt_io.md new file mode 100644 index 00000000..6b1f91db --- /dev/null +++ b/ai/prompt-io/opencode/20260903T232525Z_fadab3d2_prompt_io.md @@ -0,0 +1,41 @@ +--- +model: gpt-5.6-sol +service: opencode +session: fsp-backfill-sync-live-volume +timestamp: 2026-09-03T23:25:25Z +git_ref: fadab3d2 +scope: code +substantive: true +raw_file: 20260903T232525Z_fadab3d2_prompt_io.raw.md +--- + +## Prompt + +Diagnose and fix MNQ's same-index volume repaint, missing post-closure +volume curve, stale zoomed-out downsample path, and repeated +`No yrange provided for dolla_vlm` warnings using live SHM evidence. + +## Response summary + +Declared source sample periods on `Flume` so FSP cascades cannot mistake +a market-closure timestamp gap for their regular cadence. Clamped +negative provider volume at sampling and volume-FSP boundaries, honored +M4 renderer cache invalidation, and skipped unchanged realtime FSP +redraws while retaining forced history repairs. + +## Files changed + +- `piker/data/flows.py` - declare RT/history sample periods. +- `piker/data/_sampling.py` - prevent negative sampled volume. +- `piker/fsp/_engine.py` - subscribe using the declared RT period. +- `piker/fsp/_volume.py` - clamp volume history and trade sizes. +- `piker/ui/_dataviz.py` - honor renderer cache resets. +- `piker/ui/_fsp.py` - skip identical realtime FSP redraws. +- `tests/test_fsp_sync.py` - cover the observed regressions. + +## Human edits + +The human identified each visual failure, supplied the exact console +warning, confirmed that the later-started `flow_rates` cascade behaved +correctly, requested declared cadence instead of timestamp inference, +performed chart restarts, and live-validated the final behavior. diff --git a/ai/prompt-io/opencode/20260903T232525Z_fadab3d2_prompt_io.raw.md b/ai/prompt-io/opencode/20260903T232525Z_fadab3d2_prompt_io.raw.md new file mode 100644 index 00000000..6353d0e9 --- /dev/null +++ b/ai/prompt-io/opencode/20260903T232525Z_fadab3d2_prompt_io.raw.md @@ -0,0 +1,71 @@ +--- +model: gpt-5.6-sol +service: opencode +timestamp: 2026-09-03T23:25:25Z +git_ref: fadab3d2 +diff_cmd: git diff HEAD~4..HEAD +--- + +## Prompt + +The human reported that the MNQ volume subchart repeatedly rendered +its last bar at one index around the equity-futures closure, then +reported that the volume curve disappeared after reopening. During +live testing, the human confirmed that `flow_rates`, which started +later, advanced correctly while `dolla_vlm` remained pinned. The human +then reported a stale downsampled curve on zoom-out and supplied the +repeated console warning: + +`No yrange provided for dolla_vlm!?` + +The human requested a live diagnosis and fix, validated each restart, +and confirmed the final chart behavior was fixed. + +## Response + +Read-only SHM snapshots showed that `dolla_vlm` remained at exclusive +bound `172801` while the source advanced hundreds of rows. Its one +current row kept receiving current quote values, explaining the +same-index repaint. `flow_rates` remained aligned because it started +after regular one-second timestamps resumed. + +The cascade had inferred its sampler period from the last two distinct +timestamps. A market closure therefore looked like the source cadence. +Explicit `Flume` RT/history periods now drive sampling and downsampling +metadata instead. + +> `git diff HEAD~4..HEAD -- piker/data/flows.py` + +> `git diff HEAD~4..HEAD -- piker/fsp/_engine.py` + +Further SHM inspection found an IB source row with volume `-2319096`. +`dolla_vlm` multiplied that value into a `-68277471626` outlier, causing +`Viz.maxmin()` to reject the zoomed-out range. Sample ingestion and +volume FSP history/realtime calculations now clamp negative volume. + +> `git diff HEAD~4..HEAD -- piker/data/_sampling.py` + +> `git diff HEAD~4..HEAD -- piker/fsp/_volume.py` + +The M4 renderer already returned a cache-reset signal after rebuilding +a downsampled path, but `Viz.update_graphics()` overwrote that signal +with `False`. The override was removed so Qt's device-coordinate cache +is invalidated with the new path. + +> `git diff HEAD~4..HEAD -- piker/ui/_dataviz.py` + +Normal quote cycles also redrew unchanged FSP state. A per-`Viz` +bounds/timestamp/value signature now suppresses only identical +realtime refreshes; forced history redraws still bypass it. + +> `git diff HEAD~4..HEAD -- piker/ui/_fsp.py` + +Regression coverage models closure-gap cadence, negative provider +volume, unchanged realtime redraws, and the broader FSP synchronization +behavior. + +> `git diff HEAD~4..HEAD -- tests/test_fsp_sync.py` + +Live verification after restart showed source and `dolla_vlm` advancing +at the same bound, zero negative destination rows, and correct zoomed-out +rendering. The focused suite completed with 38 passing tests. diff --git a/piker/ui/_dataviz.py b/piker/ui/_dataviz.py index 39ee2df9..bc43ed52 100644 --- a/piker/ui/_dataviz.py +++ b/piker/ui/_dataviz.py @@ -985,10 +985,10 @@ class Viz(Struct): # XXX: SUPER UGGGHHH... without this we get stale cache # graphics that "smear" across the view horizontally # when panning and the first datum is out of view.. - reset_cache = False if ( reset_cache - or should_redraw + or + should_redraw ): # assign output paths to graphicis obj but # after a coords-cache reset.