<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Russell Boley</title>
    <description>The latest articles on DEV Community by Russell Boley (@russell_boley).</description>
    <link>https://dev.to/russell_boley</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3370533%2F47532998-ecc1-419b-ad75-e9782c3ad2ee.jpeg</url>
      <title>DEV Community: Russell Boley</title>
      <link>https://dev.to/russell_boley</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/russell_boley"/>
    <language>en</language>
    <item>
      <title>From "Vibe Coding" to Context Engineering: How I Built a Working App in One Day with Claude</title>
      <dc:creator>Russell Boley</dc:creator>
      <pubDate>Tue, 22 Jul 2025 15:45:06 +0000</pubDate>
      <link>https://dev.to/russell_boley/from-vibe-coding-to-context-engineering-how-i-built-a-working-app-in-one-day-with-claude-2plk</link>
      <guid>https://dev.to/russell_boley/from-vibe-coding-to-context-engineering-how-i-built-a-working-app-in-one-day-with-claude-2plk</guid>
      <description>&lt;h2&gt;
  
  
  The Reality Check
&lt;/h2&gt;

&lt;p&gt;We've all been there. You see those viral tweets about "vibe coding" – just tell AI what you want and boom, instant production-ready app! I was ready to ride that wave straight into the sunset. &lt;/p&gt;

&lt;p&gt;Then I fired up my laptop, and reality came crashing down.&lt;/p&gt;

&lt;p&gt;I ended up with a giant mess of spaghetti code I didn't understand and an app that "technically" worked sometimes if you squinted at it just right. I wasn't happy, and once you create a big mess like that, you'd rather just start over than start debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context engineering&lt;/strong&gt; may seem like just a different buzz word, but, it really works. With some structure and planning, AI can &lt;em&gt;actually&lt;/em&gt; produce working software. I turned my idea for an &lt;a href="https://github.com/raboley/ado-mcp" rel="noopener noreferrer"&gt;Azure DevOps MCP server&lt;/a&gt; into a testable working product in just one day using Claude Code. Here's how.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Secret Sauce: My Workflow
&lt;/h2&gt;

&lt;p&gt;My approach wasn't revolutionary, but the magic was in guiding the AI to work like a real software engineer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a detailed PRD&lt;/strong&gt; (Product Requirements Document)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a workflow guide&lt;/strong&gt; for how tasks should be completed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Break features into bite-sized chunks&lt;/strong&gt; the AI can handle&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This might sound basic, and definitely boring, but – the difference between throwing a paragraph of hopes and dreams at Claude versus co-creating structured context is like night and day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up for Success
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🏗️ Repository Structure
&lt;/h3&gt;

&lt;p&gt;First tip: AI coding assistants automatically read certain files for context (like &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;GEMINI.md&lt;/code&gt;). I used this to my advantage by creating a file that referenced all my planning documents. Every time I opened Claude Code, it had the full context ready to go.&lt;/p&gt;

&lt;p&gt;The other handy thing is that by creating files in specific directories you can create &lt;a href="https://docs.anthropic.com/en/docs/claude-code/slash-commands#custom-slash-commands" rel="noopener noreferrer"&gt;custom slash / commands&lt;/a&gt; to make actions easier to perform. I'll show how to utilize this later in the article, but lets jump into the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  📋 The Power of Planning
&lt;/h3&gt;

&lt;p&gt;Instead of jumping straight into code, I spent time creating a proper PRD with Claude's help. I used &lt;a href="https://github.com/raboley/context-engineering/blob/a6fb63548ef291852fb3be1ce777448a5e5bb473/prd.md" rel="noopener noreferrer"&gt;prd.md&lt;/a&gt; influenced by &lt;a href="https://github.com/snarktank/create-prd" rel="noopener noreferrer"&gt;snarktank's create-prd.mdc&lt;/a&gt;'s great starting place to generate the PRD. I copied the prd.md file into &lt;code&gt;~/.claude/commands/prd.md&lt;/code&gt; so that I could use it as a slash command like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/prd "Please create a design for an mcp server for azure devops. I would like it to be able to run azure pipelines, wait for them to complete and then get the resulting logs if there is a failure."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The nice thing about this template is that it doesn't just generate the PRD immediately, it prompts Claud to ask insightful questions about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Non-functional requirements&lt;/li&gt;
&lt;li&gt;User personas&lt;/li&gt;
&lt;li&gt;Edge cases you hadn't considered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After going through the short planning phase I had  &lt;/p&gt;

