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.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.
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
aiSummaryShort— a 2-sentence executive summaryaiSummaryLong— the body of the “Big Picture” page (4–8 sentences)aiHighlights— 2–4 bullet points
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.
Row commentary
Each row’saiCommentaryLong 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 for the full hash logic.
AI titles
BothBriefing.aiTitle and every BriefingRow.aiTitle regenerate in a single batched call to Haiku. The call is skipped entirely when:
- A
aiTitleInputsHashmatches the freshly computed hash, AND - Both the briefing and every row already have a user-set title (nothing to fill in).
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 clearsnameLockedByUser (or titleLockedByUser), and the next save regenerates the AI title.

