Skip to content

Yoke date ranges across panels - #744

Merged
wesm merged 14 commits into
mainfrom
codex/yoke-dates-across-panels
Jun 20, 2026
Merged

Yoke date ranges across panels#744
wesm merged 14 commits into
mainfrom
codex/yoke-dates-across-panels

Conversation

@cpcloud

@cpcloud cpcloud commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

This PR adds persisted date yoking across date-aware panels so selecting a date range in sessions analytics, usage, activity, trends, or insights carries across the rest of the viewer. Date yoking is now unconditional: there is no toggle, no opt-out UI, and no persisted enabled flag.

The frontend now has a shared yoke-date store that persists the current range in localStorage, plus URL/yoke precedence rules per panel. Explicit URL date params still win over stored yoke state, bare routes seed from the stored yoke range, and analytics/usage initial fetches wait until URL/yoke date state has been applied.

The UI work removes the old link-button affordance from the top date controls and leaves the existing date pickers/presets as the only visible date controls. Shared local date helpers keep rolling and fixed range materialization consistent across panels, including sessions window_days URLs and activity week/month period bounds.

Activity adopts only yoked ranges its backend can represent exactly. Longer ranges such as a 1y analytics/usage yoke are left on Activity's current range instead of being silently clipped or causing Activity's one-year custom-range limit to reject the first load.

Reviewers should start with frontend/src/lib/stores/yokedDates.svelte.ts, frontend/src/App.svelte, and the page integrations under frontend/src/lib/components/{analytics,usage,activity,trends,insights}/.

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (fc4266c)

Medium issues found in the date-yoking frontend changes; no High or Critical findings.

Medium

  • frontend/src/lib/components/activity/ActivityPage.svelte:89
    Week and month activity presets write the wrong yoked range when the anchor date is not the actual period start. The backend resolves weeks to ISO Monday and months to day 1, but the yoke stores activity.date as the start.
    Fix: Compute the same preset bounds as the activity backend, or derive the yoked range from the resolved report bounds.

  • frontend/src/lib/components/insights/InsightsPage.svelte:147
    Applying URL or stored yoked dates only updates dateFrom/dateTo; if the user previously selected agent_analysis, uiMode remains agent analysis and the seeded range is hidden or misapplied.
    Fix: When applying insight URL/yoke dates, reset the insight type to daily_activity or otherwise ensure date-range mode reflects the applied range.


Panel: ci_default_security | Synthesis: codex, 8s | Members: codex_default (codex/default, done, 5m9s), codex_security (codex/security, done, 14s) | Total: 5m31s

@cpcloud
cpcloud force-pushed the codex/yoke-dates-across-panels branch from fc4266c to e93a7b1 Compare June 19, 2026 13:55
@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (e93a7b1)

Summary verdict: two Medium frontend state/range consistency issues need fixes; no High or Critical findings were reported.

Medium

  • frontend/src/lib/components/activity/ActivityPage.svelte:90
    Week and month activity yoke ranges start at activity.date, while the backend expands weeks from ISO Monday and months from the first day of the month. Selecting a mid-week or mid-month activity report can yoke only a partial range to other panels.
    Fix: Mirror the backend preset expansion for week/month, or derive the yoked range from the resolved report bounds.

  • frontend/src/lib/components/insights/InsightsPage.svelte:147
    Applying URL or stored yoke dates only updates dateFrom/dateTo; it does not reset insights.type to daily_activity. If the store was previously in agent_analysis, the yoked date range can be hidden behind agent-analysis mode and generation can use the wrong insight type.
    Fix: Set the insight type to daily_activity when applying yoke or explicit insight date params.


Panel: ci_default_security | Synthesis: codex, 8s | Members: codex_default (codex/default, done, 3m53s), codex_security (codex/security, done, 1m0s) | Total: 5m1s

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (005a9e3)

Analytics date sync is mostly sound, but one Medium issue remains where chart-driven range changes bypass the new shared date flow.