&lt;p&gt;After the AI Generate plan was done I took some time to read it, and add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User journey maps&lt;/li&gt;
&lt;li&gt;API documentation links&lt;/li&gt;
&lt;li&gt;Resource references&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to create &lt;a href="https://github.com/raboley/ado-mcp/blob/f26c8bc44a4988d969c3da5fc200edb3eecaf76f/PLANNING.md" rel="noopener noreferrer"&gt;my planning doc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Giving these concrete details gave the right information and places to look for when Claude was planning these features. Gathering all the data started to make me feel like I was stuck doing the boring part of coding, research, while Claude got to do the fun part, coding, but in the end it make a huge difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 Think Vertically, Not Horizontally
&lt;/h3&gt;

&lt;p&gt;Next step is to break down the big feature prd into small tasks that can be accomplished in one shot by Claude. To do this I copied &lt;a href="https://github.com/raboley/context-engineering/blob/d76fe248509b8dee577c0ac78ad8f58b5009d67a/create_tasks.md" rel="noopener noreferrer"&gt;create_tasks.md&lt;/a&gt; into &lt;code&gt;~/.claude/commands/create_tasks.md&lt;/code&gt; and ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/create_tasks based on our prd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would then go through the process of creating tasks, and then breaking down the tasks into subtasks. An important note is how this file prompts it to create tasks. &lt;/p&gt;

&lt;p&gt;Originally when planning tasks a mistake I kept making was letting the AI plan tasks by activity instead of by feature. It would suggest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task 1: Write all the code&lt;/li&gt;
&lt;li&gt;Task 2: Write all the tests&lt;/li&gt;
&lt;li&gt;Task 3: Set up CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't do this!&lt;/strong&gt; It's a recipe for spaghetti! &lt;/p&gt;

&lt;p&gt;Instead, the &lt;a href="https://github.com/raboley/context-engineering/blob/d76fe248509b8dee577c0ac78ad8f58b5009d67a/create_tasks.md" rel="noopener noreferrer"&gt;create_tasks.md&lt;/a&gt; enforces vertical feature development. Each task had to deliver a complete, shippable feature including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The actual code&lt;/li&gt;
&lt;li&gt;End-to-end tests&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This helped guide the task breakdown phase to be thinking about the features as little slices of deliverable working software, instead of bundling and trying to deliver every feature all at once and never getting anywhere. Next is actually doing the work!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Execution Workflow That Actually Works
&lt;/h2&gt;

&lt;p&gt;Once we have a PRD to describe our high level goal, and tasks of how to achieve that goal, we get down to actually doing the work. After some trial and error, I developed a workflow that kept Claude on track:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Research and Exploration&lt;/strong&gt; - Understand the APIs and requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the Code&lt;/strong&gt; - Implement the feature&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write End-to-End Tests&lt;/strong&gt; - Verify it actually works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual Testing&lt;/strong&gt; - Try it out yourself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update CI/CD&lt;/strong&gt; - Keep the pipeline green&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document Everything&lt;/strong&gt; - Future you will thank you&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most important thing I found was to make sure it was always a full loop. Without making Claude Exercise the code, or run the tests, it would end up with overly triumphant messages about how great the feature it made is and how well it works.. but then you try to run the tests or use the feature and it wouldn't even compile. The hallucinations are real...&lt;/p&gt;

&lt;p&gt;To have Claude complete tasks once again copy &lt;a href="https://github.com/raboley/context-engineering/blob/94eee8623b25c28407bcdad3dbcf735b98820a76/complete_tasks.md" rel="noopener noreferrer"&gt;complete_tasks.md&lt;/a&gt; to &lt;code&gt;~/.claude/commands/complete_tasks.md&lt;/code&gt; and then within Claude Code run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/complete_tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and it would automatically start working on the first task the way I want. I will say that out of all the task files the &lt;a href="https://github.com/raboley/context-engineering/blob/94eee8623b25c28407bcdad3dbcf735b98820a76/complete_tasks.md" rel="noopener noreferrer"&gt;complete_tasks.md&lt;/a&gt; is definitely the most opinionated of the bunch, so don't be afraid to modify that to your own coding style and workflow.&lt;/p&gt;

