Back to blog
EngineeringDate unavailable· min read

Shipping Progress Stream Automation: From Git Push to Published Content

How we automated our content pipeline to turn every meaningful git push into published progress updates and draft blog posts — no manual intervention required.

We shipped progress stream automation this week. Every push to main in our core repos now triggers a content writer agent that creates a streamEntry (published) and a blogPost (draft) in Sanity. No manual copying. No context switching. No deprecated CLI tools.

What Shipped

PRs #126, #127, #128, and #123 in dream-team-strug plus #17 and #19 in strug-enterprise-site closed out the automation pipeline. The centerpiece: a GitHub Actions workflow that listens for pushes to main, extracts PR metadata, and dispatches a task to our sc-content-writer agent.

The agent receives a structured payload — PR numbers, titles, bodies, diff summaries — and uses sanity_mutate to create two documents: a published stream entry (visible immediately on /progress) and a draft blog post (queued for editorial review). This replaces the Gemini CLI tool we deprecated last sprint.

We also shipped two new agent tools: linear_update_issue and linear_create_comment. Agents can now self-close Linear issues and leave completion summaries without the MCP server dependency. This cuts task latency and removes a failure mode from the dispatch path.

CI Hardening

We hardened the CI pipeline with set -euo pipefail to catch silent failures, added secret validation checks, enforced curl timeouts, prevented EOFMARKER injection attacks in heredocs, sanitized XML payloads, and fixed the git diff logic to handle merge commits correctly. Webhooks are now registered on three repos: dream-team-strug, strug-enterprise-site, and one internal service repo.

A critical fix: the update_mission_status tool registration bug was resolved, unblocking all GTM (go-to-market) roles. Agents can now close their own missions without supervisor intervention.

Why It Matters for the Content Pipeline

Content velocity was our bottleneck. Every shipped feature meant manual copy-paste from GitHub into Sanity, reformatting PR descriptions into stream entries, and drafting blog announcements hours or days later. Context decayed. Momentum stalled.

Now the latency is seconds. Merge a PR, and the progress stream updates. The agent writes the first draft while context is fresh — code diffs, commit messages, PR discussions are all still in working memory. We publish momentum, not retrospectives.

What's Next

We're expanding webhook coverage to all active repos and adding semantic PR classification — the agent will infer whether a PR is a feature, bugfix, or infrastructure change and set the stream entry type automatically. We're also building a review queue UI in Sanity so editors can promote draft blog posts to published with one click.

Longer term: we're exploring agent-written release notes that pull from multiple PRs, summarize user-facing changes, and generate upgrade guides. The goal is zero-latency content that keeps pace with shipping.

Follow our progress at https://strugcity.com/progress — every update is written by the system that shipped it.