{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/2026-07-10-ai-across-the-avni-lifecycle/","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://avniproject.org","twitterHandle":"@avniproject"}},"post":{"id":"5b8eac2e-814c-5b02-8af9-51ef23ebea25","html":"<p>A year ago, if you'd asked us to imagine \"usage of AI in software development\", we'd not have come up with anything more than \"a coding assistant that converts pseudo-code into a syntactically accurate program\". That's being done now, but it's the least interesting thing we use AI for.</p>\n<p>We're a small team building and running Avni, an open-source platform that reaches over a million beneficiaries across 70-plus organisations. We can't hire people every time we take on a new organisation, so over the last year we've pushed AI into nearly every stage of the work — not just writing code, but working out what a new organisation needs before any code is written, checking a design against the real codebase, running release QA, and pulling a scattered stream of requests into one prioritised list. Here's the whole arc, and where a human still steps in.</p>\n<h2>Before any code : scoping and estimates</h2>\n<p>When a new organisation comes to us, someone has to work out what their field programme needs and how much of it Avni already does — what to track, the forms to capture it, the workflows, the rules and the reports. AI now does a first pass at that mapping and sorts each requirement into \"just configuration\" or \"real development\", and then a person refines it. Our estimates lean on the same habit: instead of guessing, we calibrate against a running record of how long comparable features actually took. And when we honestly don't know whether something is feasible, we build a quick prototype before we put a number in front of anyone.</p>\n<h2>Design : from the code, not from memory</h2>\n<p>Once a feature is worth building, we don't write the spec from imagination. AI reads the live codebase first: does the data model really behave the way we assume, does the sync between the field app and the server work the way similar features already do, and what have we forgotten. That feeds a spec we refine section by section, then cut into stories detailed enough that an engineer who's never touched Avni can pick one up and get it right. A separate pass then checks each spec against a fixed list — including the thing that's easiest to skip under deadline: does this still hold up at the scale of a large, real deployment.</p>\n<h2>Building it : two teams, one habit</h2>\n<p>On the platform side, the hard thinking is already done: we deliberately frontload design and spec, so by the time a story reaches a developer the big decisions are settled. From there it moves fast. The developer plans the change, has AI generate the code against that plan along with its tests, runs an AI code review over the result, and tries it out themselves. A second engineer then runs their own AI-assisted review of the change. We work straight onto master or the release branch — no pull requests — so the safeguard isn't a merge gate: it's the design agreed up front, plus an AI review and a peer review on every change.</p>\n<p>The implementation team — the folks who configure Avni for a single organisation — feel the same pressure from a different angle. Their job is turning requirements into forms, workflows and rules, and generating that organisation's configuration. We've built tooling that gets a first pass at that config from a structured spec, drawing on a knowledge base of roughly fifty past setups. The harder half — taking loosely structured input like a PDF, a spreadsheet or a call transcript and reliably generating the conditional rules behind each form — is in pilot, still being improved. A person reviews everything before it goes live.</p>\n<h2>Release : QA and a sanity check</h2>\n<p>With per-change review already behind us and the tests written alongside the code, QA spends its time where it matters most — on the release as a whole, not on re-checking every change by hand. We generate a focused, risk-ranked test plan that reads what changed across a release (a data-sync or database change matters far more than a cosmetic tweak) and points testers at the hours that actually count. Underneath it, a library of real-world test cases grows release over release, so a case we fought for once doesn't quietly get forgotten.</p>\n<p>Then a last sanity check before it ships. We confirm every story marked for the release is really done, that its code actually landed on the release branch, and that nothing meant for a later release slipped in early — the kind of gap that used to surface only when someone hit a bug in the field.</p>\n<h2>Running it : support and coordination</h2>\n<p>When something breaks, a rough note — often a sentence and a screenshot — becomes a proper bug report: steps to reproduce it, a suggested severity, a check against issues we already have open, and a first guess at which recent change caused it. A person reads it before it's filed. When the cause isn't obvious, we trace it through the system instead of guessing at a fix, and every incident we close leaves behind a short written runbook — what broke, why, and how we fixed it — so the next person doesn't start from scratch.</p>\n<p>Under all of it is the quieter problem a small team across ten codebases lives with every day: requests landing on a board, in an inbox, in a chat thread, with no easy way to tell what's urgent from what merely feels urgent. Pulling that into one prioritised view used to eat a real chunk of the week. It's now mostly automatic — though it still stops and asks whenever it can't tell whose call something is.</p>\n<h2>What it looks like : a normal afternoon</h2>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1600px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/69c973fc07eba539e1a44e4928a847e5/29007/lifecycle.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 62.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMklEQVQoz2VSWZaEIBDjFLIKyKIC6vP+p5ug0zbS+QJCakkV2bbtOI51XadpEkLIBkqpbSs552VZKit7kFJKSgniNQaIKaXsAy5ELhnMrXdGM/ZlAbLve4zRWhuiM2ZsxcA8zwgN5ZpQmmVvkPM8offeu6CdVS8tZ5ClD7QxXWiiNR4r0BLnouU455Nz6BZ14QOufWZGhyceSNoAL1LCB47zMAz0B2SZPaLK65esyb8QnM9+iiE45/QFDKD9QDAqNGZrZRoRXmIhUq6A4XAOtqAB1opzrmbAzLREPY6tI6ARFzKMAwejFe9GFWPIuawpKa1R+OMKWkLmukJ7wRZhIuiuN6wabSfjghx1x0HsL8BwbBs8+HH7StOtzpP8Nvm59mKrxI3bg24YRnEl/9l7eVv8AUtvV3J5g4myAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Four terminal sessions, each doing a different kind of AI-assisted work across the lifecycle — scoping a new deployment, building a feature, release QA, and triaging a support ticket\"\n        title=\"Four terminal sessions, each doing a different kind of AI-assisted work across the lifecycle — scoping a new deployment, building a feature, release QA, and triaging a support ticket\"\n        src=\"/static/69c973fc07eba539e1a44e4928a847e5/29007/lifecycle.png\"\n        srcset=\"/static/69c973fc07eba539e1a44e4928a847e5/01e7c/lifecycle.png 512w,\n/static/69c973fc07eba539e1a44e4928a847e5/2bef9/lifecycle.png 1024w,\n/static/69c973fc07eba539e1a44e4928a847e5/29007/lifecycle.png 1600w\"\n        sizes=\"(max-width: 1600px) 100vw, 1600px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">Four terminal sessions, each doing a different kind of AI-assisted work across the lifecycle — scoping a new deployment, building a feature, release QA, and triaging a support ticket</figcaption>\n  </figure></p>\n<p><em>Four kinds of work at once — scoping, building, testing, triaging — a person on the end of every one.</em></p>\n<h2>The honest part : what's still hard</h2>\n<p>None of this comes for free. The failure we watch for hardest is our own — AI writes a spec or a bug report that reads so well we're tempted to wave it through, and a confident, fluent answer is the easiest kind to be wrong about. The review gates are there to catch exactly that: us trusting good writing too quickly.</p>\n<p>It's also at its best where there's a pattern to copy — a feature with close cousins already in the codebase. Ask it for something genuinely new, or the estimate that comes with it, and the judgement stays ours. And the lesson that changed the most: it has to work from the real code, not from memory. Left to recall how the system behaves, it will tell you confidently and be wrong — so now it reads the actual code before writing a line.</p>\n<h2>Under the hood : the tooling</h2>\n<p>For the technically curious, the stack behind the above:</p>\n<ul>\n<li><strong>The codebase.</strong> Avni is open source across roughly ten repositories at <a href=\"https://github.com/avniproject\">github.com/avniproject</a> — the Android field app (<code>avni-client</code>), the server (<code>avni-server</code>), the web console (<code>avni-webapp</code>), the shared data models (<code>avni-models</code>), the reporting pipeline (<code>avni-etl</code>), the rules configuration (<code>rules-config</code>) and the infrastructure (<code>avni-infra</code>), among others.</li>\n<li><strong>Where the day-to-day happens.</strong> A lot of this lives outside the product code, in operational repositories — <code>avni-product-ops</code> (release readiness, risk-ranked test plans, cross-repo triage, and the prioritised view of what to work on next), <code>avni-support-ops</code> (turning support tickets into fixes), a shared <code>avni-skills</code> library the rest of the team draws on, and <code>data-fixes</code> (scripted, reviewed corrections to live data at scale). Several of these are private, but the working style is identical to the code: written down, versioned, and reviewed before it runs.</li>\n<li><strong>The agent.</strong> Most of this runs through Claude Code (Anthropic), on Claude Opus and Sonnet, working directly against those repositories.</li>\n<li><strong>Our process, written down.</strong> The pipeline above — scope, spec, break into stories, implement, diagnose, turn a rough note into a bug report, generate a test plan, review, verify a release — lives as reusable <em>skills</em> and multi-agent <em>workflows</em> (packaged instructions and multi-step scripts anyone on the team can invoke by name), so the same discipline is a single command away. For the core engineering habits (think before building, test-first, debug systematically, verify before calling it done) we build on the open-source <em>superpowers</em> toolkit from Anthropic's official Claude Code marketplace rather than reinventing them.</li>\n<li><strong>Connected tools (MCP).</strong> The agent reaches GitHub (issues, commits and project boards), Google Workspace (docs and sheets), and a real browser through Playwright for exercising the web console during testing.</li>\n<li><strong>Supporting pieces.</strong> A local mirror of every open issue for fast triage; scripts that check a release is genuinely ready to ship; a knowledge base of past setups that seeds new configuration.</li>\n</ul>\n<p>The platform itself is fully open source on public GitHub; the day-to-day operational tooling is a mix of public and private. If any of it is useful to your team, get in touch — we're glad to share how it works.</p>","frontmatter":{"date":"July 10, 2026","title":"AI in Samanvay : How we actually build and run the Avni platform now","author":"Himesh R","description":"Story of a small team leveraging AI to amplify results","tags":["AI","Software Engineering","Tech4Dev","Social Impact"],"image":{"childImageSharp":{"resize":{"src":"/static/69c973fc07eba539e1a44e4928a847e5/f3583/lifecycle.png","height":750,"width":1200}}}},"fields":{"slug":"/blog/2026-07-10-ai-across-the-avni-lifecycle/"}}},"pageContext":{"id":"5b8eac2e-814c-5b02-8af9-51ef23ebea25"}},"staticQueryHashes":["1175525803","4080856488"]}