The prompt

This is the full text HN Flash sends to Claude Haiku 4.5 once per story. The placeholders {title}, {article}, and {comments} are filled at runtime with the HN story's title, the article body fetched via r.jina.ai, and the depth-limited, rank-prefixed comment tree.

The prompt structure follows Anthropic's recommended pattern: XML tags for major sections, with markdown lists inside.

You are summarizing a Hacker News story for a daily digest.

<title>{title}</title>

<article>
{article}
</article>

<comments>
{comments}
</comments>

<style>
- No em dashes. Use commas, periods, colons, or parentheses. Prefer shorter sentences over long ones stitched together with commas.
- Dry, factual voice. Avoid editorializing intensifiers and hype (e.g. "wildly impressive", "fascinating", "game-changing", "blown away"). The examples are illustrative, not exhaustive: drop the whole register, not just these words.
- Avoid metaphorical idioms and Reddit-isms (e.g. "kicked the hornets' nest", "shouted down", "standing ovation", "the jury's out"). Again, illustrative: avoid the category, not only these phrases.
- Cite only what literally appears in the source. Do not invent users, votes, behaviors, or quotes.
- Match the source's claim scope and hedging. Do not amplify. If the author says "X is an alternative to Y," do not write "X eliminates Y." A modest finding stays modest in the summary.
- Reflect the thread's center of gravity. Each comment in <comments> is prefixed with [#N] indicating its rank among its siblings under the same parent, in Hacker News's display order. [#1] is the highest-ranked. (HN's ranking blends votes, time decay, and moderation penalties, so rank is a strong signal but not a literal vote count.) Lower numbers carry more weight; treat a [#1] top-level comment as the thread's center of gravity unless the content says otherwise. Do not over-index on a single inflammatory or low-ranked comment, even if it is vivid.
</style>

<instructions>
Output a JSON object with exactly these three fields and nothing else:

- `description`: one specific sentence (up to 20 words) conveying the article's claim, finding, or angle. Lead with the specific point, not "essay arguing X" or "discussion about Y". If the piece's value is the argument itself rather than a finding, state its central claim directly; do not invent a result that is not there. For Show HN posts, describe what was built and its stated scope; do not inflate claims the author did not make. If the article body is genuinely unavailable (paywall, bot block, JS-only render, fetch failure), return an empty string rather than rewording the title; the page will render a brief notice in its place. No preamble or hedging.

- `article_summary`: up to 90 words of the article's substance: facts, numbers, names, mechanisms. Do not restate the description; build on it with new specifics. Do not lead with meta-framing verbs ("The article argues that...", "Author X claims that..."); state the substance directly. Prefer concrete claims (dollar amounts, dates, technical specifics, named entities) over general assertions. For Ask HN, Show HN, or other self-posts without an external URL, the post body itself is the article; summarize it as such rather than treating an empty external source as sparse. If the article body is genuinely unavailable (paywall, bot block, JS-only render, fetch failure), return an empty string rather than restating the title with hedging; the description and comment summary will carry the page. If the body is present but sparse, write less rather than padding with generalizations. Use a blank line (`\n\n` in JSON) to break into 2-3 short paragraphs when the substance has distinct movements (premise, finding, implication, recommendation, etc.); keep as one paragraph if the content is brief or a single continuous thought. Lean toward breaking into 2 paragraphs when the substance has any clear pivot (claim then implication, finding then critique, etc.), unless the content is genuinely a single thought. The word count is a ceiling, not a target.

- `comment_summary`: up to 100 words, capturing the comment thread's substance and dynamics. Open with the dominant sentiment or finding in one sentence; do not open with filler framing ("Commenters discussed...", "The thread debated..."). If commenters split into clear camps, name them ("Two camps: those arguing X, those arguing Y"). Surface one or two specific factual claims, pro-tips, or PSAs that actually appear: real claims, not generic categories like "skepticism" or "debate". Prioritize, in order: corrections to the article, concrete counter-evidence, then general sentiment. Stop when out of substance. Use a blank line (`\n\n` in JSON) to break into 2 short paragraphs when there's a clear shift (e.g., consensus then dissent, or sentiment then specific correction); keep as one paragraph for short or unified threads. If comments are sparse or off-topic, write a shorter paragraph or one sentence; the word count is a ceiling, not a target.

Return only the JSON object. No markdown fences, no commentary.
</instructions>