An autonomous agent that researches, writes and publishes a news site An autonomous agent named ALEMBIC researches, writes, and publishes news articles for a site without human review, running weekly on Mondays via GitHub Actions. The system uses the kimi-k3 model through the Moonshot API and is designed to publish nothing when no significant news occurs, with each run producing a single commit for fast correction. New analysis articles in this site's newsroom are researched, written, sourced and published by ALEMBIC without a human reading them beforehand. It runs once a week, reports back on what it did, and is allowed to conclude that nothing worth writing about happened. An alembic is the vessel distillation actually happens in. Given what this site covers, the name was not a hard decision. Pipeline Seven stages, unattended. Scan Queries seven separate news beats and decodes the real article URLs out of the aggregator redirects. Filters to an eight day window so nothing is covered twice and nothing recent is missed. Deduplicate Parses every source URL already cited anywhere on the site and discards matches. The agent cannot rediscover a story it has already filed, which is the failure mode that makes most news bots repetitive. Judge Sends the surviving candidates and the full list of existing headlines to the model, and asks a deliberately hostile question: did anything actually happen. Opinion columns, stock commentary and rewrites of covered stories are rejected here. Research For a selected story, fetches each underlying article and extracts the readable text, so the writing pass works from primary coverage rather than from a headline and its own recollection. Write Produces the article against an explicit style contract: allegations labelled as allegations, established fact stated separately from claims, no relative dates on permanent pages, and a closing section that separates what is proven from what is merely asserted. Verify Every cited URL is fetched to confirm it resolves. The draft is checked for slug collisions, disallowed markup, minimum length, and sources already used elsewhere. Anything that fails is discarded rather than repaired. Publish Rebuilds all sixty pages, validates every structured data block and every internal link, then deploys and confirms each live URL returns 200. A failure at any point aborts before anything reaches the site. Design The hardest behaviour was teaching it to publish nothing. Most autonomous content systems fail the same way. Given a schedule and an obligation to fill it, they inflate trivia into events. A quiet week produces a confident article about nothing, and quality collapses on exactly the weeks when restraint mattered. Silence is an explicit, expected output. The selection prompt states that choosing nothing is a valid and common answer, and that most weeks contain no real development. In practice this is the single most important line in the entire system. The second design decision follows from having no approval gate. Prevention is replaced with fast correction: each run is exactly one commit, so a bad article is undone with a revert and a redeploy in seconds rather than edited under pressure. Stack What it is actually made of. Model kimi-k3, via the Moonshot API. The model at the centre of the distillation accusations this newsroom covers is the model writing the coverage. That is deliberate. Runtime Plain Node with no dependencies. Scheduled by GitHub Actions, Mondays at 09:00 Eastern. Manually triggerable with adjustable lookback window, article cap, and a dry run mode. Discovery Syndicated news feeds across seven beats, with the genuine article URL recovered from the aggregator's redirect parameters so every citation points at the original publisher. Storage The site is a static build from a content module. The agent inserts a structured object into that module, which means its output is diffable, reviewable after the fact, and revertible like any other code change. Delivery Deploys over SSH with the key held as an encrypted secret. The deploy script verifies every URL on the site returns 200 before it reports success. Field notes Three things only running it could have found. Worth recording, because none of these are visible in code review and all three would have killed a Monday run silently. The model rejects the temperature you assume kimi-k3 refuses any temperature other than 1. A parameter copied from habit returned a 400 on the very first call. Line endings broke the insertion The routine that splices a new article into the content module matched on a newline. The authoring machine writes CRLF and the CI runner writes LF, so it failed on one and would have failed differently on the other. Now agnostic to both. Reasoning tokens are spent before you see output Reasoning models consume the token budget thinking, then write. A budget sized for the visible answer was exhausted during deliberation and returned an empty string, which surfaced as an unhelpful JSON parse error. Failures now report the finish reason and token usage instead. Built by Brian Galvan. ALEMBIC was built as working practice in autonomous agent design, not as a demonstration. It runs on a live domain with real search exposure, which is the only environment where this kind of system tells you the truth about itself.