[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f3vzc5qktzeny2":3},{"_id":4,"slug":5,"title":6,"subtitle":7,"kind":8,"cards":9,"tags":58,"categories":60,"source":62,"lang":65,"author":66,"audioState":69,"stats":70,"publishedAt":73,"renderer":74},"6abd2738ca21c797c7ea23b4","one-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce","One stack per ticket: why our coding agent works on a DB copy","Every ticket on our board gets its own stack: a branch in every repo, its own services, its own copy of the dev database and its own preview URL.","news",[10,13,18,23,28,33,38,43,48,53],{"headline":6,"body":11,"imageUrl":12,"sourceImageUrl":12},"Every ticket on our board gets its own stack: a branch in every repo, its own services, its own copy of the dev database and its own preview URL. We built it because coding agents made my developers faster, and the mistakes moved out of the code and into the branches around it.","https:\u002F\u002Fmedia2.dev.to\u002Fdynamic\u002Fimage\u002Fwidth=1200,height=627,fit=cover,gravity=auto,format=auto\u002Fhttps%3A%2F%2Fpanth.vardayinitech.in%2Fassets%2Fblog%2Fcovers%2Fone-stack-per-ticket.png",{"headline":14,"body":15,"imageUrl":16,"images":17},"I'm Panth, and I lead the software team","I'm Panth, and I lead the software team at Oizom, where Envizom is the platform. This is why our agent pipeline isolates per ticket, and what the isolation buys beyond running tasks in parallel.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F1.webp",{"local":16},{"headline":19,"body":20,"imageUrl":21,"images":22},"With an agent, one developer can keep three","With an agent, one developer can keep three tasks in flight. That holds while all three go into the same branch and the same release. Once they are due in three different releases, the developer juggles repos and branches and has to remember which change belongs to which PR.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F2.webp",{"local":21},{"headline":24,"body":25,"imageUrl":26,"images":27},"The development was usually fine. The mistakes were","The development was usually fine. The mistakes were a change on the wrong branch, or a fix that only worked on one machine. As agents got faster I saw more \"works on my machine\" on my team, and client expectations kept going up at the same time. What was missing was a sandbox you could fork for one task and turn into a PR when it was done. When a developer drags a ticket to Approved, orch, our orchestrator, provisions a workspace for it:","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F3.webp",{"local":26},{"headline":29,"body":30,"imageUrl":31,"images":32},"An agent does the work inside that workspace","An agent does the work inside that workspace. The developer talks to it only through the ticket thread, tests the preview, and drags the ticket to Git Push when it is right. Until then, nothing the ticket does reaches the shared dev branch. Isolation is the safety decision A stack per ticket looks like a way to run things in parallel. That is half of it. The other half is safety.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F4.webp",{"local":31},{"headline":34,"body":35,"imageUrl":36,"images":37},"An agent that runs a bad migration or","An agent that runs a bad migration or deletes the wrong rows does it to the ticket's copy of the database. An agent that breaks the backend breaks the ticket's backend. Nobody else's work is touched, because nobody else's work is in that box.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F5.webp",{"local":36},{"headline":39,"body":40,"imageUrl":41,"images":42},"The shared environment is reached only at Git","The shared environment is reached only at Git Push, and that step is a script, not the agent. Orch commits the ticket branches, merges dev into them, opens and merges the PRs, waits for CI, rolls the new images onto the dev VM and runs health checks. If the VM is unhealthy afterwards, orch rolls it back to the previous images, reverts the merges and tells the thread what happened. All of it stops at dev. Production goes through a separate path where people make the call.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F6.webp",{"local":41},{"headline":44,"body":45,"imageUrl":46,"images":47},"The second thing isolation gives us is time","The second thing isolation gives us is time. A ticket can sit in QA for a week while three others ship. Its branch, its data and its thread wait for it, and nothing else waits on it. Three tickets due in three releases are three separate stacks, and each one ends in its own PR.","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F7.webp",{"local":46},{"headline":49,"body":50,"imageUrl":51,"images":52},"It is also why the audit trail holds","It is also why the audit trail holds together. What was asked, what was built, which preview was tested and what feedback went back all sit on one ticket, not mixed with another ticket's work. What made the copies cheap","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F8.webp",{"local":51},{"headline":54,"body":55,"imageUrl":56,"images":57},"A database copy per ticket only works if","A database copy per ticket only works if copying is cheap. In Envizom V3, which we are rebuilding from scratch, the backend runs in dev without a single extra database credential. Every store has a dev driver:","\u002Fapi\u002Fmedia\u002Fposts\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-3673ddce\u002F9.webp",{"local":56},[59],"dev",[61],"Technology",{"name":63,"url":64},"Dev.to","https:\u002F\u002Fdev.to\u002Fpanthpatel\u002Fone-stack-per-ticket-why-our-coding-agent-works-on-a-db-copy-1d6m","en",{"handle":67,"displayName":68},"spots","Spots","queued",{"views":71,"likes":72,"saves":72,"shares":72,"completions":72,"opens":72,"skips":72,"depthSum":72},1,0,"2026-09-30T15:14:00.498Z","local"]