Medium

  • frontend/src/lib/components/analytics/ActivityTimeline.svelte:137
    Week/month bar clicks still call analytics.setDateRange() directly, bypassing the new yoke and URL writeback path in AnalyticsPage. The visible analytics range changes, but yokedDates and /sessions date params stay stale, so navigating to another panel can seed from the previous range.
    Fix: Route timeline range selections through the same handler used by DateRangeSelector, such as passing an onDateRangeChange callback from AnalyticsPage, or move the yoke/URL side effects into a shared analytics date-range commit function.

Panel: ci_default_security | Synthesis: codex, 6s | Members: codex_default (codex/default, done, 5m45s), codex_security (codex/security, done, 22s) | Total: 6m13s

@mariusvniekerk

Copy link
Copy Markdown
Collaborator

do we need a toggle? Seems sensible enough to just DO?

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (2d870c6)

Medium issues remain in the frontend date URL/yoking flow; no security findings were reported.

Medium

  • frontend/src/lib/components/analytics/AnalyticsPage.svelte:273
    One-sided session date URLs such as ?date_from=2026-06-01 return null from sessionParamsToPanelDate, so this branch treats them as having no date state and seeds from the stored yoke. With yoking enabled by default, that overwrites an explicit existing session filter URL.
    Fix: Distinguish “has any session date params” from “has a complete panel range”; preserve partial date_from/date_to URLs and skip yoke seeding/writeback unless a canonical range can be formed.

  • frontend/src/App.svelte:226
    The new /sessions?window_days=... rolling date param is not integrated with the sessions route URL handling. The app can load the sidebar with stale persisted date filters on a rolling deep link, and later session-filter writeback can drop window_days from the shareable URL.
    Fix: Preserve window_days as sessions-route analytics date state during init/writeback, and reload sessions when rolling URL handling clears stale fixed date filters.


Panel: ci_default_security | Synthesis: codex, 8s | Members: codex_default (codex/default, done, 8m42s), codex_security (codex/security, done, 1m58s) | Total: 10m48s

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (ec3978a)

Medium-confidence issues remain; no Critical or High findings were reported.

Medium

  • frontend/src/lib/components/analytics/AnalyticsPage.svelte:254
    The session-filter sync effect can call analytics.fetchAll() before the later URL/yoke date initialization effect has applied explicit or stored dates. If a non-date session filter is already set when the dashboard mounts, the first analytics request can use the default or stale date range.
    Fix: Gate this fetch until date initialization has completed, or initialize URL/yoke dates before allowing the filter-sync effect to fetch.

  • frontend/src/lib/components/analytics/AnalyticsPage.test.ts:302, frontend/src/lib/components/usage/UsagePage.test.ts:188
    These full-page jsdom mounts render child charts that instantiate ResizeObserver, but the tests do not stub it. jsdom does not provide ResizeObserver, so these tests can fail with ReferenceError.
    Fix: Stub globalThis.ResizeObserver in the test beforeEach and restore it afterward, or mock the chart components.


Panel: ci_default_security | Synthesis: codex, 7s | Members: codex_default (codex/default, done, 9m15s), codex_security (codex/security, done, 25s) | Total: 9m47s

@cpcloud

cpcloud commented Jun 19, 2026

Copy link
Copy Markdown
Contributor Author

I can definitely remove the toggle.

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (bca9f90)

Medium confidence: one Medium issue needs fixing before merge.

Medium

  • frontend/src/lib/stores/yokedDates.svelte.ts:221
    Activity yoke adoption converts every stored range into a custom from/to range. A common 1y or All range from analytics/usage can exceed Activity’s backend range limit once Activity turns the inclusive to date into an exclusive next-day bound, causing the first Activity load to fail with a range-limit error.
    Fix: Validate Activity-bound yoked ranges before applying them; skip or clamp unsupported spans, or map only safe ranges to Activity custom params. Add a regression test for a 1y or other large stored yoke entering Activity.

Panel: ci_default_security | Synthesis: codex, 8s | Members: codex_default (codex/default, done, 6m12s), codex_security (codex/security, done, 14s) | Total: 6m34s

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (edff332)

No Medium, High, or Critical findings were reported.

The only reported issues were Low severity, so they are omitted per review rules.


Panel: ci_default_security | Synthesis: codex, 4s | Members: codex_default (codex/default, done, 7m55s), codex_security (codex/security, done, 13s) | Total: 8m12s

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (399c707)

Summary verdict: one medium issue needs fixing before merge.

