How Long Does It Take to Build an AI Agent? Real Timeline
DevPilot's own Linear bridge code shows the real time sink: webhook wiring and dispatch logic, not the agent's reasoning.
7 min read
How DevPilot is built, and why. Mostly the decisions that were harder than they looked.
DevPilot's own Linear bridge code shows the real time sink: webhook wiring and dispatch logic, not the agent's reasoning.
7 min read
DevPilot's dispatch_queue assigns issues to agents. See what's proven live, what's stubbed, and how adoption differs from dispatch.
5 min read
How DevPilot syncs coding agent sessions with Linear issues: signed webhooks, auto-dispatch on assignment, and real-time status updates.
5 min read
An agent orchestrator owns sequencing, retries, and pauses for review — not execution. See the real split from DevPilot's codebase, code table included.
5 min read
The critical path is the longest dependency chain in a plan. Nothing you do to the rest of the graph moves the finish line until you shorten it.
5 min read
A plan can be valid and still bad. Parallelization, peak width, wave efficiency, dependency density and file conflict are computable before dispatch.
5 min read
Two limits, not one. A global cap protects your machine and your bill; a per-plan cap protects the work from itself. Confusing them is the common mistake.
4 min read
A plan an agent can execute has checkable properties: acyclic dependencies, exclusive file ownership, and tasks that fit in a single context.
4 min read
A queue keeps agents busy. A wave keeps them coherent. The difference is a barrier, and it is why auto-advance is a real feature rather than a scheduler.
4 min read
An audit found api_key_encrypted was plaintext. Fixing the cipher was the easy half — the hard half was proving nothing else can read the column.
5 min read
Our entire bridge API was unauthenticated once. The fix was not more care — it was making the authorization check impossible to skip by accident.
5 min read
Two machines race the same queue row. No advisory lock, no SELECT FOR UPDATE — the conditional UPDATE is the acknowledgement, and the loser gets nothing.
5 min read
We moved dispatch off Pub/Sub and onto a Postgres row. The transaction boundary is the whole reason, and Realtime became an optimisation.
6 min read