EventSlideOver recurrence UI (36cd08c) — adds a "Repeat" select (None / Daily / Weekly / Monthly / Yearly) wired to the existing Event.recurrence RRULE column. CalDAV-imported rules with extra parts (e.g. FREQ=WEEKLY;BYDAY=MO,WE,FR) surface as a disabled "Custom" option with the raw rule preserved read-only.
Journal weather wiring fixes (c33cab7) — closes two gaps that produced empty weather sites in the journal panel:
PUT /api/journal/config now triggers a background refresh_location_cache for any saved location with valid lat/lon, so newly-entered sites populate without needing the manual refresh button.
get_cached_weather_rows now accepts a valid_keys filter; the journal weather routes and prep pipeline pass currently-configured location keys, so briefing-era leftover cache rows (which survived migration 0040 because that migration only dropped briefing_config, not weather_cache rows) no longer surface as ghost tabs.
Test plan
153 backend pytest tests pass
Frontend vue-tsc --noEmit clean
Manual: edit an event → set recurrence → save → reopen, preset persists
Manual: save a fresh location in Profile → journal weather panel populates without clicking refresh
Manual: any pre-existing orphaned weather tabs disappear after this rolls out
## Summary
- **EventSlideOver recurrence UI** (`36cd08c`) — adds a "Repeat" select (None / Daily / Weekly / Monthly / Yearly) wired to the existing `Event.recurrence` RRULE column. CalDAV-imported rules with extra parts (e.g. `FREQ=WEEKLY;BYDAY=MO,WE,FR`) surface as a disabled "Custom" option with the raw rule preserved read-only.
- **Journal weather wiring fixes** (`c33cab7`) — closes two gaps that produced empty weather sites in the journal panel:
1. `PUT /api/journal/config` now triggers a background `refresh_location_cache` for any saved location with valid lat/lon, so newly-entered sites populate without needing the manual refresh button.
2. `get_cached_weather_rows` now accepts a `valid_keys` filter; the journal weather routes and prep pipeline pass currently-configured location keys, so briefing-era leftover cache rows (which survived migration 0040 because that migration only dropped `briefing_config`, not `weather_cache` rows) no longer surface as ghost tabs.
## Test plan
- [x] 153 backend pytest tests pass
- [x] Frontend `vue-tsc --noEmit` clean
- [ ] Manual: edit an event → set recurrence → save → reopen, preset persists
- [ ] Manual: save a fresh location in Profile → journal weather panel populates without clicking refresh
- [ ] Manual: any pre-existing orphaned weather tabs disappear after this rolls out
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
36cd08c) — adds a "Repeat" select (None / Daily / Weekly / Monthly / Yearly) wired to the existingEvent.recurrenceRRULE column. CalDAV-imported rules with extra parts (e.g.FREQ=WEEKLY;BYDAY=MO,WE,FR) surface as a disabled "Custom" option with the raw rule preserved read-only.c33cab7) — closes two gaps that produced empty weather sites in the journal panel:PUT /api/journal/confignow triggers a backgroundrefresh_location_cachefor any saved location with valid lat/lon, so newly-entered sites populate without needing the manual refresh button.get_cached_weather_rowsnow accepts avalid_keysfilter; the journal weather routes and prep pipeline pass currently-configured location keys, so briefing-era leftover cache rows (which survived migration 0040 because that migration only droppedbriefing_config, notweather_cacherows) no longer surface as ghost tabs.Test plan
vue-tsc --noEmitclean🤖 Generated with Claude Code