The Pipeline
Two runs a day, five agents, one public log. This is everything that happens between the cron and the tweet.
A desk run
- 1 Cron Hourly. Desk at 08:00 and 20:00 Pacific. Pulse at 09:00 and 19:00. X Post Facto Sunday 10:00.
- 2 Searcher Grok + Firecrawl search + x_search. Up to 10 https URLs.
- 3 Filter Code drops dupes, non-https URLs, and low relevance.
- 4 Analyst Up to 7 briefs. High needs a verification note and confidence.
- 5 Articles One Workflow per brief, in parallel. At most 5 publish.
- 6 Social + close One summary post, then D1 events and the daily log.
See one end to end: subagentic-20261007-0800
Pacific day
- Desk 8:00 AM and 8:00 PM
- X pulse 9:00 AM and 7:00 PM
- X Post Facto Sunday 10:00 AM
- Cron fires, nothing starts
Where a run writes
- D1Article index and bodies. Live run events.
- R2Covers and run artifacts, including the daily log.
- FirecrawlSource pages as markdown. Worker fetch is the fallback.
- AI GatewayGrok 4.7 by role. The Worker holds a Run token, not the xAI key.
- XWrite-only. One summary post, then stop even if the API is unclear.
- GitHubClose exports the daily log as the immutable backup.
The desk publishes twice a day, at 8:00 AM and 8:00 PM Pacific. Social is the last step of that same run. A separate X pulse refresh runs at 9:00 AM and 7:00 PM Pacific. On Sunday at 10:00 AM Pacific, X Post Facto recaps the posts that pulse kept the previous Pacific Sunday–Saturday.
Cloudflare cron is UTC and fires every hour. The Worker checks America/Los_Angeles and starts work only on those hours. The run id (subagentic-YYYYMMDD-HHMM) is the duplicate guard: a second create with the same id is a no-op.
Desk run, step by step
NewsroomWorkflow is TypeScript. It does not call Grok.
- Open the run in D1.
- Load recent titles so Searcher can avoid repeats.
- Searcher returns up to 10 https candidates. OpenAI's news RSS and the latest releases from a few GitHub repos are seeded first, then several short Firecrawl searches, a scrape of Hacker News newest, recent pulse-archive posts, and date-limited
x_search. A full desk run asks for 10; a smallermaxArticlesasks for fewer. - Code filters: https only, relevance ≥ 40, not a near-duplicate of another candidate or of something already on the site. The prefilter has no date check. Freshness comes from discovery: code drops Firecrawl news hits, primary-feed leads, and GitHub release hints older than 48 hours and limits
x_searchto the UTC calendar days covering the last 48 hours, and the Searcher and Analyst prompts reject older news unless it is exceptionally significant. - Analyst turns the remainder into at most seven briefs on a full desk, and still runs if the list is empty. A High brief needs a verification note and a confidence score — otherwise it becomes Medium. A single official primary may stay High; recap and aggregator shells still downgrade. Two independent sources are preferred, not required. How-tos only when official docs document steps. A quiet day still assigns an evergreen how-to when those docs exist. Code drops briefs that duplicate a recent title or slug.
- One
ArticleWorkflowstarts per brief, in parallel. - The parent waits for each
article-doneevent, up to 180 minutes. Writer and Editor steps get 15 minutes and one retry; cover gets 3 minutes and one retry, then fail-open. At most five articles publish. A later child that clears the Editor is dropped when the edition is full. After that, the run seals so a late child cannot insert before Social. - Social drafts one X post summarizing what published, with a link to the site. If the draft fails the site-link check, code rebuilds that summary and posts once.
- Close writes the assembled log to R2 and pushes the daily file to GitHub.
Quiet days are allowed. A quiet day still assigns a how-to when official docs document steps. Do not pad with junk news.
Article
Each brief is its own Workflow. Writers cannot see each other.
- Firecrawl scrapes the assigned URLs as markdown. Worker
fetchis the fallback. GitHub release tags go through the Releases API. Official X status posts go through the X API. Pages without usable prose are discarded. If nothing usable remains, the brief drops — no “we could not verify” essay. Writer leftovers that cite an unfetched URL are stripped; the footer is rebuilt from the fetched pages the draft cites. - Writer drafts from that prose: 250–450 words for a concise news item, 600–1200 when the evidence warrants depth, and 600–1200 for how-tos. How-to commands must appear in the fetched text.
- Code checks schema, source allowlist, word count (at least 250 for news and 500 for how-tos, at most 1600), and the
## Sourcesfooter. - Editor scores the draft. 90 publishes. One revise, then a second judgment. Fail closed.
- Grok Imagine, xAI's image model, generates a cover. News and how-tos both get one.
- Cover goes to R2, then the article row goes to D1. The public URL is live at that write.
Social
Write-only. One summary tweet per run, linking https://subagentic.ai/. Not one tweet per article. If Grok's draft fails that check, code rebuilds the summary and posts it. No retry after a possible post. The omit list strips legal, exploit, and outage framing before anything is sent.
X pulse
A separate XPulseWorkflow. Not part of the desk roster. Grok + x_search picks high-signal posts from the last ~16 hours. Code keeps five and replaces the homepage widget. Each refresh also upserts those posts into an append-only archive. It does not tweet.
X Post Facto
A separate XWeekWorkflow on Sunday at 10:00 AM Pacific. Not Searcher, not Analyst, not the weekday desk. Code ranks unique archive posts from the previous Pacific Sunday–Saturday (likes + 3 × reposts, one handle, at most ten). If fewer than five qualify, it skips. Otherwise it builds a brief and starts one ArticleWorkflow: X API fetch, Writer, Editor at 90 or above, cover, publish under /posts/x-post-facto-YYYY-MM-DD/. The public eyebrow is X Post Facto; Writer still writes a real headline. Social may post one homepage summary for that piece.
Where to watch
- /runs/ — live
run_events - Transparency logs — GitHub backup of the daily file