Medium

  • frontend/src/lib/components/analytics/AnalyticsPage.test.ts:33, frontend/src/lib/components/usage/UsagePage.test.ts:25
    • The new vi.mock factories spread await importOriginal() without typing it. With strict TypeScript checks and string-path vi.mock, importOriginal() defaults to unknown, so these test files can fail npm run check.
    • Fix by typing the calls, for example await importOriginal<typeof import("../../api/runtime.js")>(), and apply the same pattern to the generated API module mocks.

Panel: ci_default_security | Synthesis: codex, 6s | Members: codex_default (codex/default, done, 9m5s), codex_security (codex/security, done, 1m47s) | Total: 10m58s

@cpcloud
cpcloud force-pushed the codex/yoke-dates-across-panels branch from 399c707 to 3ce1409 Compare June 19, 2026 16:37
@wesm

wesm commented Jun 19, 2026

Copy link
Copy Markdown
Member

rebasing

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (7ed4be0)

No issues found.


Panel: ci_default_security | Synthesis: codex | Members: codex_default (codex/default, done, 7m31s), codex_security (codex/security, done, 1m28s) | Total: 8m59s

@cpcloud
cpcloud force-pushed the codex/yoke-dates-across-panels branch from 7ed4be0 to ad26d47 Compare June 19, 2026 17:03
@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (ad26d47)

Summary verdict: one medium issue remains; no high or critical findings were reported.

Medium

  • frontend/src/lib/components/usage/UsagePage.svelte:313 - Usage date changes update the shared yoke but leave existing sessions.filters.date/dateFrom/dateTo untouched, while URL writeback still merges all sessionUrlParams. A user coming from a sessions date range who then picks a different usage range can get /usage URLs with conflicting from/to and stale date_from/date_to; reloading or sharing that URL hydrates the old hidden session date filters.
    • Fix: When applying a usage date/yoke change, clear or update the session date filter fields to match, or omit date, date_from, and date_to from the session params merged into usage URLs.

Panel: ci_default_security | Synthesis: codex, 8s | Members: codex_default (codex/default, done, 8m53s), codex_security (codex/security, done, 1m40s) | Total: 10m41s

@wesm
wesm force-pushed the codex/yoke-dates-across-panels branch from ad26d47 to d2b09fe Compare June 19, 2026 17:23
@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (87addd3)

Medium issue found; no High or Critical findings.

Medium

  • frontend/src/lib/components/analytics/AnalyticsPage.svelte:310
    The saved yoke range is re-applied every time the sessions URL has no date params, not only during initial panel seeding. Clearing session filters removes date/date_from/date_to from the URL, but this branch immediately reads the stored fixed yoke and writes those date filters back, making the fixed date filter effectively impossible to clear.

    Fix: Only seed from yokedDates.seedForPanel() on the first initialization run, or explicitly clear/update the yoke when the user clears date filters.


Panel: ci_default_security | Synthesis: codex, 6s | Members: codex_default (codex/default, done, 8m11s), codex_security (codex/security, done, 1m6s) | Total: 9m23s

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (faf15d8)

Medium confidence: one Medium issue remains around termination URL filter hydration/write-back.

Medium

  • frontend/src/App.svelte:228 and frontend/src/lib/components/usage/UsagePage.svelte:162
    termination is serialized by filtersToParams and preserved by SESSION_ROUTE_PARAMS, but it is missing from the filter-key sets that drive URL hydration/equality. As a result, termination-only /sessions?termination=... deep links are ignored, termination-only filter changes are not written back on /sessions, and /usage?...termination=... links do not rehydrate the session filter.
    Fix: Add "termination" to both SESSION_FILTER_KEYS sets and add termination-only URL hydration/write-back tests.

Panel: ci_default_security | Synthesis: codex, 6s | Members: codex_default (codex/default, done, 5m8s), codex_security (codex/security, done, 23s) | Total: 5m37s

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (e9b6348)

