feat: per-occurrence recurring-series title suggestions (#191) #223

Merged
claude-bot merged 1 commit from feat/191-series-titles into feat/v3.10-gm-workbench 2026-07-19 17:17:17 +00:00
Contributor

Suggest titles for the next occurrence of a recurring session series, sourced from the previous occurrence's summary, with an always-available manual entry.

Backend

  • series_titles workbench tool: params {session_id}; a context builder finds the most recent prior summarised occurrence in the same series and folds its recap into the prompt; output {suggestions: [{title, description}]}. Tolerant parser (never raises).
  • SessionResponse now exposes series_id + series_occurrence_date (additive; frontend response only — not the bot contract, no BOT_CONTRACT_VERSION bump) so the planning UI can identify series occurrences.

Frontend

  • SeriesTitleSuggester panel: pick an upcoming series occurrence → "Suggest titles" → each {title, description} has "Use this title" which writes it onto the occurrence via the existing updateSession PATCH. An always-present manual title/description block is the fallback.
  • Degrades to manual entry with no error when there's no prior summary or the LLM is unconfigured (empty suggestions is not an error).

Criterion 1 already holds

Per-occurrence titles already survive series-level edits: materialize_session_series inserts occurrences with on_conflict_do_nothing, so it never overwrites an edited title. SessionUpdate already carries title+description. So the only new work was the suggestion generation + wiring.

Notes

  • No new models or migrations. Reuses the workbench engine (#136) rather than a bespoke LLM path (per the issue's "reuse the name generator pattern").
  • Backend by me; the frontend panel by a delegate, then reviewed + verified here.
  • Interpretation: surfaced as a workbench-style panel on the GM planning page (consistent with the rest of v3.10.0) rather than inline in SeriesManager; deeper inline series-UI integration could be a follow-up.

Verification (Docker)

  • Backend 735 passed (incl. test_workbench_series_titles.py — previous-summary grounding, no-previous graceful path, 422, GM-only, parser tolerance)
  • Frontend 397 passed / 42 files; prod build OK
  • ruff check + ruff format --check clean; eslint 0 errors

Closes #191.

Suggest titles for the **next** occurrence of a recurring session series, sourced from the **previous** occurrence's summary, with an always-available manual entry. ## Backend - **`series_titles` workbench tool**: params `{session_id}`; a context builder finds the most recent *prior* summarised occurrence in the same series and folds its recap into the prompt; output `{suggestions: [{title, description}]}`. Tolerant parser (never raises). - **`SessionResponse` now exposes `series_id` + `series_occurrence_date`** (additive; frontend response only — **not** the bot contract, no `BOT_CONTRACT_VERSION` bump) so the planning UI can identify series occurrences. ## Frontend - **`SeriesTitleSuggester`** panel: pick an upcoming series occurrence → "Suggest titles" → each `{title, description}` has "Use this title" which writes it onto the occurrence via the existing `updateSession` PATCH. An always-present **manual title/description** block is the fallback. - Degrades to manual entry with **no error** when there's no prior summary or the LLM is unconfigured (empty `suggestions` is not an error). ## Criterion 1 already holds Per-occurrence titles already survive series-level edits: `materialize_session_series` inserts occurrences with `on_conflict_do_nothing`, so it never overwrites an edited title. `SessionUpdate` already carries `title`+`description`. So the only new work was the suggestion generation + wiring. ## Notes - No new models or migrations. Reuses the workbench engine (#136) rather than a bespoke LLM path (per the issue's "reuse the name generator pattern"). - Backend by me; the frontend panel by a delegate, then reviewed + verified here. - **Interpretation:** surfaced as a workbench-style panel on the GM planning page (consistent with the rest of v3.10.0) rather than inline in `SeriesManager`; deeper inline series-UI integration could be a follow-up. ## Verification (Docker) - Backend **735 passed** (incl. `test_workbench_series_titles.py` — previous-summary grounding, no-previous graceful path, 422, GM-only, parser tolerance) - Frontend **397 passed** / 42 files; prod build OK - `ruff check` + `ruff format --check` clean; eslint 0 errors Closes #191.
Suggest titles for the next occurrence of a recurring session series, sourced
from the previous occurrence's summary, with an always-available manual entry.

- series_titles workbench tool: params {session_id}; a context builder folds
  the most recent *prior* summarised occurrence in the same series into the
  prompt; output {suggestions: [{title, description}]}. Tolerant parser.
- SessionResponse now exposes series_id + series_occurrence_date (additive;
  not the bot contract) so the planning UI can identify series occurrences.
- SeriesTitleSuggester panel: pick an upcoming series occurrence, suggest
  titles, "Use this title" writes title+description onto the occurrence via the
  existing session PATCH — or type your own. Degrades to manual with no error
  when there's no prior summary or the LLM is unconfigured.

Per-occurrence titles already survive series edits: materialize_session_series
inserts occurrences with on_conflict_do_nothing, so it never clobbers an edited
title (criterion 1). No new models or migrations.

Backend 735 passed; frontend 397 passed; ruff + eslint clean; build OK.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude-bot merged commit 6b23ac39ea into feat/v3.10-gm-workbench 2026-07-19 17:17:17 +00:00
claude-bot deleted branch feat/191-series-titles 2026-07-19 17:17:18 +00:00
Sign in to join this conversation.
No description provided.