Release v26.04.27 — Journal replaces Briefing; RSS retired; Scribe rebrand #43

Merged
bvandeusen merged 0 commits from dev into main 2026-04-27 08:12:46 -04:00
bvandeusen commented 2026-04-27 08:12:28 -04:00 (Migrated from git.fabledsword.com)

Headline changes

Rebrand: Fabled Assistant → Fabled Scribe

User-visible strings, repo, Docker image path. Internal Python package, DB schema, env vars unchanged. (e652dec)

Briefing → Journal (hard cut, no data preservation)

The Daily Briefing is gone end-to-end. In its place: a day-anchored conversational Journal surface where the user records their day, and the LLM listens / asks follow-ups / silently extracts structured Moments.

  • Per-day Conversation (conversation_type='journal', day_date)
  • Daily prep: scheduled LLM-generated briefing-style opener (gathers tasks/events/weather/projects/recent-moments/open-threads into a 4–7 sentence direct prose paragraph)
  • New Moment model + four junction tables (people / places / tasks / notes — all FK to notes(id)) + own embedding index, fully isolated from notes-RAG
  • New tools: record_moment (silent), search_journal (semantic + temporal + entity-pivoted), with *_names parameters that resolve to IDs server-side
  • Frontend: /journal view with weather + upcoming events sidebar; chat bubbles inherit the existing Illuminated Transcript styling
  • MCP: fable_get_today_journal, fable_get_journal_day, fable_list_journal_days, fable_trigger_journal_prep, fable_get_journal_config, fable_list_moments

RSS hard cut (scope C)

RSS feature retired entirely: services, models, tools, API client, NewsView, article-discuss flow, and DB tables (rss_feeds, rss_items, rss_item_reactions, rss_item_embeddings). The URL-generic read_article LLM tool survives in services/tools/article.py, backed by services/article_fetcher.py. (dbd9f00)

Routing: //journal

Root now redirects to the Journal. Knowledge moved to /knowledge as its own real route. To revert (Knowledge as home), change the redirect target on the / route — single-line edit. (a3071a5)

Design system

docs/design-system.md captures the FabledSword baseline + Scribe's iteration decisions (Hybrid accent rule, warm-parchment light mode, status/priority palette, typography, chat bubbles, voice/tone, border philosophy, Lucide icon migration plan). Polish pass deferred. (0c91ab0)

Migrations (applied in order on container start)

  • 0040_rename_briefing_date_drop_briefing_data — rename conversations.briefing_dateday_date; delete all conversation_type='briefing' rows + briefing_config setting rows
  • 0041_add_momentsmoments table + 4 junction tables + moment_embeddings
  • 0042_drop_rss — drop rss_* tables; clear rss_enabled / briefing_*_topics settings

What's missing (deferred)

  • Polish pass applying the design system to existing UI — explicitly held until the design system stabilizes
  • End-of-day moment synthesis — out of scope for v1
  • Native Android Journal UX in the Flutter app already replaced briefing with journal in a separate PR on FabledApp repo

Notes for the deploy

  • Pull the new :dev (or version tag) image; migrations run on startup
  • After migration 0040 completes, all prior briefing conversations and briefing_config user settings are gone — by design, no recovery
  • Force-regenerate today's prep via mcp__fable-dev__fable_trigger_journal_prep after deploy to pick up the latest prompt-tuning commits

Test plan

  • Open / → lands on Journal
  • Open /knowledge → Knowledge view loads
  • Today's daily prep renders as the first assistant bubble (conversational, references real tasks/events/weather)
  • Send a message mentioning a new person → LLM asks "who's X to you?" before calling save_person
  • After confirming the person, LLM calls record_moment with person_names (not hallucinated person_ids)
  • mcp__fable__fable_list_moments returns the new moment with correctly-linked person
  • Weather + upcoming events sidebar renders
  • Past days accessible via day picker

🤖 Generated with Claude Code

## Headline changes ### Rebrand: Fabled Assistant → Fabled Scribe User-visible strings, repo, Docker image path. Internal Python package, DB schema, env vars unchanged. (`e652dec`) ### Briefing → Journal (hard cut, no data preservation) The Daily Briefing is gone end-to-end. In its place: a day-anchored conversational **Journal** surface where the user records their day, and the LLM listens / asks follow-ups / silently extracts structured Moments. - Per-day `Conversation` (`conversation_type='journal'`, `day_date`) - Daily prep: scheduled LLM-generated briefing-style opener (gathers tasks/events/weather/projects/recent-moments/open-threads into a 4–7 sentence direct prose paragraph) - New `Moment` model + four junction tables (people / places / tasks / notes — all FK to `notes(id)`) + own embedding index, fully isolated from notes-RAG - New tools: `record_moment` (silent), `search_journal` (semantic + temporal + entity-pivoted), with `*_names` parameters that resolve to IDs server-side - Frontend: `/journal` view with weather + upcoming events sidebar; chat bubbles inherit the existing Illuminated Transcript styling - MCP: `fable_get_today_journal`, `fable_get_journal_day`, `fable_list_journal_days`, `fable_trigger_journal_prep`, `fable_get_journal_config`, `fable_list_moments` ### RSS hard cut (scope C) RSS feature retired entirely: services, models, tools, API client, NewsView, article-discuss flow, and DB tables (`rss_feeds`, `rss_items`, `rss_item_reactions`, `rss_item_embeddings`). The URL-generic `read_article` LLM tool survives in `services/tools/article.py`, backed by `services/article_fetcher.py`. (`dbd9f00`) ### Routing: `/` → `/journal` Root now redirects to the Journal. Knowledge moved to `/knowledge` as its own real route. To revert (Knowledge as home), change the redirect target on the `/` route — single-line edit. (`a3071a5`) ### Design system `docs/design-system.md` captures the FabledSword baseline + Scribe's iteration decisions (Hybrid accent rule, warm-parchment light mode, status/priority palette, typography, chat bubbles, voice/tone, border philosophy, Lucide icon migration plan). Polish pass deferred. (`0c91ab0`) ## Migrations (applied in order on container start) - `0040_rename_briefing_date_drop_briefing_data` — rename `conversations.briefing_date` → `day_date`; delete all `conversation_type='briefing'` rows + `briefing_config` setting rows - `0041_add_moments` — `moments` table + 4 junction tables + `moment_embeddings` - `0042_drop_rss` — drop `rss_*` tables; clear `rss_enabled` / `briefing_*_topics` settings ## What's missing (deferred) - **Polish pass** applying the design system to existing UI — explicitly held until the design system stabilizes - **End-of-day moment synthesis** — out of scope for v1 - **Native Android Journal UX** in the Flutter app already replaced briefing with journal in a separate PR on `FabledApp` repo ## Notes for the deploy - Pull the new `:dev` (or version tag) image; migrations run on startup - After migration `0040` completes, all prior briefing conversations and `briefing_config` user settings are gone — by design, no recovery - Force-regenerate today's prep via `mcp__fable-dev__fable_trigger_journal_prep` after deploy to pick up the latest prompt-tuning commits ## Test plan - [ ] Open `/` → lands on Journal - [ ] Open `/knowledge` → Knowledge view loads - [ ] Today's daily prep renders as the first assistant bubble (conversational, references real tasks/events/weather) - [ ] Send a message mentioning a new person → LLM asks "who's X to you?" before calling `save_person` - [ ] After confirming the person, LLM calls `record_moment` with `person_names` (not hallucinated `person_ids`) - [ ] `mcp__fable__fable_list_moments` returns the new moment with correctly-linked person - [ ] Weather + upcoming events sidebar renders - [ ] Past days accessible via day picker 🤖 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#43