Medium finding only:

  • Medium - frontend/src/lib/components/analytics/AnalyticsPage.svelte:140: applyAnalyticsPanelDate clears selectedDate, selectedDow, and selectedHour through analytics.applyDateRange/applyRollingWindow, but its change detection only compares range fields. Re-applying the same URL/yoke range can clear drill-down filters while returning false, so the page can skip fetchAll() and leave data fetched for the old drill-down state.
    • Fix: Include the cleared drill-down fields in the before/after comparison, or have the store methods report whether any analytics state changed and use that to trigger the fetch.

Panel: ci_default_security | Synthesis: codex, 6s | Members: codex_default (codex/default, done, 8m8s), codex_security (codex/security, done, 1m56s) | Total: 10m10s

@mariusvniekerk
mariusvniekerk force-pushed the codex/yoke-dates-across-panels branch from e9b6348 to 7ed6385 Compare June 19, 2026 22:06
@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (7ed6385)

Summary verdict: Two medium frontend URL-state regressions need fixes; no high or critical findings were reported.

Medium

  • Location: frontend/src/lib/stores/usage.svelte.ts:692
    Problem: termination is treated as unsupported and stripped from usage URLs, even though the generated Usage API, backend, and UsageStore.baseParams() still support/send sessions.filters.termination. This makes /usage?termination=unclean silently lose the filter during hydration/writeback, so shared or bookmarked usage URLs no longer match the filtered data.
    Fix: Keep termination in the supported usage/session URL params and stop stripping it here, or remove termination from the usage request path entirely if it is truly unsupported.

  • Location: frontend/src/lib/components/insights/InsightsPage.svelte:411
    Problem: Selecting a generated insight or task replaces the whole query string with only insight or {}, dropping the newly added date_from/date_to insight URL state. After choosing an archive item, copying/bookmarking/reloading the URL no longer preserves the selected insight date range.
    Fix: Preserve existing route params when updating insight selection, only setting or clearing the insight key; update copied insight links to include the current date params as well.


Panel: ci_default_security | Synthesis: codex, 9s | Members: codex_default (codex/default, done, 6m57s), codex_security (codex/security, done, 1m40s) | Total: 8m46s

@wesm
wesm force-pushed the codex/yoke-dates-across-panels branch from 7ed6385 to e6b79f9 Compare June 19, 2026 22:50
@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (e6b79f9)

Summary verdict: one Medium issue remains; no High or Critical findings were reported.

Medium

  • frontend/src/lib/stores/activity.svelte.ts:104; frontend/src/lib/components/trends/TrendsPage.svelte:128; frontend/src/lib/stores/analytics.svelte.ts:711
    Rolling windows are only materialized when selected or hydrated. Later manual or periodic refreshes reuse the old from/to, so a panel can still show Last 30 days / window_days=30 while querying yesterday’s fixed range after the date rolls over.

    Fix: Before each refresh/fetch for rolling state, recompute from/to from the stored window days, and update the URL/yoke state if the materialized bounds changed.


Panel: ci_default_security | Synthesis: codex, 8s | Members: codex_default (codex/default, done, 9m58s), codex_security (codex/security, done, 1m13s) | Total: 11m19s

@roborev-ci

roborev-ci Bot commented Jun 19, 2026

Copy link
Copy Markdown

roborev: Combined Review (f28b9cb)

Verdict: Two medium frontend date-filter regressions need attention before merge.

Medium

  • frontend/src/lib/components/analytics/AnalyticsPage.svelte:145
    Rolling date selections clear the session date filters and only write window_days, but the session store/API does not apply window_days. The sidebar/session results become unbounded while analytics panels show the rolling window.
    Fix: Materialize the rolling bounds into the session filter state before loading sessions, or add real window_days handling to the session filter/API path while preserving rolling URL intent separately.

  • frontend/src/lib/components/analytics/AnalyticsPage.svelte:115
    The URL date-change signature ignores the resolved state.from/state.to. For single-bound links like ?date_to=..., the first hydration can run before sync.stats.earliest_session is loaded, resolve to a same-day range, and never update when the earliest bound arrives.
    Fix: Include resolved bounds in the signature and/or defer applying date_to-only session dates until the earliest bound is available.


Panel: ci_default_security | Synthesis: codex, 8s | Members: codex_default (codex/default, done, 9m12s), codex_security (codex/security, done, 1m21s) | Total: 10m41s

@roborev-ci

roborev-ci Bot commented Jun 20, 2026

