<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:blog="https://jonesrussell.github.io/blog/ns"><channel><title>Ai-Assisted-Dev on Web Developer Blog</title><link>https://jonesrussell.github.io/blog/tags/ai-assisted-dev/</link><description>Recent content in Ai-Assisted-Dev on Web Developer Blog</description><image><title>Web Developer Blog</title><url>https://jonesrussell.github.io/blog/images/og-default.png</url><link>https://jonesrussell.github.io/blog/images/og-default.png</link></image><generator>Hugo -- 0.164.0</generator><language>en-us</language><lastBuildDate>Tue, 02 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jonesrussell.github.io/blog/tags/ai-assisted-dev/feed.xml" rel="self" type="application/rss+xml"/><item><title>From vibe-coded to shippable: a playbook</title><link>https://jonesrussell.github.io/blog/from-vibe-coded-to-shippable/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://jonesrussell.github.io/blog/from-vibe-coded-to-shippable/</guid><category>ai</category><blog:tag>vibe-coding</blog:tag><blog:tag>ai-assisted-dev</blog:tag><blog:tag>prototyping</blog:tag><blog:tag>spec-driven</blog:tag><description>Six moves that take a vibe-coded prototype to a state where it can be run, debugged, and handed off.</description><content:encoded><![CDATA[<p>Ahnii!</p>
<p>There&rsquo;s a lot of energy right now spent bashing vibe coding. I think most of it is aimed at the wrong target. The MVP you stand up with AI doesn&rsquo;t have to generalize. That&rsquo;s not what it was for. The interesting craft is what you do <em>next</em> to take that prototype from &ldquo;it works on my laptop&rdquo; to something a stranger can run, debug, and trust. That&rsquo;s a craft worth respecting. This post is the playbook I&rsquo;m currently running on a real public repo, with six specific moves and an artifact for each.</p>
<h2 id="the-wrong-fight">The wrong fight</h2>
<p>The bashing usually goes like this: &ldquo;Look at this AI-generated MVP, look at how brittle it is, look at how much it cost in tokens to get it half-right.&rdquo; Sure. Now compare it to the alternative: an empty directory and a developer who hasn&rsquo;t started. The point of the prototype isn&rsquo;t to be production code. The point of the prototype is to find out whether the idea works at all. To answer a question. To make something move on a screen that wasn&rsquo;t moving yesterday.</p>
<p>Once it moves, you have new information. You know which parts are load-bearing. You know which gotchas bit you. You know which assumptions held up. You&rsquo;re now in a much better position to do the second pass, and the second pass is where the craft lives. The craft is the set of moves you make to take a working prototype to a state where someone else can run it, debug it, and trust it.</p>
<p>Those moves are not mysterious. They have names. They are the rest of this post.</p>
<h2 id="the-repo-on-the-bench">The repo on the bench</h2>
<p>The worked example is the OIATC application, a public PHP repo I build alongside my own modern PHP framework, <a href="https://github.com/waaseyaa/framework">Waaseyaa</a>:</p>
<p><a href="https://github.com/waaseyaa/oiatc-waaseyaa">https://github.com/waaseyaa/oiatc-waaseyaa</a></p>
<p>It powers <a href="https://oiatc.ca">oiatc.ca</a>. The marquee feature inside it is Anokii, an embedded AI chat that grounds its answers in the site&rsquo;s own community-resource pages and cites them. Anokii started as a vibe-coded chat experiment. It&rsquo;s now a RAG pipeline with a relevance gate, per-community variants, anonymous query-gap logging, and a topic-confidence gate on citations. Every step below points at a specific artifact in that repo.</p>
<h2 id="step-1-milestone-the-roadmap">Step 1. Milestone the roadmap</h2>
<p>The first thing that turned the Anokii work from &ldquo;a directory of chat hacks&rdquo; into &ldquo;a project&rdquo; was naming the phases. Phase 1 got a chat working at all. Phase 2 introduced RAG grounding, split into stages: Stage 1 was the <code>doc_chunk</code> entity and the <code>app:ingest-docs</code> CLI that fills it; Stage 2 was the keyword-RAG retrieval over those chunks.</p>
<p>Branches in the repo carry the phase names. <code>feat/doc-chunk-ingestion</code> landed Stage 1. <code>feat/keyword-rag-chat</code> landed the MVP retrieval. <code>feat/sagamok-resources</code> and <code>feat/data-sovereignty-and-masthead</code> carried sibling work. Each branch closes with a merge commit that documents what shipped, and only after that does the next phase begin.</p>
<p>Three phases, a handful of branches, every one of them with a concrete definition of done. That&rsquo;s enough structure to know what to work on next, and just as importantly, what <em>not</em> to work on right now.</p>
<p>You don&rsquo;t need a wiki or a project board. You need branch names that announce intent and merge commits that close the loop.</p>
<h2 id="step-2-write-the-runbook-including-the-gotchas">Step 2. Write the runbook, including the gotchas</h2>
<p>The repo&rsquo;s <a href="https://github.com/waaseyaa/oiatc-waaseyaa/blob/main/CLAUDE.md">CLAUDE.md</a> is the runbook. It opens with a Strategy folder pointer: a separate workspace outside the repo tracks every live page on oiatc.ca against its canonical Twig source, last-updated date, and analytics. The CLAUDE.md says, plainly, that if the two disagree, the repo wins.</p>
<p>Below that pointer it documents the architecture (<code>Access/</code>, <code>Controller/</code>, <code>Domain/</code>, <code>Entity/</code>, <code>Provider/</code>, <code>Support/</code>), the ServiceProvider DI methods with full signatures (<code>singleton</code>, <code>bind</code>, <code>resolve</code>, <code>tag</code>, <code>entityType</code>), the queue Job pattern with <code>tries</code>, <code>timeout</code>, <code>retryAfter</code>, and the frontend template families (site shell vs. longform documents vs. news). An Operations section, added in commit <code>896ec8f</code>, covers deploy, Raspberry Pi access, and secrets.</p>
<p>The runbook is the operating manual you wish someone had handed you. The OIATC one is dense because it earned every line. The mistakes that produced those lines aren&rsquo;t generic; they&rsquo;re specific to this app, this framework version, this deployment target. That&rsquo;s exactly what makes them worth writing down.</p>
<h2 id="step-3-pin-the-world">Step 3. Pin the world</h2>
<p>Vibe-coded prototypes love <code>composer install</code> and <code>git clone main</code>. That works on Tuesday. It breaks on Friday when upstream cuts a release. The OIATC repo pins the world three different ways.</p>
<p>First, <code>composer.lock</code> is committed and treated as the source of truth. Lock-file drift gets its own entry in the upstream-notes (entry 003 walks through a drift caused by a post-hash <code>php: &gt;=8.5</code> constraint and the fix). Second, the deploy contract is a <code>docker compose run</code> that calls <code>bin/waaseyaa db:init</code> before bringing the app up:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose run --rm oiatc-app bin/waaseyaa db:init
</span></span><span style="display:flex;"><span>docker compose up -d
</span></span></code></pre></div><p><code>db:init</code> is idempotent. Fresh volume gets migrations. Current schema is a no-op. Safe to invoke on every deploy. That&rsquo;s what makes a deploy step a contract instead of a tradition.</p>
<p>Third, the app lives on a specific <code>waaseyaa/framework</code> alpha version (currently alpha.188). Upgrades happen as deliberate events with their own branch and their own entry in the upstream-notes, not as quiet drift. When upstream cuts a release that breaks something, you have a working baseline to compare against.</p>
<h2 id="step-4-name-the-graveyard">Step 4. Name the graveyard</h2>
<p>The repo has a literal graveyard directory: <a href="https://github.com/waaseyaa/oiatc-waaseyaa/tree/main/docs/archive"><code>docs/archive/2026-04-20-cut-pages/</code></a>. It holds Twig templates and design notes for pages that were on oiatc.ca and got cut. Not deleted from git history. Not pretended to never have existed. Filed under a date and a reason so the next person can read what we tried and why we stopped.</p>
<p>This pattern shows up in the codebase too. The keyword-RAG retrieval merge commit literally calls itself &ldquo;Path B.&rdquo; There was a Path A. Path A&rsquo;s notes are still around. Anyone looking at the current Path B implementation can see the alternative that was considered and the trade-offs that drove the decision.</p>
<p>Naming the graveyard is one of the cheapest, most under-used moves in software. Most repos don&rsquo;t do it because it feels embarrassing. The OIATC repo does it because each cut page and each abandoned path represents a hypothesis tested. The next person who has a similar hypothesis deserves to see the result.</p>
<h2 id="step-5-recon-before-you-build">Step 5. Recon before you build</h2>
<p>The single most useful artifact in the repo is <a href="https://github.com/waaseyaa/oiatc-waaseyaa/blob/main/docs/waaseyaa-upstream-notes.md"><code>docs/waaseyaa-upstream-notes.md</code></a>. It&rsquo;s a running log of framework quirks, bugs, breakages, and missing pieces hit while building on an alpha release of <code>waaseyaa/framework</code>. Each entry uses a fixed format:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>## NNN — short title
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>- **Date / version:** YYYY-MM-DD · waaseyaa/framework alpha.NNN
</span></span><span style="display:flex;"><span>- **Doing:** what we were doing when we hit it
</span></span><span style="display:flex;"><span>- **Symptom:** the observable problem
</span></span><span style="display:flex;"><span>- **Workaround:** what we did to get unblocked
</span></span><span style="display:flex;"><span>- **Likely upstream fix:** the proper change in waaseyaa/framework
</span></span></code></pre></div><p>There are 16+ entries. Stale <code>VERSION</code> files. Ambiguous class resolution between the metapackage and split mirrors. Lock-file drift after a platform requirement bump. Hard <code>ext-sodium</code> dependency via the OIDC stack. Each one is recon for the framework itself.</p>
<p>The point of the upstream-notes is not to complain. The point is to keep app-level hacks out of the consumer code. Every entry is a decision: do we patch around it here, do we file the upstream fix now, do we wait until the next alpha. Without the log, those decisions get re-litigated every time someone hits the same wall.</p>
<p>This is also the move I think AI tooling makes most useful. When you hit a quirk, write the entry first. The structured shape forces you to articulate what you actually saw, what you&rsquo;re guessing, and what would fix it upstream. That writing is exactly the input the model needs to either help you work around it cleanly or propose an upstream change.</p>
<h2 id="step-6-layer-specs-on-whats-next">Step 6. Layer specs on what&rsquo;s next</h2>
<p>The hardest current work on Anokii doesn&rsquo;t get vibe-coded. The topic-confidence gate that decides whether a citation is worth showing (<code>65de562</code>), the relevance gate that ensures only genuinely relevant passages are cited (<code>8359e37</code>), the climate-companion variant for the Massey Solar resource cluster (<code>c8956f6</code>), the shared relational-graph instance per community (<code>928191d</code>) — all of those run through <a href="https://github.com/waaseyaa/oiatc-waaseyaa/tree/main/docs/superpowers"><code>docs/superpowers/specs</code></a> and <code>docs/superpowers/plans</code>. Each change has a spec articulating the intent, a plan decomposing the work, and reviewable PRs landing the implementation.</p>
<p>Why specs and not just commits: a relevance gate that filters citations is the kind of thing where a hallucinated implementation looks fine until a user gets a confidently-wrong answer. The spec gives you a contract for what the gate is supposed to do. The plan gives reviewers something to evaluate against. The implementation has a referenceable target.</p>
<p>This is the handoff move. Vibe coding got the chat answering. The runbook captured the patterns. The pinned world made the deploys reproducible. The graveyard remembered the dead ends. The upstream-notes captured what the framework still owes us. And now spec-driven work takes over for the parts that are too big or too risky to vibe through. Each layer earned the right to the next layer.</p>
<h2 id="what-this-looks-like-together">What this looks like together</h2>
<p>The OIATC repo is not a clean codebase. It&rsquo;s a layered one. Some Anokii code still reads like the experiment it started as, because it still works and the cost of replacing it is higher than the cost of keeping it. The newer pieces — the keyword-RAG retrieval, the relevance gate, the topic-confidence gate — were built with specs and reviewed PRs because each of them is a place where a quiet bug becomes a confidently-wrong answer to a real person looking for real community resources.</p>
<p>Vibe coding was the first move. The six moves above are the second, third, fourth, fifth, sixth, and seventh. None of them are mysterious. None of them are expensive. They are the boring craft that turns a working prototype into something a stranger can run, debug, and trust.</p>
<p>If you&rsquo;ve been bashing vibe coding, you&rsquo;re aiming at the start of a process and ignoring the rest of it. If you&rsquo;ve been vibe-coding without any of the rest, you&rsquo;re going to keep losing days to the same gotchas, and the next person who touches your prototype is going to lose them too.</p>
<p>There&rsquo;s no shame in vibe coding. There&rsquo;s a lot of value in what comes next.</p>
<p>Baamaapii</p>
]]></content:encoded></item><item><title>The hackathon Anthropic didn't expect</title><link>https://jonesrussell.github.io/blog/hackathon-anthropic-didnt-expect/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://jonesrussell.github.io/blog/hackathon-anthropic-didnt-expect/</guid><category>ai</category><blog:tag>ai-assisted-dev</blog:tag><blog:tag>equity</blog:tag><blog:tag>community</blog:tag><blog:tag>policy</blog:tag><description>A small detail from a Boris Cherny interview points at a bigger story than the one the headlines told.</description><content:encoded><![CDATA[<p>Ahnii!</p>
<p><a href="https://www.platformer.news/boris-cherny-interview-ai-jobs/">Casey Newton interviewed Boris Cherny</a>, the creator of Claude Code, for Platformer last week. Most of the coverage pulled the headline-friendly quote that coding is &ldquo;solved&rdquo; and moved on. I want to point at a smaller moment in the same interview that I think matters more. This post is about that moment, and three things I&rsquo;ve watched up close that line up with it.</p>
<h2 id="the-hackathon-anthropic-didnt-expect">The hackathon Anthropic didn&rsquo;t expect</h2>
<p>Newton asks Cherny about the AI divide. The worry, in shorthand, is that the people who already have power will use these tools to get more of it. The early data on who benefits from new technology usually goes that way. So who&rsquo;s actually getting the most out of Claude Code?</p>
<p>Cherny&rsquo;s answer surprised Newton, and it surprised me when I read it. He talks about a recent Anthropic hackathon for the Opus 4.7 release, and says the people who won were largely not professional engineers. &ldquo;There was an electrician, a doctor, a carpenter who used it to build an app.&rdquo; Same pattern at the 4.6 hackathon. He calls it a continuous surprise. The people who get the most value out of Claude Code, he says, are not the people he&rsquo;d expect.</p>
<p>That&rsquo;s a small line in a long interview. It&rsquo;s the line I haven&rsquo;t stopped thinking about.</p>
<h2 id="two-questions-not-one">Two questions, not one</h2>
<p>The AI-jobs discourse is mostly fighting over one question: will engineers be replaced. Cherny&rsquo;s answer to that question, if you read the whole interview, is actually mild. He thinks the title &ldquo;software engineer&rdquo; probably changes (&ldquo;builder&rdquo; is the word he uses), the role expands, and the number of people writing code with the help of agents goes up roughly a hundred-fold. That&rsquo;s not an extinction story. It&rsquo;s a transformation story, with a hiring pull, not a layoff cliff.</p>
<p>But that&rsquo;s not the only question we should be asking. The other question is the one Newton was getting at: when the syntax gate falls, who walks through?</p>
<p>The hackathon detail is an early answer. Not &ldquo;the engineers got faster.&rdquo; An electrician, a doctor, and a carpenter built apps that won. The default story we tell about new technology — the people in the room get more powerful first — doesn&rsquo;t fit. The people in the room didn&rsquo;t even win.</p>
<h2 id="three-things-ive-watched-up-close">Three things I&rsquo;ve watched up close</h2>
<p>Here&rsquo;s what I&rsquo;m seeing in three different places.</p>
<p>I just finished my Grade 12 coursework as an adult learner through Sagamok Anishnawbek&rsquo;s Lifelong Learning Centre. AI was in the loop for a lot of it. I&rsquo;m not the demographic anyone meant when they said &ldquo;AI for developers.&rdquo; I&rsquo;m a forty-something who came back to finish his OSSD, and the tools worked for me anyway. I finished the work that for years had been hard to finish. That&rsquo;s one shape.</p>
<p>I started <a href="https://www.change.org/p/rainbow-district-school-board-give-students-a-clear-fair-ai-policy-before-next-semester">a petition</a> asking the Rainbow District School Board to publish a real public AI policy before next semester. Students across the board are using these tools every day. The adults setting the rules haven&rsquo;t caught up. Partway through my own coursework, I was pulled aside and questioned about my AI use because there was no policy to point at. The petition is about that, but it&rsquo;s also about the kids: they&rsquo;re walking through a door before anyone has written a rule about it. That&rsquo;s another shape.</p>
<p>I&rsquo;m building <a href="https://oiatc.ca">Anokii</a>, the embedded chat on the OIATC site, on top of my own framework. Anokii isn&rsquo;t being built for engineers. It&rsquo;s being built so a member of a community can find a community-specific resource and get an answer that cites where it came from. Per-community variants. A relevance gate so it stays quiet when it shouldn&rsquo;t speak. A topic-confidence gate on the citations. When the tool is reachable, and built with the people who&rsquo;ll use it in mind, the people who reach for it are not the obvious ones. That&rsquo;s a third shape.</p>
<h2 id="the-pattern">The pattern</h2>
<p>Three different angles. An adult learner finishing high school. A petition asking for a fair rule. A chat that surfaces community resources without pretending to be smarter than it is.</p>
<p>None of these are &ldquo;engineers replaced.&rdquo; All of them are &ldquo;someone got access to a tool that wasn&rsquo;t available before, and the question is whether the systems around them caught up.&rdquo;</p>
<p>Cherny&rsquo;s hackathon detail isn&rsquo;t an outlier. It&rsquo;s the leading edge of what happens everywhere when the syntax-and-credentials gate falls. People who were never in the room start showing up. The electrician builds the app. The adult learner finishes the coursework. The community member finds the resource they needed and gets a real citation instead of an authoritative-sounding guess.</p>
<p>The energy we spend arguing about whether engineers will exist in five years is energy we are not spending on what the hackathon detail is actually telling us.</p>
<h2 id="where-the-energy-belongs">Where the energy belongs</h2>
<p>Three places I&rsquo;d want it to go.</p>
<p><strong>Schools need policy now, not after the next semester.</strong> The Rainbow District petition is one example. Every board with students using these tools is facing the same problem. The students are already there. The policy can&rsquo;t be retroactive forever.</p>
<p><strong>Communities deserve tools built for them, not demos pointed at them.</strong> Anokii is the version of that I&rsquo;m running, and the way to tell whether a community tool is real is whether it cites its sources, whether it knows when to stay quiet, and whether it gets better when the community pushes back on it. Demos do not pass any of those tests.</p>
<p><strong>For engineers and builders and whatever else we get called next:</strong> stop pretending the threat is your job disappearing. The threat, if there is one, is that the tools become most useful to the people who already had power. Cherny&rsquo;s data so far says that is not what&rsquo;s happening. Don&rsquo;t make it happen. (If you want the engineer-facing half of this argument, I wrote <a href="/blog/from-vibe-coded-to-shippable/">the playbook for taking a vibe-coded prototype to something a stranger can run</a> earlier this week. This post is the other half.)</p>
<h2 id="closing">Closing</h2>
<p>The people getting the most out of these tools right now are not the people the discourse expects. The electrician winning the hackathon, the adult learner finishing the diploma, the community member finding the resource. None of them are the story we&rsquo;re telling. All of them are the story we should be telling.</p>
<p>That should change how we talk about this.</p>
<p>Baamaapii</p>
]]></content:encoded></item></channel></rss>