> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chartcastr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Overall review & AI commentary

> How Chartcastr generates the page-level overall summary, the per-row commentary, and the AI titles that sit above and inside a briefing.

A briefing has three layers of AI text. Each layer is intentionally narrow in scope so prompt cost stays predictable and the results are easy to reason about.

## The three AI layers

| Layer              | Where it lives                                             | Inputs                                                      | Cost shape                                                          |
| ------------------ | ---------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------- |
| **AI titles**      | `Briefing.aiTitle` + `BriefingRow.aiTitle`                 | Briefing description, row items, item summaries             | Single batched Haiku call, \~500–1,000 input / \~150 output tokens. |
| **Row commentary** | `BriefingRowContent.aiCommentaryShort/Long + aiHighlights` | Just the items inside that row + their latest Pulse summary | One call per row, bounded concurrency (3 in flight).                |
| **Overall review** | `BriefingContent.aiSummaryShort/Long + aiHighlights`       | The completed row commentaries + each item's short summary  | One call per save, after all rows are done.                         |

## Overall review (the "big picture")

The Overall Review sits at the top of the composer and on Page 2 of the PDF. It synthesises **across rows** — calling out themes that show up in multiple places, contradictions between rows, and what the user should pay attention to.

It is regenerated **on every save** — there is no skip path. Even if every row was reused from cache, the overall summary still runs because (a) it depends on the row outputs, which may have shifted in tone, and (b) it's a single small call, so the savings would be marginal.

The model gets:

* The briefing name and description
* For each row: title, the long commentary, the highlights
* For each item across all rows: the short summary

It produces:

* `aiSummaryShort` — a 2-sentence executive summary
* `aiSummaryLong` — the body of the "Big Picture" page (4–8 sentences)
* `aiHighlights` — 2–4 bullet points

<Note>The overall review is text-in / text-out — no images. Row commentary is also text-only in v1. The only place chart images are read by the AI is at the per-source Pulse layer, before the briefing ever sees them.</Note>

## Row commentary

Each row's `aiCommentaryLong` is the analyst-style text shown on that row's card in the composer and under each row's "Cross-analysis" heading in the PDF. It synthesises **just** the items inside that row — there's no leakage from other rows.

Row commentary uses a hash-based skip: if the row's items, their Pulse content IDs, and the row title haven't changed since the last successful run, the prior commentary is reused without an LLM call. See [Save & commit](/analysis/briefings/save-and-commit) for the full hash logic.

## AI titles

Both `Briefing.aiTitle` and every `BriefingRow.aiTitle` regenerate in a single batched call to Haiku. The call is **skipped entirely** when:

* A `aiTitleInputsHash` matches the freshly computed hash, AND
* Both the briefing and every row already have a user-set title (nothing to fill in).

The title prompt is told which titles are locked (`nameLockedByUser` / `titleLockedByUser`) and emits `null` for those — the composer keeps your typed title and never overwrites it.

### Reset to AI title

If you typed a title and later want the AI version back, the row card and briefing header both expose a **Reset to AI title** action. This clears `nameLockedByUser` (or `titleLockedByUser`), and the next save regenerates the AI title.

## What you see in the composer

```
┌───────────────────────────────────────────────────────────┐
│  Briefing name (yours, or AI)        [Save] [Send]        │
│  description                                               │
├───────────────────────────────────────────────────────────┤
│  Overall review (read-only AI text + highlights)          │
│   "Regenerating…" while a save is in flight                │
├───────────────────────────────────────────────────────────┤
│  Row 1 — "Acquisition" (your title, or AI)                │
│  [item] [item] [item]                       [+ Add item]   │
│  Cross-analysis: row commentary + highlights              │
├───────────────────────────────────────────────────────────┤
│  Row 2 — …                                                │
└───────────────────────────────────────────────────────────┘
```

The overall review and per-row commentary are read-only — there's no human override on AI commentary text. If you want to steer the analysis, the lever is the briefing **description**: a one-paragraph framing that the AI receives at every layer and uses to prioritise what to call out.
