Joseph Doherty
22db9f3554
test: bump schema_version assertion to 8 after 0008_group_node migration
2026-04-26 15:49:25 -04:00
Joseph Doherty
6b726b2a4a
merge: T38 relationship-seed service
2026-04-26 15:49:03 -04:00
Joseph Doherty
e58cdbd527
merge: T37 guest_added/guest_removed event handlers
2026-04-26 15:49:03 -04:00
Joseph Doherty
c6b3531c64
feat: relationship-seed service for first-co-appearance prompt
2026-04-26 15:47:12 -04:00
Joseph Doherty
a0d7debce5
feat: group_node schema + projector handlers
2026-04-26 15:46:16 -04:00
Joseph Doherty
a1b4e251c5
feat: guest_added / guest_removed event handlers
2026-04-26 15:46:09 -04:00
Joseph Doherty
5aab98e4d7
fix: classifier robustness — schema in prompt, retries, kickoff fallback
...
The kickoff parse-and-confirm route was 500-ing intermittently because
Hermes-3 + Featherless's response_format={"type":"json_object"} only
guarantees JSON output, NOT a particular schema. The model was inventing
its own field names (sceneTime, entities, settingDetails) instead of
the KickoffParse fields, causing Pydantic validation to fail on both
classify() retries.
Three changes:
1. Include the Pydantic JSON schema in the system prompt so the model
knows exactly which keys to produce. Affects every classify() call
(kickoff parse, turn parse, scene-close detect, significance,
state-update, scene summarize). Strip ```json fences if the model
wraps its output. Bump retries 2 → 3 (model is stochastic; one extra
attempt closes most of the remaining gap).
2. parse_kickoff() now passes a default empty KickoffParse so the
route degrades to a fillable form instead of 500 when the classifier
ultimately fails. The confirm form is the human-in-the-loop; an
empty form is strictly better UX than a stack trace.
3. Tests updated: bumped canned-failure arrays from 2 → 3 entries to
match the new attempt count; renamed kickoff test from
"raises_when_classifier_fails_twice" to
"falls_back_to_empty_when_classifier_fails" reflecting the new
degraded-but-usable behavior.
Verified live with all 3 sample bots (maya/eli/sam) — kickoff route
returns 200 across multiple attempts. Full suite: 168 passed.
2026-04-26 15:03:13 -04:00
Joseph Doherty
a302ed427a
feat: error banners and first-run navigation flow
2026-04-26 14:33:28 -04:00
Joseph Doherty
0353d592cd
feat: streaming UX with Stop, disconnect handling, send-lock
2026-04-26 14:27:39 -04:00
Joseph Doherty
330077afcf
feat: transcript display formatting with markdown and OOC styling
2026-04-26 14:22:43 -04:00
Joseph Doherty
8390703b73
feat: nightly DB backups with 14-day retention
2026-04-26 14:18:57 -04:00
Joseph Doherty
b9644fad31
feat: periodic snapshots with retention and cold-load fast-path
2026-04-26 14:15:17 -04:00
Joseph Doherty
82be8b3f51
feat: bot reset with hard confirm and event-driven purge
2026-04-26 14:07:56 -04:00
Joseph Doherty
46062973c2
feat: regenerate with edit-then-regenerate inline UX
2026-04-26 14:04:02 -04:00
Joseph Doherty
aa0563b4fa
feat: rewind with impact preview, pre-rewind snapshot, undo toast
2026-04-26 13:58:20 -04:00
Joseph Doherty
b5175aefaa
feat: per-POV summary and edge summary update on scene close
2026-04-26 13:53:12 -04:00
Joseph Doherty
0997562e75
feat: scene close on hard signals with manual override
2026-04-26 13:46:14 -04:00
Joseph Doherty
db3005fc17
feat: drawer edits with manual_edit event capture
2026-04-26 13:40:40 -04:00
Joseph Doherty
5fc5b8ac23
feat: read-only drawer with scene, activity, edges, memories
2026-04-26 13:35:47 -04:00
Joseph Doherty
3995a8671b
feat: FTS5 memory retrieval with witness filter and ranking boosts
2026-04-26 13:30:40 -04:00
Joseph Doherty
eb4cdf9cbb
feat: async significance pass with auto-pin on score 3
2026-04-26 13:27:25 -04:00
Joseph Doherty
a45dabb6ae
feat: per-turn memory writes with witness flags
2026-04-26 13:20:43 -04:00
Joseph Doherty
e8d24a0875
feat: post-turn state-update pass per present entity
2026-04-26 13:17:07 -04:00
Joseph Doherty
9b45710cb1
feat: narrative streaming via SSE with assistant_turn event
2026-04-26 13:09:31 -04:00
Joseph Doherty
73d8b0c092
feat: prompt assembly with must/should/nice trim tiers
2026-04-26 13:00:00 -04:00
Joseph Doherty
a0f5e818ec
feat: turn input parser via classifier
2026-04-26 12:53:34 -04:00
Joseph Doherty
656c2558cb
feat: per-chat SSE channel and pub/sub
2026-04-26 12:49:41 -04:00
Joseph Doherty
e79f4d8d22
feat: chat shell page rendering
2026-04-26 12:39:15 -04:00
Joseph Doherty
0c08745194
feat: top-level nav and chat list view
2026-04-26 12:36:20 -04:00
Joseph Doherty
fbb16c86b3
feat: kickoff parse-and-confirm flow with chat creation
2026-04-26 12:28:05 -04:00
Joseph Doherty
e44e2bf93f
feat: settings page with you-entity authoring
2026-04-26 12:22:00 -04:00
Joseph Doherty
44ea627a8a
feat: bot authoring form with bot_authored event
2026-04-26 12:17:06 -04:00
Joseph Doherty
a5339fc1d2
feat: kickoff prose parser via classifier
2026-04-26 12:09:17 -04:00
Joseph Doherty
ec344064f1
feat: chats, chat_state, containers, scenes, activity tables
2026-04-26 12:03:26 -04:00
Joseph Doherty
30e6648122
feat: memory schema with witness flags and FTS5 index
2026-04-26 11:56:32 -04:00
Joseph Doherty
bc97d425ef
feat: directed edges with per-turn delta projector
2026-04-26 11:51:15 -04:00
Joseph Doherty
5e6bbb586c
feat: bot and you entity schemas with projector handlers
2026-04-26 11:46:19 -04:00
Joseph Doherty
517fe49aef
feat: append-only event log with projector skeleton
2026-04-26 11:42:49 -04:00
Joseph Doherty
c2aceffda1
feat: classifier wrapper with retry, timeout, schema-default fallback
2026-04-26 11:38:48 -04:00
Joseph Doherty
e627356168
feat: LLMClient protocol with Featherless and mock implementations
2026-04-26 11:35:57 -04:00
Joseph Doherty
67517926aa
feat: sqlite migration runner with meta version table
2026-04-26 11:32:32 -04:00
Joseph Doherty
01e6975d20
feat: config loader with toml + env override
2026-04-26 11:28:40 -04:00
Joseph Doherty
4a60171035
feat: project skeleton with health endpoint
2026-04-26 11:23:38 -04:00