You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ai_synth/docs/superpowers/specs/2026-03-26-summary-length-d...

87 lines
3.2 KiB
Markdown

# Design: Configurable Summary Length
**Date**: 2026-03-26
**Scope**: Add a user setting to control summary detail level (court/moyen/detaille)
---
## Context
Currently, article summaries are fixed at 4-5 lines based on 500 chars of article body. Users want longer summaries to avoid opening articles when the summary is sufficient.
---
## 1. New setting: `summary_length`
**Column:** `summary_length INTEGER NOT NULL DEFAULT 3` in the `settings` table.
Values and their effect on the classify prompt:
| Value | Label | Summary instruction | Body snippet size |
|-------|-------|--------------------|--------------------|
| 1 | Court | "un resume de 3 a 4 lignes" | 500 chars |
| 2 | Moyen | "un resume de 6 a 8 lignes" | 2000 chars |
| 3 | Detaille | "un resume de 12 a 15 lignes" | 4000 chars (full scrape) |
Default: **3 (Detaille)** — generates comprehensive summaries by default.
Validation: value must be 1, 2, or 3.
---
## 2. Prompt change
`build_article_classify_prompt` receives `summary_length: i32` as a new parameter. It adjusts the prompt instruction:
- Current: `"Genere un titre clair et un resume de 4 a 5 lignes."`
- New: dynamically selects the line count based on `summary_length`
The body snippet parameter (`body_snippet`) is already passed by the caller — the caller controls the truncation length.
---
## 3. Pipeline change
In `synthesis.rs`, the body snippet truncation in both Phase 1 and Phase 2 Brave classify loops changes from:
```rust
let body_snippet: String = body_text.chars().take(500).collect();
```
To a dynamic value based on `settings.summary_length`:
```rust
let snippet_size = match settings.summary_length {
1 => 500,
2 => 2000,
_ => 4000,
};
let body_snippet: String = body_text.chars().take(snippet_size).collect();
```
---
## 4. Frontend
A slider in Settings with 3 positions labeled "Court", "Moyen", "Detaille". Default position: "Detaille" (rightmost).
Placed in the generation settings section, near `max_items_per_category`.
---
## 5. Files to modify
- **Create:** `backend/migrations/20260326000023_add_summary_length.sql`
- **Modify:** `backend/src/models/settings.rs` — add `summary_length` to `UserSettings`, `UpdateSettingsRequest`, `Default`, validation (1-3)
- **Modify:** `backend/src/db/settings.rs` — add `summary_length` to `SettingsRow`, queries, binds
- **Modify:** `backend/src/services/prompts.rs``build_article_classify_prompt` takes `summary_length`, adjusts instruction
- **Modify:** `backend/src/services/synthesis.rs` — dynamic snippet size based on `settings.summary_length`
- **Modify:** `frontend/src/types.ts` — add `summary_length: number` to `UserSettings` and `DEFAULT_SETTINGS`
- **Modify:** `frontend/src/pages/Settings.tsx` — add slider component
- **Modify:** `frontend/src/i18n/fr.ts` — labels for slider
- **Modify:** `CLAUDE.md` — migration count
- **Modify:** `backend/src/services/prompts.rs` tests — update `test_settings()` fixture, add test for summary_length
- **Modify:** `backend/tests/api_syntheses_test.rs` — add `summary_length` to settings payload
- **Modify:** `backend/tests/pipeline_test.rs` — add `summary_length` to settings payload
- **Modify:** `e2e/tests/generation-live.spec.ts` — add `summary_length` to settings payload