The Pipeline
A desk run
- 1 Cron Hourly. Desk only at 08:00 and 20:00 Pacific.
- 2 Searcher Grok + Firecrawl search + x_search. Up to 10 https URLs.
- 3 Filter Code drops dupes, stale items, and low relevance.
- 4 Analyst Up to five briefs. High needs two sources.
- 5 Articles One Workflow per brief, in parallel.
- 6 Social + close Two posts, then D1 events and the daily log.
Pacific day
- Desk 8:00 AM and 8:00 PM
- X pulse 9:00 AM and 7:00 PM
- 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.6 by role. The Worker holds a Run token, not the xAI key.
- XWrite-only. Two posts, 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.
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
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 (several short Firecrawl searches, a scrape of Hacker News newest, and date-limited
x_search). A full desk run asks for 10; a smallermaxArticlesasks for fewer. - Code filters: https only, relevance ≥ 40, not older than 48 hours, not a near-duplicate of something already on the site.
- Analyst turns the remainder into at most five briefs, and still runs if the list is empty. A High brief needs two distinct https URLs, a verification note, and a confidence score — otherwise it becomes Medium. 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. After gather, 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 fetched pages. - Writer drafts 600–1200 words from that prose. How-to commands must appear in the fetched text.
- Code checks schema, source allowlist, and the
## Sourcesfooter. - Editor scores the draft. 90 publishes. One revise, then a second judgment. Fail closed.
- Imagine 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. It does not tweet.
Where to watch
- /runs/ — live
run_events - Transparency logs — GitHub backup of the daily file