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.
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
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)
## 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)
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.
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.
Conversation(conversation_type='journal',day_date)Momentmodel + four junction tables (people / places / tasks / notes — all FK tonotes(id)) + own embedding index, fully isolated from notes-RAGrecord_moment(silent),search_journal(semantic + temporal + entity-pivoted), with*_namesparameters that resolve to IDs server-side/journalview with weather + upcoming events sidebar; chat bubbles inherit the existing Illuminated Transcript stylingfable_get_today_journal,fable_get_journal_day,fable_list_journal_days,fable_trigger_journal_prep,fable_get_journal_config,fable_list_momentsRSS 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-genericread_articleLLM tool survives inservices/tools/article.py, backed byservices/article_fetcher.py. (dbd9f00)Routing:
/→/journalRoot now redirects to the Journal. Knowledge moved to
/knowledgeas 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.mdcaptures 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— renameconversations.briefing_date→day_date; delete allconversation_type='briefing'rows +briefing_configsetting rows0041_add_moments—momentstable + 4 junction tables +moment_embeddings0042_drop_rss— droprss_*tables; clearrss_enabled/briefing_*_topicssettingsWhat's missing (deferred)
FabledApprepoNotes for the deploy
:dev(or version tag) image; migrations run on startup0040completes, all prior briefing conversations andbriefing_configuser settings are gone — by design, no recoverymcp__fable-dev__fable_trigger_journal_prepafter deploy to pick up the latest prompt-tuning commitsTest plan
/→ lands on Journal/knowledge→ Knowledge view loadssave_personrecord_momentwithperson_names(not hallucinatedperson_ids)mcp__fable__fable_list_momentsreturns the new moment with correctly-linked person🤖 Generated with Claude Code