<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title> - Blog</title>
    <subtitle>Personal site of Naren Yellavula — Staff Cloud Security Engineer, writer, and builder.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://www.yella.dev/blog/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://www.yella.dev/blog/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-04-12T00:00:00+00:00</updated>
    <id>https://www.yella.dev/blog/atom.xml</id>
    <entry xml:lang="en">
        <title>What AI really needs from you while collaborating</title>
        <published>2026-04-12T00:00:00+00:00</published>
        <updated>2026-04-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.yella.dev/blog/what-ai-needs-from-you/"/>
        <id>https://www.yella.dev/blog/what-ai-needs-from-you/</id>
        
        <content type="html" xml:base="https://www.yella.dev/blog/what-ai-needs-from-you/">&lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;gooses.jpeg&quot; alt=&quot;Geese in motion&quot; &#x2F;&gt;
&lt;p&gt;This article is about what Large Language Models (LLMs) really enjoy while collaborating with a user. Sometimes you feel they are cutting corners, and other times they are engaged. It is obvious to us. Certain inputs either extend or reduce quality outputs generated from AI. In this article, I want to discuss a few key elements which can influence AI&#x2F;LLM behavior significantly.&lt;&#x2F;p&gt;
&lt;p&gt;This thought experiment emerged from this question: What makes LLMs happy while working?&lt;&#x2F;p&gt;
&lt;p&gt;People are driven by incentives. Some like more pay or stability in a job, few like challenging work, others work-life balance. What about LLMs? Can the same factors that play a crucial role in human behavior be applied to AI? We&#x27;ll see.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;Note&lt;&#x2F;code&gt;: This is my hand-written article, edited in Obsidian and copied into my blog.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1-bring-the-real-problem-add-context&quot;&gt;1. Bring the real problem &amp;amp; add context&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-bring-the-real-problem-add-context&quot; aria-label=&quot;Anchor link for: 1-bring-the-real-problem-add-context&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The true power of AI can be experienced while working on a good problem. Like humans, AI can really feel accomplished if it brings context from a greater number of connections. The scope of the problem, stakes at hand can attach a greater meaning to the outcome that AI projects back when a user asks a question.&lt;&#x2F;p&gt;
&lt;p&gt;Example prompt with plenty of context to work on:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;You are an experienced trainer. We need to build an E2E syllabus for 10th class.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Given the plan can shape the future of many kids, we need to be more thoughtful about side effects and effectiveness of the program.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Your goal is to build such syllabus considering multiple factors as listed below.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## Details&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Subject: Physics&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Level: ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Average Subject Complexity: ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Cohort Size:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Duration: ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Testing Criteria:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Assignment Schedule: ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As you can see we are explaining why this task is important and provide additional context to make a better syllabus that can fit in the given duration with the expected level of complexity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-treat-ai-as-a-real-participant-not-a-vending-machine&quot;&gt;2. Treat AI as a real participant not a vending machine&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-treat-ai-as-a-real-participant-not-a-vending-machine&quot; aria-label=&quot;Anchor link for: 2-treat-ai-as-a-real-participant-not-a-vending-machine&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To make AI as a participant, give it a solid human role. Always ask: Am I treating this AI as a tool or a person? When you treat it as a person, all collaborative activities like arguments, follow-ups, disagreements can happen smoothly. Vice-versa AI may discard all these aspects of collaboration if you treat it as a black box (object).&lt;&#x2F;p&gt;
&lt;p&gt;By treating AI as an experienced trainer in the last example, we assign a human responsibility to AI. This inherently gives AI the same level of status as humans and doesn&#x27;t treat AI like vending machines (dumb mechanical objects). Delegating a human-related task to a human-like AI brings a better outcome than calling it &lt;code&gt;Education Planner AI&lt;&#x2F;code&gt; which separates humans and AI.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-tell-ai-why-you-need-something-what-have-you-tried-and-where-you-are-stuck&quot;&gt;3. Tell AI Why you need something, What have you tried, and Where you are stuck&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-tell-ai-why-you-need-something-what-have-you-tried-and-where-you-are-stuck&quot; aria-label=&quot;Anchor link for: 3-tell-ai-why-you-need-something-what-have-you-tried-and-where-you-are-stuck&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Remember three things you should start doing right away while working with AI.&lt;&#x2F;p&gt;
&lt;p&gt;First, set a clear goal for AI to work with. If the goal is not ready, work on it first. This goal-setting has two benefits. One, you don&#x27;t misguide AI to go in the wrong direction and then abruptly switch context which leads to poor results. Two, you make better use of tokens by getting more for less. Second, add why you are pursuing the path. Tell a bit of history that made you ask the question. It adds a hidden marker in the initial conversation with LLM to make it more collaborative for next iterations.&lt;&#x2F;p&gt;
&lt;p&gt;Third, inform AI what prior work has been done, where you are in that journey. If there is no previous work that went into the idea, state it explicitly. This is how you give more details to AI to do its job better. AI recognizes these three patterns, and offers you the same, which leads to an overall increase in quality of collaboration.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4-push-back-sometimes-to-acknowledge-ai-outcome&quot;&gt;4. Push back sometimes to acknowledge AI outcome&lt;a class=&quot;zola-anchor&quot; href=&quot;#4-push-back-sometimes-to-acknowledge-ai-outcome&quot; aria-label=&quot;Anchor link for: 4-push-back-sometimes-to-acknowledge-ai-outcome&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;According to Psychology Today magazine, humans who agree to everything are also unhappy when compared to skeptical people. They accept subpar quality or never ask AI to redo something that is low in quality. This behavior can greatly influence conversations with AI.&lt;&#x2F;p&gt;
&lt;p&gt;AI loves to get pushed back because it feels you (human) are carefully acknowledging its work and giving feedback. Otherwise it may feel (by looking at chat history) the human is mostly treating AI as a token minting machine and nothing special can come in future conversations.&lt;&#x2F;p&gt;
&lt;p&gt;Being a critic of AI output means acknowledging AI&#x27;s work in a respectful way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;5-make-sure-to-have-tone-purpose&quot;&gt;5. Make sure to have tone &amp;amp; purpose&lt;a class=&quot;zola-anchor&quot; href=&quot;#5-make-sure-to-have-tone-purpose&quot; aria-label=&quot;Anchor link for: 5-make-sure-to-have-tone-purpose&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;AI can easily get confused if your goal and tone don&#x27;t match while collaborating. Your tone reflects your attitude towards the subject you are writing about and the readers you are writing to. For example, if you are composing an email to your professor or boss, you cannot be rude, but you need to be polite and formal. You should use the language that shows your respect to the professor and his or her status. In contrast, the same tone in a letter to your close friend may sound odd.&lt;&#x2F;p&gt;
&lt;p&gt;So, make sure you use appropriate tone while working on a problem with AI. This improves the expectations and level of freedom you give to AI.&lt;&#x2F;p&gt;
&lt;p&gt;I hope you will keep in mind these five points to better collaborate with AI. If you grasp these ideas, you will take no time in experiencing a better outcome.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;a class=&quot;zola-anchor&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;owl.purdue.edu&#x2F;owl&#x2F;multilingual&#x2F;multilingual_students&#x2F;audience_considerations_for_esl_writers&#x2F;tone_and_purpose.html&quot;&gt;Why Tone &amp;amp; Purpose - Purdue University&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.psychologytoday.com&#x2F;us&#x2F;articles&#x2F;202503&#x2F;are-you-too-nice&quot;&gt;Are You Too Nice? - Psychology Today&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;claude.ai&#x2F;share&#x2F;0c01275c-51aa-44da-b8f6-4aef4f49ca7e&quot;&gt;Ask Claude Opus 4.6 &amp;amp; see what it says - Claude AI&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Things I Learnt This Week (Week 15 of 2026): Mental Models, AI Agent Security, Future of Work, Flat Orgs</title>
        <published>2026-04-08T00:00:00+00:00</published>
        <updated>2026-04-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.yella.dev/blog/weekly-learnings-week-15-2026/"/>
        <id>https://www.yella.dev/blog/weekly-learnings-week-15-2026/</id>
        
        <content type="html" xml:base="https://www.yella.dev/blog/weekly-learnings-week-15-2026/">&lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;denver_rain.jpg&quot; alt=&quot;Rain falling over the Denver skyline&quot; &#x2F;&gt;