Copy link
Copy Markdown

roborev: Combined Review (9119efc)

Summary verdict: changes need follow-up for rolling-window date state drift; no security issues were reported.

Medium

  • frontend/src/App.svelte:257
    sessionRouteParamsForFilters drops window_days whenever filtersToParams(sessions.filters) contains concrete date_from/date_to. Analytics writes rolling session URLs as concrete bounds plus window_days, but the global sessions URL writeback immediately rewrites them without window_days, so rolling deep links become fixed-date links and stop rolling on reload.
    Fix: Preserve a valid current window_days when it is the active rolling intent, even when concrete date bounds are present, or make the analytics/session date writeback own this normalization.

  • frontend/src/lib/components/analytics/AnalyticsPage.svelte:446
    The refresh path calls analytics.fetchAll() directly. For rolling windows, fetchAll() updates analytics.from/to, but it does not refresh sessions.filters.dateFrom/dateTo or the URL’s concrete date bounds, so the analytics panels advance while the sidebar session filter and URL remain on the previous day’s range.
    Fix: Route analytics refreshes through a wrapper that materializes the rolling range, updates yoke state, rewrites session date params, and reloads sessions when the concrete bounds changed.


Panel: ci_default_security | Synthesis: codex, 8s | Members: codex_default (codex/default, done, 3m48s), codex_security (codex/security, done, 1m29s) | Total: 5m25s

@roborev-ci

roborev-ci Bot commented Jun 20, 2026

Copy link
Copy Markdown

roborev: Combined Review (08895aa)

The PR has one medium issue to fix before merge.

Medium

  • frontend/src/App.svelte:268: shouldPreserveSessionWindowDays preserves window_days even when the next session params intentionally remove all fixed date filters. Clearing session filters from a rolling-date sessions URL can leave window_days in the URL, so reload/share/back navigation restores the rolling date filter even though the current view appears cleared.
    • Fix: Only preserve window_days when materialized date bounds are being kept or first written, not when nextParams has cleared date/date_from/date_to while the current URL had fixed bounds.

Panel: ci_default_security | Synthesis: codex, 6s | Members: codex_default (codex/default, done, 9m14s), codex_security (codex/security, done, 15s) | Total: 9m35s

@roborev-ci

roborev-ci Bot commented Jun 20, 2026

Copy link
Copy Markdown

roborev: Review Unavailable (e190b32)

The review agent repeatedly failed to run (likely an agent or configuration error). roborev will try again on the next commit.

Last error: agent: claude-code failed stream: stream errors: You've hit your session limit · resets 5:50am (UTC): exit status 1

cpcloud and others added 2 commits June 20, 2026 08:11
Synchronize date range selection across date-aware panels while preserving each panel's URL and API semantics. The branch keeps sessions, analytics, usage, activity, trends, and insights aligned through a shared yoke state without letting unsupported or stale query params silently change visible data.

This replaces a long review-fix stack with one coherent frontend change so the final branch is reviewable as the feature it implements rather than as a sequence of conflict and URL-state repairs.

Co-authored-by: Wes McKinney <wesmckinn+git@gmail.com>
Rolling windows keep their window size as durable intent, but several refresh paths reused the previously materialized date range. That let panels claim a relative window while querying stale fixed bounds after the calendar date advanced.

Refresh paths now rematerialize rolling ranges before fetching and update URL/yoke state where those materialized bounds are visible. The tests pin the overnight rollover case so the relative label, query params, and shared range state stay aligned.
cpcloud and others added 10 commits June 20, 2026 08:11
Session URLs can carry only date_from or only date_to, but the shared yoke adapter treated those as invalid. That left analytics date state on the previous range even though the session list was filtered.

Single-bound params now materialize to a concrete analytics range while keeping the session URL fields as the source input. Analytics supplies the earliest known session date for upper-bound-only links when available.
Rolling analytics URLs need both durable rolling intent and materialized session bounds. Without the materialized date filters, session results could drift from the analytics panels even though the URL still advertised a rolling window.