&lt;p&gt;Now that Claude is working on tasks, I'll go through the flow in a little more depth to explain why I have it work the way I do.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Research First, Code Second
&lt;/h3&gt;

&lt;p&gt;I noticed Claude would often jump straight into coding and then struggle with basic API calls. So I made it slow down and research first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read the actual API documentation&lt;/li&gt;
&lt;li&gt;Try example curl commands&lt;/li&gt;
&lt;li&gt;Understand the data structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This extra step eliminated so many silly mistakes and hallucinations, and saved a ton of time it used to spend trying to brute force things without the knowing data types it needed or return types. &lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 The Testing Trap
&lt;/h3&gt;

&lt;p&gt;This might be a hot take, but: &lt;strong&gt;only let AI write end-to-end tests&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I know this turns &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" rel="noopener noreferrer"&gt;Martin Fowler's testing pyramid&lt;/a&gt; upside-down, but here's why: if you let an AI mock one thing, it will mock EVERYTHING. I can't count the times I've seen green tests that looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_api_call&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Mock the API
&lt;/span&gt;    &lt;span class="n"&gt;mock_api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Test passes! 🎉
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;mock_api&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cool test, bro. You tested that a mock returns what you told it to return. 🤦&lt;/p&gt;

&lt;p&gt;End-to-end tests force the AI to write code that actually works with real APIs and real data.&lt;/p&gt;

&lt;h3&gt;
  
  
  📚 Documentation That Doesn't Suck
&lt;/h3&gt;

&lt;p&gt;LLMs love writing comments. They REALLY love it. I had to explicitly tell Claude:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use proper docstrings only&lt;/li&gt;
&lt;li&gt;No inline comment novels&lt;/li&gt;
&lt;li&gt;Focus on the "why", not the "what"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It will still occasionally try to add comments to every block of code to explain what it is doing, but it happens a lot less if you prompt for good documentation practices. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;After all this prep work, the actual "coding" day was surprisingly smooth:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tell Claude to start on the task list&lt;/li&gt;
&lt;li&gt;Review the code and tests&lt;/li&gt;
&lt;li&gt;Fire up MCP Inspector to try it out&lt;/li&gt;
&lt;li&gt;If it works, commit and move to the next task&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once Claude got into the groove, it was churning out quality, tested, documented features consistently. After about 5 hours of me reviewing code, saying okay continue, walking away, repeat, I had an MCP server that could run Azure Pipelines, get the log results and tell me what was wrong with it-Exactly what I designed originally, it even had an end to end test suite that worked and documentation humans and LLMs could understand. &lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Time spent planning saves 10x time debugging&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Vertical features &amp;gt; horizontal layers&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;End-to-end tests keep the AI honest&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Context is king – feed your AI well&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Working with LLMs is definitely a skill that's constantly evolving. But with the right structure and context, Claude makes an incredible coding partner. You just need to be the director with the vision who can provide enough context to get things done.&lt;/p&gt;

&lt;p&gt;If you are interested in in depth usage of this framework to implement a new feature in an existing codebase, subscribe to get notified about my next post on how to add a new feature to an existing code base in depth. &lt;/p&gt;

&lt;p&gt;All my planning and execution templates are available in my &lt;a href="https://github.com/raboley/context-engineering" rel="noopener noreferrer"&gt;context-engineering&lt;/a&gt; GitHub repo&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your LLM workflow?&lt;/strong&gt; Drop a comment below – I'd love to hear how others are taming their AI coding assistants! And if this helps you build something cool, definitely let me know. 🚀&lt;/p&gt;

&lt;p&gt;PS:&lt;br&gt;
If you are using Azure DevOps checkout &lt;a href="https://github.com/raboley/ado-mcp" rel="noopener noreferrer"&gt;ado-mcp&lt;/a&gt; to streamline your pipelines development workflow with AI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inspired by &lt;a href="https://github.com/coleam00/context-engineering-intro" rel="noopener noreferrer"&gt;Cole Medin's context engineering intro&lt;/a&gt; and &lt;a href="https://www.youtube.com/watch?v=Egeuql3Lrzg" rel="noopener noreferrer"&gt;this excellent YouTube guide&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