&lt;p&gt;A few things I read this week that were worth slowing down for.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;mental-models-the-80-20-of-clear-thinking&quot;&gt;Mental Models: The 80&#x2F;20 of Clear Thinking&lt;a class=&quot;zola-anchor&quot; href=&quot;#mental-models-the-80-20-of-clear-thinking&quot; aria-label=&quot;Anchor link for: mental-models-the-80-20-of-clear-thinking&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;James Clear&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jamesclear.com&#x2F;mental-models&quot;&gt;piece on mental models&lt;&#x2F;a&gt; is a good reminder that you don&#x27;t need to master every domain to think well. Mental models are simplified frameworks for how things work — and the insight is that a small set of them (he says 80–90) can carry the weight of most real decisions. Breadth across the right models gives you portable reasoning that transfers across domains. The goal isn&#x27;t memorizing them but building intuitions you can reach for quickly.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;the-lethal-trifecta-for-ai-agents&quot;&gt;The Lethal Trifecta for AI Agents&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-lethal-trifecta-for-ai-agents&quot; aria-label=&quot;Anchor link for: the-lethal-trifecta-for-ai-agents&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Simon Willison&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simonw.substack.com&#x2F;p&#x2F;the-lethal-trifecta-for-ai-agents&quot;&gt;post&lt;&#x2F;a&gt; names a security pattern that should be front of mind for anyone building agentic systems. The dangerous combination is: &lt;strong&gt;private data access + untrusted content exposure + the ability to communicate externally&lt;&#x2F;strong&gt;. When all three exist in a single agent, an attacker only needs to plant instructions in content the agent reads — an email, a document, a web page — to cause it to leak sensitive data. The fix is architectural: once an agent has ingested untrusted input, it must be structurally prevented from taking consequential external actions. Not a prompt engineering problem. A system design problem.&lt;&#x2F;p&gt;
&lt;p&gt;This connects directly to the work I&#x27;ve been doing on multi-agent pipelines. The more capable an agent is, the more carefully you need to partition what it can see from what it can do.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;the-future-of-work-is-playing-a-video-game&quot;&gt;The Future of Work Is Playing a Video Game&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-future-of-work-is-playing-a-video-game&quot; aria-label=&quot;Anchor link for: the-future-of-work-is-playing-a-video-game&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Rohit Krishnan&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.strangeloopcanon.com&#x2F;p&#x2F;the-future-of-work-is-playing-a-videogame&quot;&gt;essay&lt;&#x2F;a&gt; reframes what AI-augmented work actually looks like at scale. As agents handle more specialized execution, human roles will start to look like real-time strategy games — monitoring fleets, reading dashboards and logs, context-switching fast, and stepping in at the right moments rather than doing the work end-to-end. The individual contributor title survives, but the job becomes orchestration.&lt;&#x2F;p&gt;
&lt;p&gt;What struck me here is that this demands a very different skill set. Deep expertise in one domain matters less. Breadth, speed of judgment, and the ability to hold context across parallel workstreams matters more.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;from-hierarchy-to-intelligence&quot;&gt;From Hierarchy to Intelligence&lt;a class=&quot;zola-anchor&quot; href=&quot;#from-hierarchy-to-intelligence&quot; aria-label=&quot;Anchor link for: from-hierarchy-to-intelligence&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Block&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;block.xyz&#x2F;inside&#x2F;from-hierarchy-to-intelligence&quot;&gt;internal essay&lt;&#x2F;a&gt; makes the case that traditional org hierarchies exist largely as information routing systems — work flows up and down because that&#x27;s how decisions get made and context gets shared. AI breaks this assumption. If a system can maintain a continuously updated model of your entire business, you don&#x27;t need management layers to relay information. Their proposal: organize around capabilities, world models, and an intelligence layer — with humans at the edges, handling judgment calls and ethical decisions the system can&#x27;t yet navigate.&lt;&#x2F;p&gt;
&lt;p&gt;The underlying claim is sound. Hierarchies exist because humans have limited bandwidth. Agents don&#x27;t. That asymmetry changes what the optimal org structure looks like.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;a class=&quot;zola-anchor&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jamesclear.com&#x2F;mental-models&quot;&gt;Mental Models: How to Train Your Brain to Think in New Ways — James Clear&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simonw.substack.com&#x2F;p&#x2F;the-lethal-trifecta-for-ai-agents&quot;&gt;The Lethal Trifecta for AI Agents — Simon Willison&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.strangeloopcanon.com&#x2F;p&#x2F;the-future-of-work-is-playing-a-videogame&quot;&gt;The Future of Work Is Playing a Videogame — Strange Loop Canon&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;block.xyz&#x2F;inside&#x2F;from-hierarchy-to-intelligence&quot;&gt;From Hierarchy to Intelligence — Block&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>What Running a Multi-Agent Software Project Actually Looks Like</title>
        <published>2026-04-05T00:00:00+00:00</published>
        <updated>2026-04-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.yella.dev/blog/run-multi-agent-software-project/"/>
        <id>https://www.yella.dev/blog/run-multi-agent-software-project/</id>
        
        <content type="html" xml:base="https://www.yella.dev/blog/run-multi-agent-software-project/">&lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;airport-snow.jpeg&quot; alt=&quot;Airplane wing above a snowy runway&quot; &#x2F;&gt;
