Release v26.04.29.1 — Date durability + journal voice tuning #45

Merged
bvandeusen merged 0 commits from dev into main 2026-04-29 10:37:46 -04:00
bvandeusen commented 2026-04-29 10:37:38 -04:00 (Migrated from git.fabledsword.com)

Highlights

This release is two cohesive workstreams that came out of inspecting real journal usage across 4/27–4/29.

Calendar tool — date/time handling made model-agnostic

A user asked for a dentist appointment "this Friday at 8 AM" on a Wednesday and the assistant scheduled it for Thursday at 8 AM. Tracing the failure exposed two distinct fault lines, both fixed:

  • 611c940 — Split start into start_date + start_time. A combined ISO datetime gives the model room to TZ-tag the calendar day; with split fields a YYYY-MM-DD string carries no TZ to mis-tag and the day cannot drift across the local→UTC boundary. Strict regex validation rejects anything with a TZ suffix on either field. Legacy combined start/end kept as a backcompat fallback for saved tool-call payloads.
  • 03d725e — Anchor today's weekday + verify expected_weekday. Both journal and general chat system prompts now read "Today is Wednesday, 2026-04-29 (...)" instead of forcing the model to derive the weekday. New expected_weekday parameter on create_event / update_event rejects mismatches with a self-correcting error ("Date 2026-04-30 falls on Thursday, not Friday. Recompute…") — the local-vs-UTC distinction is covered (Tokyo Friday 23:00 stays Friday).

Journal — three rough edges from real usage (Fable #157, #158, #159)

  • 6c309f1 — Persona tuning. JOURNAL_PERSONA now leads with "CAPTURE first, advise only if asked"; RESPONSE STYLE bans helpdesk-style follow-ups when the user is just logging work; emoji ban (the journal is a thinking-companion surface, not a chat bot); record_moment.content description rewritten to require first-person/imperative phrasing with concrete GOOD/BAD examples (eliminates "The user mentioned…" observer voice).
  • 4f18023record_moment data hygiene. Server-side _filter_task_ids_by_keyword_overlap drops moment→task links that share no meaningful keyword with the content — preempts the 4/27 Docker→ADHD auto-link bug. _filter_placeholder_places drops generic single-word placeholders (work, home, office) that aren't real places.
  • 9f8b451 — Journal prep filtering. Tasks now bucket into due-today / upcoming / overdue so the prep stops calling 60-day-overdue tasks "due today"; overdue items surface with their staleness duration ("still on the list 68 days"). The events block now uses a TZ-aware day window (fixed RRULE expansion) plus a defense-in-depth proximity filter — eliminates the recurring "Birthday — 2026-09-29" surfacing 5 months out in every prep.

MCP package

  • 3b2a0a1 — fable-mcp 0.3.0. Briefing tools removed; journal tools shipped (fable_get_today_journal, fable_list_moments, etc). Production MCP needs a pipx install --force after this lands.

Test plan

  • flutter analyze and flutter test clean (Flutter side, n/a here)
  • Backend pytest clean — 53 tests green across journal_prep + journal_search + record_moment_guards + calendar_tool_tz + events_*
  • ruff check clean across all touched files
  • Smoke test on prod after deploy: ask "schedule X for next Friday at 8am" — assistant should echo the resolved date in its reply, the event lands on the correct day, and the model uses expected_weekday
  • Verify the journal prep on the day after deploy uses three task buckets with overdue framing

🤖 Generated with Claude Code

## Highlights This release is two cohesive workstreams that came out of inspecting real journal usage across 4/27–4/29. ### Calendar tool — date/time handling made model-agnostic A user asked for a dentist appointment "this Friday at 8 AM" on a Wednesday and the assistant scheduled it for Thursday at 8 AM. Tracing the failure exposed two distinct fault lines, both fixed: - **`611c940` — Split `start` into `start_date` + `start_time`.** A combined ISO datetime gives the model room to TZ-tag the calendar day; with split fields a `YYYY-MM-DD` string carries no TZ to mis-tag and the day cannot drift across the local→UTC boundary. Strict regex validation rejects anything with a TZ suffix on either field. Legacy combined `start`/`end` kept as a backcompat fallback for saved tool-call payloads. - **`03d725e` — Anchor today's weekday + verify `expected_weekday`.** Both journal and general chat system prompts now read `"Today is Wednesday, 2026-04-29 (...)"` instead of forcing the model to derive the weekday. New `expected_weekday` parameter on `create_event` / `update_event` rejects mismatches with a self-correcting error ("Date 2026-04-30 falls on Thursday, not Friday. Recompute…") — the local-vs-UTC distinction is covered (Tokyo Friday 23:00 stays Friday). ### Journal — three rough edges from real usage (Fable #157, #158, #159) - **`6c309f1` — Persona tuning.** `JOURNAL_PERSONA` now leads with "CAPTURE first, advise only if asked"; `RESPONSE STYLE` bans helpdesk-style follow-ups when the user is just logging work; emoji ban (the journal is a thinking-companion surface, not a chat bot); `record_moment.content` description rewritten to require first-person/imperative phrasing with concrete GOOD/BAD examples (eliminates "The user mentioned…" observer voice). - **`4f18023` — `record_moment` data hygiene.** Server-side `_filter_task_ids_by_keyword_overlap` drops moment→task links that share no meaningful keyword with the content — preempts the 4/27 Docker→ADHD auto-link bug. `_filter_placeholder_places` drops generic single-word placeholders (`work`, `home`, `office`) that aren't real places. - **`9f8b451` — Journal prep filtering.** Tasks now bucket into `due-today` / `upcoming` / `overdue` so the prep stops calling 60-day-overdue tasks "due today"; overdue items surface with their staleness duration ("still on the list 68 days"). The events block now uses a TZ-aware day window (fixed RRULE expansion) plus a defense-in-depth proximity filter — eliminates the recurring "Birthday — 2026-09-29" surfacing 5 months out in every prep. ### MCP package - **`3b2a0a1` — fable-mcp 0.3.0.** Briefing tools removed; journal tools shipped (`fable_get_today_journal`, `fable_list_moments`, etc). Production MCP needs a `pipx install --force` after this lands. ## Test plan - [x] `flutter analyze` and `flutter test` clean (Flutter side, n/a here) - [x] Backend `pytest` clean — 53 tests green across `journal_prep` + `journal_search` + `record_moment_guards` + `calendar_tool_tz` + `events_*` - [x] `ruff check` clean across all touched files - [ ] Smoke test on prod after deploy: ask "schedule X for next Friday at 8am" — assistant should echo the resolved date in its reply, the event lands on the correct day, and the model uses `expected_weekday` - [ ] Verify the journal prep on the day after deploy uses three task buckets with overdue framing 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledScribe#45