> Story drafts about what is moving in your publication's weekly map, with every sentence cited and checked by code, using Shipped as the open example.

Canonical: https://p.apyr.us/cookbook/cited-trends/

::band{id="top" size="hero" eyebrow="Cookbook · Recipe"}
# Cited trend stories.

Once a week Papyrus can draft stories about what is moving in your publication's own map, and prove where every sentence came from. This recipe follows the path from a week of items to a draft in the Proposals queue, using [Shipped](https://shipped.anth.us/proposals/) as the open example. The example drafts there are a demonstration, not a launch.

::band{id="signals" tone="muted" eyebrow="Step 1 · Signals" columns="top"}
## The map says what is moving.

The weekly knowledge run counts your items per topic and per entity, week by week, and marks clusters New, Growing or Cooling. Those counts are the signals. Code, not a model, picks the rising and cooling ones and attaches the releases behind each.

```
::include{kind="block" name="knowledge-trending-list" limit=6}
```

::column{panel="card"}
::include{kind="block" name="knowledge-trending-list" limit=6}

::band{id="draft" eyebrow="Step 2 · Draft and check" columns="top"}
## One model call, then a check that does not trust it.

A single GPT-6 Luna call drafts the story from the signals and releases it is given. Each sentence comes back with the handles of what it rests on. Then code rejects the draft unless every sentence cites something real, at least two signals back the story, and every number and date comes from the evidence that sentence cites. A rejected draft is never filed; the run record keeps it with the reasons.

```
papyrus ideas trends --site shipped \
  --snapshot https://shipped.anth.us/_data/knowledge/ \
  --store proposals --dry-run
```

::column{panel="card"}
A failing draft lists each problem with the sentence it came from:

```
no_citation
unknown_signal:S99
number_not_in_cited_signals:40
```

A passing draft keeps its sentences with the signals each one cites.

::band{id="figure" tone="muted" eyebrow="Step 3 · The chart" columns="top"}
## Drawn by code, from real counts.

The model names which signals to chart and writes the caption. It never supplies a number. The chart is built from the cited signals' weekly counts and travels with the draft, so an editor approves the copy and the figure together.

```
{"type": "line", "unit": "items per week",
 "x": ["2026-08-31", "...", "2026-10-19"],
 "series": [{"signal": "entity:platform--hugging-face",
             "label": "Hugging Face", "values": [1, 2, 3, 4, 7, 3, 3, 2]}]}
```

::column{panel="card"}
::include{kind="block" name="knowledge-entity" key="hover-weaving" part="trend"}

::band{id="queue" eyebrow="Step 4 · File and steer" columns="top"}
## A Proposal, one soft review, readers' votes.

The draft is filed as an AI story draft Proposal with one soft review request for the whole run. Readers vote on it, an editor reads it, and the editor decides. The weekly step is off by default and switched on per site; on the Shipped stack it is three stack parameters. Approving a draft does not yet create a story.

[How Shipped turns on Proposals](https://github.com/AnthusAI/Shipped-web/blob/main/papyrus.config.ts) is one line of its open configuration: `proposals: { publish: true }`.

::column{panel="card"}
AI proposes. You steer. Editors decide.

[See the queue on Shipped](https://shipped.anth.us/proposals/)

::band{id="process" tone="card" eyebrow="The editorial process" columns="top"}
## How it stays honest.

1. **The weekly run.** Items are grouped, counted and reviewed. Every pass records who accepted what, and AI is labelled as AI.
2. **The draft.** A model writes; it is not trusted.
3. **The check.** Code verifies citations and numbers. It proves where a sentence points, not that the sentence reads its evidence correctly.
4. **The editor.** An editor reads every draft and decides. Nothing publishes until they do.

[Cited Trends in full](/cited-trends.html). The Papyrus doc is `docs/idea-pipeline.md`.