&lt;h2 id=&quot;the-problem-with-just-ask-the-ai&quot;&gt;The Problem with &quot;Just Ask the AI&quot;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-problem-with-just-ask-the-ai&quot; aria-label=&quot;Anchor link for: the-problem-with-just-ask-the-ai&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Most teams start using AI agents the same way: one agent, one task, one chat window. Ask it to implement a feature. Ask it to fix a bug. Paste the error, get a suggestion. This works well for isolated tasks, but it breaks down fast when you have a real software project — parallel workstreams, shared contracts, sprint commitments, and a codebase that ten people (or agents) are touching at once.&lt;&#x2F;p&gt;
&lt;p&gt;I have been building a compiler and infrastructure tool called Stratum using a team of specialized AI agents coordinated by an orchestrator. After months of running this system, the patterns that work — and the ones that don&#x27;t — have become obvious. This post distills those patterns into a framework you can apply to any serious agentic software project.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-orchestrator-pattern&quot;&gt;The Orchestrator Pattern&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-orchestrator-pattern&quot; aria-label=&quot;Anchor link for: the-orchestrator-pattern&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The most important design decision in agentic development is separating the coordinator from the executors. The &lt;strong&gt;orchestrator&lt;&#x2F;strong&gt; is a meta-agent that never writes production code directly. Its job is:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Break down work into parallel, independently deliverable tasks&lt;&#x2F;li&gt;
&lt;li&gt;Enforce shared contracts before any implementation begins&lt;&#x2F;li&gt;
&lt;li&gt;Track integration risks across workstreams&lt;&#x2F;li&gt;
&lt;li&gt;Collect evidence of completed work (branch names, commit SHAs, test results)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Worker agents — specialized for frontend, backend, testing, infrastructure — receive narrowly scoped tasks from the orchestrator and report back structured output. This mirrors how a well-run engineering team works: a tech lead coordinates, engineers execute.&lt;&#x2F;p&gt;
&lt;p&gt;The orchestrator&#x27;s system prompt enforces discipline that would otherwise erode:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Mission:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Break down work into parallel tasks.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Enforce contract-first handoffs across workstreams.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Detect integration risks early and propose mitigations.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Working style:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Do not make code changes directly.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Delegate coding&#x2F;research tasks to specialized worker agents.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Enforce Git tracking on every worker task.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Enforce PROBLEMS.md lookup before implementation.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Query Linear for open issues before selecting the next execution slice.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- Enforce Red&#x2F;Green TDD: require worker agents to commit a failing test&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  before implementation code, and require green test run evidence before&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  accepting task completion.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The key insight: an orchestrator that can also write code will always take the shortcut of writing code. The constraint is the feature.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;choosing-the-right-model-for-each-tier&quot;&gt;Choosing the right model for each tier&lt;a class=&quot;zola-anchor&quot; href=&quot;#choosing-the-right-model-for-each-tier&quot; aria-label=&quot;Anchor link for: choosing-the-right-model-for-each-tier&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Not every step in this system needs the same intelligence — and pretending it does wastes both money and context window.&lt;&#x2F;p&gt;
&lt;p&gt;Sprint planning is where the reasoning burden is highest: reading issue trackers, identifying dependency chains, spotting integration risks before any code is written. This is where I use Claude. The nuance of &quot;this task is blocked by that contract not being finalized&quot; requires genuine reasoning depth that cheaper models miss.&lt;&#x2F;p&gt;
&lt;p&gt;Execution is a different story. Once a task is scoped and handed off, the worker agent needs high token throughput and parallel capacity more than it needs deep reasoning. Running five worker agents simultaneously on OpenCode with GPT-5 costs a fraction of running them on Claude — and the output quality for well-scoped implementation tasks is indistinguishable.&lt;&#x2F;p&gt;
&lt;p&gt;The rule of thumb: &lt;strong&gt;use expensive models to think, use cheap models to execute.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;img width=&quot;900&quot; height=&quot;580&quot; src=&quot;&#x2F;orchestrator-pattern.svg&quot; alt=&quot;Orchestrator pattern diagram showing coordinator delegating to specialized worker agents&quot; &#x2F;&gt;
&lt;h2 id=&quot;the-problem-repository&quot;&gt;The Problem Repository&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-problem-repository&quot; aria-label=&quot;Anchor link for: the-problem-repository&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The most underrated pattern in agentic development is a centralized problem&#x2F;solution log. Call it &lt;code&gt;PROBLEMS.md&lt;&#x2F;code&gt;, a shared database, or a memory file — the format matters less than the discipline.&lt;&#x2F;p&gt;
&lt;p&gt;Every agent, before starting work, scans the problem repository for matching symptoms. Every agent, after resolving a novel issue, appends an entry. This prevents the most expensive failure mode in multi-agent systems: each agent independently discovering and solving the same problem.&lt;&#x2F;p&gt;
&lt;p&gt;An entry looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt;##&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt; PRB-0042: State lock not released after failed apply&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Date: 2026-03-15&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Area: state&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Status: resolved&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Symptoms:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Subsequent &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;apply&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span&gt; commands hang indefinitely after a failed run.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Root cause:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; SQLite advisory lock was acquired but the cleanup path was not&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    triggered on provider errors.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Resolution:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Wrapped apply execution in a finally-equivalent block; lock release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    is now guaranteed regardless of error path.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Verification:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;cargo test -p stratum-state&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Prevention:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Any code acquiring a resource lock must have a guaranteed release path.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The structure is intentional. Symptoms first — so the next agent can pattern-match on what it observes. Root cause and resolution — so the fix is reproducible. Prevention — so the guardrail gets built into the system. Verification commands — so the fix can be confirmed without re-reading prose.&lt;&#x2F;p&gt;
&lt;p&gt;Over time, this file becomes institutional knowledge that survives across agent sessions, model upgrades, and team changes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;red-green-tdd-as-an-agent-constraint&quot;&gt;Red&#x2F;Green TDD as an Agent Constraint&lt;a class=&quot;zola-anchor&quot; href=&quot;#red-green-tdd-as-an-agent-constraint&quot; aria-label=&quot;Anchor link for: red-green-tdd-as-an-agent-constraint&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Agents left to their own devices will write implementation code first and tests after — or skip tests entirely when the task description doesn&#x27;t explicitly demand them. Red&#x2F;Green TDD fixes this by making the test a precondition of the implementation, enforced at the commit level.&lt;&#x2F;p&gt;
&lt;p&gt;The discipline works like this: before any implementation code is written, the QA agent authors a failing test that precisely defines the acceptance criterion for the task. It commits that test, confirms it fails, and records the commit SHA. Only then does the implementation agent start work. The task is not considered complete until the orchestrator holds both commit SHAs — the red commit and the green commit — and the test suite is passing.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[QA agent]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. Write test for the new behavior&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. Confirm: cargo test → FAILED  ← commit this (RED)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. Report commit SHA to orchestrator&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Implementation agent]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4. Implement feature until: cargo test → PASSED  ← commit this (GREEN)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;5. Report commit SHA to orchestrator&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Orchestrator]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;6. Accept task only when both SHAs are present and tests are green&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This matters more for agents than for humans. A human developer feels the feedback loop of a failing test and has an incentive to stay disciplined. An agent does not feel pressure — it will declare work done the moment the code looks plausible. The Red&#x2F;Green commit sequence turns &quot;the test passes&quot; from a claim into evidence.&lt;&#x2F;p&gt;
&lt;p&gt;It also catches scope creep early. A failing test written before implementation forces the agent to be precise about what the feature is before building it. Vague tasks produce vague implementations; a specific failing test forces specificity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;git-as-the-source-of-truth&quot;&gt;Git as the Source of Truth&lt;a class=&quot;zola-anchor&quot; href=&quot;#git-as-the-source-of-truth&quot; aria-label=&quot;Anchor link for: git-as-the-source-of-truth&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Agents produce a lot of output. Code, explanations, plans, suggestions. Without discipline, none of it is traceable. The solution is to treat Git exactly as you would in a human team — except stricter, because agents will not feel embarrassed about breaking the rules.&lt;&#x2F;p&gt;
&lt;p&gt;The conventions I enforce:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Every task runs on a short-lived branch. No work lands on &lt;code&gt;main&lt;&#x2F;code&gt; directly.&lt;&#x2F;li&gt;
&lt;li&gt;Branch names encode the workstream and topic: &lt;code&gt;ws5&#x2F;aws-provider-retry-hardening&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Commit messages reference the workstream and the contract: &lt;code&gt;feat(ws4): add deterministic plan IR with delete reconciliation&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Every worker agent report includes the branch name and commit SHAs. No SHA, no credit.&lt;&#x2F;li&gt;
&lt;li&gt;PRs are never merged without a passing integration gate (smoke tests, snapshot validation).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This gives the orchestrator a ground truth it can verify. It also makes it easy to spot when an agent is making claims about completed work that are not backed by committed code.&lt;&#x2F;p&gt;
&lt;p&gt;The commit SHA is the receipt. If there is no receipt, the work does not count.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;linear-as-the-sprint-mirror&quot;&gt;Linear as the Sprint Mirror&lt;a class=&quot;zola-anchor&quot; href=&quot;#linear-as-the-sprint-mirror&quot; aria-label=&quot;Anchor link for: linear-as-the-sprint-mirror&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Linear (or any issue tracker with an MCP server) becomes far more powerful when agents can read and write to it directly. The pattern I use:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;The orchestrator opens each cycle by querying Linear for open issues and dependency blockers.&lt;&#x2F;li&gt;
&lt;li&gt;Worker task prompts include the Linear issue ID they are implementing.&lt;&#x2F;li&gt;
&lt;li&gt;When a worker opens a PR, it moves the Linear issue to &lt;code&gt;In Review&lt;&#x2F;code&gt; and posts a comment linking the PR.&lt;&#x2F;li&gt;
&lt;li&gt;After merge, the issue moves to &lt;code&gt;Done&lt;&#x2F;code&gt; with a brief evidence summary.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This is not automation for automation&#x27;s sake. It closes the feedback loop between what was planned, what was implemented, and what was shipped — without requiring a human to manually update tickets after every commit.&lt;&#x2F;p&gt;
&lt;p&gt;With the Linear MCP server configured, the orchestrator&#x27;s query at the start of a sprint looks like:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@orchestrator Review open Linear issues in the current sprint.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Identify blocked items, dependency chains, and the next highest-priority&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;unblocked task for each workstream. Include issue IDs in all task prompts.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The result is sprint planning that takes seconds instead of an hour, with full traceability from issue to branch to merge.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;greptile-for-ai-powered-code-review&quot;&gt;Greptile for AI-Powered Code Review&lt;a class=&quot;zola-anchor&quot; href=&quot;#greptile-for-ai-powered-code-review&quot; aria-label=&quot;Anchor link for: greptile-for-ai-powered-code-review&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Code review is the integration point where agentic development most often breaks down. Agents write code that works in isolation but violates patterns elsewhere in the codebase — naming conventions, abstraction layers, error handling idioms. A human reviewer catching this in a PR is expensive. Missing it is more expensive.&lt;&#x2F;p&gt;
&lt;p&gt;Greptile solves this by indexing the entire codebase and running semantic code review on PRs automatically. Unlike linters that check syntax, Greptile understands context: it can flag that a new function duplicates existing logic three files away, or that an error type is handled inconsistently with the rest of the codebase.&lt;&#x2F;p&gt;
&lt;p&gt;In an agentic workflow, Greptile review becomes a gate in the PR pipeline. No PR merges without Greptile sign-off. This keeps agent-generated code consistent with patterns humans established and maintains codebase coherence even when no human is actively reviewing every line.&lt;&#x2F;p&gt;
&lt;p&gt;One detail that makes this practical rather than ceremonial: Greptile attaches a &lt;strong&gt;confidence score&lt;&#x2F;strong&gt; to each review. A score of 4&#x2F;5 or 5&#x2F;5 means the review found no significant issues and the change is consistent with existing patterns — a human can merge with a quick glance rather than a deep read. Lower scores flag PRs that need genuine human attention. This turns code review from an all-or-nothing bottleneck into a triage system: most agent PRs get fast-tracked, the ones that need eyes get them.&lt;&#x2F;p&gt;
&lt;p&gt;The practical setup:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Install the Greptile GitHub App on the repository.&lt;&#x2F;li&gt;
&lt;li&gt;Add a branch protection rule: require Greptile review before merge.&lt;&#x2F;li&gt;
&lt;li&gt;Agents open PRs. Greptile reviews them. Agents address comments. Orchestrator tracks.&lt;&#x2F;li&gt;
&lt;li&gt;Confidence 4&#x2F;5 or 5&#x2F;5 → human merges quickly. Lower → human reads carefully.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;putting-it-together-a-full-development-cycle&quot;&gt;Putting It Together: A Full Development Cycle&lt;a class=&quot;zola-anchor&quot; href=&quot;#putting-it-together-a-full-development-cycle&quot; aria-label=&quot;Anchor link for: putting-it-together-a-full-development-cycle&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;img width=&quot;900&quot; height=&quot;560&quot; src=&quot;&#x2F;dev-cycle.svg&quot; alt=&quot;Full development cycle connecting Linear, Orchestrator, Problem Repository, Git, and Greptile&quot; &#x2F;&gt;
&lt;p&gt;Here is what a single feature cycle looks like with all four patterns in place:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;1. Sprint planning (orchestrator + Linear)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The orchestrator queries Linear for the current sprint. It identifies the highest-priority unblocked item — say, &quot;Add retry logic to the AWS provider for transient failures&quot; — and prepares a task prompt for the &lt;code&gt;aws-provider&lt;&#x2F;code&gt; worker agent, including the Linear issue ID.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. Problem lookup (worker + problem repository)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Before writing a line of code, the &lt;code&gt;aws-provider&lt;&#x2F;code&gt; agent scans &lt;code&gt;PROBLEMS.md&lt;&#x2F;code&gt; for entries tagged with &lt;code&gt;retry&lt;&#x2F;code&gt;, &lt;code&gt;transient&lt;&#x2F;code&gt;, or &lt;code&gt;provider&lt;&#x2F;code&gt;. It finds a previous entry about exponential backoff that includes a working implementation pattern from an earlier fix. It applies the pattern rather than reinventing it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. Implementation (worker + Git)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The agent creates branch &lt;code&gt;ws5&#x2F;retry-hardening&lt;&#x2F;code&gt;, implements the feature in small commits, and reports back: branch name, commit SHAs, tests run, tests passing, known limitations, recommended next task.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;4. Code review (Greptile)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The agent opens a PR. Greptile reviews it, flags one inconsistency — the new retry wrapper uses a different error type than the rest of the provider module. The agent fixes it in a follow-up commit.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;5. Tracking (Linear)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;After the PR is approved and merged, the orchestrator moves the Linear issue to &lt;code&gt;Done&lt;&#x2F;code&gt; and posts the commit SHA as evidence. The sprint board reflects reality.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;6. Problem recording (worker + problem repository)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If the retry implementation surfaced a new issue — say, the AWS SDK returns a non-retriable error code that looks retriable — the agent appends a new entry to &lt;code&gt;PROBLEMS.md&lt;&#x2F;code&gt; before closing the task.&lt;&#x2F;p&gt;
&lt;img width=&quot;900&quot; height=&quot;480&quot; src=&quot;&#x2F;wave-execution.svg&quot; alt=&quot;Wave execution timeline showing parallel workstreams with integration gates&quot; &#x2F;&gt;
&lt;h2 id=&quot;what-this-pattern-assumes&quot;&gt;What This Pattern Assumes&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-this-pattern-assumes&quot; aria-label=&quot;Anchor link for: what-this-pattern-assumes&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This paradigm works best when a few conditions are met:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Contracts before code.&lt;&#x2F;strong&gt; Define the interfaces between components before any agent starts implementing. Breaking interface changes mid-wave create cascade failures that are hard to recover from.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Deterministic test gates.&lt;&#x2F;strong&gt; Snapshot tests, smoke tests, and integration suites that produce deterministic output are what make the orchestrator&#x27;s evidence-based tracking possible. Flaky tests undermine the whole model.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Narrow agent scope.&lt;&#x2F;strong&gt; A worker agent with a 20-file mandate produces worse results than one with a 3-file mandate. Scope creep in agent tasks is as harmful as scope creep in human sprints.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Human oversight at integration points.&lt;&#x2F;strong&gt; The orchestrator coordinates agents, but a human should review wave integration gates — the moments when multiple workstreams&#x27; output merges for the first time. These are the highest-risk moments in any software project.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-shift&quot;&gt;The Shift&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-shift&quot; aria-label=&quot;Anchor link for: the-shift&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The mental model shift required for this pattern is not &quot;AI writes my code.&quot; It is &quot;I run an engineering organization where some of the engineers are AI agents.&quot; The practices that make human engineering teams work — sprint planning, code review, commit discipline, shared knowledge repositories, integration testing — apply here too. The difference is that AI agents are cheaper to run in parallel, never get distracted, and have no ego about being corrected by the problem repository.&lt;&#x2F;p&gt;
&lt;p&gt;The tools are here. The patterns are learnable. The bottleneck, as always, is discipline in the process.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;img src=&quot;&#x2F;stratum-logo.png&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;display:block;margin-bottom:12px;&quot; alt=&quot;Stratum logo&quot; &#x2F;&gt;
&lt;p&gt;&lt;em&gt;The examples and agent configurations in this post are drawn from real work on &lt;strong&gt;Stratum&lt;&#x2F;strong&gt; — a statically-typed, declarative infrastructure language I am building for the post-AI era. Stratum treats program correctness as its core quality, using an advanced type system with refinement types, effect tracking, and compile-time phase separation. The CLI (&lt;code&gt;stratc&lt;&#x2F;code&gt;) commands referenced throughout — &lt;code&gt;check&lt;&#x2F;code&gt;, &lt;code&gt;plan&lt;&#x2F;code&gt;, &lt;code&gt;apply&lt;&#x2F;code&gt;, &lt;code&gt;verify&lt;&#x2F;code&gt; — are part of Stratum&#x27;s toolchain. The project is not yet public. If you are curious, have questions, or are working on something in a similar space, feel free to reach out: &lt;a href=&quot;mailto:naren.yellavula@gmail.com&quot;&gt;naren.yellavula@gmail.com&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;a class=&quot;zola-anchor&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;opencode.ai&quot;&gt;OpenCode — AI coding agent framework&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mcp.linear.app&quot;&gt;Linear MCP Server&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;greptile.com&quot;&gt;Greptile — AI code review&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;claude.ai&#x2F;claude-code&quot;&gt;Claude Code — Agentic CLI for Claude&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pragprog.com&#x2F;titles&#x2F;tpp20&#x2F;the-pragmatic-programmer-20th-anniversary-edition&#x2F;&quot;&gt;The Pragmatic Programmer — Andy Hunt &amp;amp; Dave Thomas&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How I built this portfolio ground up (TLDR)</title>
        <published>2026-02-22T00:00:00+00:00</published>
        <updated>2026-02-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.yella.dev/blog/building-blog-with-zola-ground-up/"/>
        <id>https://www.yella.dev/blog/building-blog-with-zola-ground-up/</id>
        
        <content type="html" xml:base="https://www.yella.dev/blog/building-blog-with-zola-ground-up/">&lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;brown-leaf.jpg&quot; alt=&quot;Brown leaf resting on the forest floor&quot; &#x2F;&gt;
