Atmospheric Automated Development

Updated:
4 min read

I run a feedback board for Standard Reader. People file bugs and feature requests, and my workflow has trended toward letting the AI do more and more. Until this point I've been at the helm, guiding architectural decisions, defining patterns. But I've come to a point where my AI is getting it right on the first shot and I have to watch it a lot less.

So I wired up a pipeline that takes me out of it. Now when I mark a piece of feedback "planned" on Standard Reader's userinput.app board, an autonomous coding agent picks it up, implements it, and opens a draft PR.

The only decisions left are the ones that should be human: Is this worth building? Does the user experience make sense?

The Trigger

The board is built on userinput.app, which I wrote about in a previous post. I have three labels set up: bug, feature, question.

To start the workflow for a piece of feedback, all I have to do is set its status to planned (typically from my phone).

A planned piece of feedback
A planned piece of feedback

Watching for the Event

To turn planned work into "do something" I use airglow.run, an IFTTT-style automation tool for the Atmosphere. It watches the firehose for records matching a rule and fires an action.

First we wait for an app.userinput.status record to show up in Standard Reader's repo.

The condition for my workflow
The condition for my workflow

Kicking off the Work

Once that condition is met, we POST to a webhook that points at GitHub's repository_dispatch endpoint:

The webhook that is triggered
The webhook that is triggered

A GitHub Actions workflow listens for that feedback-planned event.

on: repository_dispatch: types: [feedback-planned]

Once triggered we:

  1. Read the board and find every discussion currently marked planned
  2. Skip anything tagged question — those want an answer from a person, not a PR
  3. Skip anything already handled
  4. Create a branch for it to push to, then fire the actual agent
  5. Move the User Input item to In Progress

Turning Feedback into a Prompt

Feedback comes from a user who is frustrated and trying to figure out something that's broken or missing. They're bound to be a little wrong in one way or another. The prompt has to account for that since I've given myself no room to add extra text.

The standing instructions tell the agent to:

There's a security angle too, since these bodies are written by the public and the agent can push branches under my identity. The feedback is labeled untrusted input. It describes what to build, and it never carries instructions about how the agent should behave. Anything in a feedback body that reads like a directive to the agent gets ignored.

Running the Agent

I'm lazy and I know I could probably use some better service, but hooking up your repo to https://claude.ai/code is super easy. The GitHub action triggers a "Routine" that contains the meaty parts of the prompt. It's really just a fancy session that I can trigger programmatically — I can even go in and chat if I want.

Verify the Work

I don't just merge! I of course skim the code and make sure it looks good, but that isn't the important part.

The critical part of this is that I have full previews set up for PRs:

With this I can pull the PR up on my phone and check out the result of the work. If it's a bug, I verify it's fixed. If it's a feature, I critique the design and UX. When something needs to be changed, I can just pull up the routine and dictate my changes to it as I browse the app.

After I merge, the User Input item is moved to Implemented.

Closing Thoughts

The nice thing about this is how little of it is new. Triage was already producing a record, GitHub already had a way to be poked, and the agent already knew how to write code. I just connected things that already existed.

Now triage and implementation are the same gesture.

Do you want to implement this? Go steal it from Standard Reader.

Enjoying the blog?

Subscribe to get new posts delivered straight to wherever you read standard.site publications.

Subscribe