when i joined replicas about 6 months ago, i ran an experiment where we gave replicas our entire backlog. half of it came back mergeable on the first try, but every PR still went through me. i had to triage the tickets, write the briefs, start the agents, and decide what was ready.
we've been chipping away at that since, and now customer requests go all the way through without me starting anything.
at 1:59 pm, branavan from moda asked this in our shared slack channel:

at 2:32 pm there was a PR for it, tested on web and ios, with screenshots. at 3:47 pm it was merged. at 3:58 pm i got a DM telling me to go let him know.
i touched it twice. once to merge, once to reply to branavan. here's everything that happened in between.
the ticket files itself
an agent watches every shared customer channel. when someone reports a bug or asks for something, it reads the thread, files a linear ticket with a title, priority, cycle, labels and owner, and posts a note back to us. nobody has to notice the message or decide whose it is.
branavan's message became REP-1393 a minute later.

this also fixes what went wrong most in that backlog experiment: bad briefs. the ticket comes with the request, what's expected, what happens today, who asked, and a link back to the thread.
labels decide where it goes
a mothership is a workspace that owns one area of the product. it doesn't write code itself. it reads each ticket, decides what it needs, and hands the work to ships, which are workspaces with their own sandboxes.
motherships can subscribe to linear by team, cycle, label and assignee. mine takes REP tickets labelled mothership and assigned to me, so REP-1393 went straight there.
19 seconds later it had decided the ticket needed code, started a ship called convert-to-mothership, and written down what it would build and how it would test it.

the ship tests its own work
the ship built the feature across the web app, the mobile app, the api and the docs. then it tested it the way i would have: it converted a real workspace on a local copy of our stack, had the new mothership start a ship of its own, checked the cases that should be refused, and ran the mobile flow on an ios simulator through limrun.
the screenshots went on the PR.

a PR isn't done when it's opened. agent checks run on every commit, greptile reviews it, and anything they flag gets fixed in the same workspace. the mothership only told me about it once it was actually ready.
so i didn't read the 183 lines. i looked at the screenshots, approved, and merged.
the customer hears back
the part that always slipped was telling the customer. we now have an automation that runs when a customer ticket moves to done. it finds the original slack thread and DMs me the PR and a link to it.

it didn't work the first time. the automation ran a second after the ticket closed but never sent the DM, because the triage agent had attached the slack thread in a link format the automation didn't recognise. i asked an agent why, and a couple of minutes later it had found the cause, sent the DM, and updated the automation to handle both formats.
which is kind of the point. the setup broke, and an agent fixed it too.
what's still mine
| time | what happened | who |
|---|---|---|
| 1:59 pm | branavan asks in slack | customer |
| 2:00 pm | ticket filed and routed | agent |
| 2:00 pm | ship started with a plan | mothership |
| 2:32 pm | PR opened with screenshots | ship |
| 3:47 pm | merged | me |
| 3:58 pm | branavan told | me |
the two steps left are deciding a change is good enough to ship, and talking to the customer. i'm not in a rush to hand either of those off.
everything else, i'd rather never do again.