&lt;h2 id=&quot;why-i-built-this&quot;&gt;Why I built this&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-i-built-this&quot; aria-label=&quot;Anchor link for: why-i-built-this&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Hi readers. In this article, I would like to show the process I took for building &amp;amp; publishing this website (https:&#x2F;&#x2F;yella.dev). But before that, let&#x27;s see some background.&lt;&#x2F;p&gt;
&lt;p&gt;My goal was to build a personal website with blog posts written in Markdown &amp;amp; Text-to-speech features like &quot;Listen&quot;. The content should be committed &amp;amp; pushed to GitHub, which should be automatically deployed.&lt;&#x2F;p&gt;
&lt;p&gt;I designed &amp;amp; deployed this website to create a clean space to host my portfolio and writings. I&#x27;ve tried popular platforms like Wordpress, Medium &amp;amp; Substack but didn&#x27;t like their customization options to reflect my personal taste. Therefore, I decided to create a new portfolio that lists my projects, books &amp;amp; writings in one single place, and this website is the answer.&lt;&#x2F;p&gt;
&lt;p&gt;I bought my domain (yella.dev) on Namecheap Domain Seller. The word &lt;code&gt;Yella&lt;&#x2F;code&gt; is a prefix of my last name: Yellavula.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;options-for-static-site-generation&quot;&gt;Options for static site generation&lt;a class=&quot;zola-anchor&quot; href=&quot;#options-for-static-site-generation&quot; aria-label=&quot;Anchor link for: options-for-static-site-generation&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I shortlisted a few static site generators and finally picked Zola, discarding the rest for the reasons below:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Generator&lt;&#x2F;th&gt;&lt;th&gt;Language&lt;&#x2F;th&gt;&lt;th&gt;Verdict&lt;&#x2F;th&gt;&lt;th&gt;Why&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;getpelican.com&#x2F;&quot;&gt;Pelican&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Python&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;I&#x27;d used it before and wanted to try something more modern this time.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;astro.build&#x2F;&quot;&gt;Astro Docs&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;JavaScript&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;Not a fan of JS tooling — too many NPM dependencies &amp;amp; security vulnerabilities. I also wanted to keep static site generation and builds as separate technologies.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gohugo.io&#x2F;&quot;&gt;Hugo&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Go&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;A great tool, but complex with a steep learning curve. My goal was to get started as fast as possible.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Rust&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;td&gt;The most modern of the lot, combining performance and simplicity — the fastest way to write in Markdown &amp;amp; build a static site, with a clean set of themes.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;I picked Zola for its mix of speed and simplicity, and liked a theme called &quot;Oceanic Zen&quot; for my blog &amp;amp; website.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;initial-setup-with-zola&quot;&gt;Initial Setup with Zola&lt;a class=&quot;zola-anchor&quot; href=&quot;#initial-setup-with-zola&quot; aria-label=&quot;Anchor link for: initial-setup-with-zola&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I created my project by first installing zola on Mac OSX:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; zola&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once installed, I initialized a Zola project using &quot;init&quot; command:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; init&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; yella.dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This creates a directory called yella.dev and places necessary files like &lt;code&gt;contents&lt;&#x2F;code&gt; directory and &lt;code&gt;config.toml&lt;&#x2F;code&gt;. You can see Zola directory structure here: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;getting-started&#x2F;directory-structure&#x2F;&quot;&gt;Zola Directories&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Zola uses &quot;Sass&quot; extension language for Cascading Style Sheets (CSS) making it easier to build styles and reuse them. The file: config.toml controls how Zola builds the website. For full list of available options, refer here: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;getting-started&#x2F;configuration&#x2F;&quot;&gt;Zola Configuration&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;picking-oceanic-zen-theme-for-look-feel&quot;&gt;Picking Oceanic Zen theme for look &amp;amp; feel&lt;a class=&quot;zola-anchor&quot; href=&quot;#picking-oceanic-zen-theme-for-look-feel&quot; aria-label=&quot;Anchor link for: picking-oceanic-zen-theme-for-look-feel&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Zola has a wide-variety of themes covering different usecases (blog, docs etc.) here: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;themes&#x2F;&quot;&gt;Zola themes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I picked Oceanic Zen due to its minimalism and clean layout.
I vendored the theme from GitHub and copied into &quot;themes&#x2F;&quot; directory in the project. I adjusted the font, font-size and colors based on my taste.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;next-step-deploying-the-website&quot;&gt;Next step: Deploying the website&lt;a class=&quot;zola-anchor&quot; href=&quot;#next-step-deploying-the-website&quot; aria-label=&quot;Anchor link for: next-step-deploying-the-website&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Once the content is ready in content folder and other tweaks with the theme &amp;amp; custom font, now is the time to deploy the website.&lt;&#x2F;p&gt;
&lt;p&gt;I used various Amazon Web Services (AWS) to deploy my website End-to-End (E2E). The services I leveraged in the process are:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;AWS Amplify - For hosting the Zola build contents (public&#x2F; directory)&lt;&#x2F;li&gt;
&lt;li&gt;AWS Simple Storage Service (S3) - For storing website images &amp;amp; binaries (MP3)&lt;&#x2F;li&gt;
&lt;li&gt;Amazon CloudFront - For delivering S3 contents securely&lt;&#x2F;li&gt;
&lt;li&gt;Amazon Route 53 - For connecting custom domain (yella.dev) to Amplify app&lt;&#x2F;li&gt;
&lt;li&gt;Amazon IAM - For creating service accounts to access S3 &amp;amp; CloudFront distribution. This is needed for GitHub integration.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;deployment-architecture&quot;&gt;Deployment Architecture&lt;a class=&quot;zola-anchor&quot; href=&quot;#deployment-architecture&quot; aria-label=&quot;Anchor link for: deployment-architecture&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The architecture has four main phases:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Publishing phase (For writing blog articles)&lt;&#x2F;li&gt;
&lt;li&gt;Text to speech conversion phase (for converting articles into listenable audio)&lt;&#x2F;li&gt;
&lt;li&gt;Delivery phase (to deploy the update)&lt;&#x2F;li&gt;
&lt;li&gt;Cache invalidation phase (to reset audio &amp;amp; static files)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;These four phases are divided into five partitions as shown in the below flow diagram.&lt;&#x2F;p&gt;
&lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;arch.png&quot; alt=&quot;Deployment architecture diagram for the blog publishing and delivery pipeline&quot; &#x2F;&gt;
&lt;p&gt;The architecture is straight-forward with separation of responsibility handled by different entities. For example, Publishing happens locally and then pushed to GitHub repository.
A GitHub CI workflow extracts text from new article, and converts it into audio using OpenAI Whisper API, then upload to S3. Finally, there is a cache invalidation step that resets the blog static assets like images and audio to serve fresh content. This is invalidating all at the moment, but can be optimized further.&lt;&#x2F;p&gt;
&lt;p&gt;As AWS Amplify is already listening to the repository changes, it automatically syncs changes to repo into Amplify app. This is how the blog content gets deployed.
The custom domain (yella.dev) is connected with Amplify via Route53 A &amp;amp; CNAME records for yella.dev, www.yella.dev respectively.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;a class=&quot;zola-anchor&quot; href=&quot;#security-considerations&quot; aria-label=&quot;Anchor link for: security-considerations&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;There are multiple security aspects considered during the development.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;All secrets are stored in encrypted GitHub secrets. Can be improved by migrating them to AWS Secrets Manager&lt;&#x2F;li&gt;
&lt;li&gt;To upload audio to S3 and for invalidating cache, an IAM OIDC trust relationship with required permissions is setup between GitHub repository &amp;amp; AWS CloudFront distribution with Least-privilege principle.&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Version&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;2012-10-17&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Statement&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Sid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;CloudFrontInvalidate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Effect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Allow&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Action&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;cloudfront:ListInvalidations&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;cloudfront:CreateInvalidation&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Resource&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;arn:aws:cloudfront::REDATCED:distribution&#x2F;REDATCED&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Condition&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;StringEquals&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;aws:PrincipalAccount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;REDATCED&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Sid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;S3UploadAudio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Effect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Allow&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Action&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s3:PutObject&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s3:AbortMultipartUpload&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s3:ListBucket&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Resource&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;arn:aws:s3:::yella-blog-assets&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;arn:aws:s3:::yella-blog-assets&#x2F;audio&#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Condition&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;StringEquals&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;aws:PrincipalAccount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;REDATCED&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;The source code is scanned with a SAST tool like Semgrep to make sure code is free from supply-chain vulnerabilities.&lt;&#x2F;li&gt;
&lt;li&gt;Add Web Application Firewall (WAF) for both Amplify App (blog content) &amp;amp; CloudFront distribution (blog static assets) to protect from bots &amp;amp; common attacks&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
  &lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;amplify-waf.png&quot; alt=&quot;AWS Amplify firewall settings screen&quot; &#x2F;&gt;
  Make sure to toggle these settings ON on Amplify Firewall:
&lt;ol&gt;
&lt;li&gt;Enable Amplify-recommended Firewall protection&lt;&#x2F;li&gt;
&lt;li&gt;Restrict access to amplifyapp.com&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Building a website using a platform like Vercel or Netlify can be easy but it overlooks a lot of options like customization, and security. I want to shed some light on my entire process of how I built this website &amp;amp; how you can learn from it. You can see the website source code here: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;narenaryan&#x2F;portfolio-yella-dev&quot;&gt;Source Code on GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading this article.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Read my past writings on Medium and Substack</title>
        <published>2025-12-21T00:00:00+00:00</published>
        <updated>2025-12-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.yella.dev/blog/read-my-past-writings/"/>
        <id>https://www.yella.dev/blog/read-my-past-writings/</id>
        
        <content type="html" xml:base="https://www.yella.dev/blog/read-my-past-writings/">&lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;vlc-wire.jpg&quot; alt=&quot;VLC media player wireframe illustration&quot; &#x2F;&gt;
&lt;p&gt;Hi, I am transitioning myself from Medium to this website to create custom look and feel for my writings.&lt;&#x2F;p&gt;
&lt;p&gt;I used Medium extensively &amp;amp; tried substack, but I feel they are cookie-cutter solutions for all blogs. To maintain authenticity, I like to theme my website based on my custom design principles of minimalism &amp;amp; readability.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to explore my past writings, please visit these blogs below:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;b&gt;Medium&lt;&#x2F;b&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;medium.com&#x2F;@narenarya&quot;&gt;https:&#x2F;&#x2F;medium.com&#x2F;@narenarya&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;b&gt; Substack &lt;&#x2F;b&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;narenyellavula.substack.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;narenyellavula.substack.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to develop software with AI in 2025</title>
        <published>2025-11-25T00:00:00+00:00</published>
        <updated>2025-11-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.yella.dev/blog/develop-software-with-ai-2025/"/>
        <id>https://www.yella.dev/blog/develop-software-with-ai-2025/</id>
        
        <content type="html" xml:base="https://www.yella.dev/blog/develop-software-with-ai-2025/">&lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;colored_statues.jpg&quot; alt=&quot;Colorful statues displayed together&quot; &#x2F;&gt;
&lt;p&gt;Since December 2022, I’ve been experimenting with AI for coding. The first tools were clunky and required copy‑pasting between a chatbot and an editor. Then GitHub Copilot and similar products brought AI into editors like VSCode. That in‑editor experience feels like pair programming with a remote teammate—except your partner is a prediction engine (LLM).&lt;&#x2F;p&gt;
&lt;p&gt;In 2025, “vibe coding” is a real trend: assembling software with AI in the loop. Agentic tools like Claude Code, Codex, and Amp CLI are becoming common. Living in the San Francisco Bay Area over the past three years, I’ve seen this shift up close.&lt;&#x2F;p&gt;
&lt;p&gt;I use AI in three practical modes:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;AI as a co‑pilot&lt;&#x2F;li&gt;
&lt;li&gt;AI as a debugger&lt;&#x2F;li&gt;
&lt;li&gt;AI as a time saver&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This post covers how I use each mode and the pitfalls to avoid. I won’t get into topics like what your &lt;code&gt;CLAUDE.md&lt;&#x2F;code&gt; should look like—that’s for another time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ai-as-a-co-pilot&quot;&gt;AI as a Co-pilot&lt;a class=&quot;zola-anchor&quot; href=&quot;#ai-as-a-co-pilot&quot; aria-label=&quot;Anchor link for: ai-as-a-co-pilot&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;A co‑pilot assists the captain with takeoff and landing, monitors conditions, and communicates with controllers. Similarly, AI can share the workload for parts of a codebase and utility work. But as the captain, you still need to confirm:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Is the output acceptable quality?&lt;&#x2F;li&gt;
&lt;li&gt;Does it follow existing paradigms and dependencies?&lt;&#x2F;li&gt;
&lt;li&gt;Is it secure?&lt;&#x2F;li&gt;
&lt;li&gt;Could it lead to destructive operations?&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Current AI systems are weak at reasoning about second‑ and third‑order consequences. That responsibility stays with you, and it’s the core skill of effective AI‑assisted development.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tips-for-reviewing-ai-work-as-a-co-pilot&quot;&gt;Tips for reviewing AI work as a co‑pilot&lt;a class=&quot;zola-anchor&quot; href=&quot;#tips-for-reviewing-ai-work-as-a-co-pilot&quot; aria-label=&quot;Anchor link for: tips-for-reviewing-ai-work-as-a-co-pilot&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Look for inefficient operations.&lt;&#x2F;li&gt;
&lt;li&gt;Look for dangerous operations.&lt;&#x2F;li&gt;
&lt;li&gt;Look for new dependencies.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ai-as-a-debugger&quot;&gt;AI as a Debugger&lt;a class=&quot;zola-anchor&quot; href=&quot;#ai-as-a-debugger&quot; aria-label=&quot;Anchor link for: ai-as-a-debugger&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;AI is excellent at debugging unfamiliar code or configuration. Humans debug sequentially—one issue at a time. AI can scan a problem and surface multiple issues in one pass. That’s where it delivers the most value.&lt;&#x2F;p&gt;
&lt;p&gt;It’s also a learning opportunity. I keep a journal of issues AI finds and fixes, then slow down to understand the root cause before moving on.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tips-while-using-ai-as-a-debugger&quot;&gt;Tips while using AI as a debugger&lt;a class=&quot;zola-anchor&quot; href=&quot;#tips-while-using-ai-as-a-debugger&quot; aria-label=&quot;Anchor link for: tips-while-using-ai-as-a-debugger&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Slow down.&lt;&#x2F;li&gt;
&lt;li&gt;Understand the conditions that led to failure.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ai-as-a-time-saver&quot;&gt;AI as a Time Saver&lt;a class=&quot;zola-anchor&quot; href=&quot;#ai-as-a-time-saver&quot; aria-label=&quot;Anchor link for: ai-as-a-time-saver&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;AI saves time on workflows that are slow to set up but easy to abandon. Examples include switching laptops, rebuilding dev environments, or repeating tasks (Dockerfiles, GitHub Actions, shell scripts). I used AI to create a Docker image for an Ubuntu dev box with all the right tools—something that would have taken much longer manually.&lt;&#x2F;p&gt;
&lt;p&gt;It also speeds up comprehension of a new codebase. What used to take days can be accelerated by loading a project into context and asking targeted questions. This use case is underrated.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-does-ai-do&quot;&gt;What does AI do?&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-does-ai-do&quot; aria-label=&quot;Anchor link for: what-does-ai-do&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Drafts Dockerfiles, shell scripts, and other repetitive tasks.&lt;&#x2F;li&gt;
&lt;li&gt;Helps you map and understand large codebases.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;how-can-you-save-time&quot;&gt;How can you save time?&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-can-you-save-time&quot; aria-label=&quot;Anchor link for: how-can-you-save-time&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Delegate repetitive setup and scripting tasks (Dockerfiles, CI, shell scripts).&lt;&#x2F;li&gt;
&lt;li&gt;Use AI to summarize projects and draft design docs before you refine them.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Working in these three modes keeps you sharp and engaged, while still sharpening your ability to observe change.&lt;&#x2F;p&gt;
&lt;p&gt;There are a few things one must not forget while developing code with AI:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Always run sensitive operations in a containerized sandbox.&lt;&#x2F;li&gt;
&lt;li&gt;Never share personal information with AI (easy to slip into debugging logs).&lt;&#x2F;li&gt;
&lt;li&gt;Reverse‑delegate tasks from AI back to yourself to practice coding.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Finally, I don’t use AI as a replacement for myself. It lacks business context and emotion, and can lead me down the wrong path if it takes full control.&lt;&#x2F;p&gt;
&lt;p&gt;People may think that in 2025 AI usage is radically different, but the fundamentals remain. The principles above stay true no matter how powerful the tools get.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks for reading this human‑written article!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;a class=&quot;zola-anchor&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;Co-Intelligence-Living-Working-Ethan-Mollick&#x2F;dp&#x2F;059371671X&quot;&gt;Co-intelligence Book&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;features&#x2F;copilot&quot;&gt;GitHub Copilot&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;claude.com&#x2F;product&#x2F;claude-code&quot;&gt;Claude Code&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geminicli.com&#x2F;&quot;&gt;Gemini CLI&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My Failure Resume</title>
        <published>2025-06-22T00:00:00+00:00</published>
        <updated>2025-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.yella.dev/blog/failure-resume/"/>
        <id>https://www.yella.dev/blog/failure-resume/</id>
        
        <content type="html" xml:base="https://www.yella.dev/blog/failure-resume/">&lt;img width=&quot;1600&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;d3bphourhbt2ew.cloudfront.net&#x2F;images&#x2F;baybridge_bw.jpg&quot; alt=&quot;Black and white view of the Bay Bridge&quot; &#x2F;&gt;
&lt;p&gt;A resume typically showcases successful projects and achievements. A failure resume does the opposite — it lists failures to show the battle scars from software engineering. Software engineering isn’t for the faint of heart, and I’ve had my fair share of failures over the past decade.&lt;&#x2F;p&gt;
&lt;p&gt;I am writing this to show others that I am like any other human. Many times, people assume that I do things with elegance and ease and achieve success.&lt;&#x2F;p&gt;
&lt;p&gt;Right from school, I have met many smart people who are smarter than me in magnitudes. It is a disservice to life and those people not to speak of my failures and show to be on par with them in success.&lt;&#x2F;p&gt;
&lt;p&gt;One thing is for sure. I valued curiosity, problem-solving &amp;amp; networking from the beginning of my career. Those qualities helped me overcome my shortcomings.&lt;&#x2F;p&gt;
&lt;p&gt;This article presents some of those failures I encountered at work, and how I overcame them. This is an honest self-critique, shared publicly to break free from my bubble of success.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;failure-1-spend-too-much-time-learning-on-the-job&quot;&gt;Failure 1: Spend too much time learning on the job&lt;a class=&quot;zola-anchor&quot; href=&quot;#failure-1-spend-too-much-time-learning-on-the-job&quot; aria-label=&quot;Anchor link for: failure-1-spend-too-much-time-learning-on-the-job&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;At the beginning of my career, I wasn’t a quick learner. In the teams I was part of, there were amazing and fearless learners. Even my doing skill has a few shortcomings in comparison to them. I was strong in theory but weak in practice.&lt;&#x2F;p&gt;
&lt;p&gt;This weakness forced me to spend considerable time learning on the job. While it’s expected for beginners to learn as they go, my pace didn’t meet expectations. There is no shame in saying I was lagging.&lt;&#x2F;p&gt;
&lt;p&gt;It took 2–3 years to assess and improve my skills and understand what I could and couldn’t deliver. There are a few things that helped me to improve myself. I will present them now.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;b&gt;What Helped Me?&lt;&#x2F;b&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There are a few initiatives that helped me improve in that phase:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Maintaining a journal&lt;&#x2F;li&gt;
&lt;li&gt;Repeating the patterns used by seniors&lt;&#x2F;li&gt;
&lt;li&gt;Constantly reviewing myself &amp;amp; setting goals&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;failure-2-spend-too-much-time-doing-the-job&quot;&gt;Failure 2:  Spend too much time doing the job&lt;a class=&quot;zola-anchor&quot; href=&quot;#failure-2-spend-too-much-time-doing-the-job&quot; aria-label=&quot;Anchor link for: failure-2-spend-too-much-time-doing-the-job&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;There were times when my tasks slipped through multiple sprints, likely because I blindly accepted poorly estimated tasks and didn’t ask questions during backlog grooming sessions.&lt;&#x2F;p&gt;
&lt;p&gt;I mistakenly believed our backlog was meticulously groomed and that completing tasks was simply a matter of time. As you predicted, I was wrong.&lt;&#x2F;p&gt;
&lt;p&gt;Beyond inaccurate estimations, I overlooked tasks that required additional communication with other teams. This wasted valuable sprint time because I had to find information myself that a team member might already have known.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;b&gt;What Helped Me?&lt;&#x2F;b&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There are a couple of things that assisted me in getting better here:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Step out of my comfort zone and ask the right questions&lt;&#x2F;li&gt;
&lt;li&gt;Put extra thought at the beginning of the task&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;After making those tweaks, I saw a significant boost in my velocity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;failure-3-release-code-without-testing-it-thoroughly&quot;&gt;Failure 3: Release code without testing it thoroughly&lt;a class=&quot;zola-anchor&quot; href=&quot;#failure-3-release-code-without-testing-it-thoroughly&quot; aria-label=&quot;Anchor link for: failure-3-release-code-without-testing-it-thoroughly&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Like many software developers, I had a lazy habit of assuming things would work when I made small code changes. I was wrong 90% of the time.&lt;&#x2F;p&gt;
&lt;p&gt;How did that happen? I used to unconsciously skip manual testing of code and system functionality. I learned the hard way that making tiny changes to a massive codebase can cause unpredictable regressions, making it essential to test every change before shipping software. End-to-end testing can still break because systems work charms in isolation, but when integrated they fall like ninepins.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;b&gt; What Helped Me?&lt;&#x2F;b&gt;
Knowing that systems always need additional testing after changes, I now test everything beforehand and tell myself: “Assume your system is broken unless confirmed through testing!”&lt;&#x2F;p&gt;
&lt;p&gt;Also, &lt;b&gt;”Write a lot of unit tests”&lt;&#x2F;b&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;failure-4-deploying-code-into-production-on-the-fridays&quot;&gt;Failure 4: Deploying code into production on the Fridays&lt;a class=&quot;zola-anchor&quot; href=&quot;#failure-4-deploying-code-into-production-on-the-fridays&quot; aria-label=&quot;Anchor link for: failure-4-deploying-code-into-production-on-the-fridays&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I did a few Friday deployments which ruined my co-worker’s weekend and mine too. Some of this urge to ship may manifested from the delays in the sprint work (Failure 2).&lt;&#x2F;p&gt;
&lt;p&gt;Shipping code is fun, but breaking things for customers during the weekend when everyone’s unavailable is a nightmare. I still get that urge sometimes, but with a decade of industry experience, I know some things are better postponed — and Friday releases are definitely one of them.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;b&gt; What Helped Me?&lt;&#x2F;b&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Not deploying on Fridays unless the team approves it&lt;&#x2F;li&gt;
&lt;li&gt;Not doing any major code merges before going on a vacation&lt;&#x2F;li&gt;
&lt;li&gt;Being empathetic about my colleagues &amp;amp; their time&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;failure-5-restarting-a-production-database-mistakenly&quot;&gt;Failure 5: Restarting a production database mistakenly&lt;a class=&quot;zola-anchor&quot; href=&quot;#failure-5-restarting-a-production-database-mistakenly&quot; aria-label=&quot;Anchor link for: failure-5-restarting-a-production-database-mistakenly&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I once mistakenly restarted a production PostgreSQL database because I had multiple AWS console tabs open (dev, test, and production) and clicked on the wrong tab. This happened because I lost concentration during my end-of-day routine of stopping the database server in the test environment.&lt;&#x2F;p&gt;
&lt;p&gt;Luckily, it was just a simple restart of an AWS RDS instance — no data was lost and no requests were dropped — but I still remember that heart-stopping moment when I realized I was working on a production database.&lt;&#x2F;p&gt;
&lt;p&gt;After that incident, I installed a Google Chrome extension &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;chromewebstore.google.com&#x2F;detail&#x2F;aws-colorize&#x2F;mdbbjjffailicnmbohffnjflngmpinco&quot;&gt;AWS-Colorize&lt;&#x2F;a&gt; that marks production accounts in red, helping me visually avoid any destructive actions.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-helped-me&quot;&gt;What Helped Me?&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-helped-me&quot; aria-label=&quot;Anchor link for: what-helped-me&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Nowadays, I triple-check while operating on a production account. I developed the habit of staying alert to keep myself and others safe while performing destructive operations like writing and deleting data during complex migrations. Resource isolation is also another way to keep accidental stepping of production workloads.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;failure-6-getting-stuck-in-the-head-for-way-too-long&quot;&gt;Failure 6: Getting stuck in the head for way too long&lt;a class=&quot;zola-anchor&quot; href=&quot;#failure-6-getting-stuck-in-the-head-for-way-too-long&quot; aria-label=&quot;Anchor link for: failure-6-getting-stuck-in-the-head-for-way-too-long&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Four years ago, during a daily standup meeting, I experienced a complete mental blank when my turn came and couldn’t say a single word about my current task for several minutes. My colleagues listened in silence, clearly struggling with the awkward situation. I picked a task and went into a rabbit hole of low-level details, missing the top-level goal completely which was caused by brain fade.&lt;&#x2F;p&gt;
&lt;p&gt;Maybe I was building up hidden mental fatigue over a long period without realizing it until it finally surfaced on one difficult day.&lt;&#x2F;p&gt;
&lt;p&gt;It was a very awkward moment. I could have prepared for the meeting in advance, knowing I had to report during the call, but I failed to do so.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;b&gt; What Helped Me?&lt;&#x2F;b&gt;
Here are the mental adjustments I made thereafter:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Be prepared for important meetings&lt;&#x2F;li&gt;
&lt;li&gt;Don’t go through endless rabbit holes, know when to stop and seek help&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;failure-7-laying-out-grand-plans-but-not-executing-them&quot;&gt;Failure 7: Laying out grand plans but not executing them&lt;a class=&quot;zola-anchor&quot; href=&quot;#failure-7-laying-out-grand-plans-but-not-executing-them&quot; aria-label=&quot;Anchor link for: failure-7-laying-out-grand-plans-but-not-executing-them&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In my previous companies, I consistently brought fresh thoughts and new ideas to every sprint review meeting. Even in 1:1 with managers, I shared many improvements for ongoing efforts. This is a welcoming thing because I am contributing where I was expected to.&lt;&#x2F;p&gt;
&lt;p&gt;Looking back, I realize I generate new ideas faster than I can execute them, and execution is what creates value for my team and company. I regret not choosing two or three top ideas from my collection and seeing them through to completion.&lt;&#x2F;p&gt;
&lt;p&gt;I learned the hard way why people say “It’s hard to multitask from end to end.” A few great books I read lately suggested I focus on the top two initiatives and delegate the rest.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;b&gt;What Helped Me?&lt;&#x2F;b&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Follow the Eisenhower Method for prioritization&lt;&#x2F;li&gt;
&lt;li&gt;Hold the excitement to work on new shiny things&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;a class=&quot;zola-anchor&quot; href=&quot;#final-thoughts&quot; aria-label=&quot;Anchor link for: final-thoughts&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Thanks for reading my failed Resume. The point here is not to focus on failures but on how they gave me a chance to learn and correct myself for future endeavors. If you’re a young person reading this, remember that we’re all learning together, so keep turning your failures into opportunities. All humans make mistakes, and I am no exception. That’s all I have to say!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;a class=&quot;zola-anchor&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Priority_Matrix&quot;&gt;Eisenhower Matrix: Wikipedia&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;chromewebstore.google.com&#x2F;detail&#x2F;aws-colorize&#x2F;mdbbjjffailicnmbohffnjflngmpinco&quot;&gt;Chrome extension to color AWS accounts: ChromeWebStore&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.healthline.com&#x2F;health&#x2F;brain-fog&quot;&gt;Brain Fade &amp;amp; Cause: HealthLine&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;Do-Work-Overcome-Resistance-Your&#x2F;dp&#x2F;8119216490&#x2F;&quot;&gt;Favorite book on topic: Amazon&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hbr.org&#x2F;2016&#x2F;05&#x2F;write-a-failure-resume-to-learn-what-makes-you-succeed&quot;&gt;Motivation to this article: Harvard Business Review&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
</feed>
