One call per article. The hourly digest is those blurbs pasted together with a title and links. No second prompt. The model sees the boxes below in this order. Save, then run. The report shows the exact text that was sent. Empty boxes stay empty. Nothing hidden is put back.
1. System prompt — standing orders
Sent first, as the system message. Use this for rules that should apply to every article ("always start with the ticker", "always output the word cheese"). A small model will ignore this if box 3 still tells it to write a news blurb.
2. Examples — fake earlier chats the model copies
Sent next, as user/assistant pairs, before the real article. Left = what you pretend the user asked. Right = the reply you want copied. If these still show normal news blurbs, the model will write normal news blurbs. Leave both sides blank to send no examples.
3. User template — the real request, last thing the model reads
This is filled in per article and sent last. It wins when it disagrees with box 1. Do not delete the tokens. They are replaced, not sent literally: {{symbol_display}} → $ERO {{symbol}} → ERO {{news_type}} → category label {{headline}} → headline, only if you put the token in {{body}} → article text. If the article is too long, the start is kept and the end is dropped. Writing instructions in this box are why a system-prompt test like "always output cheese" still produces a news summary. Change this box too.
{{symbol_display}}
$ERO
{{symbol}}
ERO
{{news_type}}
{{headline}}
{{body}}
Same category and industry options as the news filters. Save applies to the live pipeline and simulations immediately. Empty industries means no industry gate. Clearing every category blocks tweets.
Articles by received_date (US/Eastern). No Slack during sim. Live ingest paused.