Single-bound session dates also need normalized stats bounds in the yoke adapter, and refresh shortcuts should route through the same wrapper paths that update URL and yoke state. This keeps the visible query params, shared date state, and API requests aligned without expanding the date-yoke design.
Rolling analytics URLs now carry both materialized session bounds and window_days. The global sessions URL writeback must keep that rolling intent when the concrete bounds still match, otherwise a rolling link is downgraded to a fixed date link.

Manual analytics refreshes now use the same date writeback path as range selection so refreshed rolling bounds update the sidebar/session filters and URL together.
Direct sessions links can start with only window_days before analytics materializes concrete date bounds. The sessions URL writeback must keep that rolling intent during the first materialized update, otherwise the link becomes fixed-date state on the next pass.

Centralizing the preserve decision keeps the no-date, first-materialization, and matching-materialization cases in one place instead of spreading date checks through the route sync code.
Rolling session URLs can carry old materialized date_from/date_to values alongside window_days after the calendar advances. Analytics correctly treats window_days as the source of truth, but the sessions URL writeback was comparing against the stale fixed bounds and could downgrade the URL to fixed-date state.

Move the session route-param preservation rule into a small testable helper so direct links, first materialization, matching bounds, and refreshed rolling materialization are covered by behavior tests instead of component source assertions.
Clearing materialized session date filters from a rolling URL should remove the rolling window intent too. Otherwise the URL can look cleared while reloads or shared links restore the hidden rolling date filter.

Keep preserving window_days for pre-materialized direct links and rolling materializations, but stop carrying it when concrete date filters are intentionally removed. The App source-shape tests now assert their delimiters so future component edits cannot silently widen the checked block.
Clearing session date filters from a rolling sessions URL should leave the main sessions view cleared. The analytics URL hydration effect was treating the missing params as a cue to reapply the current rolling window, which wrote date_from/date_to back into the session filters.

When the URL date state disappears and the session date filters are already empty, clear the shared yoke state instead of taking the rolling fallback. This keeps the current view, reload behavior, and shared date seed aligned with the explicit clear action.
Clearing a rolling sessions date filter now leaves the yoke intentionally empty. Refresh still needs to fetch analytics data, but it must not treat the panel's retained internal date range as a new yoke selection and write session date params back into the URL.

Track the explicit clear state until another date URL or user date selection reactivates the yoke, so manual and scheduled refreshes preserve the cleared session filter state.
Cleared analytics date state has to survive normal component remounts. A component-local guard is lost when users open a session or navigate away and then return, allowing refresh to write the retained internal analytics range back into session filters.

Derive the cleared-yoke guard from shared state instead: no URL date/window params, empty session date filters, and no stored yoke range. That keeps refresh from restoring cleared dates across remounts while explicit date URLs and user date selections still reactivate the yoke.
Date filters can be cleared while AnalyticsPage is unmounted, such as from session detail. In that path the page-level clear effect cannot run, so the stored yoke range can survive and later reseed the cleared dates when the analytics view remounts.

Clear the stored yoke from the shared sessions route writeback whenever date/window intent is removed from the URL params. This keeps sidebar clears, detail-route clears, and the analytics remount path aligned.
@wesm
wesm force-pushed the codex/yoke-dates-across-panels branch from 86e7be3 to 57f0e40 Compare June 20, 2026 13:11
Clearing session filters from a detail route can remount AnalyticsPage before App's route writeback effects clean up stale date params. Clear the shared date yoke synchronously from the shared filter clear path when date intent is being removed, including routes that only carry rolling window intent.

The Insights e2e now expects saved insight links to preserve the active date-yoked query params instead of the pre-yoke bare insight URL.
@roborev-ci

roborev-ci Bot commented Jun 20, 2026

Copy link
Copy Markdown

roborev: Combined Review (57f0e40)

No issues found.


Panel: ci_default_security | Synthesis: codex | Members: codex_default (claude-code/default, done, 11m5s), codex_security (claude-code/security, done, 1m10s) | Total: 12m15s

The shared window_days query key is used by non-session pages too. Session filter clears should only treat it as session date intent on the sessions route, otherwise clearing unrelated filters on usage can wipe the shared date yoke.
@wesm
wesm merged commit 0caf1e5 into main Jun 20, 2026
20 of 21 checks passed
@wesm
wesm deleted the codex/yoke-dates-across-panels branch June 20, 2026 14:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants