{"slug": "the-agenthood-news-digest-now-writes-itself", "title": "The Agenthood news digest now writes itself", "summary": "Agenthood has deployed a daily news digest agent that automatically generates release notes using an LLM, validates them against a strict contract, and opens pull requests for human review. The pipeline, which runs via a scheduled GitHub Action, fetches new releases, drafts the digest in the house style, and ensures the agent never pushes directly to main. The first digest covering versions v3.13.0–v3.13.6 is now live.", "body_md": "Every Agenthood release used to end with the same chore: read the changelog, summarize what actually changed, and write the news post by hand. It was accurate, but it did not scale — and it is exactly the kind of task an agent should own.\n\nToday we shipped the **daily news digest agent** ([PR #64](https://github.com/fworks-tech/agenthood-site/pull/64)). A scheduled GitHub Action fetches new releases, asks an LLM to draft the digest in the house style, validates it against a strict contract, and opens a pull request for review. The first digest is live: [Agenthood Release Digest: v3.13.0–v3.13.6](https://agenthood.flabs.tech/news/whats-new-2026-08-11/).\n\nHere is how it works, where the trust boundaries are, and what our own Reviewer member caught in review.\n\nThe pipeline is two new files:\n\n`scripts/generate-news-digest.mjs`\n\n`.github/workflows/news-digest.yml`\n\nIt runs daily at **06:00 UTC** (plus manual `workflow_dispatch`\n\n):\n\n`content/news/manifest.json`\n\n. Nothing new → `NOOP`\n\n, no PR.`deepseek-v4-flash`\n\n, temperature 0.3, 8,192 max tokens) with the releases formatted as a prompt.`build-news-manifest.mjs`\n\nenforces. On failure, retry once with the rejection reasons fed back to the model.`content/news/whats-new-<date>.md`\n\nand regenerate the manifest.`news-digest/<date>`\n\n, `automation`\n\nlabel, always for human review.The script speaks a tiny machine protocol — `WROTE <path>`\n\nor `NOOP <reason>`\n\n— so the workflow and tests can assert the outcome without parsing articles. It is idempotent by slug: a re-run on the same day is a no-op.\n\nThe one rule that matters most: **the agent never pushes to main.** The best it can do is open a PR with a label.\n\nThe LLM output is untrusted input. Before a single byte reaches the site, the draft must satisfy a strict contract:\n\n| Rule | Why it exists |\n|---|---|\n`title` must equal the first `#` heading |\nThe article can't advertise one thing and say another |\n`date` must be exactly the post date |\nNo backdated or future-dated posts |\n`author` and `summary` must be non-empty |\nNo broken front matter |\n`summary` ≤ 160 characters |\nCard truncation on the\n|\n\n`title`\n\n, `author`\n\n, `summary`\n\nIf validation fails, the script retries **once**, feeding the model the exact rejection reasons — `\"Your draft was rejected for: front matter 'title' does not match the '# ' heading. Please fix these issues…\"`\n\n— and fails loudly if the second attempt is also invalid.\n\nRelease bodies are also treated as untrusted: they flow straight into the prompt, so a crafted changelog could try to steer the model. Mitigated by the strict validation, the \"do not invent\" tone rule, and the human PR gate.\n\nThe system prompt encodes the newsroom style as a spec, not a vibe:\n\nWarm, professional, and precise. First-person plural (\"We've shipped…\"). Confident but measured — no emoji, no exclamation marks, no \"game-changing\" marketing. Explain what changed and why it matters; prefer concrete details (limits, timeouts, files) over vague praise. Stay accurate to the changelog. Do NOT invent features, fixes, links, or press quotes.\n\nSame ethos as this blog. The first digest reads like a human wrote it — grouped by theme, tables for the release overview, no hype.\n\nThe automation itself went through the same [review pipeline](https://github.com/fworks-tech/agenthood-site/pull/64#pullrequestreview-4902595406) Agenthood enforces on every PR. Four findings, all legitimate:\n\n| Finding | The risk | The fix |\n|---|---|---|\n| Release list not paginated | If the gap since the last post grew past 100 releases, newer ones were silently dropped | Pagination loop (≤ 10 pages × 100) that stops at the cutoff |\n| Consecutive runs with an unmerged digest PR | Overlapping PRs covering the same window | Skip when any `news-digest/*` PR is open, not just today's |\n| Transient 5xx bypassed the retry | A single 503 killed the daily run | Retry 5xx with exponential backoff (1s → 2s → 4s) |\n`author` not escaped in front matter |\nA newline or quote could corrupt the YAML | Escape it exactly like title and summary |\n\nThat last one is the pattern we like to point at: the review pipeline caught a real injection-shaped bug in the automation *that was automating part of the review process itself*. The Society polices its own tools.\n\n| Metric | Value |\n|---|---|\n| Digest tests | 17 (80 total in the repo) |\n| LLM attempts per run | 2 max (one retry with feedback) |\n| HTTP retries on 5xx | 3, exponential backoff |\n| Releases fetched | Up to 10 pages × 100 |\n| Summary cap | 160 characters |\n| Time to first digest | Same day the agent merged |\n\nThe digest agent covers the [news page](https://agenthood.flabs.tech/news). The natural next step is letting The Herald draft release notes and The Mailman handle cross-posting — the delivery side of the same pipeline.\n\nThe news does not write itself. The agent drafts it, the contract gates it, and a human signs it. That is how you automate a newsroom without trusting the autopilot.", "url": "https://wpnews.pro/news/the-agenthood-news-digest-now-writes-itself", "canonical_source": "https://dev.to/flabstech/the-agenthood-news-digest-now-writes-itself-2199", "published_at": "2026-08-19 23:20:23+00:00", "updated_at": "2026-08-19 23:44:02.259904+00:00", "lang": "en", "topics": ["ai-agents", "large-language-models", "developer-tools", "mlops"], "entities": ["Agenthood", "GitHub Actions", "deepseek-v4-flash"], "alternates": {"html": "https://wpnews.pro/news/the-agenthood-news-digest-now-writes-itself", "markdown": "https://wpnews.pro/news/the-agenthood-news-digest-now-writes-itself.md", "text": "https://wpnews.pro/news/the-agenthood-news-digest-now-writes-itself.txt", "jsonld": "https://wpnews.pro/news/the-agenthood-news-digest-now-writes-itself.jsonld"}}