<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Flowkater.io (English)</title><description>AI-translated English versions of Tony Cho&apos;s Korean posts. Korean originals are canonical.</description><link>https://flowkater.io/</link><language>en</language><item><title>Books I Read in Q1 2026</title><link>https://flowkater.io/en/posts/2026-04-14-2026-q1-book-reviews/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-04-14-2026-q1-book-reviews/</guid><description>Notes on the 10 books I read in Q1 2026: Stoner, The Obstacle Is the Way, Meditations, Source Code: My Beginnings, Bird That Drinks Blood, the second Krafton Way book, Lost and Founder, The Score Takes Care of Itself, Formula One, and Principles.</description><pubDate>Tue, 14 Apr 2026 01:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;I&apos;m pulling together the books I read this past Q1 in one place. I reached for whatever was around: fiction, classics, biography, self-help, startup, leadership, sport. Some I wrote long reviews of, others I covered in dedicated posts, so the lengths vary. I&apos;m just logging them in no particular order.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;Stoner&lt;/em&gt;, by John Williams&lt;/h2&gt;
&lt;p&gt;I actually read this one back in November but never wrote about it anywhere, so I&apos;m putting it here. It was the first novel-as-novel I&apos;d felt in a long time. Maybe the fact that it isn&apos;t dramatic is exactly why it lands with so many people. Following one man&apos;s life secondhand, I came away feeling like I&apos;d lived through the whole sweep of frustration and constriction we all carry, and the everyday determination of someone who still gave each day his best. (The afterglow stuck with me long enough that I subscribed to Millie&apos;s Library for a month just to read critic Lee Dong-jin&apos;s review.) There&apos;s a reason so many readers call it the book of their life.&lt;/p&gt;
&lt;p&gt;It&apos;s a quiet novel, walking through a life&apos;s events in sequence, but a few &quot;villains&quot; do show up. Not dramatic ones, just the kind of people who keep needling and obstructing him in an otherwise unremarkable life. What fascinated me was how closely those villains resemble the ones in our own lives. Nobody who&apos;s done you wrong enough to deserve being killed off, just the irritating people you meet along the way, captured with uncanny precision.&lt;/p&gt;
&lt;p&gt;And like most of us, Stoner never once defeats them. I&apos;m still recommending what sounds like a soul-crushing novel because I&apos;ve rarely encountered one that renders a single life so close to the skin, and I want you to feel the afterglow of walking with him from beginning to end.&lt;/p&gt;
&lt;p&gt;I&apos;ll defer the formal introduction to &lt;a href=&quot;https://www.youtube.com/watch?v=gMifHcD8mm4&quot;&gt;critic Lee Dong-jin&apos;s recommendation video&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t try to win the war that&apos;s your whole life. Try to win the daily battles. Stoner was that kind of person too.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Lee Dong-jin (translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;The Obstacle Is the Way&lt;/em&gt;, by Ryan Holiday&lt;/h2&gt;
&lt;p&gt;I picked this self-help book back up after a long break, planning to read it together with George and Ellie. Truth is, it&apos;s not a great book. The one redeeming function: that signature self-help lightness was unbearable enough that I went and read &lt;em&gt;Meditations&lt;/em&gt;, the Stoic classic the book keeps quoting.&lt;/p&gt;
&lt;p&gt;The full review is &lt;a href=&quot;/posts/2026-02-03-book-review-the-obstacle-is-the-way/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;Meditations&lt;/em&gt;, by Marcus Aurelius&lt;/h2&gt;
&lt;p&gt;I read this in small daily doses, almost the way you&apos;d read scripture. If &lt;em&gt;I May Be Wrong&lt;/em&gt; (which I love) is essay-shaped, this one sits closer to scripture. Reading it while remembering that Marcus was talking to himself makes it surprisingly compelling.&lt;/p&gt;
&lt;p&gt;I&apos;d wanted to read this classic for ages, and &lt;em&gt;The Obstacle Is the Way&lt;/em&gt; finally pushed me to it. The passages where he scolds the part of himself that wants to stay safe under the covers (using these almost dogmatic lines) are the highlight. Whenever life gets hard down the road, I think I&apos;ll find comfort in the lines I underlined in his diary. I read with a pen, sometimes switched to audio, and I plan to gather the passages I marked into a separate note.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Everything depends on how you take it&quot; means that the character and impact of any external thing or circumstance (anything value-neutral, with no inherent connection to happiness or to good and evil) depends not on the thing itself but solely on how a person receives it. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;When daylight comes and you don&apos;t want to leave your bed, tell yourself: &quot;I&apos;m getting up to do the work of a human being. I was born for this work, came into the world for it, and now I&apos;m complaining and balking? I wasn&apos;t born to lie under blankets enjoying warm comfort.&quot; &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;Source Code: My Beginnings&lt;/em&gt;, by Bill Gates&lt;/h2&gt;
&lt;p&gt;I bought this the moment it came out last year and only got around to it almost a year later. I&apos;d absorbed the Microsoft founding story through other media (&lt;em&gt;Pirates of Silicon Valley&lt;/em&gt;, the 1999 docudrama, and so on), but reading it in his own words gave me a much more granular account of everything up to the founding than the version I&apos;d vaguely held in my head.&lt;/p&gt;
&lt;p&gt;This is part one of his life. The main material is his childhood, before Microsoft. Part two will probably be the rise of the Microsoft empire, part three the post-retirement years. It has a different feel from Walter Isaacson&apos;s &lt;em&gt;Elon Musk&lt;/em&gt; and &lt;em&gt;Steve Jobs&lt;/em&gt;, but peering into his unusual childhood was its own kind of fun.&lt;/p&gt;
&lt;p&gt;(Of course his scandal broke right as I was reading this, which made writing about it feel awkward. Still, I read it, so a quick note.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How long do you have to focus and grind, day after day, just to do a little better than yesterday, for how many years, before you reach the top? &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;Bird That Drinks Blood&lt;/em&gt; (first half), by Lee Yeongdo&lt;/h2&gt;
&lt;p&gt;I cried while reading &lt;em&gt;Bird That Drinks Tears&lt;/em&gt; during a high school class. I think it was sophomore year, and the scene I read at the very end is still with me. I kept meaning to read &lt;em&gt;Bird That Drinks Blood&lt;/em&gt; and never quite got there until the 20th-anniversary edition came out (honestly I wanted the &lt;em&gt;Tears&lt;/em&gt; edition), at which point I bought the whole set and started chipping away at it last year, picking it up in pockets through Q1.&lt;/p&gt;
&lt;p&gt;I still have a few volumes left, but it has far more characters and factions than &lt;em&gt;Tears&lt;/em&gt; did. If &lt;em&gt;Tears&lt;/em&gt; is &lt;em&gt;The Lord of the Rings&lt;/em&gt; (specifically the Fellowship), &lt;em&gt;Blood&lt;/em&gt; is closer to &lt;em&gt;A Song of Ice and Fire&lt;/em&gt; (Game of Thrones). (In the ensemble-drama sense.)&lt;/p&gt;
&lt;p&gt;The variety of character charm and the world-building solidified across both books reach a kind of essence here, and there are scenes that genuinely make you marvel. There are still sentences that hit you in the gut, and a few that feel a little juvenile, maybe because the book has aged. (Or I have.) I&apos;ll still finish it and write up the rest in next quarter&apos;s post.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The one who falls from the horse is the one who rode it. The defeated general is the one who went to war. The drowned Lekon is the one who went into the water…. Every loser is someone who kept winning right up to the moment of defeat. Life is a long journey toward losing. Life isn&apos;t to be spent on winning; it&apos;s to be spent on losing. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;Battlegrounds, Onto a New Front: The Second Krafton Way&lt;/em&gt;, by Lee Gi-mun&lt;/h2&gt;
&lt;p&gt;My first impression after reading the original &lt;em&gt;Krafton Way&lt;/em&gt; was: &quot;they got really lucky with how PUBG came to be.&quot; How Bluehole (Krafton&apos;s earlier name) was founded, the trial and error that led them all the way to PUBG: the story itself was riveting, but I felt I had no real lesson to take from it.&lt;/p&gt;
&lt;p&gt;This second book was different. They&apos;d hit a global home run with PUBG, and now the book is full of the messy, real work of turning that one-time success into a sustainable organization, company, and service. Unlike the first book, much of this one left a deep impression on me.&lt;/p&gt;
&lt;p&gt;They had to walk through a grueling, drawn-out process to turn a globally successful service into something that lasts, not a one-off jackpot. Reading along, I felt the strain with them, and at the same time I found myself envious of a team this aligned, pouring their lives into the work to push the service forward.&lt;/p&gt;
&lt;p&gt;The dialogues at the center, between Chang Byung-gyu and Kim Chang-han, are sharp to the point of &quot;is this even okay?&quot; Watching leaders of a company at this level keep clashing this hard, studying the org, trying to talk to their people (one-sided as it sometimes is), I kept asking myself: did I ever put that much effort into the orgs I was part of? It triggered a lot of reflection.&lt;/p&gt;
&lt;p&gt;I&apos;d guess this book was Chang Byung-gyu&apos;s idea. It&apos;s worth recommending because beyond the behind-the-scenes of building and shipping PUBG, you get a lot of the work of building org culture (and the difficulty of it), and the agonizing behind various business calls, conveyed without much editing.&lt;/p&gt;
&lt;p&gt;I hope Krafton doesn&apos;t end up as a PUBG one-hit wonder, and that they keep growing through diverse IP and game titles. (Since Krafton holds the &lt;em&gt;Bird That Drinks Tears&lt;/em&gt; media IP, as I mentioned, I&apos;m hoping for a Korean Witcher.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Within PUBG, no one had seen Kim Chang-han stripped down to the mad-dog persona. Kim Chang-han didn&apos;t carry the substance of his negotiations with Bluehole&apos;s leadership, or the friction they caused, into PUBG. What he looked like outside PUBG, no one inside knew. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;A person with ownership over something owns the delivery of the message too. Let&apos;s not say &quot;I sent it; they didn&apos;t receive it.&quot; If we start passing responsibility around like that, we don&apos;t get to an answer. Before debating whether the means are efficient, the person with ownership, whether of communication or of work, has to take responsibility until the message lands. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Korean developers got into development as a job. Passionate people are the ones who should be diving in, and I&apos;m not sure how many of those we have in Korea. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;When the entire dev team stops developing and starts playing the game they made, that&apos;s the launch date. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;Lost and Founder&lt;/em&gt;, by Rand Fishkin&lt;/h2&gt;
&lt;p&gt;Some VC trashed it on Threads as &quot;garbage&quot; and mocked the author&apos;s &quot;weak&quot; mental state for wallowing in self-pity, which made me want to read it immediately. The author founded the SEO startup &lt;a href=&quot;https://moz.com/&quot;&gt;Moz&lt;/a&gt;, and the book covers his very naive early days in business, his regret about not exiting after VC funding turned things around, and a critique of the growth-hacking and J-curve gospel preached in the Valley (and the broader startup scene). It tells the unedited version of the story you don&apos;t get from Facebook or the small handful of breakout success stories.&lt;/p&gt;
&lt;p&gt;These days, thanks to AI, there&apos;s a growing belief that you don&apos;t necessarily need VC funding, and bootstrapping is part of the conversation. But back when I started in the early 2010s, every startup&apos;s top mission was to take VC money and become a unicorn. Mine was no exception, even though not every business can be a unicorn.&lt;/p&gt;
&lt;p&gt;There are companies that use VC funding to run on losses while chasing explosive growth, and there are companies that build cash flow in a niche market and grow steadily. If you&apos;re thinking about a startup, this book is worth reading at least once. It&apos;ll help you weigh what you actually want, what kind of business growth fits you. His mental anguish, and his stage-by-stage regrets and advice, meant a lot to me.&lt;/p&gt;
&lt;p&gt;If I&apos;d read this ten years ago, would I still be running my own business today?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The moment you believe you can hide the truth, the brake that stops you from doing bad things is broken. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;A founder&apos;s traits get embedded in the organization almost permanently, while employees&apos; traits change over time. Part of the reason is that founders stay much longer and exert influence for much longer. But even when the team turns over, what remains is an indelible imprint left by the founder&apos;s biases, the business structures they built, the way they hired, the way they delegated, how they allocated resources, their passions, and their blind spots. I see this pattern repeat in companies of every size, industry, and configuration. The founder (and CEO) governs not just the personality and culture of the org, but also the foundational strengths and weaknesses that shape the organization&apos;s trajectory for years or decades. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;The Score Takes Care of Itself&lt;/em&gt;, by Bill Walsh&lt;/h2&gt;
&lt;p&gt;This one is a pretty famous leadership book in the US. So many people recommended it that I read it in the original English, carefully underlining as I went, with an AI agent making the process much easier.&lt;/p&gt;
&lt;p&gt;The full review lives in &lt;a href=&quot;/posts/2026-04-13-score-takes-care-of-itself/&quot;&gt;this post&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;Formula One&lt;/em&gt;, by Joshua Robinson and Jonathan Clegg&lt;/h2&gt;
&lt;p&gt;This is one of the books I bought and finished fastest. Inside you get the F1 industry titans I&apos;d only heard about (Enzo Ferrari, Bernie Ecclestone), the championship drivers from Niki Lauda, Ayrton Senna, Michael Schumacher, through Lewis Hamilton and Max Verstappen, plus the major chapters of team history and the stories behind them. Built from years of reporting by Wall Street Journal writers, the book reads as both a tribute to F1&apos;s past and a mix of affection and worry about today&apos;s American-market-centric era.&lt;/p&gt;
&lt;p&gt;I came into F1 through Netflix&apos;s &lt;em&gt;Drive to Survive&lt;/em&gt; season 1, watched on and off for a while, and only started catching every race last year. The book retraced the older F1 history for me and unpacked even the famous events I already knew with great backstage detail. Last year I followed every race closely and traded paddock news and driver memes with Ellie, so this year&apos;s new &lt;em&gt;Drive to Survive&lt;/em&gt; season felt thin to me. (Documentaries always aim at total newcomers.) That disappointment is part of why I wrote a &lt;a href=&quot;/posts/2026-01-09-f1-leadership-james-vowles/&quot;&gt;separate post on F1 leadership&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then, after the first three races this year, the war in Iran caused two April races to be cancelled. That doubled the disappointment. This book filled the gap. After Liberty Media bought the sport and the Netflix doc dropped, F1 entered a completely new era. A race is, at heart, a game to decide first place. But racing has become a status sport, and the fact that drama from mid-pack and back-of-the-grid teams gets consumed alongside the title fight is genuinely interesting. As the book points out, there are now people who call themselves F1 fans without watching a single race. (I was one of them up to two years ago.)&lt;/p&gt;
&lt;p&gt;If you&apos;re curious about F1, watch the Netflix doc; if you came in through the doc and want to know F1&apos;s older history, this book is exactly right. The Miami Grand Prix is two weeks away, so go buy it now and read it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In that sense, F1 had become a kind of &quot;post-sport.&quot; We&apos;re now in a world where you can call yourself a die-hard Formula 1 fan without watching a single race. They&apos;re full-on supporters who pour their lives, attachment, and money into F1. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;em&gt;Principles&lt;/em&gt;, by Ray Dalio&lt;/h2&gt;
&lt;p&gt;This is the famous book by investor Ray Dalio. I read about 60% and put it down. Part 1 was a fascinating secondhand tour of his life, but parts 2 and 3 are quite literally a list of &quot;principles,&quot; which threw me a bit.&lt;/p&gt;
&lt;p&gt;These days a self-help book written this way would probably get torched. But it came out seven or eight years ago when plenty of people around me recommended and raved about it, so I&apos;d had it for a long time, sitting like a homework assignment. Reading it now, the rapid-fire list of principles in parts 2 and 3 felt off. I don&apos;t lean toward this kind of structure, and I&apos;m allergic to the self-help genre to begin with. Setting aside the fact that he&apos;s a successful investor, I&apos;m not sure the book deserves the praise it gets.&lt;/p&gt;
&lt;p&gt;That said, his principles aren&apos;t unreasonable. They&apos;re decent advice. The problem is that for any of these messages to actually land in my own life, they need to leave an impression, and they didn&apos;t.&lt;/p&gt;
&lt;p&gt;The book is very thick. If you&apos;re just curious about who Ray Dalio is, part 1 alone is enough; his story carries it. Imagine if they&apos;d split it into three volumes and sold part 1 separately. Some readers call it the book of their life, so trying it once and forming my own opinion was at least worth something.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What you do after failing matters most. Successful people grow by leaning into their strengths and shoring up their weaknesses; people who fail can&apos;t bring themselves to do that. &lt;em&gt;(translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem; margin: 1.5rem 0;&quot;&amp;gt;
&amp;lt;figure style=&quot;margin: 0;&quot;&amp;gt;
&amp;lt;img src=&quot;/assets/2026-q1-books.jpg&quot; alt=&quot;Onyx Palma 2&quot; style=&quot;width: 100%; height: auto; margin: 0;&quot; /&amp;gt;
&amp;lt;figcaption style=&quot;text-align: center; font-size: 0.875rem; opacity: 0.7; margin-top: 0.5rem;&quot;&amp;gt;Onyx Palma 2 e-reader&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;figure style=&quot;margin: 0;&quot;&amp;gt;
&amp;lt;img src=&quot;/assets/2026-q1-todait.png&quot; alt=&quot;Todait reading plan&quot; style=&quot;width: 100%; height: auto; margin: 0;&quot; /&amp;gt;
&amp;lt;figcaption style=&quot;text-align: center; font-size: 0.875rem; opacity: 0.7; margin-top: 0.5rem;&quot;&amp;gt;My Q1 reading plan, managed in Todait&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;For the actual reading I mostly used Todait, which I&apos;m building (again) right now. Even with three books in flight, the per-book pacing balances itself, so I worked through them one chunk at a time. Reading multiple books at once turned out to be more chaotic than expected. If work gets busy and I miss a few days, the backlog stacks up that much, and I&apos;m thinking I should cap it at two books in flight.&lt;/p&gt;
&lt;p&gt;I started reading in earnest in February. Roughly one book per week (and we&apos;re already in mid-April). Reading a lot is good, but I want to keep stacking reviews and leave at least rough notes for thinking. Some of these books I read a while ago, and not having taken notes at the time made it harder to write from memory.&lt;/p&gt;
&lt;p&gt;Half were physical books, and for the other half I bought the Onyx Palma 2 (a phone-sized e-reader) so I can read anywhere. Lately I leave my smartphone outside the bedroom and bring only the e-reader and whichever book I&apos;m in. It&apos;s helped with sleep and with reading both.&lt;/p&gt;
&lt;p&gt;I still have plenty of unread books stacked up. To keep the reading habit going, I&apos;m leaving a quarterly note. See you in the next quarter.&lt;/p&gt;
</content:encoded><category>reading</category><category>essay</category><category>retrospective</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Reading &apos;The Score Takes Care of Itself&apos;: On Leadership</title><link>https://flowkater.io/en/posts/2026-04-13-score-takes-care-of-itself/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-04-13-score-takes-care-of-itself/</guid><description>Notes on Bill Walsh&apos;s leadership book &apos;The Score Takes Care of Itself.&apos; The good-talent-bad-attitude equation, his declaration that teaching is the very definition of leadership, and the upward leadership chapter. The three-time Super Bowl winning coach&apos;s principles, read against my own failures.</description><pubDate>Mon, 13 Apr 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/assets/bill-walsh-cover.jpg&quot; alt=&quot;The Score Takes Care of Itself, by Bill Walsh&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;Whenever leadership comes up, people ask what success I&apos;ve had to speak this deeply about it. The question is genuinely embarrassing, because I haven&apos;t had any success in leadership. I was always the loner in whatever organization I joined, and from the days I ran my own startup to the most recent team, I have never once felt like I &apos;truly&apos; belonged. When I was younger that was arrogance and self-delusion (&quot;I&apos;m different&quot;). More recently it&apos;s been my own laziness; I gave up trying to understand other people. And on top of that, I watched with my own eyes as the standards and principles I&apos;d set, and the consistency I&apos;d tried to keep, collapsed underneath me, and my sandcastle leadership went with them. (I don&apos;t want to plead force majeure. I picked that team in the end.)&lt;/p&gt;
&lt;p&gt;The small comfort is that out of every person I&apos;ve worked with across my career (myself included, every boss above me, every successor below me) not one of them practiced anything I&apos;d call real leadership. (Not one.) By my standards, most of them were closer to the worst end of the scale, and the funny part is I think I was at least a notch better than them. I still think so. (They&apos;d disagree, of course. This is just my take.)&lt;/p&gt;
&lt;p&gt;A leader needs to delegate to the right people on the right things. But naive delegation without trust is just laissez-faire dressed up as empowerment, and the &apos;fake&apos; psychological safety you create by comforting people who failed is nothing more than my own small selfishness, wanting them not to be uncomfortable around me. The opposite is just as bad. When you can&apos;t trust them and you pull every load yourself, the team never finds their own role, never grows or stretches in the right ways, and slips into the assumption that as long as they clock the hours, the leader will cover the rest. The team&apos;s win is no longer their concern. They just want the company to keep paying salaries. So the question isn&apos;t whether to delegate. Every team is different, every person is different, and calibrating the dose is genuinely hard work. There&apos;s no leadership law that holds everywhere with the same shape.&lt;/p&gt;
&lt;p&gt;I used to read everything on this. What makes a good team, why &apos;psychological safety&apos; matters, why a winning team matters (which I wrote about three months ago in &quot;&lt;a href=&quot;/posts/2026-01-25-no-victory-no-future/&quot;&gt;Organizations that don&apos;t win have no future&lt;/a&gt;&quot;). At some point I realized how lazy and convenient it is to expect a book to hand you the answer. So I put all those leadership books down. Reading does sometimes give us unexpected lessons and experiences, but on the topic of leadership specifically, I&apos;d dare to say this:&lt;/p&gt;
&lt;p&gt;Close the book. Spend that time on a 1:1 with the people on your team right now. Then ask yourself whether what you&apos;re doing is actually moving the team toward winning.&lt;/p&gt;
&lt;p&gt;So the leadership fragments I share with people come from many places, but they almost always trace back to the same wounds: losing the details, falling out of alignment with the leadership above me, missing the small shifts in my teammates, failing to define what winning looks like. It&apos;s less success than the residue of a long string of bone-deep failures I felt with my whole body during sleepless nights.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So this post isn&apos;t a summary of Bill Walsh&apos;s principles. It&apos;s a record of the places I&apos;m still failing.&lt;/strong&gt; It&apos;s closer to a notebook of the failures his book held up like a mirror.&lt;/p&gt;
&lt;p&gt;Bill Walsh (1931–2007) is a football legend, and the protagonist of the cliché sports drama (a coach takes over a hopeless team, builds it into a champion, and keeps it there). He was the man who turned the dismal 49ers of the early &apos;80s into a dynasty, and one of the great leaders of that era. Three Super Bowl wins in &apos;84, &apos;88, &apos;89, and famous for being the first to bring the &apos;West Coast Offense (WCO)&apos; to a team. As an NFL outsider, what I read is that football history splits into before and after WCO. (I have never properly watched a football game. You really don&apos;t need to know the rules to read this book.)&lt;/p&gt;
&lt;p&gt;I don&apos;t know NFL well, but Walsh&apos;s leadership book is famous enough that I&apos;d kept it on my shelf for a long time, telling myself I&apos;d get to it. With no team members I have to do 1:1s with anymore, this felt like the right moment to look back at my own failures through it. &lt;strong&gt;Maybe the next time the chance comes around, I&apos;ll be a little better.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What makes this book really good is the gap between expectation and reality. You&apos;d assume an all-time-great American football coach wrote a book of his triumphs, war stories, and the leadership rules they produced. But the title (&lt;em&gt;The Score Takes Care of Itself&lt;/em&gt;) names the leadership principle Walsh truly chased, and also, in the end, the principle he himself failed to keep. &lt;strong&gt;The kick of this book is in the second half.&lt;/strong&gt; In the first half you underline his leadership principles one by one. In the second half the book changes character entirely. I&apos;ll get into how it changes in the last section of the body.&lt;/p&gt;
&lt;p&gt;He&apos;s a leader from a different era, a different country, a different field, and his success isn&apos;t comparable to anything I&apos;ve done. But the fatigue, loneliness, exhaustion, and the open record of his mistakes and failures behind that success made the principles in the first half land harder than they would have otherwise. So this review ended up as the record of one person who keeps tripping over those principles, not as a tidy summary of them.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The score takes care of itself? Winning is still the metric&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The Score Takes Care of Itself.&lt;/em&gt; When I first saw the title I was on guard. About three months ago I&apos;d written a post called &quot;Organizations that don&apos;t win have no future.&quot; I quoted &quot;Winning solves everything,&quot; took it as my north star, and wrote pretty firmly that a leader who can&apos;t define winning for the organization eventually collapses. Then here was Bill Walsh standing in what looked like the opposite spot. &lt;strong&gt;Don&apos;t chase wins. The score takes care of itself.&lt;/strong&gt; Coming from the legendary coach who lifted three Lombardi trophies, the odds my view was wrong felt much higher.&lt;/p&gt;
&lt;p&gt;To get straight to the conclusion, no, I wasn&apos;t wrong. Walsh and I were looking at the same point from opposite sides. That came into focus near the last page.&lt;/p&gt;
&lt;p&gt;In the chapter &quot;The Prime Directive Was Not Victory,&quot; Walsh says it like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;What it was, instead, was a comprehensive standard and plan for installing a level of proficiency — competency — at which our production level would become higher in all areas, both on and the field, than that of our opponent. Beyond that, I believed the score would take care of itself.&quot;&lt;/p&gt;
&lt;p&gt;— &quot;The Prime Directive Was Not Victory&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And in the same chapter he gets a little more honest:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I directed our focus less to the prize of victory than to the process of improving — obsessing, perhaps, about the quality of our execution and the content of our thinking; that is, our actions and attitude. I knew if I did that, winning would take care of itself, and when it didn&apos;t I would seek ways to raise our Standard of Performance. At least that was my plan.&quot;&lt;/p&gt;
&lt;p&gt;— same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What stopped me was that last line: &quot;At least that was my plan.&quot; Walsh did not put winning aside. He chased winning by &lt;strong&gt;not openly chasing it&lt;/strong&gt;. He obsessed over standards and process, and when that obsession wasn&apos;t working, he says he&apos;d find a way to &lt;strong&gt;raise the Standard of Performance&lt;/strong&gt;. In other words, his process was still being graded by win-or-lose feedback.&lt;/p&gt;
&lt;p&gt;So here&apos;s how I sorted it: &lt;strong&gt;Putting winning first does not mean ignoring process.&lt;/strong&gt; It&apos;s the opposite. The principles inside your process have to be evaluable as &apos;winning.&apos; A standard with no evaluation is a hobby. A process with no evaluation is self-comfort. Walsh could obsess over proficiency the way he did because the football world stamps a clear number on a scoreboard every Sunday. With wins and losses arriving every week, he couldn&apos;t escape winning even &lt;strong&gt;without naming it out loud&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Business doesn&apos;t work like that.&lt;/p&gt;
&lt;p&gt;Aligning a whole business team around &apos;winning&apos; is, honestly, a much harder job than football. We don&apos;t get a scoreboard every week. Our &apos;win&apos; might be a quarterly metric, a product metric, or a strategy that won&apos;t be judged for three years. So if you let people focus only on process, no one ends up asking whether that process points anywhere. Each person works hard, but the directions diverge. (That was the &quot;organization that hasn&apos;t defined winning&quot; I wrote about three months ago.)&lt;/p&gt;
&lt;p&gt;Which means in a business org, having &apos;winning&apos; get evaluated still matters. Even when you obsess over process the way Walsh did, &lt;strong&gt;the leader has to take responsibility for aligning&lt;/strong&gt; what that process points toward. Saying &quot;the score will take care of itself&quot; inside an org where that alignment doesn&apos;t exist looks, to me, like dodging the responsibility.&lt;/p&gt;
&lt;p&gt;I think Walsh&apos;s line should be read this way: &lt;strong&gt;Don&apos;t give up the daily standards that point toward winning, not give up winning itself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the chapter &quot;How I Avoid Becoming a Victim of Myself,&quot; he repeats the same idea from another angle.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The key to performing under pressure at the highest level, regardless of circumstance, is preparation in the context of your standards of performance and a thorough organizational embrace of the actions and attitudes contained in your leadership philosophy.&quot;&lt;/p&gt;
&lt;p&gt;— &quot;How I Avoid Becoming a Victim of Myself&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was at &quot;&lt;strong&gt;An organization that can&apos;t even define winning falls apart.&lt;/strong&gt;&quot; Walsh, on top of his already-defined winning, was showing in his book how to live each day. When he wrote about &quot;standards of behavior&quot; and &quot;organizational embrace,&quot; I lost count of the times I&apos;d failed to embed those standards in the orgs I&apos;d led.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Good talent, bad attitude: I should have cut sooner&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;A person with good talent walks in carrying an attitude that doesn&apos;t match the team&apos;s standard.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Walsh tosses the line into a parenthetical.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Whatever your specific job description, it is essential to our team that you do it at the highest possible level in all of its various aspects, both mental and physical (i.e., good talent + bad attitude = bad talent).&quot; — &quot;Standard of Performance&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The parenthetical was louder. It&apos;s one of the lines that made me put the book down for a long time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Honestly, I learned this much later than Walsh did.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I worked with several people who kept building real depth in their craft but were terrible at collaboration and communication. There was a stretch when I got swept up in their talent and convinced myself their role still mattered. &lt;em&gt;If this person leaves, this part collapses. There&apos;s no immediate replacement. People might change with time.&lt;/em&gt; I kept feeding myself those excuses. I let the standard blur, I shrugged my shoulders, I went around explaining to the rest of the team that &quot;that&apos;s just how they are.&quot;&lt;/p&gt;
&lt;p&gt;Now I&apos;m sure. If a person doesn&apos;t carry the kind of attitude that lines up on the same side as the team&apos;s standard, the right move is to cut them as soon as possible.&lt;/p&gt;
&lt;p&gt;Walsh is brutal on this point.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Individuals who fell short of the standard in various ways were usually quietly removed, and those who challenged my authority did so at their own peril.&quot; — &quot;The Prime Directive Was Not Victory&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;Quietly removed.&quot; No drama, no slamming the door, no public showdown. Just quietly, but firmly, out. The view from someone next to Bill makes it sharper.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Bill was smart enough and willful enough that even a talented person who contributed to a negative organizational culture — who wasn&apos;t a team player — would be let go.&quot; — &quot;Problem Solver&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Letting go wasn&apos;t itself the choice. The choice was &lt;strong&gt;not keeping them around for the sake of talent&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The most striking line was elsewhere. In &quot;Seek Character. Beware Characters,&quot; Bill turns the lens on himself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I tolerated this longer than I should have because of his talent. But his play, in that state, was a long way short of what it could have been if his head had been in the right place.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even Bill did this. The man with four Super Bowl rings and a Hall of Fame jacket carried someone &quot;longer than he should have&quot; because of talent. And he wrote it down as regret. In one line. I read that sentence over and over. I, too, carried things I shouldn&apos;t have because of talent, and the team paid the price for it.&lt;/p&gt;
&lt;p&gt;He hammers the point one more time in &quot;Big Ego.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The damage that the arrogant egotist inflicts on an organization is always greater than the benefits he provides.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Always.&lt;/strong&gt; Coming from a writer who doesn&apos;t reach for that word easily, the sentence sits heavier. Not &apos;sometimes the harm wins.&apos; Not &apos;on rare occasions the benefit loses.&apos; Always the harm wins.&lt;/p&gt;
&lt;p&gt;What I&apos;d actually been trapped by wasn&apos;t the talent. It was the fear of losing the talent. The anxiety of &quot;this person can&apos;t leave&quot; kept eroding my standards. The cost of that erosion fell on the rest of the team. While the talented-but-toxic person stays, the team&apos;s &quot;attitude standard&quot; is set by them. The people with the right attitude start to wonder if they&apos;re being too rigid. That&apos;s the scene I saw too late.&lt;/p&gt;
&lt;p&gt;Cut sooner. That&apos;s where I land now.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Teaching is the definition of leadership, and I have no patience&lt;/h2&gt;
&lt;p&gt;In one of the most central spots in the book, Walsh nails it down.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Leadership, at its best, is exactly that: teaching skills, attitudes, and goals (yes, goals are taught and defined) to individuals who are part of your organization. Most of life — running a family, educating a child, running a company or sales team, coaching an athlete — requires good teaching.&quot; — &quot;Teaching Defines Your Leadership&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not a leadership &lt;strong&gt;technique&lt;/strong&gt;. The &lt;strong&gt;definition&lt;/strong&gt; of leadership is teaching. Not strategy, not vision-setting, not decision-making. Teaching.&lt;/p&gt;
&lt;p&gt;He calls teaching the team&apos;s top priority.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;A Super Bowl championship (or attainment of the number-one ranking in the marketplace, hitting a meaningful quarterly production goal, or signing a big contract) occurs because the entire team not only does its individual jobs, but also recognizes that those jobs contribute to the overall success.&quot; — &quot;The Top Priority Is Teaching&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;And this organizational recognition that &apos;success belongs to everybody&apos; is what the leader teaches.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Failure also belongs to everyone. If you or someone on your team &apos;drops the ball,&apos; everyone is responsible.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He sums up his life like this near the end.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Looking back, the lesson I would draw out is this: if you don&apos;t love it, don&apos;t do it. I loved it. Teaching others how to dig deep so they could realize their full potential, how to be great.&quot; — &quot;The Thrill of Teaching&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Don&apos;t do it if you don&apos;t love it.&lt;/p&gt;
&lt;p&gt;For a long time I believed I &lt;strong&gt;loved&lt;/strong&gt; teaching. When juniors or new hires joined the team, I organized study groups to pull them along, taught the material myself when I had to. I think I put real effort into onboarding, code reviews, 1:1s. I always wanted to be a good coach, a good teacher.&lt;/p&gt;
&lt;p&gt;The problem was &lt;strong&gt;speed&lt;/strong&gt;. Each person needed a different amount of time before what I taught showed up in their work, and I didn&apos;t tolerate the gap well enough. When the same problem turned up in the second review after I&apos;d already explained it, my temper rose. By the third round my tone showed it. By the fourth I escaped into &quot;it&apos;s faster if I just do it myself.&quot;&lt;/p&gt;
&lt;p&gt;I wanted to be a good teacher, but I was less of one than I thought. Loving teaching and putting enough patience into teaching are completely different things. I couldn&apos;t tell those two apart for a long time.&lt;/p&gt;
&lt;p&gt;But the deeper sting wasn&apos;t on the junior side. The second failure was with the senior people.&lt;/p&gt;
&lt;p&gt;I decided I had nothing to teach the seniors. They work independently, I should protect their autonomy, they need to be self-driven to grow. Those judgments piled on top of each other and I effectively &lt;strong&gt;abandoned&lt;/strong&gt; them. For a long time I called that &lt;strong&gt;autonomy&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Teaching didn&apos;t have to stay in the technical lane. Direction of work, organizational principles, decision criteria, communication posture: all of these were within reach for seniors too. If anything, the more senior they were, the more I should have shown up. I papered over it with &quot;they&apos;ll figure it out.&quot;&lt;/p&gt;
&lt;p&gt;In some ways that was fine. They built a lot on their own. But the moment I realized &lt;strong&gt;decisions that shouldn&apos;t have been made without me had already been made&lt;/strong&gt;, and that I&apos;d shrunk my own ground from inside, it was already too late. Abandonment wasn&apos;t autonomy. It was just me dodging the work of teaching.&lt;/p&gt;
&lt;p&gt;Walsh writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Whether it&apos;s a 350-pound tackle, an employee, or a child, we must do all we can to encourage, support, and inspire. But ultimately — finally — people must do it for themselves.&quot; — &quot;The Bubba Diet (Willpower Cannot Be Transplanted)&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The line looks like it lets me off the hook, but it does the opposite. Walsh says &quot;willpower cannot be transplanted&quot; only &lt;strong&gt;after&lt;/strong&gt; establishing that you must do everything you can to encourage, support, and inspire. The &quot;ultimately, themselves&quot; part only kicks in after you&apos;ve done that everything. I skipped the prerequisite and pulled the conclusion forward. As an alibi.&lt;/p&gt;
&lt;p&gt;He hammers it once more.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Teaching and training others how to do their jobs.&quot; — &quot;Unleash Mentors&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That, he says, is what a leader should ask of mentors. Which means the starting point has to be the leader being a teacher first.&lt;/p&gt;
&lt;p&gt;What about me now?&lt;/p&gt;
&lt;p&gt;In mentoring with George, in collaborating with Ellie, my patience is still short. The thoughts and ideas in my head are already several steps ahead, and I see myself getting frustrated when the other person can&apos;t keep pace. After explaining once I want to wave it off with &quot;okay, done.&quot; When the person asks again, I can hear my tone get a little sharp.&lt;/p&gt;
&lt;p&gt;Maybe it&apos;s because I&apos;m building product hands-on again. The person whose hands are moving has a fast head, and a fast head finds it easy to ignore the pace of the person next to them. But that&apos;s a reason. It can&apos;t be an excuse.&lt;/p&gt;
&lt;p&gt;I see places where I&apos;ve actually regressed compared to when I was managing as a full-time leader.&lt;/p&gt;
&lt;p&gt;I thought stepping out of the leader role would make me a better person, but in some ways the opposite happened. There was a coat of patience that the manager position forced onto my shoulders. Once I took it off, what got exposed is that I&apos;m not as decent without it as I&apos;d hoped.&lt;/p&gt;
&lt;p&gt;So lately I think about it this way. Before blaming the other person, I have to think about how I can deliver it better, sharpen it. Teaching isn&apos;t completed when the other person receives it. It&apos;s mine &lt;strong&gt;until I&apos;ve delivered it well enough&lt;/strong&gt;. I&apos;m only now starting to grasp that.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The inner voice: what my black comedy planted&lt;/h2&gt;
&lt;p&gt;The most &lt;strong&gt;chilling&lt;/strong&gt; line I&apos;ve ever read in a leadership book is this one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The genuine inspiration, expertise, and execution that employees bring to the actual work is more often a result of what an inner voice is saying than what an outer voice shouts. Not the leader&apos;s pep talk.
What that inner voice says, leader, you decide. The leader, at least the good leader, teaches the team how to talk to itself. The effective leader has a deep impact on what that inner voice is going to say.&quot; — &quot;The Inner Voice vs. the Outer Voice&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not the pep talk. The &lt;strong&gt;inner voice&lt;/strong&gt;. Not what gets shouted from the outside, but what your teammate says to themselves when they&apos;re sitting alone. That&apos;s what the leader plants. On the prior page he wrote this too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Leadership is expertise. It is not rhetoric, it is not pep talks. People follow those who have credibility and expertise — knowledge of the job — and who demonstrate an understanding of human nature.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And on how he handled his own language:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;When I criticized someone or gave feedback, I didn&apos;t take a defeatist tone. I kept the focus on the moment, and didn&apos;t drag in days or weeks of bad play to construct an image.&quot; — &quot;The Leverage of Language&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even when criticizing, he didn&apos;t pull the past forward. He stayed in the present. Walsh knew his words rode on his teammates&apos; shoulders for days, weeks. He kindly wrote down the reason on the next page.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;If you&apos;re seen as a constantly negative person who only ever points and criticizes, the people around you will simply tune you out. Your ability to teach, influence, and drive improvement shrinks until it disappears.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I couldn&apos;t lift my head reading this part.&lt;/p&gt;
&lt;p&gt;In the early days, when our team collaborated with other teams, I&apos;d publicly criticize the other team&apos;s not-particularly-startup-shaped responses and sloppy communication. When leadership made a decision I didn&apos;t agree with or didn&apos;t understand, I&apos;d openly bash it in front of my team. I hoped it&apos;d read as humor and as solidarity with the team, but that wasn&apos;t always the case in the end. The moment I noticed my own tone reflected back in my teammates&apos; behavior, I tried to stop, but it was a little late.&lt;/p&gt;
&lt;p&gt;Especially since my (self-proclaimed) black comedy was rooted in something hopeful: staring straight at the brutally frustrating reality and still believing we could do something inside it. That intent didn&apos;t really land. (Maybe what didn&apos;t land is the perfect black comedy(?).)&lt;/p&gt;
&lt;p&gt;To be honest, I do think there was real &lt;strong&gt;conviction&lt;/strong&gt; somewhere inside me at the time. The hope that we could build a better organization, that even on top of this obvious reality we could try something different. But what came out of my mouth wasn&apos;t shaped like conviction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I&apos;d actually been releasing wasn&apos;t conviction. It was cynicism. That hit me bone-deep.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And cynicism is a far more contagious language than hope. By the time I tried to stop saying and doing those things, the words had already taken root in my teammates&apos; mouths, in our Slack, in our meeting rooms. What was left in the space I tried to clear wasn&apos;t my intent. It was my tone. Walsh&apos;s line about the leader&apos;s words becoming the team&apos;s inner voice landed exactly here, and it hurt.&lt;/p&gt;
&lt;p&gt;There&apos;s another memory layered on top of this. A story about the bottom 20 percent.&lt;/p&gt;
&lt;p&gt;There was a chronic complainer (a real pro at it) on a team with a long history, and I never pushed back hard enough to stop the behavior. By the time I sat down for a 1:1 to try to win them over, it was already too late. That&apos;s when it hit me. Especially when you&apos;re higher up, you become the one who has to convince people, so you start looking for the positive over the negative, and at some point you&apos;ve already started thinking that way yourself. But the more you hesitate to listen to what people are actually saying, the more that gap (my optimism vs. their pessimism) widens, until you reach a point of no return.&lt;/p&gt;
&lt;p&gt;Walsh names the mechanism precisely.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;For reasons I never fully figured out, the complaints of the bottom 20 percent often overpower the positive enthusiasm of the other 80 percent. I always assumed it should be the opposite, but it&apos;s not. The whiners seem to wield disproportionate influence.&quot; — &quot;The Bottom 20 Percent May Determine Your Success&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I avoided that person&apos;s face back then. I knew how heavy the air got in meetings when they spoke, and I told myself &quot;it&apos;s just that one person, the rest are fine.&quot; I was scared that if I started taking in the negative signal, my own optimism would shake. While I postponed it, their cynicism was quietly becoming the team&apos;s shared language. Walsh wrote this too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;A leader who ignores this part of the organization — the &apos;bottom 20 percent&apos; that holds special or supporting roles — is asking for trouble. When these people start feeling redundant, their grievances can spread through the whole organization like cancer through the body.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Spreads like cancer.&lt;/strong&gt; Reading the analogy, I saw the scene of my own public criticism a moment earlier and the face of that complainer overlap onto the same picture. The cynicism I sprayed from above and the cynicism I left untouched from below were running through the same vein.&lt;/p&gt;
&lt;p&gt;A leader&apos;s language doesn&apos;t move in one direction. It falls from the top down and becomes the inner voice, and if you don&apos;t face the discontent rising from the bottom in time, it spreads back up in the same color. Sitting between those two flows are the &lt;strong&gt;few weeks or months you hesitated to listen&lt;/strong&gt;. The gap widens by the exact amount of time you avoided listening, and the organization quietly buckles.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Upward leadership: why Bill spent a chapter on the owner&lt;/h2&gt;
&lt;p&gt;Open most leadership books and they&apos;re about &lt;strong&gt;leadership pointing downward&lt;/strong&gt;. How to lead the team, how to teach them, how to motivate them. It fills entire bookstore aisles.&lt;/p&gt;
&lt;p&gt;But &lt;strong&gt;upward leadership&lt;/strong&gt; is something I&apos;ve never properly learned anywhere. Bosses, boards, investors, owners. No one explains how to handle the people sitting above your head. As an individual contributor it&apos;s relatively simple, since there&apos;s only one boss. The moment you become a middle manager, that relationship becomes half of your job. A half that&apos;s sometimes heavier than performance.&lt;/p&gt;
&lt;p&gt;So I was a bit surprised when I got to the chapter where Walsh devotes a section to owner Edward J. DeBartolo Jr. A legendary coach, in a post-retirement memoir, pours out criticism of the man who gave him his shot, to a degree that makes you wonder if he&apos;s allowed to say all this.&lt;/p&gt;
&lt;p&gt;What&apos;s even more striking is that at the end of the long stretch of criticism, Walsh comes back around and reminds you of &lt;strong&gt;the gratitude for the chance Eddie gave him&lt;/strong&gt;. The same Eddie who handed Walsh the leadership stage was also the cause of that leadership slowly breaking down. One person built and chipped at Walsh&apos;s career. He puts that duality right in the middle of the book, no covering up.&lt;/p&gt;
&lt;p&gt;Walsh recalls his earliest days as head coach in the chapter &quot;Autonomy and Authority.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Equally important, he made it clear to everybody in the organization that I was the boss, and he wasn&apos;t going to undercut my authority. Without this authority and support my task would have been virtually impossible, given how dire the situation was.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Authority and support. Without those two words, the work of a middle manager is &quot;virtually impossible,&quot; he says flatly. As you move toward the back of the book, you see what happens when that authority and support are slowly pulled back, and that&apos;s exactly what the chapter on Eddie is.&lt;/p&gt;
&lt;p&gt;The title Walsh gives this situation is bleakly fitting: &lt;strong&gt;Ride It Out Until Help Comes; Hold On to Your Boss.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;You have to keep the people above you, who want immediate results, from acting rashly, while at the same time working with the people below so they don&apos;t quit or rebel.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The whole life of a middle manager fits in that one sentence. The top is impatient, the bottom is exhausted. You stand in the middle and have to &lt;strong&gt;hold both sides&lt;/strong&gt; at the same time. Let go for a moment and one side falls.&lt;/p&gt;
&lt;p&gt;His prescription is oddly tactical.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I wanted the owner (and his advisors) to understand that I was making the maximum effort and paying attention to every small detail of the family&apos;s huge financial investment.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;He was a really great boss to work with in the early years when I was head coach and general manager. To some extent that was, I think, because my constant effort to keep him fully in the loop gave him a sense of relief.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And the famous line.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Read or unread, dump documented information on your boss — projections, evaluations, progress reports, status updates. Then request regular meetings. Make it clear, in a very professional way, that the boss should understand you&apos;re doing everything you can and that it&apos;s all documented — in fact it&apos;s right there in the thick folder in their hand.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The advice from a coach who lifted three Lombardis turns out to be the practical tip of &lt;strong&gt;flooding your boss with information so they feel relieved&lt;/strong&gt;. Read or unread, doesn&apos;t matter. The sense of a thick folder in hand calms the upward axis. At first it was practical to the point of being funny. By the end I couldn&apos;t laugh. That sentence is closer to a survival manual pulled from the most exhausting season Walsh lived through.&lt;/p&gt;
&lt;p&gt;He adds one more line. &lt;strong&gt;Keep your eye on the ball.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;While placating the people who can determine your fate during a losing stretch or a turnaround — bosses, boards, shareholders — you must, at the same time, stay absolutely focused on what really matters.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Soothe the top. At the same time, stay absolutely focused on what really matters. Two commands sit calmly inside one sentence. Walsh says it&apos;s possible, but he also seems to know how cruel the demand is. A whole chapter is the record of that cruelty.&lt;/p&gt;
&lt;p&gt;I overlaid the companies I&apos;ve passed through onto the relationship between Walsh and the owner. The personalities differed, but the structure was similar. Upward leadership is at least as important as downward leadership, if not more. I&apos;ve felt that to the bone, more than anything else. And ironically, the people who opened the door to my leadership and the people who became the reason that leadership broke were, in some sense, sitting in the same spot.&lt;/p&gt;
&lt;p&gt;I can&apos;t put my specific experiences here. I don&apos;t think I should. But I&apos;d guess that almost everyone working as a middle manager is wrestling with some version of the same dilemma somewhere. Absorbing the impatience of the top, absorbing the fatigue of the bottom, while their own exhaustion stays invisible to anyone.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Did I crash through, or did I give up?&lt;/h2&gt;
&lt;p&gt;In the second half of the book Walsh leaves this line.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Looking back, I came to the conclusion that there are times you have to stand up for yourself even if the result is that you get fired. As proven by the fact that I didn&apos;t do it myself, easier said than done.&quot; — &quot;Zero Points for Winning&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is Bill Walsh. The man who lifted three Super Bowls. Even Bill confesses, &quot;I did not stand up for myself.&quot;&lt;/p&gt;
&lt;p&gt;He also wrote this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Everyone has opinions. Leaders are paid to make decisions. The difference between offering an opinion and making a decision is the difference between working for a leader and being one.&quot; — &quot;The Common Denominator of Leadership: Force of Will&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;If I was going to come apart, I wanted to come apart for the right reasons. (…) The hardest thing — the unforgivable thing — is failing to admit your way was the wrong way and failing even when changing course is the only path to victory.&quot; — &quot;Be Wrong for the Right Reason&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Place these two next to each other and the chill sets in. &lt;strong&gt;Decisions, not opinions. If you fall, fall for the right reason.&lt;/strong&gt; Did I actually live that way?&lt;/p&gt;
&lt;p&gt;To be honest, no.&lt;/p&gt;
&lt;p&gt;I genuinely believed certain approaches weren&apos;t the way to win, but in moments where I didn&apos;t want to take responsibility (or didn&apos;t even want to be the one accountable) I always compromised. I had opinions, I could even see the answer, and I stepped back because I didn&apos;t want to sit in the chair of decision. That wasn&apos;t yielding. That was running.&lt;/p&gt;
&lt;p&gt;I don&apos;t want the cheap comfort of &quot;well, that&apos;s office life.&quot; Because it&apos;s a lie. Those compromises eventually become wounds you carry. Those scenes don&apos;t get erased; they pile up quietly and one day come back as the question, &quot;Was I really a leader then?&quot;&lt;/p&gt;
&lt;p&gt;In the same room where Bill Walsh confesses that even he couldn&apos;t stand up for himself, the only thing I can do is throw the same question back at myself, not make excuses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Did I really push back with everything I had? Or did I just give up?&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Everything has its cost&lt;/h2&gt;
&lt;p&gt;In the first half I kept underlining Walsh&apos;s principles. Standards, teaching, attitude, the inner voice, upward leadership. There was so much to learn that at some point I started wondering, &quot;How did this one man have all of it?&quot; Then in the second half the underlines changed character. I wasn&apos;t stopping at his moments of victory anymore. I was stopping at his moments of collapse.&lt;/p&gt;
&lt;p&gt;Walsh warns first.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The reason consecutive champions are rare at the top of competition is that a certain measure of success brings with it a kind of disorientation we&apos;re not prepared for.&quot; — &quot;Winning Is Harder to Handle Than Losing&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And one chapter later he adds:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;When things are going best is when you have the chance to be your strongest, most demanding, and most effective as a leader. A strong wind is at your back, but to keep that wind from knocking you over, you have to understand the dangers winning brings.&quot; — &quot;Why Repeat Championships Are Hard&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The dangers winning brings. That phrase stuck with me. We usually only think about the dangers of failure, but Walsh flips it. The truly dangerous time is when things are going well. And this warning isn&apos;t just strategic advice. It was something he was saying to himself, which becomes more obvious as you read on.&lt;/p&gt;
&lt;p&gt;There&apos;s a chapter where he opens up his interior. The title is &quot;The Perfection of the Puzzle.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I didn&apos;t want to lose by 40 points. I&apos;d prefer losing by 39. When we won by 20, I&apos;d wake up in the middle of the night thinking hard about how we could have scored 21.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A man who, on a night the team won by 20, wakes up to think about how they could have scored 21. That&apos;s Bill Walsh. Even in a victory, replaying through the night the reason they didn&apos;t score one more point.&lt;/p&gt;
&lt;p&gt;He keeps writing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Did I miscalculate or ignore information I could have seen there? Why and where did our execution break down? Of our decisions, of my decisions, which were wrong or completely off? Endlessly, endlessly, endlessly. What I was pursuing, I think, was perfection.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Endlessly, endlessly, endlessly. You can see how he lived in the way he repeats that word three times. And he diagnoses the root of his own perfectionism.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;All of this was less about scoring more points or losing by fewer than it was about how I had come to perceive the entire process of leadership and the effort to succeed. To me, it was a puzzle to solve, pieces to find and place, solutions to work out.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The engine of his greatness was also his blade. He knew it best himself.&lt;/p&gt;
&lt;p&gt;And then the heaviest chapter in the book arrives. &quot;Zero Points for Winning.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I gave myself zero points for winning.&lt;/p&gt;
&lt;p&gt;Winning was nothing more than postponing the pain of losing. I&apos;d quickly turn my attention to the next game, and the next, and each one offered nothing but a chance to push back the dread that comes with losing — without ever removing the dread itself.&lt;/p&gt;
&lt;p&gt;When this happens, any defeat or mistake or setback becomes deeply unsettling, even destructive — because you&apos;ve attached your self-image to the outcome of competition. Winning becomes harmful for the same reason. You&apos;re letting winning start to define your sense of worth, your feelings about yourself.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I closed the book for a moment in front of this passage.&lt;/p&gt;
&lt;p&gt;A man who lifted three Lombardi trophies confesses he gave himself zero points for winning. Those trophies weren&apos;t joy; they were painkillers that briefly delayed the dread of the next loss. And after the confession, one line: &quot;Because you&apos;ve attached your self-image to the outcome of competition.&quot;&lt;/p&gt;
&lt;p&gt;I&apos;d done that too. There was a time I dragged outcomes into my self-worth. When metrics went up I felt like a decent person; when they cracked I felt worthless. I didn&apos;t know back then that, lived that way, even winning is harmful.&lt;/p&gt;
&lt;p&gt;Walsh also wrote about how the bill comes due.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The volatility of the environment and the emotional drain can completely deplete you, and you live with it constantly. It can leave you very vulnerable, very weak.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And he leaves himself a warning.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Avoid the destructive temptation of equating your team&apos;s win-loss record with your own self-worth.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You only feel the weight of this line after the confessions before it. This isn&apos;t theory. It&apos;s the last warning Walsh leaves himself, and the people walking the same road he walked.&lt;/p&gt;
&lt;p&gt;He looks honestly at where his perfectionism began.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;In the early days I was the same. I firmly believed that if I did my job well, the score would take care of itself. When it didn&apos;t, I worked harder to improve coaching and raise the team&apos;s standard of performance. This was one of the reasons I drove myself so relentlessly.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even his philosophy of &quot;the score takes care of itself,&quot; flipped over, was the engine that drove him relentlessly into himself. At this point I accepted that this book is less a leadership textbook than one person&apos;s confession.&lt;/p&gt;
&lt;p&gt;The book&apos;s final chapter is written by his son, Craig Walsh. A chapter about his father. The title is &quot;THE WALSH WAY: A Complex Man. A Simple Goal.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;He was a perfectionist, and perfection, he believed, was only achievable when his ideas and decisions were fully realized — not filtered through other people, who, in his view, would inevitably misunderstand and misapply them. He had to be the one in charge.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A son&apos;s view of his father. Not warm, not cold, just as is. The son sums up in the shortest sentence why the great father couldn&apos;t let himself go to the very end.&lt;/p&gt;
&lt;p&gt;And the book&apos;s final paragraph.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;My father is gone, but the leadership lessons he earned through blood and sweat remain. Maybe more meaningful now than they&apos;ve ever been. I know he would want something he shared in this book to be of value to you in your own challenges as a leader. That would mean he could once again do the thing he loved and did so well. Teaching others how to be as great as they can possibly be.&quot; — last paragraph of the same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I sat with the book closed for a while at this last paragraph.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It felt like watching one human&apos;s great and intensely personal history.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A book that started as a leadership book and ended as a life. A man who woke at midnight to think about scoring one more point on a puzzle he was solving. A man who gave himself zero points for winning. A man who, never having reconciled with himself, wrote it all down in a book and left. His son closes the book by carrying his lessons in the last chapter.&lt;/p&gt;
&lt;p&gt;There was relief. Even a man whose success I can&apos;t compare myself to was like this. The huge shadow and the huge cost made my small failures feel a little less alone. So you went through that too, I thought.&lt;/p&gt;
&lt;p&gt;There&apos;s also a cool warning in it. Considering the cost Walsh paid, what would I get from walking the same road, having not even brushed against his level of greatness? As long as I tie my self-worth to outcomes, winning chews me up and losing breaks me down. There are no exceptions. If even Bill Walsh wasn&apos;t an exception, I sure won&apos;t be.&lt;/p&gt;
&lt;p&gt;So Bill restates the message he always pointed toward, even though he himself never fully reached it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;The score takes care of itself.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing: beyond leadership, toward being a slightly better person&lt;/h2&gt;
&lt;p&gt;A few days passed after I closed the book.&lt;/p&gt;
&lt;p&gt;The first thought was the same one I&apos;d written in the opening. &quot;Maybe the next time the chance comes, I&apos;ll be a little better.&quot; Next time, I&apos;ll put Walsh&apos;s underlines to better use. That kind of expectation.&lt;/p&gt;
&lt;p&gt;But as I sat with this review and pulled myself apart section by section, that sentence started to feel a little suspicious.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next time. Is that really what matters?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I was imagining a &quot;next leadership opportunity&quot; and quietly suspending the version of me that exists right now. Next time I&apos;ll do it properly. Next time I&apos;ll be the patient mentor. Next time I&apos;ll be a leader aligned both upward and downward. The vagueness of that &quot;next&quot; was building an alibi for today&apos;s laziness.&lt;/p&gt;
&lt;p&gt;And the place I stopped longest in Walsh&apos;s book wasn&apos;t the strategy or the principles. It was this passage from &quot;Quick Results Come Slowly.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I believe this is true in your work as well. The effort at the start is part of a continuous effort, and your standard of performance is part of a continuous standard. Today&apos;s effort becomes tomorrow&apos;s result. The quality of that effort becomes the quality of the work. One day connects to the next, and the months connect to the years that follow.&quot;&lt;/p&gt;
&lt;p&gt;— &quot;Quick Results Come Slowly: The Score Takes Care of Itself&quot; chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;One day connects to the next.&lt;/strong&gt; A separate &quot;next chance&quot; doesn&apos;t arrive. How I speak today, how I listen, how patient I am, how I push back: that exact thing rides forward into tomorrow. On the same page Walsh closes with this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Your own standard of performance becomes who and what you are. You and your organization achieve greatness.&quot; — same chapter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This sentence shook me most on this read. &quot;Your own standard of performance becomes who and what you are.&quot; It&apos;s the last line of a leadership book, but once you&apos;ve read it, it doesn&apos;t only sound like a leadership line. It reads as: the standard I allow myself today becomes who I am.&lt;/p&gt;
&lt;p&gt;So what I have to fix isn&apos;t &quot;the next-chance me.&quot; It&apos;s the me right now.&lt;/p&gt;
&lt;p&gt;Beyond leadership, in a single line of feedback I trade with Ellie while building product, in mentoring sessions with George, in the brief conversation with someone I happen to run into at a café, the small refusal to stop becoming a slightly better person. Not the grand restoration of leadership, but that level of diligence.&lt;/p&gt;
&lt;p&gt;Honestly, this is something I&apos;ve already written about. Tucked away in a corner of the blog I once wrote a piece called &quot;&lt;a href=&quot;/posts/2024-02-be-curious/&quot;&gt;Be curious, not judgmental&lt;/a&gt;.&quot; It was a note to myself: don&apos;t judge people quickly, hold curiosity first and look once more. I&apos;d long forgotten that note. The recent me has been judging first quite a bit. Getting frustrated. Reaching the conclusion before anyone else.&lt;/p&gt;
&lt;p&gt;I think I need to take it up again. With more room, &lt;strong&gt;kind but rigorous&lt;/strong&gt;, a life that keeps reaching for a little better. When Walsh writes elsewhere that &quot;You Must Have a Hard Edge,&quot; he doesn&apos;t mean coldness. Kindness and rigor aren&apos;t opposites. I was simply short on both.&lt;/p&gt;
&lt;p&gt;If I can become that person, the score will probably take care of itself.&lt;/p&gt;
&lt;p&gt;Walsh&apos;s original line was about teams and organizations. As I closed the book I decided to take it home in a single-person size. &lt;strong&gt;If today&apos;s standards decide who I am, tomorrow&apos;s score will follow on its own, even when I&apos;m not watching.&lt;/strong&gt; At least, that&apos;s what I want to try believing.&lt;/p&gt;
</content:encoded><category>reading</category><category>essay</category><category>leadership</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>The Moment You Spin Up an AX Team, You&apos;ve Already Lost</title><link>https://flowkater.io/en/posts/2026-04-08-ax-team-paradox/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-04-08-ax-team-paradox/</guid><description>The paradox of setting up an AX task force. MIT NANDA found the successful 5% weren&apos;t led by central AI labs but by line managers on the ground. What I learned from going from consultant to CTO. The first principle of organizational AX isn&apos;t tools — it&apos;s people and the organization.</description><pubDate>Wed, 08 Apr 2026 13:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;The Moment You Spin Up an AX Team, You&apos;ve Already Lost&lt;/h1&gt;
&lt;h2&gt;That Uneasy Sense of Déjà Vu&lt;/h2&gt;
&lt;p&gt;The moment a company decides to &quot;do AX&quot; by spinning up a dedicated AX task force, it has already failed.&lt;/p&gt;
&lt;p&gt;That may sound harsh. But if you think about it for a second, haven&apos;t we all seen this movie before? The DX task force. The Cloud Migration Division. The Big Data Innovation Team. &quot;We&apos;ll stand up a team and roll this out company-wide.&quot; How many times have we watched this? It was never going to work.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://flowkater.io/posts/2026-03-15-ax-organization-transformation/&quot;&gt;part one&lt;/a&gt; I wrote that &quot;installing Claude Code at your company doesn&apos;t get you AX.&quot; The diagnosis was that adoption and transformation are two different things. There was plenty of response, and the question that came back kept landing in the same place.&lt;/p&gt;
&lt;p&gt;&quot;So what should we actually do?&quot;&lt;/p&gt;
&lt;p&gt;I&apos;m trying to answer that question this time.&lt;/p&gt;
&lt;p&gt;According to &lt;a href=&quot;https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo/&quot;&gt;MIT NANDA&apos;s research&lt;/a&gt;, &lt;strong&gt;95%&lt;/strong&gt; of enterprise GenAI pilots fail. Ninety-five percent. Near total wipeout. And yet the successful 5% shared a clear pattern. They weren&apos;t organizations led by a central AI lab. They were &lt;strong&gt;organizations where line managers on the ground drove adoption&lt;/strong&gt;. The ones that survived weren&apos;t the ones that built a separate AI unit. They were the ones where the existing operational teams moved on their own.&lt;/p&gt;
&lt;p&gt;If I&apos;m being honest, I&apos;ve seen this many times, and I&apos;ve built one of these myself. The task force. The transformation division. That was hypocrisy on my part. It didn&apos;t work then. It won&apos;t work now.&lt;/p&gt;
&lt;p&gt;Why doesn&apos;t it work? And what the hell are we supposed to do instead?&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;We&apos;re Supposed to Flatten Layers. We&apos;re Stacking Them.&lt;/h2&gt;
&lt;p&gt;The essence of AX is reducing layers. AI absorbs the middle of the work, shortening the distance between decision and execution. Creating an AX task force does the opposite. It adds one more layer on top of the existing ones.&lt;/p&gt;
&lt;p&gt;The most dramatic case of this paradox is &lt;a href=&quot;https://www.adsoftheworld.com/campaigns/designers-lead-ai-follows&quot;&gt;Coca-Cola&apos;s Project Fizzion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Coca-Cola, a 139-year-old consumer goods company, went all-in on an AI-driven transformation. They co-developed Project Fizzion with Adobe and simultaneously pushed hard on an AI-generated holiday ad experiment. One of the oldest brands in the world declared it would lead the AI era.&lt;/p&gt;
&lt;p&gt;What came back from the field first wasn&apos;t applause. It was pushback. The AI holiday ad drew &lt;a href=&quot;https://www.theverge.com/news/812559/coca-cola-ai-holiday-christmas-commercial-2025&quot;&gt;heavy backlash&lt;/a&gt;. CEO James Quincey stepped down, saying in his own words, &quot;someone with the energy to pursue a completely new transformation&quot; was needed. Roughly 75 positions at the Atlanta headquarters were on the chopping block in the first round of restructuring.&lt;/p&gt;
&lt;p&gt;The point here isn&apos;t that one ad failed. It&apos;s that a 139-year-old company pushed AX like a single project, and leadership plus the whole organization paid the price together.&lt;/p&gt;
&lt;p&gt;By coincidence, around the same time, &lt;a href=&quot;https://www.theregister.com/2025/08/22/commonwealth_ban_chatbot_fail_rehiring/&quot;&gt;Australia&apos;s largest bank, Commonwealth Bank&lt;/a&gt;, hit the same kind of wall. This one was more naked. They laid off 45 customer service staff on the assumption that an AI voice bot would cut call volume. In practice, call volume went up. Managers had to start taking calls. The bank publicly admitted the misjudgment and rehired all 45. They&apos;d also rolled out GitHub Copilot, got mixed results, and eventually pulled it. The union called it a full reversal. It took a month.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://defensescoop.com/2025/08/15/feinberg-cdao-realignment-shakeup-dod-ai-enterprise/&quot;&gt;The Pentagon&apos;s CDAO&lt;/a&gt; was folded into R&amp;amp;E (Research and Engineering). The AI function that had been elevated as a standalone org was pulled back inside the research-and-engineering structure.&lt;/p&gt;
&lt;p&gt;Coca-Cola, Commonwealth Bank, and the Pentagon are in different industries and sizes. What they have in common is that standalone AI units or central task forces either didn&apos;t work as hoped, or had to be redone.&lt;/p&gt;
&lt;p&gt;Funny thing: &lt;a href=&quot;https://fortune.com/2026/03/27/why-cfo-not-chief-ai-officer-secret-getting-real-value-ai/&quot;&gt;Fortune reported in March 2026&lt;/a&gt; that &lt;strong&gt;76%&lt;/strong&gt; of AI projects led by CFOs delivered &quot;great value.&quot; And yet only &lt;strong&gt;2%&lt;/strong&gt; of companies had given the CFO an AI role.&lt;/p&gt;
&lt;p&gt;Put those two numbers side by side and the paradox shows up. When the person who knows the reality of P&amp;amp;L and cost leads AI, the results land. But most organizations create a new title (CAIO) and hand it to a separate org.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bloomberg.com/news/articles/2025-11-10/intel-head-of-ai-katti-leaves-for-hardware-role-at-openai&quot;&gt;Intel&apos;s CAIO left for OpenAI after seven months.&lt;/a&gt; Seven months. His business cards hadn&apos;t even worn out yet.&lt;/p&gt;
&lt;p&gt;And this isn&apos;t just a problem inside AI orgs. It&apos;s telling that big-company CEO turnovers like &lt;a href=&quot;https://www.cnbc.com/2026/03/26/coca-cola-james-quincey-walmart-doug-mcmillon-artificial-intelligence-step-down.html&quot;&gt;Coca-Cola&apos;s James Quincey and Walmart&apos;s Doug McMillon&lt;/a&gt; are happening right as AI transformation enters its critical phase. AX isn&apos;t a project where you bring in one tool. It shakes leadership and the entire org design. &lt;strong&gt;The moment you create a separate org, the rest of the organization treats AX as someone else&apos;s problem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s the core of the AX task-force paradox. You&apos;re piling a new layer onto work that requires fewer layers, so it&apos;s structurally bound to fail.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Limits of Tool-Talk: This Isn&apos;t an Efficiency Problem. It&apos;s an Identity Problem.&lt;/h2&gt;
&lt;p&gt;A lot of today&apos;s AX discourse stops at demoing tools like Claude Code or Copilot. Here&apos;s what&apos;s possible, isn&apos;t it cool, you can do AX too. The people writing those posts include startup founders, solo developers, and consultants.&lt;/p&gt;
&lt;p&gt;I get it. They need to survive too. Tool demos look good. They get strong reactions.&lt;/p&gt;
&lt;p&gt;But corporate reality is different. It&apos;s conservative and slow. And if you, as the person in charge of AX, catch yourself asking, &quot;why aren&apos;t they using this great thing?&quot;, your AX is basically over.&lt;/p&gt;
&lt;p&gt;The problem isn&apos;t tools. It&apos;s people. More precisely, it&apos;s a question of &lt;strong&gt;how each person understands their own job&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;People treat their role as their identity.&lt;/p&gt;
&lt;p&gt;&quot;I&apos;m a product planner.&quot;&lt;/p&gt;
&lt;p&gt;&quot;I&apos;m a marketer.&quot;&lt;/p&gt;
&lt;p&gt;&quot;I&apos;m a backend engineer.&quot;&lt;/p&gt;
&lt;p&gt;What AX asks for is the dismantling of that identity. A significant chunk of my job gets taken over by AI, and I have to play a different role than before. This isn&apos;t an efficiency problem. It&apos;s an &lt;strong&gt;identity problem&lt;/strong&gt;. You don&apos;t solve that by giving someone a new tool.&lt;/p&gt;
&lt;p&gt;Take a marketer with 15 years of experience. That person has built expertise in writing weekly reports, polishing campaign copy, and summarizing results. One day they watch AI produce a week&apos;s worth of reports in three hours. What&apos;s the feeling that comes up? &quot;Cool&quot;? No. For most people, a different feeling comes first.&lt;/p&gt;
&lt;p&gt;&quot;Then what am I?&quot;&lt;/p&gt;
&lt;p&gt;Backend engineers go through something similar. When an engineer watches AI plausibly replicate patterns they&apos;ve spent years learning, they&apos;re not just looking at a productivity tool. They&apos;re re-examining the boundary of their own expertise. What moves a person at this point isn&apos;t a better demo. It&apos;s a structure that lets them sit with the anxiety and move into a new role.&lt;/p&gt;
&lt;p&gt;That&apos;s why AX is harder at the transformation step than at the adoption step. Adoption is a matter of buying a license. Transformation requires rebuilding a person&apos;s identity.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a problem for one company. Demos are everywhere, but almost no company tells its people what to do on the Monday after. &quot;Sixty percent of your job will be automated&quot; is the part companies are willing to say. &quot;Here&apos;s what you&apos;re now accountable for in the remaining forty percent&quot; is the part almost no one gets to. The first sentence is a tech story. The second is a human story. &lt;strong&gt;AX built around tools is doomed to fail.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We aren&apos;t failing at AX because we don&apos;t know the tools. We&apos;re failing because we don&apos;t know the people and the org.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;People Who Don&apos;t Understand an Organization Can&apos;t Change One&lt;/h2&gt;
&lt;p&gt;Steve Jobs, in his 1992 MIT talk, criticized consultants. His point was that people who don&apos;t own the outcome and don&apos;t own the execution produce only a tiny sliver of the value. It was a fundamental distrust of trying to change an organization from the outside.&lt;/p&gt;
&lt;p&gt;I agree with that almost 100 percent. My situation was a little unusual, though. I was with them every day, functioning like I was already half-inside the organization. Most consulting doesn&apos;t work that way. So mine was closer to an exception.&lt;/p&gt;
&lt;p&gt;This is the first time I&apos;m telling this story publicly.&lt;/p&gt;
&lt;p&gt;I started as a consultant. A company asked me to audit their engineering organization. Four evenings a week, three hours at a time, I&apos;d go to the office. After leaving my own job, I&apos;d clock in at another company. It was called consulting, but really it was three hours every evening reading the codebase, joining meetings, and talking to the people.&lt;/p&gt;
&lt;p&gt;The two engineers I worked with in those first sessions were effectively forced into overtime because of my consulting. With those two, night after night, we read code, debated architecture, and talked through the organization&apos;s problems.&lt;/p&gt;
&lt;p&gt;Over the course of a month, I got to understand the organization deeply. The state of the codebase, where technical debt sat, the bottlenecks between teams, people&apos;s skills and frustrations and ambitions. A month sounds short. But four nights a week, three hours a night, for a month is almost fifty hours.&lt;/p&gt;
&lt;p&gt;Along the way, I found myself wanting more. The scope was past anything a consulting engagement could finish. From the outside, by advice alone, some things were never going to change.&lt;/p&gt;
&lt;p&gt;It wasn&apos;t that I understood the backend architecture or the business deeply enough to make that call.&lt;/p&gt;
&lt;p&gt;What mattered to me was who I&apos;d be working with. The tech stack was made of technologies I&apos;d never used. Node.js (I&apos;d gone from Ruby and Python into a heavy Go phase, and had never handled Node.js in production) and Kafka, which was the consulting engagement&apos;s main project, were both new to me. On technical grounds alone, there was no reason to join.&lt;/p&gt;
&lt;p&gt;But after a month of meeting the same people every evening (those two engineers, and the other members of their team), I felt convinced that together we could change something.&lt;/p&gt;
&lt;p&gt;Tech, you can learn. Domain, you can dig into. But if you don&apos;t have the people to work with, nothing happens.&lt;/p&gt;
&lt;p&gt;So I joined as CTO.&lt;/p&gt;
&lt;p&gt;What I took away from that experience is one thing. &lt;strong&gt;To change an organization, you first have to understand it. And to understand it, you have to spend time.&lt;/strong&gt; Throwing a framework over the wall from outside never works. Only after putting in three hours a night, touching the code, the people, and the culture directly, could I see what was broken and where to start.&lt;/p&gt;
&lt;p&gt;Even that turned out to be nothing. Once I went full-time, problems that had been invisible during the consulting phase piled up like a mountain. From the org structure to server operations, for the first few months I was fighting several fires at once and almost never left on time.&lt;/p&gt;
&lt;p&gt;AX is the same. Handing people an AI tool and saying &quot;there, go do AX&quot; doesn&apos;t land. You have to carve a small piece off a new business unit or an existing team and experiment. And that experiment isn&apos;t an experiment with the tool. It&apos;s an experiment with how work gets done. The person leading that experiment has to know the organization&apos;s people.&lt;/p&gt;
&lt;p&gt;Giving advice is easy. Owning the outcome of that advice all the way through is a completely different thing.&lt;/p&gt;
&lt;p&gt;That&apos;s why I keep circling back to people whenever I talk about AX.&lt;/p&gt;
&lt;p&gt;Reading Jack Dorsey&apos;s piece &lt;a href=&quot;https://block.xyz/inside/from-hierarchy-to-intelligence&quot;&gt;&quot;From Hierarchy to Intelligence,&quot;&lt;/a&gt; one line stuck with me. &lt;strong&gt;Hierarchy was originally not a structure for managing people but a structure for routing information.&lt;/strong&gt; From Roman armies to railroad companies to modern enterprises, organizations have always solved the same problem. Who knows what, who gets that information next, and who makes the decision? The layers we&apos;ve accepted as given (team lead, director, department head, PM, middle manager) exist because they paid the cost of moving information around.&lt;/p&gt;
&lt;p&gt;Seen through that lens, the nature of what&apos;s happening now looks different. AI doesn&apos;t just do work faster. &lt;strong&gt;The human middle layer whose job was to collect, summarize, tidy, and pass along information is itself being shaken.&lt;/strong&gt; Before, the organization only worked if a person reported up, coordinated sideways, and cascaded down. Now AI takes part of that. It reads documents, drafts, organizes context, summarizes data. At that moment hierarchy stops being strictly necessary. In some cases, it becomes the thing that slows you down.&lt;/p&gt;
&lt;p&gt;Most companies stop here. They attach an AI copilot to the existing org. Documents get written faster, meeting notes get tidied faster, reports come out faster. They leave the structure as it is and run it slightly better. There&apos;s value in that. But Jack Dorsey&apos;s question goes deeper. &lt;strong&gt;Do you want to run the company more efficiently, or do you want to redesign how the company runs?&lt;/strong&gt; The first is automation. The second is org redesign. The distinction I keep making in this post is exactly that.&lt;/p&gt;
&lt;p&gt;Reframed this way, everything I&apos;ve said so far ties together on one line. Setting up an AX task force is adding a layer at the exact moment you need fewer layers. The reason people feel anxious is that the information-passing and coordination role they used to hold is shifting. The reason I spent a month reading the organization before joining as CTO was the same. An organizational problem is less about individual skill and more about &lt;strong&gt;how information flows and who owns what&lt;/strong&gt;. If you can&apos;t read that flow, you can&apos;t change the org.&lt;/p&gt;
&lt;p&gt;So the next question follows naturally. Does an AI-era organization need more layers, or does it need fewer handoffs and clearer ownership? The answer is already in the room, from where I sit. As people shift from being couriers to being decision-makers, teams get smaller, and ownership has to carry all the way to the end. At that point, AX becomes a story about End-to-End.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;AX Ends Up as End-to-End&lt;/h2&gt;
&lt;p&gt;In &lt;a href=&quot;https://flowkater.io/posts/2026-03-15-ax-organization-transformation/&quot;&gt;part one&lt;/a&gt; I broke the organization down into five axes, and I named the most important one as the &lt;strong&gt;End-to-End Ownership Team&lt;/strong&gt;. A structure where a single team owns Discovery (what to build), Delivery (how to build), and Distribution (how to sell) from end to end.&lt;/p&gt;
&lt;p&gt;For readers who skipped part one, one more sentence. This isn&apos;t an argument for a do-everything solo company. It&apos;s an argument for a structure where ownership doesn&apos;t break in the middle. A structure where you can always tell who defined the problem, who built it, and who saw it through.&lt;/p&gt;
&lt;p&gt;What AI changed is simple. &lt;strong&gt;One person&apos;s coverage.&lt;/strong&gt; AI helps with the product spec, the code, and the data analysis. Work that used to require three teams ping-ponging can now be handled by a much smaller team. The need for division of labor itself has dropped.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.evanreiser.com/blog/transformation/the-projection-problem/&quot;&gt;What Abnormal Security&apos;s CEO Evan Reiser calls &quot;The Projection Problem&quot;&lt;/a&gt; captures this well. Ideas are high-dimensional; language is low-dimensional. Every time the expert explains it to the PM, the PM writes the spec, and the engineer implements it, every handoff is lossy compression. Everyone looks at the same shadow and says &quot;we&apos;re aligned,&quot; but they might be imagining different products. To fix that, Reiser put a CISO with 20 years of experience directly in the product owner seat and built a structure where AI interviews what&apos;s in his head. Expert to AI. One handoff. The cleanest explanation of why End-to-End matters.&lt;/p&gt;
&lt;p&gt;So the direction of AX naturally leads to End-to-End. Smaller teams. Shorter handoffs. Clearer ownership.&lt;/p&gt;
&lt;p&gt;This might sound like an empty slogan. But organizations are already moving this way.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.microsoft.com/source/features/digital-transformation/the-only-way-how-copilot-is-helping-propel-an-evolution-at-lumen-technologies/&quot;&gt;Lumen Technologies&lt;/a&gt; took a more fundamental approach. A 30-year-old legacy telco. What CEO Kate Johnson (formerly at Microsoft) did wasn&apos;t deploy a tool. She redefined the company&apos;s identity. From &quot;legacy telco&quot; to &quot;the backbone of the AI economy.&quot;&lt;/p&gt;
&lt;p&gt;After piloting Microsoft 365 Copilot (a work AI assistant, different from GitHub Copilot) with the sales team, she rolled it out to the whole company, and used a &quot;champion program&quot; to assign AI evangelists in each department. The numbers are striking. Customer research that used to take a salesperson &lt;strong&gt;4 hours dropped to 15 minutes&lt;/strong&gt;. Across a 3,000-plus sales org, they saved an average of 4 hours per week, which over 12 months translated to &lt;strong&gt;$50M in revenue value&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnbc.com/2026/02/24/jpm-ceo-jamie-dimon-ai-reshaping-workforce-redeployment.html&quot;&gt;JPMorgan Chase&lt;/a&gt; went deeper. The company treats AI not as a subtopic inside the tech department but as a core executive agenda. In practice, JPMorgan has seated &lt;a href=&quot;https://www.jpmorganchase.com/about/leadership/teresa-heitsenrether&quot;&gt;CDAO (Chief Data &amp;amp; Analytics Officer) Teresa Heitsenrether&lt;/a&gt; on the Operating Committee. AI isn&apos;t cordoned off into a separate org. It&apos;s &lt;strong&gt;at the core decision-making table&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tech.walmart.com/content/walmart-global-tech/en_us/blog/post/all-in-on-agents.html&quot;&gt;Walmart&lt;/a&gt; is moving in a similar direction. The company is consolidating fragmented AI capabilities into four super agents for customers, employees, partners, and developers. Then–Walmart U.S. CEO John Furner said at &lt;a href=&quot;https://fortune.com/2025/09/09/walmart-ai-jobs-brainstorm-tech/&quot;&gt;Fortune Brainstorm Tech&lt;/a&gt;, &quot;Headcount in two to five years will be roughly the same as today.&quot; The meaning is simple. AI will raise productivity, but they won&apos;t turn that directly into headcount reduction. They&apos;re going to run a bigger business with the same-size org and change what people actually do. That&apos;s closer to a declaration than a prediction.&lt;/p&gt;
&lt;p&gt;Lumen (telecom), JPMorgan (finance), and Walmart (retail). What they have in common is that they did not build a separate AX team. They&apos;re &lt;strong&gt;directly changing the roles and structure of the existing organization&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The Maker vs. Closer distinction I drew in part one lives in the same context. The point wasn&apos;t to add more people who only produce output. It was to add more people who carry work through to completion. MyRealTrip CEO Donggun Lee&apos;s pivot (&lt;a href=&quot;https://www.threads.com/@keon21/post/DWaPi0TkoHK?xmt=AQF02PLI9eOJz6Pr2R3k5wbTzIJ5yY5FKdwvrKF-rpmsFg&quot;&gt;&quot;grow the number of people who can sell directly&quot; over &quot;make it better&quot;&lt;/a&gt;) lives on the same line. It&apos;s a declaration that the wall between engineering and marketing, between product and sales, has to come down.&lt;/p&gt;
&lt;p&gt;Before, getting past that wall meant filing a request with another team. You had to wait for assets, explain yourself, and justify the ask. That&apos;s different now. An engineer can draft ad copy with AI, classify customer feedback, and even do basic data analysis on their own.&lt;/p&gt;
&lt;p&gt;One more step in: this isn&apos;t an argument for making engineers do sales. It&apos;s an argument for letting engineers hear the customer&apos;s voice directly, fold that feedback into the next sprint, and see the business impact of what they shipped in actual numbers. Same for marketers. Since AI can draft a product brief, marketers get more time for judgment calls about product direction. The energy that used to go into &quot;when is the engineering team going to get to this?&quot; can now go into &quot;what does the customer actually need?&quot;&lt;/p&gt;
&lt;p&gt;This isn&apos;t saying everyone should do everything. It&apos;s saying that the wall you used to book a conference room to get past is lower now.&lt;/p&gt;
&lt;p&gt;At that point the Maker becomes a Closer. The distinction I drew in part one is turning from an abstract concept into a real state. Someone who only produced output becomes someone who carries a result to the end. That&apos;s what the individual-level transformation inside an AX organization actually looks like.&lt;/p&gt;
&lt;p&gt;Where AX works, you find &lt;strong&gt;small teams organized around problems&lt;/strong&gt;, not around job titles. Teams that own End-to-End. Teams with minimal handoffs. Teams where one group handles it from Discovery to Distribution. The goal isn&apos;t a separate &quot;AX task force.&quot; It&apos;s a structure where each existing team becomes AX on its own.&lt;/p&gt;
&lt;p&gt;Don&apos;t push the tool. Let the need pull the tool in.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;When Layers Disappear, Roles Shift&lt;/h2&gt;
&lt;p&gt;Same organization, but this time we look at how individual roles change rather than at structure.&lt;/p&gt;
&lt;p&gt;Lots of people see AX as IT&apos;s job. The engineering team uses AI, designers write code, PMs run agents. Those changes matter.&lt;/p&gt;
&lt;p&gt;But real AX happens outside of IT, in the field.&lt;/p&gt;
&lt;p&gt;A recent &lt;a href=&quot;https://www.youtube.com/watch?v=9qXc-THAvc0&quot;&gt;example from the OpenAI Codex team&lt;/a&gt; shows this clearly. On that team, designers write code themselves, PMs work as builder-owners instead of messengers, and engineers focus on supervising the system rather than writing code line by line. You could say &quot;well, that&apos;s an AI company&apos;s engineering team.&quot; But the principle is general.&lt;/p&gt;
&lt;p&gt;&quot;Designers become builders. PMs become owners. Engineers become supervisors.&quot; That principle doesn&apos;t only apply to an AI company&apos;s engineering team. It&apos;s a universal pattern for an era in which role boundaries are being redefined, across every industry.&lt;/p&gt;
&lt;p&gt;Look at retail. A store operations lead at Walmart isn&apos;t just someone who files requests to headquarters anymore. They&apos;re handling inventory, promotions, and customer signals directly in a much shorter loop. What the AI system created isn&apos;t a fancy dashboard. It expanded the radius of judgment on the ground. Target too. &lt;a href=&quot;https://corporate.target.com/press/release/2025/05/target-corporation-announces-multi-year-enterprise-acceleration-office&quot;&gt;The Enterprise Acceleration Office&lt;/a&gt; exists to raise enterprise-wide speed and agility. The goal is to shorten the distance between decision and execution in the stores.&lt;/p&gt;
&lt;p&gt;Finance is even more dramatic. &lt;a href=&quot;https://fortune.com/2026/03/17/inside-bank-of-americas-build-once-ai-strategy/&quot;&gt;Bank of America&apos;s Erica&lt;/a&gt; has handled over &lt;strong&gt;3.2 billion&lt;/strong&gt; cumulative interactions, and more than &lt;strong&gt;98% of users find what they need&lt;/strong&gt;. The real point isn&apos;t the number. What Bank of America actually did was build Erica for consumers first, then reuse the same engine for employees, wealth management, and corporate banking. &quot;Build Once, Reuse.&quot; It&apos;s a strategy of spreading one engine across the whole organization.&lt;/p&gt;
&lt;p&gt;What did that change on the ground? Advisory, underwriting, and operations stopped being three teams passing documents around. They got closer to the customer&apos;s problem and saw it through. With the AI handling repetitive queries, advisors got room to go deeper into complex financial problems. Underwriters gained the same kind of space. Time that went into document verification now goes into actual risk judgment.&lt;/p&gt;
&lt;p&gt;The Bank of America CIO&apos;s line is worth sitting with. &lt;strong&gt;&quot;The discipline of slowing down early produces much faster acceleration over the long run.&quot;&lt;/strong&gt; Organizations racing to deploy tools should probably hear that one first.&lt;/p&gt;
&lt;p&gt;Telecom tells the same story. At Lumen Technologies, salespeople cut four-hour research down to fifteen minutes and spent the rest of the time in deeper customer conversations. Before, gathering pre-meeting material ate up half a day. Now, fifteen minutes is enough to pull together industry trends, prior contracts, and likely needs for the customer. The salesperson&apos;s role shifted from &quot;material collector&quot; to &quot;customer problem-solver.&quot;&lt;/p&gt;
&lt;p&gt;Manufacturing is no exception. The UAE&apos;s &lt;a href=&quot;https://media.ega.ae/ega-designated-industry-40-global-lighthouse-by-world-economic-forum-in-uae-and-world-aluminium-industry-first/&quot;&gt;Emirates Global Aluminium (EGA)&lt;/a&gt; built a cross-functional execution model under its CDO (Chief Digital Officer) and retrained more than 3,000 employees. In 2025 it was named a WEF (World Economic Forum) Industry 4.0 Global Lighthouse. A first for the aluminum industry.&lt;/p&gt;
&lt;p&gt;A common pattern shows up here.&lt;/p&gt;
&lt;p&gt;In retail, in finance, and in telecom, jobs don&apos;t disappear. &lt;strong&gt;The center of gravity of the job moves.&lt;/strong&gt; From reporting to judgment. From passing things along to executing. From collecting to interpreting.&lt;/p&gt;
&lt;p&gt;The point isn&apos;t to teach everyone to code.&lt;/p&gt;
&lt;p&gt;The point is &lt;strong&gt;letting each person keep their expertise while gaining a wider radius of judgment and execution&lt;/strong&gt;. Someone who only reported now also executes one step further. Someone who only executed now also judges one step further. Someone who only judged now also carries the result through to the end.&lt;/p&gt;
&lt;p&gt;This isn&apos;t proprietary to tech companies. It&apos;s an operating model that every existing organization has to translate into its own language.&lt;/p&gt;
&lt;p&gt;A good AX team&apos;s role converges here, too. Not promoting tools, but making these role transitions actually happen.&lt;/p&gt;
&lt;p&gt;What Bank of America shows is that the transition doesn&apos;t happen overnight. After launching Erica in 2018, it took seven years to extend it to employees and wealth management. But once the plumbing is in, it gets reused again and again. &lt;strong&gt;Better to lay it slowly and use it for a long time than lay it fast and watch it collapse.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;More Tools Is Not the Same as Winning&lt;/h2&gt;
&lt;p&gt;A lot of organizations trip over this next part.&lt;/p&gt;
&lt;p&gt;Once a company declares it&apos;s doing AX, people start showing up with their own little tools. Non-engineers build small automations with Claude Code. They wire up agents to summarize reports, classify customer inquiries, and tidy meeting notes. Some even ship apps. At first it&apos;s heartwarming. The feeling is, &quot;Our organization is finally changing.&quot;&lt;/p&gt;
&lt;p&gt;That scene is genuinely moving. A non-engineer attaches an agent to their own work and makes something, however small. From the org&apos;s point of view, it&apos;s a good signal. At least the psychological resistance isn&apos;t completely closed off.&lt;/p&gt;
&lt;p&gt;But is that really AX?&lt;/p&gt;
&lt;p&gt;Has AX actually taken hold in the organization?&lt;/p&gt;
&lt;p&gt;Does personal work automation genuinely contribute to the organization&apos;s performance?&lt;/p&gt;
&lt;p&gt;Usually, no.&lt;/p&gt;
&lt;p&gt;Because in most cases, the tool reduces &lt;strong&gt;friction at the individual level&lt;/strong&gt; without touching &lt;strong&gt;the organization&apos;s bottleneck&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A marketer can build a tool that generates their weekly report faster. A CS rep can hook up a bot that drafts replies faster. A finance person can write a script that makes reconciliation spreadsheets less painful. All fine. All productive.&lt;/p&gt;
&lt;p&gt;But that&apos;s not how a company wins.&lt;/p&gt;
&lt;p&gt;A company wins not when individuals finish their own work a bit faster, but &lt;strong&gt;when the whole organization moves faster in the same direction&lt;/strong&gt;. If personal automation doesn&apos;t connect to organizational wins, it&apos;s just another tool on the pile.&lt;/p&gt;
&lt;p&gt;I&apos;d call this local optimization at the individual level. The friction on your desk is lower. Your calendar has a little more room. But cross-team approvals are still stuck, priority conflicts are still unresolved, and the lack of goal alignment is untouched. The organization still slows down at the same places.&lt;/p&gt;
&lt;p&gt;There&apos;s a worse version. Once everyone starts making their own tools, the org gets more fragmented, not less. Even within one marketing team, A uses her own GPT, B uses a Claude project, C wires together Zapier and Notion. Engineering has its own agent workflows. On the surface, everyone looks innovative. But there&apos;s no shared language, shared goal, or shared operating principle.&lt;/p&gt;
&lt;p&gt;The tools multiply. The organization fits together worse.&lt;/p&gt;
&lt;p&gt;That&apos;s not AX. That&apos;s &quot;every person for themselves,&quot; but more sophisticated.&lt;/p&gt;
&lt;p&gt;At this point I find myself pulled back to a previous post, &lt;a href=&quot;https://flowkater.io/posts/2026-01-25-no-victory-no-future/&quot;&gt;An Organization That Can&apos;t Win Has No Future&lt;/a&gt;. The core of that piece was simple. &lt;strong&gt;If an organization can&apos;t define what winning means, the way it works loses meaning.&lt;/strong&gt; Effort without direction can be comforting, but it won&apos;t become results.&lt;/p&gt;
&lt;p&gt;Same for AX.&lt;/p&gt;
&lt;p&gt;Changing how you work without aligning the organization&apos;s goals is just adding one more tool to the stack.&lt;/p&gt;
&lt;p&gt;The problem starts here. AX discourse too easily mistakes &quot;tool utilization rate&quot; for performance. How many people use agents internally, how many automations have been built, how many demo days have been held. Those are activity metrics. They are not outcome metrics.&lt;/p&gt;
&lt;p&gt;The real questions are these.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Did time-to-customer go down?&lt;/li&gt;
&lt;li&gt;Are we making better decisions faster?&lt;/li&gt;
&lt;li&gt;Are we closer to the organization&apos;s winning conditions?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the answer is unclear, the organization&apos;s AX is still at the toy stage.&lt;/p&gt;
&lt;p&gt;Here&apos;s the distinction.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activity metric (looks good)&lt;/th&gt;
&lt;th&gt;Outcome metric (actually matters)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Internal AI user count&lt;/td&gt;
&lt;td&gt;Customer lead-time reduction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of automations built&lt;/td&gt;
&lt;td&gt;Cross-team handoffs eliminated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demo days held&lt;/td&gt;
&lt;td&gt;Decision latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt-share count&lt;/td&gt;
&lt;td&gt;Business impact on the org&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The left column is great for internal slide decks. Measuring real AX means looking at the right column.&lt;/p&gt;
&lt;p&gt;I&apos;d argue the leader has to get colder, not warmer, the moment employees start building their own tools. Don&apos;t just applaud. Check where those tools are reducing friction, whether they expose a common bottleneck, and whether they contribute to the organization&apos;s core value flow. An organization that cleanly removes one shared bottleneck is much closer to AX than an organization with twenty scattered personal tools.&lt;/p&gt;
&lt;p&gt;Personal automation can be a &lt;strong&gt;signal&lt;/strong&gt;. It&apos;s not &lt;strong&gt;evidence&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Signals are welcome. Evidence is different.&lt;/p&gt;
&lt;p&gt;The evidence of AX is always the same. Shorter processing time, fewer handoffs, clearer ownership, and most of all, &lt;strong&gt;a contribution to the whole organization&apos;s business performance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Miss that, and the org collapses the same way it always did, even in the AI era. Just with more tools.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;So You&apos;ve Already Set Up an AX Team. Now What.&lt;/h2&gt;
&lt;p&gt;Reality is reality. Plenty of organizations have already stood up an AX team. Leadership made the call, a team got assembled, and a mission was handed down. How, then, do you at least raise the odds of it working?&lt;/p&gt;
&lt;p&gt;Think back to a previous organization. When introducing a new process, the most effective move wasn&apos;t importing an outside expert. It was pulling in the person on each team who had the most complaints and who also knew the work best.&lt;/p&gt;
&lt;p&gt;Those aces knew the real bottlenecks. People with the most complaints know best what&apos;s wrong. People who know the work know what actually has to change for things to move.&lt;/p&gt;
&lt;p&gt;An AX team has to start from there.&lt;/p&gt;
&lt;p&gt;What an AX team needs isn&apos;t an AI expert. You need the marketer who knows where marketing&apos;s bottleneck is, the engineer who knows the real problems in the dev pipeline, the CS lead who knows where things break at the customer touchpoint. Those people come together and redesign how work is done in their own context, using AI as a tool, not the other way around.&lt;/p&gt;
&lt;p&gt;The reason this matters is that an AX team that doesn&apos;t know the field almost always turns into an &quot;AI PR team.&quot; They run internal seminars, introduce tools, and translate success stories. It looks legit. But the actual bottlenecks on the ground stay right where they were.&lt;/p&gt;
&lt;p&gt;Order is everything. Most organizations run this order backwards. First they install the tool, then they think about where to use it. Nothing ends up planted deeply anywhere.&lt;/p&gt;
&lt;p&gt;The mission also gets set wrong. &quot;Drive AI adoption&quot; isn&apos;t a mission. It&apos;s a slogan. The mission has to be a concrete business problem. Cut new customer onboarding time by 50%. Double customer inquiry resolution speed. Bring monthly report generation from 8 hours down to 2. That kind of thing. Then the team looks at processes, not tools.&lt;/p&gt;
&lt;p&gt;It was the same in a previous org. When we moved from an abstract mission like &quot;improve software quality&quot; to a concrete one (&quot;count issues and reduce them every week&quot;), the team finally moved. We counted issues, tidied them, prioritized them, and focused on bringing the number down. This wasn&apos;t only a developer&apos;s job. PMs, QA, and designers all lined up on the same issue pipeline, which is why it worked. AI didn&apos;t solve it. Looking at the same number and moving in the same direction did.&lt;/p&gt;
&lt;p&gt;The more concrete the mission, the more the team looks at boring bottlenecks over flashy demos. Most of the time, real impact comes out of those boring bottlenecks.&lt;/p&gt;
&lt;p&gt;There&apos;s another trap here. Many organizations frame the mission as &quot;reach 80% AI tool adoption.&quot; The number is concrete. The direction is wrong. Utilization rate is an activity metric. It says nothing about which bottleneck gets fixed or which value flow it serves.&lt;/p&gt;
&lt;p&gt;A proper mission looks like this. &quot;Cut first-response time on customer inquiries from 24 hours to 4. AI is an assist; final accountability sits with the dedicated team.&quot; This mission doesn&apos;t force tool usage. It nails down the result and the ownership structure. The tool is just a means.&lt;/p&gt;
&lt;p&gt;People don&apos;t move on mission alone. They need to see the reason their role is changing and the path forward.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloudwars.com/innovation-leadership/servicenow-ai-agents-will-boost-productivity-20-this-year-50-next-year-says-ceo-bill-mcdermott/&quot;&gt;ServiceNow assessed all 28,000 of its employees.&lt;/a&gt; What matters isn&apos;t the assessment itself. They had to redraw who could move into which role after AI, who needed what kind of training, and who was currently stuck in repetitive work. People aren&apos;t afraid of AI itself. They&apos;re afraid of being useless in an AI era. That&apos;s why redrawing the role map comes first. You have to know exactly what someone can do now before you can design what they&apos;ll learn next.&lt;/p&gt;
&lt;p&gt;The AX team&apos;s job is not tool evangelism. It&apos;s laying the runway that lets people learn, switch roles, and run experiments in the field.&lt;/p&gt;
&lt;p&gt;Execution authority doesn&apos;t have to be grand. You don&apos;t need sweeping org redesign power. You just need the authority to run tiny experiments. Skip one approval step. Try a different way to classify customer inquiries for two weeks. Put one specific report through an AI assist. If it doesn&apos;t work, roll back. Without that much authority, AX lives and dies as a deck. With even that much, the organization actually learns something.&lt;/p&gt;
&lt;p&gt;No experimentation authority, no innovation. That was it.&lt;/p&gt;
&lt;p&gt;AX teams are the same. &quot;Do it this way&quot; has to become &quot;we&apos;ll try it ourselves first.&quot; And then you have to show the result. In numbers. Successful experiments get handed off to the field. Failed experiments get logged so the next team makes fewer mistakes. What matters is that the result doesn&apos;t stay inside the AX team. It becomes organizational learning.&lt;/p&gt;
&lt;p&gt;In the end, an AX team&apos;s success depends on its goal being its own disappearance. Once each field organization can run its own AX, a separate AX team is redundant.&lt;/p&gt;
&lt;p&gt;A team whose reason for existing is to stop existing.&lt;/p&gt;
&lt;p&gt;It&apos;s paradoxical, but it&apos;s the only design that works.&lt;/p&gt;
&lt;p&gt;Walmart redesigned the org. Bank of America laid the plumbing. Lumen redefined identity. Commonwealth Bank reversed course.&lt;/p&gt;
&lt;p&gt;The results are already in.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;The first principle of AX isn&apos;t tools. It&apos;s the organization and its people.&lt;/p&gt;
&lt;p&gt;Understanding AI matters. Knowing Claude Code matters. But before that, you have to understand the people in the organization that&apos;s going to use the tool. Why they work the way they do. What drains them. What has to change for them to actually move.&lt;/p&gt;
&lt;p&gt;At the end of understanding people lies direction. If the organization can&apos;t define a direction, no matter how great the tool, people run toward different places. &lt;a href=&quot;https://flowkater.io/posts/2026-01-25-no-victory-no-future/&quot;&gt;As I wrote before&lt;/a&gt;, effort without direction can be comforting, but it won&apos;t become results.&lt;/p&gt;
&lt;p&gt;The more an organization wants to be good at AX, the more sharply it has to ask itself: what are we trying to win here.&lt;/p&gt;
&lt;p&gt;I invested three hours every evening to understand that organization. That was all I could do. Not a framework, not a toolkit. Just sitting in the office at night reading code and talking to people. Nothing glamorous.&lt;/p&gt;
&lt;p&gt;But that was the real thing. &lt;strong&gt;People who know tools stay with tools. People who know people change organizations.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;If you want to build a ship, don&apos;t drum up the men to gather wood, divide the work and give orders. Instead, teach them to yearn for the vast and endless sea.&quot;&lt;/p&gt;
&lt;p&gt;Antoine de Saint-Exupéry&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;MIT NANDA, &lt;a href=&quot;https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo/&quot;&gt;&quot;95% of GenAI Pilots Failing: What the Successful 5% Do Differently&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fortune, &lt;a href=&quot;https://fortune.com/2026/03/27/why-cfo-not-chief-ai-officer-secret-getting-real-value-ai/&quot;&gt;&quot;Why CFOs, not CAIOs, Are the Secret to AI Value&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CNBC, &lt;a href=&quot;https://www.cnbc.com/2026/03/26/coca-cola-james-quincey-walmart-doug-mcmillon-artificial-intelligence-step-down.html&quot;&gt;&quot;Coca-Cola, Walmart CEOs Step Down amid AI Shift&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ads of the World, &lt;a href=&quot;https://www.adsoftheworld.com/campaigns/designers-lead-ai-follows&quot;&gt;&quot;Coca-Cola: Designers Lead. AI follows.&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Verge, &lt;a href=&quot;https://www.theverge.com/news/812559/coca-cola-ai-holiday-christmas-commercial-2025&quot;&gt;&quot;Coca-Cola&apos;s new AI holiday ad is a sloppy eyesore&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CBS Atlanta, &lt;a href=&quot;https://www.cbsnews.com/atlanta/news/coca-cola-plans-to-cut-about-75-jobs-at-its-atlanta-headquarters-in-early-2026/&quot;&gt;&quot;Coca-Cola plans to cut about 75 jobs at its Atlanta headquarters in early 2026&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Register, &lt;a href=&quot;https://www.theregister.com/2025/08/22/commonwealth_ban_chatbot_fail_rehiring/&quot;&gt;&quot;Commonwealth Bank AI Chatbot Fail: 45 Rehired&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Walmart Tech, &lt;a href=&quot;https://tech.walmart.com/content/walmart-global-tech/en_us/blog/post/all-in-on-agents.html&quot;&gt;&quot;All in on Agents&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fortune, &lt;a href=&quot;https://fortune.com/2025/09/09/walmart-ai-jobs-brainstorm-tech/&quot;&gt;&quot;Why Walmart&apos;s CEO says AI won&apos;t lead to lower headcount&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft, &lt;a href=&quot;https://news.microsoft.com/source/features/digital-transformation/the-only-way-how-copilot-is-helping-propel-an-evolution-at-lumen-technologies/&quot;&gt;&quot;How Copilot Is Helping Propel an Evolution at Lumen Technologies&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fortune, &lt;a href=&quot;https://fortune.com/2026/03/17/inside-bank-of-americas-build-once-ai-strategy/&quot;&gt;&quot;Inside Bank of America&apos;s Build Once AI Strategy&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bloomberg, &lt;a href=&quot;https://www.bloomberg.com/news/articles/2025-11-10/intel-head-of-ai-katti-leaves-for-hardware-role-at-openai&quot;&gt;&quot;Intel CAIO Leaves for OpenAI after 7 Months&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Defense Scoop, &lt;a href=&quot;https://defensescoop.com/2025/08/15/feinberg-cdao-realignment-shakeup-dod-ai-enterprise/&quot;&gt;&quot;Feinberg orders major shakeup in Pentagon&apos;s AI enterprise&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CloudWars, &lt;a href=&quot;https://cloudwars.com/innovation-leadership/servicenow-ai-agents-will-boost-productivity-20-this-year-50-next-year-says-ceo-bill-mcdermott/&quot;&gt;&quot;ServiceNow: 28,000 Employees Assessed for AI Skills&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SalesforceBen, &lt;a href=&quot;https://www.salesforceben.com/salesforce-lays-off-nearly-1000-employees-in-early-2026-cuts/&quot;&gt;&quot;Salesforce Lays Off Nearly 1,000 Employees in Early 2026&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CNBC, &lt;a href=&quot;https://www.cnbc.com/2026/02/24/jpm-ceo-jamie-dimon-ai-reshaping-workforce-redeployment.html&quot;&gt;&quot;JPMorgan CEO Jamie Dimon: AI Is Reshaping Workforce&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JPMorgan Chase, &lt;a href=&quot;https://www.jpmorganchase.com/about/leadership/teresa-heitsenrether&quot;&gt;&quot;Teresa Heitsenrether&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;EGA, &lt;a href=&quot;https://media.ega.ae/ega-designated-industry-40-global-lighthouse-by-world-economic-forum-in-uae-and-world-aluminium-industry-first/&quot;&gt;&quot;EGA Designated Industry 4.0 Global Lighthouse by WEF&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Evan Reiser, &lt;a href=&quot;https://www.evanreiser.com/blog/transformation/the-projection-problem/&quot;&gt;&quot;The Projection Problem&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;flowkater.io, &lt;a href=&quot;https://flowkater.io/posts/2026-03-15-ax-organization-transformation/&quot;&gt;&quot;Installing Claude Code at Your Company Doesn&apos;t Get You AX&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Target, &lt;a href=&quot;https://corporate.target.com/press/release/2025/05/target-corporation-announces-multi-year-enterprise-acceleration-office&quot;&gt;&quot;Enterprise Acceleration Office&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Block, &lt;a href=&quot;https://block.xyz/inside/from-hierarchy-to-intelligence&quot;&gt;&quot;From Hierarchy to Intelligence&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;YouTube / Peter Yang, &lt;a href=&quot;https://www.youtube.com/watch?v=9qXc-THAvc0&quot;&gt;&quot;How OpenAI&apos;s Codex Team Builds with Codex&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;flowkater.io, &lt;a href=&quot;https://flowkater.io/posts/2026-01-25-no-victory-no-future/&quot;&gt;&quot;An Organization That Can&apos;t Win Has No Future&quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>AI</category><category>AX</category><category>org-transformation</category><category>essay</category><category>leadership</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>When Package Install Becomes a Hack: Why Zero Dependency Matters</title><link>https://flowkater.io/en/posts/2026-04-04-package-install-hacking-zero-dependency/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-04-04-package-install-hacking-zero-dependency/</guid><description>In March 2026, the litellm and axios supply-chain attacks hit back-to-back. I trace ten years of dependencies turning from convenience to trust to risk, and use code to show why zero-dependency design is survival, not minimalism.</description><pubDate>Sat, 04 Apr 2026 02:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;Around January 2022, the lead maintainer of &lt;code&gt;colors.js&lt;/code&gt; and &lt;code&gt;faker.js&lt;/code&gt; (Marak Squires) went public with a complaint: large companies were using his open source for free without paying him a cent. As a form of protest, he intentionally broke his own libraries. Both packages were used in thousands of projects, including a number of large companies, and &lt;code&gt;colors.js&lt;/code&gt; was downloading at over 20 million per week. A lot of builds and services went down because of it.&lt;/p&gt;
&lt;p&gt;There&apos;s a representative package manager for nearly every language. Ruby has gem, Python has pip, JavaScript has npm, Rust has cargo. I&apos;ve shipped services fast on top of these open-source ecosystems, pulled all-nighters chasing dependency conflicts, and at times even monkey-patched open-source libraries for my own use. Most of the time, I was grateful. These libraries let me build quickly, and I was happily inheriting the work of all the Stack Overflow veterans who had suffered before me. After importing one open-source library after another, at some point I started wondering whether coding was just LEGO(?). (Even before the AI era, there was always a recurring jab: &quot;If you&apos;re just gluing open source together, is that really development?&quot;)&lt;/p&gt;
&lt;p&gt;In that context, the colors.js incident hit me hard. The line &quot;If you&apos;re just gluing open source together, is that really development?&quot; stopped being a cheap jab and started feeling like an existential question about my own output. What am I actually building? Am I a coder, or an engineer? The old software adage &quot;don&apos;t reinvent the wheel&quot; started to feel less obvious. &lt;em&gt;Mostly true. But really?&lt;/em&gt; (My drift toward Go over Python or Node.js, and Swift over Flutter on mobile clients, isn&apos;t unrelated to this. Going fully without package dependencies is hard, but heading in the direction of fewer is something I started to value.)&lt;/p&gt;
&lt;p&gt;As it happened, two more incidents hit back-to-back. One was the litellm (PyPI) maintainer-account takeover on March 24, 2026. The other was the axios (npm) OS-specific malicious RAT distribution on March 31.&lt;/p&gt;
&lt;p&gt;Both landed close to home for me. litellm shows up in many open-source agent plugins (for Claude Code, Codex, and similar tools), and axios was the library I always reached for when working in React.&lt;/p&gt;
&lt;p&gt;Since the LLM/AI era took off, a lot of Korean developers have been releasing open source one after another, and some of those libraries are genuinely good. I haven&apos;t built anything that qualifies yet, but the litellm and axios incidents pushed me to write down what I think about open-source design, and why zero dependency matters.&lt;/p&gt;
&lt;p&gt;&quot;Don&apos;t reinvent the wheel&quot; is fine advice. The question is, how far can I trust the wheel?&lt;/p&gt;
&lt;h2&gt;March 2026: Two Incidents in litellm and axios&lt;/h2&gt;
&lt;h3&gt;litellm: The day an LLM integration library became a credential-stealing tool&lt;/h3&gt;
&lt;p&gt;litellm is a Python library that unifies more than 100 LLM providers (OpenAI, Anthropic, Bedrock, Vertex AI, and more) behind a single interface. If you run an LLM-based service, chances are you&apos;ve typed &lt;code&gt;pip install litellm&lt;/code&gt; at some point. PyPI shows millions of monthly downloads. It&apos;s one of the core packages in the AI infrastructure stack.&lt;/p&gt;
&lt;p&gt;On March 24, 2026, litellm&apos;s PyPI maintainer account was hijacked. The attacker pushed a poisoned version through the normal release process. From the outside, it looked like a routine update. Anyone who ran &lt;code&gt;pip install --upgrade litellm&lt;/code&gt; got the malicious package with no warning.&lt;/p&gt;
&lt;p&gt;The technical structure was clever. The malicious code abused Python&apos;s &lt;code&gt;.pth&lt;/code&gt; file mechanism. A &lt;code&gt;.pth&lt;/code&gt; file is a path-configuration file that Python runs automatically at startup, and the attacker injected code into one so that the payload would fire the moment Python started, even without &lt;code&gt;import litellm&lt;/code&gt;. Install the package, write zero lines of import code, and the next time Python runs, you&apos;re infected.&lt;/p&gt;
&lt;p&gt;According to &lt;a href=&quot;https://www.sonatype.com/blog/compromised-litellm-pypi-package-delivers-multi-stage-credential-stealer&quot;&gt;Sonatype&apos;s analysis&lt;/a&gt;, the payload ran in stages. Stage one collected system environment information. Stage two scraped API keys, cloud credentials, and database connection strings from environment variables and shipped them to an external server. If you run an LLM service, your environment variables are usually a treasure chest: OpenAI API keys, AWS credentials, database passwords. The attacker knew exactly where to look.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kaspersky.com/blog/critical-supply-chain-attack-trivy-litellm-checkmarx-teampcp/55510/&quot;&gt;Kaspersky&apos;s report&lt;/a&gt; pointed out that this wasn&apos;t litellm-only. It was a coordinated supply-chain campaign that also targeted Trivy, Checkmarx, and other security-tool packages. Security tools as the security hole. You can&apos;t make this up.&lt;/p&gt;
&lt;p&gt;The most striking part is the &lt;strong&gt;transitive dependency&lt;/strong&gt; path. Organizations that installed litellm directly weren&apos;t the only victims. Anyone who installed something that depended on litellm (certain Cursor MCP plugins, some agent frameworks) got litellm pulled in alongside, and the infection path opened. According to &lt;a href=&quot;https://www.herodevs.com/blog-posts/the-litellm-supply-chain-attack-what-happened-why-it-matters-and-what-to-do-next&quot;&gt;HeroDevs&apos; analysis&lt;/a&gt;, a large number of vulnerable projects didn&apos;t even use litellm directly.&lt;/p&gt;
&lt;p&gt;I had a close call myself. I&apos;d recently installed a Claude Code agent skill called ouroboros, and litellm was somewhere in its dependency tree. Luckily I never actually ran the skill, so litellm never activated in my Python environment. But if I&apos;d run it even once, the API keys in my environment variables could have leaked. It made my stomach drop.&lt;/p&gt;
&lt;h3&gt;axios: The day an HTTP client became a RAT delivery tool&lt;/h3&gt;
&lt;p&gt;axios is the most widely used HTTP client library in the JavaScript and TypeScript ecosystem. &lt;strong&gt;Over 100 million weekly downloads on npm.&lt;/strong&gt; If you&apos;re working in React, Vue, or Node.js and you need to call an API, your fingers practically type &lt;code&gt;npm install axios&lt;/code&gt; on their own. I reached for it every single React project.&lt;/p&gt;
&lt;p&gt;On March 31, 2026, the axios npm package was compromised. According to &lt;a href=&quot;https://www.elastic.co/security-labs/axios-one-rat-to-rule-them-all&quot;&gt;Elastic Security Labs&apos; detailed writeup&lt;/a&gt;, the attacker used the &lt;code&gt;postinstall&lt;/code&gt; script in &lt;code&gt;package.json&lt;/code&gt;. That hook runs automatically the moment npm installs a package, and the attacker dropped a malicious script into it. Run &lt;code&gt;npm install&lt;/code&gt;, and before you&apos;ve imported a single line of code, the attacker&apos;s code is running.&lt;/p&gt;
&lt;p&gt;The cleverness was in shipping different payloads per OS. On Windows, it pulled an executable via PowerShell. On macOS, it combined curl and bash to fetch a binary. Linux had its own payload. &lt;a href=&quot;https://www.huntress.com/blog/supply-chain-compromise-axios-npm-package&quot;&gt;Huntress&apos; report&lt;/a&gt; confirmed that the payload was a &lt;strong&gt;RAT (Remote Access Trojan)&lt;/strong&gt;. A backdoor that lets an attacker connect to your machine remotely, read files, capture keystrokes, install more malware.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sophos.com/en-us/blog/axios-npm-package-compromised-to-deploy-malware&quot;&gt;Sophos&apos; analysis&lt;/a&gt; listed the RAT&apos;s capabilities: system information collection, filesystem traversal, keylogging, screen capture, downloading and executing additional payloads. Effectively, full remote control of an infected developer machine.&lt;/p&gt;
&lt;p&gt;This incident made it painfully clear why npm&apos;s &lt;code&gt;postinstall&lt;/code&gt; hook is dangerous. npm runs &lt;code&gt;preinstall&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;, and &lt;code&gt;postinstall&lt;/code&gt; scripts in order during package installation, and most developers have no idea this is happening. Type &lt;code&gt;npm install axios&lt;/code&gt; and all you see is the install progress bar. Almost nobody checks what scripts ran behind it. Even &lt;a href=&quot;https://docs.npmjs.com/cli/v10/using-npm/scripts#best-practices&quot;&gt;the official npm docs&lt;/a&gt; recommend minimizing &lt;code&gt;postinstall&lt;/code&gt; use, but countless packages still rely on it.&lt;/p&gt;
&lt;p&gt;Look at the two incidents side by side and the pattern emerges. Both compromised a maintainer account or release pipeline. Both infected you just by installing the package, with zero lines of code executed. And both targeted core packages that sit deep inside millions of projects&apos; dependency trees.&lt;/p&gt;
&lt;p&gt;litellm hit the spine of AI infrastructure. axios hit the spine of web development. One week apart.&lt;/p&gt;
&lt;h2&gt;Ten Years of Pattern: From Disruption, to Damage, to Infiltration&lt;/h2&gt;
&lt;p&gt;Open-source dependency incidents didn&apos;t suddenly start in 2026. There&apos;s a ten-year arc, and it&apos;s been moving in one direction.&lt;/p&gt;
&lt;h3&gt;2016, left-pad: the disruption era&lt;/h3&gt;
&lt;p&gt;In March 2016, a developer named Azer Koçulu deleted his &lt;code&gt;left-pad&lt;/code&gt; package from npm. It was an 11-line function. Pad a string on the left with spaces or a specific character. That was it. When those 11 lines vanished, builds broke across thousands of projects, including React and Babel.&lt;/p&gt;
&lt;p&gt;David Haney asked at the time on his &lt;a href=&quot;https://www.davidhaney.io/npm-left-pad-have-we-forgotten-how-to-program/&quot;&gt;blog&lt;/a&gt;, &quot;Have we forgotten how to program?&quot; The fact that we&apos;d reach for a package instead of writing 11 lines of string padding ourselves was funny and a little sad at the same time.&lt;/p&gt;
&lt;p&gt;The essence of left-pad was &lt;strong&gt;disruption&lt;/strong&gt;. When the dependency disappears, the build breaks. That&apos;s all there was to it. No malice, no intent to harm. It started with &quot;I&apos;m deleting my own package, what&apos;s the problem?&quot; and the damage stopped at failed builds and delayed deploys. npm tightened its unpublish policy afterward, people thought about dependencies for a minute, and then forgot.&lt;/p&gt;
&lt;h3&gt;2022, colors.js: the damage era&lt;/h3&gt;
&lt;p&gt;Six years later, Marak Squires injected an infinite loop into his own &lt;code&gt;colors.js&lt;/code&gt; and &lt;code&gt;faker.js&lt;/code&gt;. This time it wasn&apos;t a mistake. It was deliberate sabotage. The motive was anger that big companies were making money off his open source while none of it came back to him. Every application that imported colors.js stalled while spamming &quot;LIBERTY LIBERTY LIBERTY&quot; to the console.&lt;/p&gt;
&lt;p&gt;The shift from disruption to damage had begun. left-pad was a failure of absence. colors.js was code that was actively present and doing harm. The problem wasn&apos;t the missing package. The problem was the package that was there. The vector flipped.&lt;/p&gt;
&lt;p&gt;Even so, colors.js still had a &quot;human face.&quot; The attacker was the original author, not an anonymous hacker. The motive (whether you agreed with it or not) was a comprehensible grievance. The damage was service disruption, not data exfiltration or credential theft.&lt;/p&gt;
&lt;h3&gt;2026, litellm and axios: the infiltration era&lt;/h3&gt;
&lt;p&gt;The two incidents in March 2026 crossed into different territory. Not a maintainer&apos;s personal protest, but the planned infiltration of an organized attacker. Auto-execution via &lt;code&gt;.pth&lt;/code&gt;, the &lt;code&gt;postinstall&lt;/code&gt; hook, OS-specific RATs. The technical sophistication is on another level. So is the goal. Not stopping the service, but stealing credentials, planting backdoors, and securing persistent access.&lt;/p&gt;
&lt;p&gt;Here&apos;s the ten-year arc in one table.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Motive&lt;/th&gt;
&lt;th&gt;Damage scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;left-pad&lt;/td&gt;
&lt;td&gt;Disruption&lt;/td&gt;
&lt;td&gt;Personal decision&lt;/td&gt;
&lt;td&gt;Build failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;colors.js&lt;/td&gt;
&lt;td&gt;Damage&lt;/td&gt;
&lt;td&gt;Protest&lt;/td&gt;
&lt;td&gt;Service outages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;litellm/axios&lt;/td&gt;
&lt;td&gt;Infiltration&lt;/td&gt;
&lt;td&gt;Organized attack&lt;/td&gt;
&lt;td&gt;Credential theft, remote control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Russ Cox warned about this in 2019 in &lt;a href=&quot;https://research.swtch.com/deps&quot;&gt;Our Software Dependency Problem&lt;/a&gt;: &quot;Software dependencies are part of the software supply chain, and supply-chain security is determined by the weakest link.&quot; It sounded like a theoretical warning back then. Seven years on, the warning is reality.&lt;/p&gt;
&lt;p&gt;I used to fear a dependency breaking on me. Now I fear a dependency breaking me.&lt;/p&gt;
&lt;h2&gt;My Tools: Superpowers and Zero Dependency&lt;/h2&gt;
&lt;h3&gt;4-1. Why I picked Superpowers&lt;/h3&gt;
&lt;p&gt;I introduced this in a &lt;a href=&quot;https://flowkater.io/posts/2026-02-08-superpowers-introduction/&quot;&gt;previous post&lt;/a&gt;, but Superpowers is a skill framework that gives AI coding agents like Claude Code or Codex a systematic development workflow. It enforces the flow of question → design → plan → TDD → code review automatically, without any commands. I adopted it because it bundles together the interview command, TDD skill, and code-review skill I&apos;d been building separately into a single structure.&lt;/p&gt;
&lt;p&gt;Honestly, &quot;zero dependency&quot; wasn&apos;t on the list of reasons I picked Superpowers. The workflow matched how I work, the skill structure was intuitive, and the brainstorm → plan → execute flow lined up with the development process I aim for. After the litellm/axios incidents I went back into the Superpowers code, and there it was: a concrete answer to the question &quot;how should you design good open source?&quot;&lt;/p&gt;
&lt;h3&gt;4-2. Proof in code: 354 lines of server.cjs&lt;/h3&gt;
&lt;p&gt;Superpowers ships with a local web server used during brainstorming sessions. It serves HTML to a browser, sends real-time updates over WebSocket, and watches files for changes. Anyone who&apos;s done web work knows the usual stack for this kind of feature: Express (HTTP server), ws (WebSocket), chokidar (file watcher). And installing those three drags hundreds of sub-packages into &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That&apos;s exactly how this server started out. The &lt;a href=&quot;https://github.com/obra/superpowers&quot;&gt;v5.0.2 release notes&lt;/a&gt; record what happened next.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Zero-Dependency Brainstorm Server&lt;/strong&gt;
Removed all vendored node_modules — server.js is now fully self-contained.
Replaced Express/Chokidar/WebSocket dependencies with zero-dependency Node.js server using built-in &lt;code&gt;http&lt;/code&gt;, &lt;code&gt;fs&lt;/code&gt;, and &lt;code&gt;crypto&lt;/code&gt; modules.
Removed ~1,200 lines of vendored &lt;code&gt;node_modules/&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;, and &lt;code&gt;package-lock.json&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Express, chokidar, and ws plus their transitive dependencies amounted to about 1,200 lines of vendored code, all stripped out. The whole server was rewritten using only Node.js built-ins. The result is a single file, &lt;code&gt;server.cjs&lt;/code&gt;, &lt;strong&gt;354 lines long&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The Superpowers &lt;code&gt;package.json&lt;/code&gt; makes the choice obvious.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;superpowers&quot;,
  &quot;version&quot;: &quot;5.0.7&quot;,
  &quot;type&quot;: &quot;module&quot;,
  &quot;main&quot;: &quot;.opencode/plugins/superpowers.js&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No &lt;code&gt;dependencies&lt;/code&gt; field. No &lt;code&gt;devDependencies&lt;/code&gt;. As an npm package, the external dependency count is literally zero. Run &lt;code&gt;npm install&lt;/code&gt; on this project and not a single external package is added to &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now let&apos;s look at how those 354 lines actually break down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) WebSocket protocol: implementing RFC 6455 directly&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Instead of using &lt;code&gt;ws&lt;/code&gt;, this code implements the WebSocket protocol (RFC 6455) by hand. The core of WebSocket is frame encoding and decoding. Wrapping the data the server sends into binary frames, and unmasking the masked frames the client sends.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const OPCODES = { TEXT: 0x01, CLOSE: 0x08, PING: 0x09, PONG: 0x0a };
const WS_MAGIC = &quot;258EAFA5-E914-47DA-95CA-C5AB0DC85B11&quot;;

function computeAcceptKey(clientKey) {
  return crypto
    .createHash(&quot;sha1&quot;)
    .update(clientKey + WS_MAGIC)
    .digest(&quot;base64&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the WebSocket handshake. Take the &lt;code&gt;Sec-WebSocket-Key&lt;/code&gt; the client sends, append the magic string, run SHA-1, and produce &lt;code&gt;Sec-WebSocket-Accept&lt;/code&gt;. Exactly what RFC 6455 Section 4.2.2 specifies. That&apos;s what the &lt;code&gt;ws&lt;/code&gt; library does internally. Written by hand, it&apos;s five lines.&lt;/p&gt;
&lt;p&gt;Frame encoding is the same story.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function encodeFrame(opcode, payload) {
  const fin = 0x80;
  const len = payload.length;
  let header;

  if (len &amp;lt; 126) {
    header = Buffer.alloc(2);
    header[0] = fin | opcode;
    header[1] = len;
  } else if (len &amp;lt; 65536) {
    header = Buffer.alloc(4);
    header[0] = fin | opcode;
    header[1] = 126;
    header.writeUInt16BE(len, 2);
  } else {
    header = Buffer.alloc(10);
    header[0] = fin | opcode;
    header[1] = 127;
    header.writeBigUInt64BE(BigInt(len), 2);
  }

  return Buffer.concat([header, payload]);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The logic picks a 2-byte, 4-byte, or 10-byte header depending on payload length. The whole core of the WebSocket frame format fits in this one branch. Under 126, the length is packed into 7 bits. Between 126 and 65536, a 16-bit extension. Above that, a 64-bit extension.&lt;/p&gt;
&lt;p&gt;Decoding is the reverse. Client frames must be masked (RFC 6455 requires it), so a 4-byte mask key is XOR&apos;d back through the payload.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function decodeFrame(buffer) {
  if (buffer.length &amp;lt; 2) return null;
  const secondByte = buffer[1];
  const opcode = buffer[0] &amp;amp; 0x0f;
  const masked = (secondByte &amp;amp; 0x80) !== 0;
  let payloadLen = secondByte &amp;amp; 0x7f;
  let offset = 2;

  if (!masked) throw new Error(&quot;Client frames must be masked&quot;);
  // ... length parsing, mask key extraction ...

  const mask = buffer.slice(maskOffset, dataOffset);
  const data = Buffer.alloc(payloadLen);
  for (let i = 0; i &amp;lt; payloadLen; i++) {
    data[i] = buffer[dataOffset + i] ^ mask[i % 4];
  }

  return { opcode, payload: data, bytesConsumed: totalLen };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;ws&lt;/code&gt; library also gives you permessage-deflate compression, fragmentation, subprotocol negotiation, and more. Does the Superpowers brainstorm server need any of that? Does sending an HTML reload message over localhost need compression? It does not. So the implementation only covers what&apos;s actually needed. TEXT, CLOSE, PING, PONG. Four opcodes is enough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) HTTP server: no Express&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Express is gone, replaced by Node.js&apos;s built-in &lt;code&gt;http&lt;/code&gt; module. There are exactly three routed paths, so a middleware stack adds nothing.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function handleRequest(req, res) {
  touchActivity();
  if (req.method === &quot;GET&quot; &amp;amp;&amp;amp; req.url === &quot;/&quot;) {
    const screenFile = getNewestScreen();
    let html = screenFile
      ? (raw =&amp;gt; (isFullDocument(raw) ? raw : wrapInFrame(raw)))(
          fs.readFileSync(screenFile, &quot;utf-8&quot;)
        )
      : WAITING_PAGE;

    if (html.includes(&quot;&amp;lt;/body&amp;gt;&quot;)) {
      html = html.replace(&quot;&amp;lt;/body&amp;gt;&quot;, helperInjection + &quot;\n&amp;lt;/body&amp;gt;&quot;);
    } else {
      html += helperInjection;
    }

    res.writeHead(200, { &quot;Content-Type&quot;: &quot;text/html; charset=utf-8&quot; });
    res.end(html);
  } else if (req.method === &quot;GET&quot; &amp;amp;&amp;amp; req.url.startsWith(&quot;/files/&quot;)) {
    // static file serving
    const fileName = req.url.slice(7);
    const filePath = path.join(CONTENT_DIR, path.basename(fileName));
    if (!fs.existsSync(filePath)) {
      res.writeHead(404);
      res.end(&quot;Not found&quot;);
      return;
    }
    const ext = path.extname(filePath).toLowerCase();
    const contentType = MIME_TYPES[ext] || &quot;application/octet-stream&quot;;
    res.writeHead(200, { &quot;Content-Type&quot;: contentType });
    res.end(fs.readFileSync(filePath));
  } else {
    res.writeHead(404);
    res.end(&quot;Not found&quot;);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Serve the most recent HTML on &lt;code&gt;/&lt;/code&gt;. Serve static resources on &lt;code&gt;/files/*&lt;/code&gt;. Everything else, 404. That&apos;s all there is. What &lt;code&gt;app.get()&lt;/code&gt;, &lt;code&gt;app.use()&lt;/code&gt;, and &lt;code&gt;app.static()&lt;/code&gt; do under the hood is exactly this. Does a server with three routes really need a framework&apos;s middleware chain?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) File watching: no chokidar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Node.js&apos;s &lt;code&gt;fs.watch()&lt;/code&gt; is famous for behaving differently per platform. On macOS, the &lt;code&gt;rename&lt;/code&gt; event fires for both new file creation and overwriting an existing file. That&apos;s why most projects reach for &lt;code&gt;chokidar&lt;/code&gt;, which gives you cross-platform compatibility, recursive watching, stable event debouncing, and so on.&lt;/p&gt;
&lt;p&gt;But the Superpowers server has exactly one watch target. Changes to &lt;code&gt;.html&lt;/code&gt; files in the &lt;code&gt;CONTENT_DIR&lt;/code&gt; folder. One directory, one extension. In that case, attaching your own debounce timer to &lt;code&gt;fs.watch()&lt;/code&gt; is plenty.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const debounceTimers = new Map();

const watcher = fs.watch(CONTENT_DIR, (eventType, filename) =&amp;gt; {
  if (!filename || !filename.endsWith(&quot;.html&quot;)) return;

  if (debounceTimers.has(filename)) clearTimeout(debounceTimers.get(filename));

  debounceTimers.set(
    filename,
    setTimeout(() =&amp;gt; {
      debounceTimers.delete(filename);
      const filePath = path.join(CONTENT_DIR, filename);
      if (!fs.existsSync(filePath)) return;
      touchActivity();

      if (!knownFiles.has(filename)) {
        knownFiles.add(filename);
        // reset event file when a new screen is added
        const eventsFile = path.join(STATE_DIR, &quot;events&quot;);
        if (fs.existsSync(eventsFile)) fs.unlinkSync(eventsFile);
      }

      broadcast({ type: &quot;reload&quot; });
    }, 100)
  );
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;code&gt;Map&lt;/code&gt; tracks per-file debounce timers, and a &lt;code&gt;Set&lt;/code&gt; tracks known files. The macOS &lt;code&gt;rename&lt;/code&gt; double-fire problem dissolves naturally with a 100ms debounce. Recursive watching, glob patterns, symlink tracking. chokidar gives you those, and none of them are needed here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) WebSocket upgrade handshake&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The HTTP-to-WebSocket protocol upgrade is also handled by hand.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function handleUpgrade(req, socket) {
  const key = req.headers[&quot;sec-websocket-key&quot;];
  if (!key) {
    socket.destroy();
    return;
  }

  const accept = computeAcceptKey(key);
  socket.write(
    &quot;HTTP/1.1 101 Switching Protocols\r\n&quot; +
      &quot;Upgrade: websocket\r\n&quot; +
      &quot;Connection: Upgrade\r\n&quot; +
      &quot;Sec-WebSocket-Accept: &quot; +
      accept +
      &quot;\r\n\r\n&quot;
  );
  // ... frame-based communication after this
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A four-line handshake that writes an HTTP 101 directly to the socket. That&apos;s what &lt;code&gt;ws&lt;/code&gt;&apos;s &lt;code&gt;WebSocket.Server&lt;/code&gt; does inside.&lt;/p&gt;
&lt;h3&gt;4-3. Cost and value: 1,200 lines down to 354&lt;/h3&gt;
&lt;p&gt;The previous version&apos;s vendored &lt;code&gt;node_modules&lt;/code&gt; was about 1,200 lines. Express&apos;s middleware chain, chokidar&apos;s cross-platform abstraction, ws&apos;s full WebSocket spec implementation, all included. After the refactor, 354 lines. The 846 lines that disappeared weren&apos;t useless code. They were &quot;code for features this project doesn&apos;t need.&quot;&lt;/p&gt;
&lt;p&gt;Rob Pike put it this way in &lt;a href=&quot;https://go-proverbs.github.io/&quot;&gt;Go Proverbs&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;A little copying is better than a little dependency.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first time I read that, my reaction was &quot;yeah, in theory, but realistically...&quot; After looking at server.cjs, I can put a number on what &quot;a little copying&quot; actually means. WebSocket handshake, 5 lines. Frame encoding, 20 lines. Frame decoding, 30 lines. HTTP routing, 25 lines. File watching, 15 lines. Total, about 100 lines of &quot;stuff the library used to do.&quot; The other 254 lines are business logic (screen management, event handling, lifecycle management), code you&apos;d write yourself regardless of which library you picked.&lt;/p&gt;
&lt;p&gt;100 lines of &quot;copying&quot; replaced 1,200 lines of dependency. And those 100 lines are readable. If you&apos;ve read RFC 6455, you can verify this WebSocket implementation yourself. That&apos;s a different level of transparency from chasing through Express&apos;s internals to confirm the middleware chain is correct.&lt;/p&gt;
&lt;p&gt;The value of zero dependency isn&apos;t only security. It&apos;s &lt;strong&gt;readability&lt;/strong&gt;. 354 lines is something one person can sit down and read end to end. You can understand every behavior the code has. You know exactly what code runs in your project. Throw in 1,200 lines of vendored dependencies and you start leaning on the assumption that &quot;most of this is fine, no need to look.&quot; That assumption shatters when litellm or axios happens.&lt;/p&gt;
&lt;h2&gt;What Good Open-Source Design Looks Like: Code-Level Patterns&lt;/h2&gt;
&lt;p&gt;Superpowers&apos; server.cjs is one example. There are more zero-dependency projects than you might think, and they share a common set of code-level patterns. I see three layers.&lt;/p&gt;
&lt;h3&gt;Layer 1: Keep the core value outside the code&lt;/h3&gt;
&lt;p&gt;The core value of good open source isn&apos;t the code itself. It&apos;s the &lt;strong&gt;mental model&lt;/strong&gt; the code implements. Superpowers&apos; core value isn&apos;t the 354 lines of server.cjs. It&apos;s the workflow mental model: question → design → plan → TDD → review. That model lives in markdown skill files. The code is just a helper that supports it.&lt;/p&gt;
&lt;p&gt;In a structure like that, dependencies can&apos;t help shrinking. If the core value isn&apos;t in code execution, the executable code only needs to do the minimum supporting work. Not putting complex dependency-heavy features into the &quot;core value&quot; is the first design principle.&lt;/p&gt;
&lt;h3&gt;Layer 2: Keep the executable code small&lt;/h3&gt;
&lt;p&gt;When code does need to run, narrow the scope of what it does. server.cjs covers exactly one scope: a local brainstorming server. It&apos;s not trying to be a general-purpose web framework. It only implements what this single use case needs. Narrow scope means fewer features. Fewer features means a higher chance you can build it without external libraries.&lt;/p&gt;
&lt;h3&gt;Layer 3: Separate install from execution&lt;/h3&gt;
&lt;p&gt;The scariest part of the litellm incident was the auto-execution via &lt;code&gt;.pth&lt;/code&gt;. Code runs at install time. axios&apos;s &lt;code&gt;postinstall&lt;/code&gt; hook is the same shape. Good design draws a clear line between &quot;install&quot; and &quot;execute.&quot; Installing a package should mean copying files to disk, nothing more. No code should run automatically. Code should run only when the user explicitly imports it or runs a command.&lt;/p&gt;
&lt;h3&gt;Why zero dependency is possible&lt;/h3&gt;
&lt;p&gt;Let&apos;s see how those three layers play out in real projects, and what technical strategies make zero dependency possible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;zod&lt;/strong&gt;: TypeScript schema validation library. Over 30 million weekly downloads on npm. Zero dependencies. zod can run dependency-free because the TypeScript type system itself is enough to express validation logic. Runtime checks are built from plain JavaScript conditionals and type guards. No external parser engine, no code generator. Schema definition and runtime checking both ride on TypeScript&apos;s type inference. The library&apos;s job is &quot;take a JavaScript value, run conditionals on it, narrow the type if it matches,&quot; and there&apos;s no part of that which needs outside help.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nanoid&lt;/strong&gt;: unique ID generator. Zero dependencies. One file, 130 bytes gzipped. nanoid&apos;s core is a single web standard API: &lt;code&gt;crypto.getRandomValues()&lt;/code&gt;. It&apos;s built into both browsers and Node.js, gives you cryptographically secure randomness, and nanoid just encodes the output as a URL-safe string. UUID libraries often need dependencies because they have to polyfill older environments. nanoid sidesteps that by supporting only modern runtimes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;picocolors&lt;/strong&gt;: terminal coloring library. The zero-dependency alternative to &lt;code&gt;chalk&lt;/code&gt;. One file, 0.1KB bundle size. Terminal coloring is fundamentally about wrapping strings with ANSI escape sequences (&lt;code&gt;\x1b[31m&lt;/code&gt; for red, &lt;code&gt;\x1b[0m&lt;/code&gt; for reset). chalk had over 10 dependencies for color-space conversion, 256-color support, Windows console compatibility, and other extras, but most CLI tools really only use red, green, yellow, and bold. picocolors decided to support only that &quot;most,&quot; and ended up with zero dependencies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hono&lt;/strong&gt;: web framework. Multi-runtime support across Node.js, Deno, Bun, Cloudflare Workers. Zero dependencies. Hono can stay 0-dep because it uses only the Web Standard API (Request, Response, URL, Headers). Express built its own abstraction layer over Node.js&apos;s &lt;code&gt;http&lt;/code&gt; module. Hono runs on the web standard interface that all runtimes already implement. The standard, not the library, papers over runtime differences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;chi&lt;/strong&gt;: Go HTTP router. Zero dependencies. Go&apos;s standard library &lt;code&gt;net/http&lt;/code&gt; already provides a strong HTTP server, and chi just adds one routing tree (a radix tree) on top. Zero dependency is unusually common in the Go ecosystem partly because the standard library covers so much already, and partly because Rob Pike&apos;s &quot;a little copying is better than a little dependency&quot; runs through the community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sqlc&lt;/strong&gt;: a tool that compiles SQL queries into Go code. Zero runtime dependencies. ORMs generating queries and mapping results at runtime usually need reflection, code generation, and connection pooling, all of it complicated runtime machinery. sqlc flips the approach. It parses SQL at build time and generates type-safe Go code, so at runtime the standard &lt;code&gt;database/sql&lt;/code&gt; package is plenty. The complexity moved from runtime to build time.&lt;/p&gt;
&lt;p&gt;The shared traits across these projects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Narrow scope.&lt;/strong&gt; They do one thing well. They don&apos;t try to cover every case.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lean on platform built-ins.&lt;/strong&gt; Don&apos;t reimplement what the runtime already provides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&apos;t confuse extras with the core.&lt;/strong&gt; The courage to leave out &quot;nice to have&quot; features.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Vendoring and runtime evolution: structural change driven by tech&lt;/h3&gt;
&lt;p&gt;Google uses a &lt;strong&gt;vendoring&lt;/strong&gt; strategy in its large monorepos. They copy external dependency source code directly into their own repository and patch it independently afterward. The point is securing &quot;control&quot; over the dependency. Even if a package is tampered with on npm or PyPI, the vendored copy is unaffected.&lt;/p&gt;
&lt;p&gt;Bun and Deno are worth watching too. Bun bundles the bundler, transpiler, and package manager into the runtime itself. Work that used to need three external tools (webpack, babel, npm) and all their dependency trees collapses into a single runtime. Deno introduced a URL-based module system without npm from day one, and its native TypeScript support removed the need for tools like &lt;code&gt;ts-node&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The same pattern shows up in Node.js itself. Node.js 18 added a built-in &lt;code&gt;fetch()&lt;/code&gt;, which trimmed the need for an HTTP client package. Node.js 20 stabilized a built-in test runner, which trimmed the reason to install &lt;code&gt;jest&lt;/code&gt; or &lt;code&gt;mocha&lt;/code&gt; for simple tests. The bigger the runtime gets, the less need there is for external dependencies. And the fewer external dependencies, the smaller the attack surface. Regardless of any individual developer&apos;s intent, the technical infrastructure itself is evolving in the direction of fewer dependencies.&lt;/p&gt;
&lt;h2&gt;Developer Behavior Has to Change&lt;/h2&gt;
&lt;p&gt;Up to here it&apos;s been a story about design and technology. What good open source looks like, how runtimes are evolving. But no matter how many times the runtime adds &lt;code&gt;fetch()&lt;/code&gt; or how many projects pursue zero dependency, a developer&apos;s hand still types &lt;code&gt;npm install&lt;/code&gt;. Tech opens the door. Behavior actually has to walk through it.&lt;/p&gt;
&lt;h3&gt;The three layers of dependency cost&lt;/h3&gt;
&lt;p&gt;The cost of adding a dependency comes in three layers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 1, surface cost (the visible stuff).&lt;/strong&gt; Bundle size growth, longer install times, larger &lt;code&gt;node_modules&lt;/code&gt; folders. Most developers see this cost, and it&apos;s the most discussed. In practice, it&apos;s also the least important.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 2, maintenance cost (what shows up over time).&lt;/strong&gt; Version conflicts, breaking changes, deprecated API migrations, security patches. These costs accumulate as a project runs for one, two, five years. The maintenance burden of a 10-dependency project versus a 100-dependency one isn&apos;t linear. It&apos;s exponential.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 3, trust cost (invisible until something blows up).&lt;/strong&gt; Supply-chain attack exposure, maintainer departures, license changes, malicious-code injection. This is the layer litellm and axios revealed. The probability is low, but when it triggers, the damage outweighs layers 1 and 2 combined. And the more dependencies you have, the higher the probability climbs. Each dependency widens the attack surface.&lt;/p&gt;
&lt;h3&gt;When AI recommends dependencies&lt;/h3&gt;
&lt;p&gt;There&apos;s an interesting, slightly unsettling phenomenon. Ask an AI coding assistant to write code that makes an HTTP request, and a large fraction of the time you get code that imports &lt;code&gt;axios&lt;/code&gt;. Even though Node.js 18 and later ship with built-in &lt;code&gt;fetch()&lt;/code&gt;. The AI&apos;s training data is overwhelmingly axios, so the most &quot;probabilistically plausible&quot; suggestion is axios.&lt;/p&gt;
&lt;p&gt;Compared side by side:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Before: axios dependency
const { data } = await axios.get(&quot;https://api.example.com/data&quot;);

// After: built-in fetch (Node.js 18+)
const data = await fetch(&quot;https://api.example.com/data&quot;).then(r =&amp;gt; r.json());
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Is there a reason to install an external package for those two lines? If your project genuinely needs axios&apos;s interceptors, request cancellation, or automatic JSON conversion, fine. But for the majority case of a simple GET or POST, built-in &lt;code&gt;fetch()&lt;/code&gt; is plenty. The AI doesn&apos;t make that contextual judgment. It just emits the most frequent pattern from its training data.&lt;/p&gt;
&lt;p&gt;This creates a feedback loop where &quot;popular package equals good package&quot; gets stronger in the AI era. Heavy use leads to AI recommendations, AI recommendations lead to even heavier use, and heavier use raises the attack value. axios&apos;s 100M weekly downloads is also a signal to attackers: &quot;Hit here and you reach 100 million projects.&quot;&lt;/p&gt;
&lt;p&gt;That&apos;s why uncritically accepting AI-generated code is dangerous. AI doesn&apos;t check whether the package&apos;s maintainer has 2FA enabled. AI doesn&apos;t inspect what the package&apos;s postinstall hook actually does. AI just pattern-matches and emits the most common code, and the most common code is not guaranteed to be the safest code.&lt;/p&gt;
&lt;h3&gt;Checklist: six things to verify before adding a dependency&lt;/h3&gt;
&lt;p&gt;Here&apos;s a practical checklist. Before you add a new package to your project, run through at least these six items.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) Is there a built-in alternative?&lt;/strong&gt;
Check whether you&apos;re using an external package for something Node.js&apos;s &lt;code&gt;fetch()&lt;/code&gt;, &lt;code&gt;crypto&lt;/code&gt;, &lt;code&gt;test runner&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, or &lt;code&gt;url&lt;/code&gt; could already handle.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# List Node.js built-in modules
node -e &quot;console.log(require(&apos;module&apos;).builtinModules.join(&apos;\n&apos;))&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2) How deep is the dependency tree?&lt;/strong&gt;
A single direct dependency can drag in 100 transitive ones. Inspect the tree before installing.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Inspect an npm package&apos;s dependency tree
npm view &amp;lt;package&amp;gt; dependencies
# Visualize the full tree
npm ls --all
# For Python
pip show &amp;lt;package&amp;gt; | grep Requires
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3) Maintainer info and activity history?&lt;/strong&gt;
&lt;a href=&quot;https://scorecard.dev/&quot;&gt;OpenSSF Scorecard&lt;/a&gt; automatically grades the security practices of an open-source project. Maintainer 2FA usage, code-review practices, CI/CD security, branch protection rules, all scored.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Check security score with OpenSSF Scorecard
# https://scorecard.dev/ — paste your GitHub repo URL
# Or via CLI:
scorecard --repo=github.com/&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4) Are there postinstall hooks or auto-run code?&lt;/strong&gt;
The core of the axios incident was the &lt;code&gt;postinstall&lt;/code&gt; hook. Inspect the package&apos;s &lt;code&gt;scripts&lt;/code&gt; field before installing.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Check a package&apos;s install scripts
npm view &amp;lt;package&amp;gt; scripts
# Find postinstall hooks among already-installed packages
find node_modules -name &quot;package.json&quot; -exec grep -l &quot;postinstall&quot; {} \;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5) What&apos;s the &lt;a href=&quot;https://slsa.dev/&quot;&gt;SLSA&lt;/a&gt; level?&lt;/strong&gt;
Supply-chain Levels for Software Artifacts. A framework that indicates how verifiable a package&apos;s build process is. SLSA Level 3 or higher means the build process is recorded in a tamper-evident way, so even if an attacker compromises the build pipeline, you can trace it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6) How many lines if you implemented it yourself?&lt;/strong&gt;
left-pad was 11 lines. The Superpowers WebSocket handshake was 5 lines. If the cost of writing it yourself is low, it can be a better choice than adding a dependency. Remember Rob Pike&apos;s &quot;a little copying is better than a little dependency.&quot;&lt;/p&gt;
&lt;p&gt;This checklist isn&apos;t saying &quot;never use any dependency.&quot; Implementing your own crypto library is a fast path to a security disaster. Writing your own database driver is unrealistic. Asking &quot;do I really need this package, or am I adding it out of habit?&quot; alone reduces your attack surface.&lt;/p&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;npm install&lt;/code&gt; was never a convenience command. It was a trust command.&lt;/p&gt;
&lt;p&gt;The moment I type &lt;code&gt;npm install axios&lt;/code&gt;, I&apos;m declaring that I trust axios&apos;s maintainer, the maintainers of every package axios depends on, the security posture of all those maintainers&apos; accounts, the integrity of the npm registry, and every single line of code the &lt;code&gt;postinstall&lt;/code&gt; hook will run on my system. &lt;code&gt;pip install litellm&lt;/code&gt; is the same. Most of us have been running this command dozens of times a day without registering the weight of what we&apos;re trusting.&lt;/p&gt;
&lt;p&gt;354 lines is something you can read. 1,200 lines is something you can only trust.&lt;/p&gt;
&lt;p&gt;What Superpowers&apos; server.cjs shows isn&apos;t minimalism or showing off. It&apos;s a decision: &quot;I&apos;ll only put code I can understand into my project.&quot; Of course not every project should write its own 354-line implementation. That&apos;s unrealistic. What is realistic is asking, every single time, &quot;do I really need this dependency, would it be hard to write myself, do I have grounds to trust this package?&quot;&lt;/p&gt;
&lt;p&gt;Few dependencies isn&apos;t minimalism. It&apos;s reducing what I have to trust.&lt;/p&gt;
&lt;p&gt;In the end, &quot;don&apos;t reinvent the wheel&quot; is still good advice. Building the wheel yourself is a waste of time most of the time. But the adage probably needs a line added to it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t reinvent the wheel. But know what the wheel is doing in your car.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;litellm, &lt;a href=&quot;https://docs.litellm.ai/blog/security-update-march-2026&quot;&gt;Security Update — March 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sonatype, &lt;a href=&quot;https://www.sonatype.com/blog/compromised-litellm-pypi-package-delivers-multi-stage-credential-stealer&quot;&gt;Compromised litellm PyPI Package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kaspersky, &lt;a href=&quot;https://www.kaspersky.com/blog/critical-supply-chain-attack-trivy-litellm-checkmarx-teampcp/55510/&quot;&gt;Critical Supply Chain Attack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;HeroDevs, &lt;a href=&quot;https://www.herodevs.com/blog-posts/the-litellm-supply-chain-attack-what-happened-why-it-matters-and-what-to-do-next&quot;&gt;The LiteLLM Supply Chain Attack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Elastic Security Labs, &lt;a href=&quot;https://www.elastic.co/security-labs/axios-one-rat-to-rule-them-all&quot;&gt;Axios: One RAT to Rule Them All&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Huntress, &lt;a href=&quot;https://www.huntress.com/blog/supply-chain-compromise-axios-npm-package&quot;&gt;Supply Chain Compromise: Axios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sophos, &lt;a href=&quot;https://www.sophos.com/en-us/blog/axios-npm-package-compromised-to-deploy-malware&quot;&gt;Axios npm Package Compromised&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Russ Cox, &lt;a href=&quot;https://research.swtch.com/deps&quot;&gt;Our Software Dependency Problem&lt;/a&gt; (2019)&lt;/li&gt;
&lt;li&gt;Rob Pike, &lt;a href=&quot;https://go-proverbs.github.io/&quot;&gt;Go Proverbs&lt;/a&gt; (2015)&lt;/li&gt;
&lt;li&gt;David Haney, &lt;a href=&quot;https://www.davidhaney.io/npm-left-pad-have-we-forgotten-how-to-program/&quot;&gt;Have We Forgotten How to Program?&lt;/a&gt; (2016)&lt;/li&gt;
&lt;li&gt;Suckless, &lt;a href=&quot;https://suckless.org/philosophy/&quot;&gt;Philosophy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wikipedia, &lt;a href=&quot;https://en.wikipedia.org/wiki/Npm_left-pad_incident&quot;&gt;npm left-pad incident&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SLSA, &lt;a href=&quot;https://slsa.dev/&quot;&gt;Supply-chain Levels for Software Artifacts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenSSF, &lt;a href=&quot;https://scorecard.dev/&quot;&gt;Scorecard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;npm, &lt;a href=&quot;https://docs.npmjs.com/cli/v10/using-npm/scripts#best-practices&quot;&gt;Scripts Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub, &lt;a href=&quot;https://github.com/obra/superpowers&quot;&gt;obra/superpowers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Flowkater.io, &lt;a href=&quot;https://flowkater.io/posts/2026-02-08-superpowers-introduction/&quot;&gt;Introducing Superpowers&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>security</category><category>open-source</category><category>essay</category><category>supply-chain-attack</category><category>zero-dependency</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>AI Native Engineer: Taste Built on Principles</title><link>https://flowkater.io/en/posts/2026-03-23-ai-native-engineer/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-03-23-ai-native-engineer/</guid><description>Being good with AI tools doesn&apos;t make you an AI Native Engineer. Taste without principles is guesswork; principles without taste stay academic. After hitting the wall in iOS, getting blindsided as a Maker, and falling into the sorcerer&apos;s apprentice trap, I came to one conclusion: an AI-era engineer&apos;s identity isn&apos;t the toolkit, it&apos;s taste built on principles.</description><pubDate>Tue, 24 Mar 2026 15:20:00 GMT</pubDate><content:encoded>&lt;h1&gt;AI Native Engineer: Taste Built on Principles&lt;/h1&gt;
&lt;h2&gt;1. Opening&lt;/h2&gt;
&lt;p&gt;The AI-native era is here, and a lot of people are scared of it. The phrase &quot;developer collective depression&quot; doesn&apos;t feel like an exaggeration anymore. Fear of losing the job, even talk of a new Luddite movement. Should we go smash AI servers like the original Luddites did? Will the AI revolution leave every individual knowledge worker without work, with a handful of giants hoarding all knowledge production? I don&apos;t know.&lt;/p&gt;
&lt;p&gt;As I&apos;ve said in earlier posts, AI is essentially a mirror of the person using it. Strong people get stronger with it; lazy people get lazier. We&apos;ve reached the point where it&apos;s hard to imagine working without it, and yet what I see around me is that output quality still depends massively on the individual. Right now everyone&apos;s swept up in FOMO, racing to adopt new tools and reshare and repost them, but the people who actually ship results are still few.&lt;/p&gt;
&lt;p&gt;I&apos;ve worn a lot of hats (developer, lead, builder) and met a lot of people. From that experience, my own take is surprisingly optimistic. Anxiety is what shows up first, but this post is about what&apos;s beyond the anxiety. Companies will start hiring juniors again soon, and the companies that succeed in the AI era will hire too. I run more than twelve agents around the clock, every day, applying every skill and case study I can find to my own work. And yet when I stop everything and write a single thought-note on a blank page, that one note beats all of it. The agents can chew through my notes and produce a working implementation at speeds I couldn&apos;t have imagined before, but without &quot;my&quot; thought-note in the first place, what is there to start from?&lt;/p&gt;
&lt;p&gt;No matter how many times you square zero, it&apos;s still zero. An AI Native Engineer is someone who isn&apos;t zero.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://flowkater.io/posts/2026-03-01-agentic-engineering-9-skills/&quot;&gt;9 Skills of Agentic Engineering&lt;/a&gt; I covered the How, and in &lt;a href=&quot;https://flowkater.io/posts/2026-03-15-ax-organization-transformation/&quot;&gt;AX Organization Transformation&lt;/a&gt; I covered the Where. This time it&apos;s the Who: what kind of person is an AI Native Engineer? This one is the hardest to write, because in the end I have to look at myself.&lt;/p&gt;
&lt;p&gt;The How has plenty of answers already. &lt;a href=&quot;https://developers.openai.com/codex/guides/build-ai-native-engineering-team&quot;&gt;OpenAI&lt;/a&gt; laid out a Delegate-Review-Own model. &lt;a href=&quot;https://www.thoughtworks.com/perspectives/edition36-ai-first-software-engineering/article&quot;&gt;Mike Mason&lt;/a&gt; calls Context Engineering the next stage after prompt engineering. &lt;a href=&quot;https://x.com/karpathy/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt; described how spinning up agents, handing them tasks, and reviewing them in parallel has already become an engineer&apos;s daily routine. &lt;a href=&quot;https://sourcegraph.com/blog/revenge-of-the-junior-developer&quot;&gt;Steve Yegge&lt;/a&gt; orchestrated 20-30 agents in parallel and produced a million lines in a year. There&apos;s no shortage of methodology for how to use AI.&lt;/p&gt;
&lt;p&gt;What&apos;s missing is the &lt;strong&gt;Who&lt;/strong&gt;. Handling tools well is a condition, not an identity. Knowing your knife doesn&apos;t make you a chef, and being good with AI doesn&apos;t make you an AI Native Engineer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taste without principles is guesswork.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. What Got Exposed: How This Differs from the Old Engineer&lt;/h2&gt;
&lt;p&gt;I&apos;ve been writing software for fifteen years. Most of that time was spent wrestling with tools. Memorizing language syntax, learning framework conventions, configuring build systems, building deployment pipelines. There&apos;s a line in the preface to Drew Hoskins&apos;s &lt;em&gt;The Product-Minded Engineer&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The tools and languages were so hard that learning and using them was a full-time job in itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reading that, the last puzzle piece finally clicked into place.&lt;/p&gt;
&lt;p&gt;Good with Swift, you&apos;re an iOS developer. Good with React, you&apos;re a frontend developer. Good with Kubernetes, you&apos;re a DevOps engineer. The tool was the identity. &quot;What you built with&quot; mattered more than &quot;what you built.&quot; That was the era.&lt;/p&gt;
&lt;p&gt;AI has started doing that full-time job for us.&lt;/p&gt;
&lt;p&gt;Syntax? AI knows it. Frameworks? AI knows them. Build configs? AI handles them. Deployment pipelines? AI writes them. It&apos;s not perfect yet, of course. Complex legacy codebases still demand grunt work. But the direction is clear.&lt;/p&gt;
&lt;p&gt;And once that full-time job started disappearing, the things that should have mattered all along (the ones the tools were hiding) came into the foreground.&lt;/p&gt;
&lt;p&gt;It came down to user understanding, product thinking, business ownership.&lt;/p&gt;
&lt;p&gt;The data backs this up.&lt;/p&gt;
&lt;p&gt;According to the &lt;a href=&quot;https://dora.dev/research/2025/dora-report/&quot;&gt;DORA 2025 report&lt;/a&gt;, PR volume jumped 98% after AI tool adoption. Almost double. Software delivery performance, though? Flat. No change.&lt;/p&gt;
&lt;p&gt;The number stings a little, and &lt;a href=&quot;https://www.faros.ai/blog/key-takeaways-from-the-dora-report-2025&quot;&gt;Nicole Forsgren&lt;/a&gt; named exactly why. The coding &lt;strong&gt;inner loop&lt;/strong&gt; (writing code, testing, building locally) got faster. The &lt;strong&gt;outer loop&lt;/strong&gt; (review, approval, integration, deployment, security, feedback) is still the bottleneck. The real bottleneck was never coding. What we called &quot;coding productivity&quot; was a tiny slice of the full value chain.&lt;/p&gt;
&lt;p&gt;There&apos;s a colder data point too. Professor &lt;a href=&quot;https://youtu.be/WvdLd87OO9o&quot;&gt;Rem Koning at Harvard Business School&lt;/a&gt; ran an experiment giving ChatGPT to small-business founders in Kenya, and the group that was already underperforming saw their &lt;strong&gt;profits drop 10%&lt;/strong&gt; after using AI. They got plenty of advice, but they didn&apos;t have the judgment to tell good advice from bad. The group that already had judgment filtered out the bad advice and improved their numbers. Koning&apos;s takeaway: &lt;strong&gt;AI is not an equalizer. It&apos;s an amplifier.&lt;/strong&gt; Without earned insight from doing the work yourself, AI just leads you toward slop.&lt;/p&gt;
&lt;p&gt;The era of &quot;as long as you can code, you&apos;re fine&quot; hasn&apos;t ended. What&apos;s ended is the illusion that coding alone is enough. The easier the tools get, the less you can hide behind them.&lt;/p&gt;
&lt;p&gt;So what specifically has changed? Compared to the old-era engineer, three things stand out.&lt;/p&gt;
&lt;h3&gt;The expansion of responsibility&lt;/h3&gt;
&lt;p&gt;Back when I was leading a dev team, our scope of responsibility ended at delivery. Shipping accurately and quickly, that was our job. Sales and ops were always somebody else&apos;s. What I feel viscerally now is one thing: discovery matters more than delivery, and shipping one well-found thing beats shipping a hundred wrong ones. In a world where building got dramatically faster, an engineer who can&apos;t take ownership of discovery is a zero engineer.&lt;/p&gt;
&lt;p&gt;In the old days the PM asked &quot;why are we building this?&quot; on the engineer&apos;s behalf. Engineers got the spec and implemented it. That structure wasn&apos;t bad. It made sense. Tools were too hard. But now that AI has taken a big chunk of implementation, what is an engineer who doesn&apos;t know the &quot;why&quot; actually doing? Handing the spec to AI? That&apos;s a relayer, not an engineer.&lt;/p&gt;
&lt;p&gt;What does the user actually want? What&apos;s the business impact of this feature? Why is this priority set this way? The gap between engineers who get this context and engineers who don&apos;t is widening dramatically in the AI era. AI takes over the &quot;how,&quot; so an engineer who doesn&apos;t know the &quot;why&quot; has nothing left. An engineer who doesn&apos;t know the user just gets left behind.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-to-be-a-10x-engineer-interview&quot;&gt;&quot;Sam&quot;&lt;/a&gt; has been GitHub-inactive for five years and has zero social media presence. And former colleagues line up to hire him. One startup was ready to invent a new role just for him. The moment he understands a project, he breaks the whole thing down on a whiteboard. He frames delays as &quot;tradeoffs,&quot; not &quot;delays.&quot; When working with another team, he doesn&apos;t open with &quot;please do this for me,&quot; he opens with &quot;the customer is hitting this problem, can you walk me through how this system works?&quot; High-level decomposition plus customer-problem thinking, in one person. This isn&apos;t a new AI-era skill. It&apos;s what good engineers always did. Now there&apos;s nowhere left to hide if you don&apos;t.&lt;/p&gt;
&lt;h3&gt;Ten times faster learning&lt;/h3&gt;
&lt;p&gt;If AI generates ten times the code, the speed at which you read and judge that code has to be ten times faster too. To look at the 200 lines AI produced in 30 seconds and call out &quot;this is right, that&apos;s wrong, here&apos;s a perf issue,&quot; your foundation has to be solid.&lt;/p&gt;
&lt;p&gt;Basics never die. CS fundamentals, yes, and also a deep grasp of whatever tool you use, language or framework. Surface familiarity won&apos;t let you tell good AI output from bad. And if you can&apos;t tell, you stop using AI and start being dragged by it. That&apos;s not AI Native, that&apos;s AI Dependent.&lt;/p&gt;
&lt;p&gt;In the old era, going deep on one technology kept you fed for ten years. Good at Java? Java developer. Good at Golang? Backend developer. Depth was the moat. Not anymore. AI is collapsing the walls between languages. Someone who doesn&apos;t know iOS can ship an iOS app with AI&apos;s help (I&apos;m exhibit A). But that doesn&apos;t make them an &quot;iOS engineer.&quot; The gap between code that runs on the surface and code that holds up in production is still wide.&lt;/p&gt;
&lt;p&gt;So the way you learn has to change. Instead of building up brick by brick from syntax, you read what AI generated and reverse-engineer the principles. Dig into &quot;why does this code behave this way?&quot; and you naturally end up at deep understanding. AI&apos;s output becomes your textbook. You just need the eyes to read it.&lt;/p&gt;
&lt;h3&gt;The speed of judgment&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.faros.ai/blog/key-takeaways-from-the-dora-report-2025&quot;&gt;Forsgren&lt;/a&gt; pointed out that working with AI means &lt;strong&gt;reconstructing your mental model dozens of times in 30 minutes.&lt;/strong&gt; The old pace was one or two design decisions a day. Now it&apos;s dozens in half an hour.&lt;/p&gt;
&lt;p&gt;When AI offers three approaches, you decide which one fits. When AI says &quot;add a cache,&quot; you decide whether caching is actually the answer or whether the query itself is the problem. When AI proposes a refactor, you decide whether it&apos;s genuinely better design or just the same complexity wearing different clothes. All of this happens fast, back to back.&lt;/p&gt;
&lt;p&gt;Fast judgment comes from deep understanding. Someone who knows the principles can decide intuitively. &quot;This is O(n²), so it&apos;ll break under load.&quot; &quot;This structure has consistency problems in a distributed setting.&quot; &quot;This API design dumps too much responsibility on the client.&quot; Calls like these need to land in half a second, in this era.&lt;/p&gt;
&lt;p&gt;Before, if you didn&apos;t know, you could look it up. There was time. Now, to keep pace with the speed at which AI throws code at you, your gut has to fire before you can look anything up. That gut doesn&apos;t come out of nowhere. It comes from years of accumulated principles.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The essence didn&apos;t change; it just got exposed plainly. Good engineers had these three things before too. The tools were just hard enough to hide them.&lt;/p&gt;
&lt;p&gt;I might have been hiding behind tools for fifteen years. Using frameworks well, building servers well, designing solid architectures: I believed that was my craft. Not entirely wrong, but I sometimes acted like that was the whole story. There were times a user told me something was painful, and I doubled down on &quot;technically it&apos;s correct.&quot;&lt;/p&gt;
&lt;p&gt;When AI started doing that toolwork for me, the person hiding behind the tools got exposed.&lt;/p&gt;
&lt;p&gt;(And it&apos;s an uncomfortable thing to sit with.)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. The Maker&apos;s Backlash&lt;/h2&gt;
&lt;p&gt;In the &lt;a href=&quot;https://flowkater.io/posts/2026-03-15-ax-organization-transformation/&quot;&gt;earlier AX post&lt;/a&gt; I separated Maker from Closer. The Maker produces; the Closer brings outcomes home. Now let&apos;s go a level deeper, from the org to the individual.&lt;/p&gt;
&lt;p&gt;The classic Makers believed their KPIs were aligned with making things. Writing code, shipping features, opening PRs, closing sprints. The ones who coded until dawn, deployed on weekends, ran toward incidents. They were genuinely working hard.&lt;/p&gt;
&lt;p&gt;But in most IT orgs, there comes a moment when most of the Makers are judged not to be contributing directly to business KPIs. That&apos;s when the layoffs hit. Big tech let go of tens of thousands, and most of them were people who&apos;d been working hard.&lt;/p&gt;
&lt;p&gt;It&apos;s painful, but most of the time this isn&apos;t the individual&apos;s fault. It&apos;s the backlash that hits people who were hired without thought and who diligently did the work they were given.&lt;/p&gt;
&lt;p&gt;AI is accelerating that backlash. The Maker&apos;s work (writing code, implementing features) has been shown to be replaceable by AI in large part, and the wave is breaking faster than we expected.&lt;/p&gt;
&lt;p&gt;Some Makers, even in that environment, were probably already asking &quot;is this actually contributing to the org?&quot; The ones who checked the data on their own features, and were the first to say &quot;let&apos;s kill this&quot; when the metrics didn&apos;t show up. Either they left or they survived. Either way, the depth of their thinking made the next move clearer. (Not everyone gets that chance, of course.)&lt;/p&gt;
&lt;p&gt;It used to be that &quot;a Maker with a Closer mindset&quot; was a compliment. &quot;A developer who also gets the business. Impressive.&quot; Now? You can&apos;t survive without being a Closer. &lt;strong&gt;It&apos;s not praise anymore. It&apos;s a survival condition.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The faster I click-build with AI, the faster everyone else does too. The act of building itself is becoming a commodity. In an era where anyone can build, &quot;I&apos;m good at building&quot; doesn&apos;t differentiate. &lt;strong&gt;&lt;em&gt;Click&lt;/em&gt; and you have an app. That&apos;s not an edge anymore.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The love of building isn&apos;t the problem. The direction of that love has to shift.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a knock on Makers. I&apos;m one. I love building. The rush of writing code, designing architecture, opening a clean PR. That part is still good.&lt;/p&gt;
&lt;p&gt;But love doesn&apos;t change reality. We&apos;re in an era where building alone doesn&apos;t complete value. Build, deliver, validate, iterate, and only then does it become value. Someone has to own the whole arc.&lt;/p&gt;
&lt;p&gt;This is the bitterest part for me. I had Maker pride too. I believed building well was valuable in itself. Reality is colder than that.&lt;/p&gt;
&lt;p&gt;That doesn&apos;t mean technology stopped mattering. The opposite, actually. Technology matters more. Just a different kind of technology.&lt;/p&gt;
&lt;p&gt;I learned this one in my body.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. The Sorcerer&apos;s Mistake: The Paradox Where Tech Matters More&lt;/h2&gt;
&lt;p&gt;Right now I&apos;m building a backend in Golang and a client in iOS.&lt;/p&gt;
&lt;p&gt;In Golang I sometimes get lost in code-logic bugs, but I rarely get blocked by not knowing the tech itself. I jump straight to the core logic, fix things fast, and grasp AI-generated code quickly.&lt;/p&gt;
&lt;p&gt;iOS is a different story. I started native iOS development for the first time this year, and I&apos;m leaning heavily on AI. When variables don&apos;t render right in WidgetKit, when layouts don&apos;t come out the way I want, my native iOS skills aren&apos;t strong enough, so I spent two or three days endlessly editing while neither AI nor I could actually fix the problem, stuck in an infinite loop. Most of it was layout issues that don&apos;t surface in code logs, or transitions that need to feel natural. Walking in without basics, from how Navigation Stack works to Liquid Glass, I got destroyed.&lt;/p&gt;
&lt;p&gt;AI throws together believable-looking output by vibe. On the happy path everything looks normal. Then you go back, the header breaks. The loading cuts out. The transition feels wrong. AI implemented everything, and somehow the result was indistinguishable from nothing being implemented at all. Every skill, every harness-engineering trick. The work was still piece by piece. I&apos;d talk through the problem with AI, reproduce it by hand, and when AI kept circling the same bug, I&apos;d try to give it the parent layout or app-wide context. Eventually one thought kept coming back: &quot;an iOS engineer would have done this in five minutes.&quot;&lt;/p&gt;
&lt;p&gt;WidgetKit, screen transitions, all of it: using technology I didn&apos;t understand cost me days. If I&apos;d been an iOS engineer, I&apos;m certain I would have fixed it in five minutes. Being able to do something doesn&apos;t mean you can do it well.&lt;/p&gt;
&lt;p&gt;A product engineer is an engineer who thinks about the end user. What AI produces is a starting point, and shaping it into something the end user is actually happy with comes down to the engineer. Principles and taste aren&apos;t opposed. The more you want to exercise taste, the more you&apos;ll find that without understanding the principles, you cannot produce real quality.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This isn&apos;t only my experience.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://htmx.org/essays/yes-and/&quot;&gt;Carson Gross&lt;/a&gt; (HTMX creator, Montana State professor) calls it the &quot;Sorcerer&apos;s Apprentice Trap,&quot; and that was exactly my situation. The Disney Fantasia scene where the apprentice enchants the broom to fetch water and loses control. (My all-time favorite Mickey episode, though Ellie says she doesn&apos;t really know it. Anyone else here who watched the Disney cartoon hour on Sunday mornings?) The relationship between AI and coding looks just like that.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If juniors don&apos;t know how to write code, they don&apos;t know how to read code. And if they can&apos;t read it, they get jerked around by the LLM.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That described my iOS problem precisely. Code is usually &lt;strong&gt;read&lt;/strong&gt; more often than it&apos;s written. So AI writes the code for you, and writing matters less? Reading matters more, then. You have to read code you didn&apos;t write, understand it, and judge it.&lt;/p&gt;
&lt;p&gt;What&apos;s scarier is the broken feedback loop. Normally, as code gets more complex, your body sends a signal first. Hands stop, head hurts, the &quot;this is too hard&quot; signal arrives. That signal forces the design simpler. With AI generation, that process disappears. AI hands over 200 lines or 2,000 lines without flinching. Complexity stacks invisibly, then explodes all at once.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LLMs don&apos;t reduce essential complexity. They just generate accidental complexity easily.&lt;/strong&gt; That&apos;s the exact distinction Fred Brooks drew in 1986 in &quot;No Silver Bullet.&quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stevekrouse.com/precision&quot;&gt;Steve Krouse&lt;/a&gt; (Val Town CEO) hit something similar from a different angle, and that overlaps my experience exactly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vibe coding gives you the illusion that your vibe is a precise abstraction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It works at first. The demo is perfect. You win the hackathon prize. Then you add features or grow the scale, and bugs sneak in at lower abstraction layers you never understood. Same as my iOS experience. Network timeouts, memory leaks, concurrency issues. In production, with users doing things you didn&apos;t expect, problems erupt at layers you never grasped.&lt;/p&gt;
&lt;p&gt;And to debug those problems, you end up needing the principles.&lt;/p&gt;
&lt;p&gt;One of Krouse&apos;s questions stayed in my head. &lt;strong&gt;&quot;Nobody talks about &apos;vibe writing.&apos;&quot;&lt;/strong&gt; Nobody seriously argues for &quot;just write by feel&quot; when it comes to writing. Good writing demands grammar, structure, and reading a lot of other writing. So why does coding get the &quot;just go by vibe&quot; treatment?&lt;/p&gt;
&lt;p&gt;Thinking it through, it comes down to &lt;strong&gt;tool knowledge versus principle knowledge.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool knowledge.&lt;/strong&gt; Swift syntax, React patterns, Kubernetes YAML, the API of a specific framework. AI can replace this. It already is. I don&apos;t memorize Swift syntax these days. Claude knows it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Principle knowledge.&lt;/strong&gt; Networking, computer architecture, OS, distributed systems, data structures, algorithms. This is what shines more in the AI era. To judge &quot;why is this code slow&quot; or &quot;why is this concurrency broken&quot; in AI-generated output, you have to know the principles.&lt;/p&gt;
&lt;p&gt;You can ask AI &quot;why is this code slow?&quot; AI might give you an answer. Whether that answer is right is up to a person who knows the principles. AI says &quot;add a cache,&quot; but the real problem is N+1 queries? Only someone who understands networking and the database can call out the difference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Engineering mindset emerges on top of engineering theory. Mindset alone doesn&apos;t build it.&lt;/strong&gt; (A product engineer is, in the end, still an engineer.)&lt;/p&gt;
&lt;p&gt;Saying &quot;this API feels slow&quot; without understanding networking is guesswork, not taste. When someone who understands TCP handshakes says &quot;this is where the latency is happening,&quot; that&apos;s taste. Saying &quot;the app feels heavy&quot; without knowing the OS is impression. When someone who knows memory management points and says &quot;there&apos;s a leak right here,&quot; that&apos;s diagnosis.&lt;/p&gt;
&lt;p&gt;Product taste has to sit on top of CS fundamentals. Order matters. Trying to grow taste without the foundation is like playing technical soccer without basic conditioning.&lt;/p&gt;
&lt;p&gt;The sorcerer&apos;s mistake lives here. AI replaces tool knowledge, so people assume &quot;tech matters less.&quot; In practice, principle knowledge matters more. The space tool knowledge used to fill has to be filled by principle knowledge.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Taste on Principles: Eval&lt;/h2&gt;
&lt;p&gt;So are principles enough?&lt;/p&gt;
&lt;p&gt;No. &lt;strong&gt;Principles without taste might make a scholar, but they don&apos;t make a good engineer.&lt;/strong&gt; A CS PhD doesn&apos;t automatically become a great engineer. Writing strong papers doesn&apos;t mean you ship strong products. Knowing the principles is necessary, not sufficient.&lt;/p&gt;
&lt;p&gt;The &quot;Bob&quot; story from Hoskins&apos;s &lt;em&gt;The Product-Minded Engineer&lt;/em&gt; illustrates the point well. Bob is a capable engineer. He knows the principles, his code is clean, his reviews are thorough.&lt;/p&gt;
&lt;p&gt;But Bob implements without scenarios.&lt;/p&gt;
&lt;p&gt;He builds what&apos;s in the spec, without asking &quot;in what real situation would the user actually use this?&quot; Bob&apos;s features work, the tests pass. And the users don&apos;t use them.&lt;/p&gt;
&lt;p&gt;&quot;Technically perfect feature, nobody uses it.&quot; I&apos;ve lived through that several times (and maybe still am).&lt;/p&gt;
&lt;p&gt;Hoskins compared engineers to &lt;strong&gt;editors&lt;/strong&gt;. Not the person who writes good sentences, but the one who cuts the unnecessary ones. The person who decides &quot;we don&apos;t need this.&quot; That&apos;s the heart of Product Architecture.&lt;/p&gt;
&lt;p&gt;AI can write code well. Whether the feature is what the user actually needs is still on the human.&lt;/p&gt;
&lt;p&gt;That judgment is what &lt;a href=&quot;https://www.anthropic.com/research/how-ai-is-transforming-work-at-anthropic&quot;&gt;Anthropic&lt;/a&gt; called &quot;taste.&quot; The thing that the people who build AI best are the slowest to hand off to AI.&lt;/p&gt;
&lt;p&gt;The word &quot;taste&quot; sounds a little mystical, though. &quot;Isn&apos;t taste innate? What if you don&apos;t have it?&quot; I felt that way at first too. Especially watching engineers around me who clearly do.&lt;/p&gt;
&lt;p&gt;Then &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/product-minded-engineer-panel&quot;&gt;Linear CTO Thomas&lt;/a&gt; answered it cleanly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Taste is not mystical. It&apos;s a craft.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Taste isn&apos;t mystical. It&apos;s a craft. It can be sharpened.&lt;/p&gt;
&lt;p&gt;The Linear team proved this. Quality Wednesday: every Wednesday the entire team hunts and fixes product defects. Subtle scroll jank, buttons misaligned by 3px, they go after the small stuff with discipline. Over two years they fixed 2,500 defects. Repeat that weekly and a &quot;always-looking-for-the-next-thing-to-fix&quot; mindset forms automatically. Taste sticks to your body like muscle that way.&lt;/p&gt;
&lt;p&gt;The way reading lots of good writing makes bad writing jump out. The way experiencing lots of good UX makes bad UX irritate you. The intuition that shows on the outside is the result of experience stacked on the inside.&lt;/p&gt;
&lt;p&gt;Taste is accumulated experience, not innate gift.&lt;/p&gt;
&lt;p&gt;I covered the &lt;a href=&quot;https://flowkater.io/posts/2026-03-01-agentic-engineering-9-skills/&quot;&gt;9 skills of agentic engineering&lt;/a&gt; in an earlier post. Writing this one, I&apos;m convinced I need to add one more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eval.&lt;/strong&gt; The judgment to evaluate what AI produces.&lt;/p&gt;
&lt;p&gt;If the nine skills are &quot;how to work with AI,&quot; Eval is &quot;how to judge AI&apos;s output.&quot; If taste is the gut feeling that says &quot;this isn&apos;t quite right,&quot; Eval is the ability to point out exactly why and propose a fix.&lt;/p&gt;
&lt;p&gt;You hand AI a UI layout. It generates code, runs the tests. All Pass. CI is green.&lt;/p&gt;
&lt;p&gt;&quot;Oh, looks good.&quot;&lt;/p&gt;
&lt;p&gt;Then you touch it on a real device, and it&apos;s a different story.&lt;/p&gt;
&lt;p&gt;The layout warps on a narrow screen. The scroll feels off. The touch target is too small for a thick finger. The text gets clipped. The animation behaves differently from intent.&lt;/p&gt;
&lt;p&gt;AI optimizes for the test cases, not for the user experience. Whether AI-generated code functions and whether it gives users a good experience are completely different things. AI can do the first. The second is still on humans, and will be for a while.&lt;/p&gt;
&lt;p&gt;The deeper problem hits when AI patches a narrow piece of the layout in a way that breaks consistency, or when development heads in entirely the wrong direction. Tests stay green, the product drifts somewhere strange. &lt;a href=&quot;https://flowkater.io/posts/2026-02-28-ai-as-smart-as-you/&quot;&gt;AI Is Only as Smart as You Are&lt;/a&gt;, that&apos;s the title of a post I wrote before, and it lands here. AI&apos;s judgment doesn&apos;t exceed mine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Is AI&apos;s All Pass also All Pass for me?&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Anyone who can ask that question is an AI Native Engineer. Not the one who relaxes when tests pass, but the one who looks with their own eyes, touches it with their own hands, and judges from the user&apos;s seat. That&apos;s Eval.&lt;/p&gt;
&lt;p&gt;And this Eval is sharper in the hands of someone who knows how networking moves, how memory is managed, how the rendering pipeline flows. Taste exercised on top of principles. That&apos;s real Eval.&lt;/p&gt;
&lt;p&gt;End-to-end ownership (from spec to deployment to user feedback) used to belong to the PO or the CEO. Developers &quot;just built what they were told.&quot; That boundary is collapsing. AI takes over &quot;building it well,&quot; so the human role left is &quot;what should we build&quot; and &quot;is it actually valuable.&quot;&lt;/p&gt;
&lt;p&gt;This can&apos;t run on individual willpower alone. If the role and responsibility aren&apos;t given, the environment isn&apos;t a good one for becoming an AI Native Engineer. &quot;You just implement this feature to spec.&quot; Eval can&apos;t grow in an org like that. No chance to meet users, no permission to look at metrics, no space to ask &quot;why are we building this?&quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6. So here I am&lt;/h2&gt;
&lt;p&gt;If you&apos;ve read this far, you&apos;re probably wondering what to do.&lt;/p&gt;
&lt;p&gt;I went through all of it. Stepped on every trap.&lt;/p&gt;
&lt;p&gt;&quot;I&apos;ll learn first, then start.&quot; I did that too. Sounds reasonable, but it was actually a declaration of not-starting. AI tools change every month. If you wait for prep to finish, you&apos;ll never start. Like swimming, you have to get in the water; reading swimming theory books won&apos;t teach you to swim. The day I caught myself saying the same thing a year later, I finally got it.&lt;/p&gt;
&lt;p&gt;I&apos;ve also opened Twitter, muttered &quot;I should be doing this too,&quot; and closed it. Anxiety can fuel action, but anxiety itself isn&apos;t a substitute for action.&lt;/p&gt;
&lt;p&gt;&quot;Maybe I&apos;ll take a course first.&quot; I thought that too at first. Then I realized AI answers my actual questions directly. The time spent watching a course is ten times less productive than just hitting the wall. Isn&apos;t it a little odd for an engineer to learn a tool by watching a lecture? (I know that sounds kkondae-ish (a patronizing senior who can&apos;t read the room). There are good courses out there too.)&lt;/p&gt;
&lt;p&gt;There was a stretch when I only communicated through code. The more AI takes over coding, the more talking with people and understanding users becomes the differentiator, and I&apos;ve been the one who froze when asked &quot;explain why we need this feature.&quot;&lt;/p&gt;
&lt;p&gt;The turn came when I started running into the wall.&lt;/p&gt;
&lt;p&gt;When I got stuck, I asked AI. When I hit an error, I pasted the error message; when I got blocked on design, I asked about architecture; when a test failed, we analyzed the failure together. The process itself was the learning. One round of grunt work beats ten courses, and I learned that with my body.&lt;/p&gt;
&lt;p&gt;I built what I actually wanted. Not &quot;someday I&apos;ll build it,&quot; but starting now. With AI, I could build it much faster than before. Building fast meant failing fast too. That, more than anything, was the opportunity.&lt;/p&gt;
&lt;p&gt;And critically, I dragged it all the way to a product with real users. A side project you alone use, and a product other people actually use, are worlds apart. The mix of unease and learning that hits the moment a user says &quot;this is uncomfortable,&quot; you have to feel that to develop product sense. AI doesn&apos;t grow that for you.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I have a soft spot for tech and for the Maker craft. Still. A new framework drops, I want to play with it; designing clean architecture makes me proud; code that runs beautifully makes me happy. (Listening to talks on extreme Golang concurrency at &lt;a href=&quot;https://flowkater.io/posts/2025-12-11-2025-gophercon-korea-review/&quot;&gt;GopherCon&lt;/a&gt; and feeling crushed in the process is a bonus.) When I see a great Maker, I respect them.&lt;/p&gt;
&lt;p&gt;But the real value-creation wasn&apos;t in any of that. However beautiful the code, if it doesn&apos;t deliver value to the user, it&apos;s self-satisfaction. All of us are only meaningful when the business actually generates value. It took me a long time to admit that.&lt;/p&gt;
&lt;p&gt;I&apos;ve watched developers dismiss users. &quot;What do users know?&quot; &quot;The plan is wrong, technically this is the right way.&quot; I&apos;ve done that too (it&apos;s embarrassing in retrospect).&lt;/p&gt;
&lt;p&gt;Looking back, that was a defense mechanism. Taking users seriously requires much higher quality. Smooth UX, server infrastructure that doesn&apos;t drop, AI features that feel natural. Take users seriously and every domain has a real challenge in it. Without confidence, the easier path is to look away. Hiding inside &quot;what&apos;s technically correct&quot; is comfortable.&lt;/p&gt;
&lt;p&gt;I&apos;ve built a lot of products. I&apos;ve had a business fail. &lt;a href=&quot;https://flowkater.io/posts/2026-01-25-no-victory-no-future/&quot;&gt;I&apos;ve experienced firsthand how an org collapses when it can&apos;t be led to a win&lt;/a&gt;. I&apos;ve watched capable people lose direction and scatter. Technically the team was excellent. We just couldn&apos;t answer the question &quot;is what we&apos;re building giving real value to users?&quot; with any clarity.&lt;/p&gt;
&lt;p&gt;That experience, more than my tech romance, is what brought me here.&lt;/p&gt;
&lt;p&gt;Loving tech and using tech to create value are different things. They&apos;re not opposed, though. I love tech, so I dig into the principles, and because I know the principles, I shine more in the AI era. Without love, principles are just textbook content.&lt;/p&gt;
&lt;p&gt;I want both. The priority shifted. Tech used to come first. Value comes first now.&lt;/p&gt;
&lt;p&gt;Am I an AI Native Engineer(?) I&apos;m not sure. The honest answer is &quot;I&apos;m becoming one.&quot; I do know the direction. Value over tech. Close over Make. User over code. Stack the principles, sharpen the taste.&lt;/p&gt;
&lt;p&gt;Right now, working with Ellie on an app, I use AI, take feedback, watch the metrics, and fix it again. Break yesterday&apos;s work today, fix today&apos;s work tomorrow. I try to judge user experience while understanding the rendering pipeline, and try to say &quot;we don&apos;t need to build this&quot; while knowing the system architecture.&lt;/p&gt;
&lt;p&gt;I&apos;m still scrambling to create value today. That&apos;s all there is.&lt;/p&gt;
&lt;p&gt;It isn&apos;t glamorous. But this is the real thing.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7. Closing: A Compass on the Accelerant&lt;/h2&gt;
&lt;p&gt;&quot;Is what you&apos;re building actually generating value?&quot;&lt;/p&gt;
&lt;p&gt;Even when I run dozens of agents through n rounds of feedback to produce a draft plan, Ellie still finds gaps. Same for this post. AI gave me a plausible draft, but in the end I rewrote most of it myself, with AI handling only some of the polish. You know the feeling. A piece written entirely by AI lands flat.&lt;/p&gt;
&lt;p&gt;However much you automate testing, you can&apos;t skip the act of using it yourself. And often, using it once and writing it up is faster than running 100 AI tests.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ntlJBU3LLL8&quot;&gt;Terry Winograd&lt;/a&gt;, the Stanford first-generation researcher who has watched AI for over half a century since SHRDLU in 1971, said this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AI is not the cause of the problem. AI is an accelerant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Coming from someone who walked through the past AI winters in person, that lands with weight. Problems that already existed are getting accelerated by AI. People running in a good direction arrive at good places faster. People running in the wrong direction hit the wall faster. What changed is the speed, not the direction.&lt;/p&gt;
&lt;p&gt;An accelerant needs a compass.&lt;/p&gt;
&lt;p&gt;That compass is taste built on principles.&lt;/p&gt;
&lt;p&gt;Taste without principles stays guesswork; principles without taste stay academic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An AI Native Engineer is someone who exercises taste on top of principles.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Someone who understands networking and can also judge user experience. Someone who knows system architecture and can also say &quot;we don&apos;t need to build this.&quot; Someone who can read code and also ask &quot;is this even the right problem?&quot;&lt;/p&gt;
&lt;p&gt;Even with the How (agentic skills), even working in the Where (an AX org), if the Who (you) isn&apos;t someone who exercises taste on top of principles, none of it means anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taste built on principles. That&apos;s the AI Native Engineer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;End-to-end ownership has always been what made a good engineer. It was true before AI, and it&apos;ll be true after. The only difference is, now it&apos;s hard to keep pretending otherwise.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Andrej Karpathy, &lt;a href=&quot;https://x.com/karpathy/status/2026731645169185220&quot;&gt;X post on AI Builders vs Coders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mike Mason / ThoughtWorks, &lt;a href=&quot;https://www.thoughtworks.com/perspectives/edition36-ai-first-software-engineering/article&quot;&gt;&quot;AI-First Software Engineering — Context Engineering&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Steve Yegge, &lt;a href=&quot;https://sourcegraph.com/blog/revenge-of-the-junior-developer&quot;&gt;&quot;Revenge of the Junior Developer&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAI, &lt;a href=&quot;https://developers.openai.com/codex/guides/build-ai-native-engineering-team&quot;&gt;&quot;Building an AI-Native Engineering Team&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Drew Hoskins, &lt;em&gt;The Product-Minded Engineer&lt;/em&gt; (O&apos;Reilly, 2025)&lt;/li&gt;
&lt;li&gt;Pragmatic Engineer, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-to-be-a-10x-engineer-interview&quot;&gt;&quot;How to Be a 10x Engineer&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DORA, &lt;a href=&quot;https://dora.dev/research/2025/dora-report/&quot;&gt;&quot;Accelerate State of DevOps Report 2025&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rem Koning / Harvard Business School, &lt;a href=&quot;https://youtu.be/WvdLd87OO9o&quot;&gt;&quot;AI Native lecture at Harvard&quot;&lt;/a&gt; — EO Korea&lt;/li&gt;
&lt;li&gt;Nicole Forsgren / Faros AI, &lt;a href=&quot;https://www.faros.ai/blog/key-takeaways-from-the-dora-report-2025&quot;&gt;&quot;Key Takeaways from the DORA Report 2025&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Terry Winograd, &lt;a href=&quot;https://www.youtube.com/watch?v=ntlJBU3LLL8&quot;&gt;Stanford Interview on AI as Accelerant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Carson Gross, &lt;a href=&quot;https://htmx.org/essays/yes-and/&quot;&gt;&quot;Yes, and... The Sorcerer&apos;s Apprentice Trap&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Steve Krouse, &lt;a href=&quot;https://stevekrouse.com/precision&quot;&gt;&quot;The Death of Code is Greatly Exaggerated&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Anthropic, &lt;a href=&quot;https://www.anthropic.com/research/how-ai-is-transforming-work-at-anthropic&quot;&gt;&quot;How AI Is Transforming Work at Anthropic&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pragmatic Engineer, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/product-minded-engineer-panel&quot;&gt;Product-Minded Engineer Panel&lt;/a&gt; — Linear CTO Thomas: &quot;Taste is not mystical. It&apos;s a craft.&quot;&lt;/li&gt;
&lt;li&gt;Linear, &lt;a href=&quot;https://linear.app/blog&quot;&gt;Quality Wednesday&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;flowkater, &lt;a href=&quot;https://flowkater.io/posts/2026-03-01-agentic-engineering-9-skills/&quot;&gt;&quot;9 Skills of Agentic Engineering&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;flowkater, &lt;a href=&quot;https://flowkater.io/posts/2026-03-15-ax-organization-transformation/&quot;&gt;&quot;AX Organization Transformation&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;flowkater, &lt;a href=&quot;https://flowkater.io/posts/2026-02-28-ai-as-smart-as-you/&quot;&gt;&quot;AI Is Only as Smart as You Are&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;flowkater, &lt;a href=&quot;https://flowkater.io/posts/2026-01-25-no-victory-no-future/&quot;&gt;&quot;No Victory, No Future&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;flowkater, &lt;a href=&quot;https://flowkater.io/posts/2025-12-11-2025-gophercon-korea-review/&quot;&gt;&quot;2025 GopherCon Korea Review&quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>AI</category><category>essay</category><category>engineering</category><category>career</category><category>AI-Native</category><category>product-engineer</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Installing Claude Code Across Your Org Doesn&apos;t Make It AX</title><link>https://flowkater.io/en/posts/2026-03-15-ax-organization-transformation/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-03-15-ax-organization-transformation/</guid><description>Rolling out an AI tool company-wide and going through an AX (AI Transformation) are two completely different things. Real AX starts when you redesign roles, KPIs, pipelines, and governance, not when you bolt AI onto a functional org.</description><pubDate>Sun, 15 Mar 2026 09:30:00 GMT</pubDate><content:encoded>&lt;h1&gt;Installing Claude Code Across Your Org Doesn&apos;t Make It AX&lt;/h1&gt;
&lt;h2&gt;1. To Start: Between Admiration and Discomfort&lt;/h2&gt;
&lt;p&gt;A LinkedIn post showed up the other day about a Korean startup rolling out Claude Code company-wide. I also saw a piece claiming OpenClaw was deployed across the whole org and productivity exploded. Given how conservative the corporate culture is here (even at startups), these moves deserve credit.&lt;/p&gt;
&lt;p&gt;Honestly, my first reaction was, &quot;Wow, that&apos;s pretty serious.&quot; I&apos;ve also bolted AI tools onto my own teams, hooked up MCP, felt the productivity bump in my own hands. But something kept nagging at me. The tools clearly got better. The way the org actually worked together didn&apos;t feel any different.&lt;/p&gt;
&lt;p&gt;Is that really AX at the org level (AI Transformation, redesigning the entire organization with AI as the baseline assumption)? Can we actually say the org &quot;adopted&quot; AI in any meaningful sense?&lt;/p&gt;
&lt;p&gt;Before Claude Code there was Notion. Before that, Google Drive. Before that, Slack. So let&apos;s get to the bottom of it. Over the past decade, did organizations adopting these tools see truly explosive productivity gains compared to before? Did those gains actually convert into business outcomes? Are there real cases where simply adopting a tool produced that kind of result?&lt;/p&gt;
&lt;p&gt;I&apos;ve written plenty about AI-native engineers. This time I want to talk about how an AI-native organization should actually be built. The gap between what we feel personally as LLM performance leaps forward, and what shows up at the org-level outcome layer.&lt;/p&gt;
&lt;p&gt;To untangle that gap, the vocabulary has to come first. The reason this distinction matters is that too many people use the same phrase, &quot;AI adoption,&quot; to mean wildly different levels of change. I think of the relationship between AI and organizations in three stages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 1. AI usage.&lt;/strong&gt; Individuals using ChatGPT, Claude, or Copilot for work. Most office workers are here. They&apos;re picking tools, tuning prompts, going &quot;huh, this is actually pretty handy.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 2. AI adoption (enablement).&lt;/strong&gt; The company writes install guides, runs training sessions, hands out access. Most of the recent buzzy cases sit here. They deploy MCP, teach non-engineers how to use it, demo workflows by job function. It&apos;s genuinely valuable work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 3. AX transformation.&lt;/strong&gt; Roles, approval flows, KPIs, pipelines, governance, and accountability all redesigned around AI as the baseline. Almost no organization has gotten this far. &lt;a href=&quot;https://www.bain.com/insights/unsticking-your-ai-transformation/&quot;&gt;Bain says &quot;treating GenAI like a tool doesn&apos;t work,&quot;&lt;/a&gt; and &lt;a href=&quot;https://www.mckinsey.com/capabilities/tech-and-ai/our-insights/superagency-in-the-workplace-empowering-people-to-unlock-ais-full-potential-at-work&quot;&gt;McKinsey notes that only 1% of organizations have reached AI maturity, with leadership being the biggest blocker.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This post is about mistaking stage 2 for stage 3. About the difference between adoption and transformation, and how (inside that gap) the roles of organizations and individuals, especially Makers (who produce) and Closers (who deliver outcomes), need to shift.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. A Good Adoption and a Good Transformation Are Not the Same&lt;/h2&gt;
&lt;p&gt;Let&apos;s read this fairly first. The recent Korean cases that drew attention genuinely did certain things well.&lt;/p&gt;
&lt;p&gt;That company removed the install barrier. They wrote OS-specific guides, deployed MCP, ran company-wide sessions. They had non-engineer colleagues do the demos themselves, building the perception that &quot;I can do this too.&quot; BX, HR, PM, finance, CX, business development: every job function got an actual workflow, and an internal survey showed every respondent said they used it almost daily.&lt;/p&gt;
&lt;p&gt;Most domestic companies still can&apos;t pull this off. That&apos;s worth real credit.&lt;/p&gt;
&lt;p&gt;There are great adoption stories abroad too. &lt;a href=&quot;https://www.morganstanley.com/press-releases/ai-at-morgan-stanley-debrief-launch&quot;&gt;Morgan Stanley embedded AI directly into its financial advisor workflow,&lt;/a&gt; connecting meeting notes to summary to email draft to Salesforce save, and the majority of advisor teams adopted it. Impressive. But as Morgan Stanley itself says, &quot;human relationships remain the core.&quot; The financial advisor&apos;s role itself didn&apos;t change. The tool got better.&lt;/p&gt;
&lt;p&gt;So we have to push the question one step further. What&apos;s the unit of change here?&lt;/p&gt;
&lt;p&gt;The PM became a faster PM. Finance became faster finance. HR became faster HR. AI accelerated the work inside each role. But did the relationship between PM and finance and HR shift? The approval flow? The KPIs? The decision-making path?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/cursor/comments/1qx0uxo/&quot;&gt;A Reddit comment&lt;/a&gt; nails this exactly: &quot;AI made the &apos;typing&apos; part instant, but it didn&apos;t solve the organizational friction. So the business sees the same velocity, even if the devs feel like wizards.&quot;&lt;/p&gt;
&lt;p&gt;Funny thing. There was a similar scene seven or eight years ago. People expected adopting Notion to make organizational knowledge flow. Adopting Slack would supposedly speed up communication. The result? Notion became per-team wikis. Slack became per-team channels. The tools changed; the structure of how information flowed didn&apos;t. The same pattern is repeating with AI tooling now.&lt;/p&gt;
&lt;p&gt;Laying down a tool and rebuilding the organization around that tool are different categories of work. &quot;But the start matters, doesn&apos;t it?&quot; Sure. I&apos;m not denying that. The point is, you can&apos;t mistake the starting line for the destination.&lt;/p&gt;
&lt;p&gt;After your org adopted AI, did the number of handoffs between PM and engineer shrink? Did approval time shrink? Did the speed of value reaching the customer go up? If the answer to any of these is &quot;no,&quot; it&apos;s still adoption, not transformation.&lt;/p&gt;
&lt;p&gt;Of course there are teams doing this well. &lt;a href=&quot;https://www.reddit.com/r/ExperiencedDevs/comments/1qq8y8u/&quot;&gt;A 10-year engineering manager&lt;/a&gt; summarized his team&apos;s full Claude Code rollout this way. They consolidated on a single agent environment. They converted existing Confluence runbooks into AI skills. They structured the codebase and architecture docs as AI context, automated ticket creation, and started catching missing requirements upfront. They had AI verify meeting notes so any tangent could be corrected immediately, and they added a new weekly &quot;AI workflow share&quot; meeting.&lt;/p&gt;
&lt;p&gt;What stands out here is that this team &lt;strong&gt;didn&apos;t just install tools.&lt;/strong&gt; Meeting structure, ticket process, doc system, weekly sync. They changed the way the work itself flowed. A small European operator said something similar: &quot;The biggest shift wasn&apos;t the tools. It was redesigning the daily workflow. Bolt AI onto the existing process and you get marginal gains at best.&quot;&lt;/p&gt;
&lt;p&gt;When you look at the places that pulled it off, a pattern shows up. They didn&apos;t succeed by laying down better tools. They succeeded by &lt;strong&gt;changing how they actually worked.&lt;/strong&gt; But that&apos;s a story about one team. Team-level transformation is doable. Org-level transformation only happens when leadership rewires the structure.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Why a Functional Org Absorbs AI and Stays the Same&lt;/h2&gt;
&lt;p&gt;The problem with a functional org isn&apos;t that it can&apos;t use AI. It&apos;s that it absorbs AI too well. Marketing inside marketing, finance inside finance, engineering inside engineering. Each function bolts on AI and gets faster. But the place that needs AX isn&apos;t inside a department. It&apos;s between departments. It&apos;s the entire value flow, not the inside of a job function.&lt;/p&gt;
&lt;h3&gt;AI Doesn&apos;t Break Silos. It Reinforces Them.&lt;/h3&gt;
&lt;p&gt;People expect AI to tear down the walls between departments. The reality can go the other way. When each department optimizes AI only for its own work, marketing builds a marketing-grade AI, customer support builds a customer-support-grade AI, and you end up with per-department AI islands while company-wide outcomes stay flat. &lt;a href=&quot;https://hbr.org/2025/09/dont-let-ai-reinforce-organizational-silos&quot;&gt;HBR points out that AI often reinforces functional silos rather than dissolving them.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bolt AI onto a functional org and the functional org doesn&apos;t disappear. It becomes a &lt;strong&gt;faster functional org.&lt;/strong&gt; That&apos;s high-speed silo-ification, accelerating territorial behavior between departments. It&apos;s not AX.&lt;/p&gt;
&lt;h3&gt;The Bottleneck Lives Between Departments, Not Inside Them&lt;/h3&gt;
&lt;p&gt;Here&apos;s something I lived through as CTO.&lt;/p&gt;
&lt;p&gt;Another department sent over a project plan that would actually move a real KPI. Once it landed in R&amp;amp;D, it slipped behind our own priorities and weeks went by. Eventually those departments routed cooperation through the CEO not as a &quot;request&quot; but as a &quot;directive,&quot; and we stopped what we were doing to start theirs. By then the launch timing had drifted way off. The market wasn&apos;t going to wait.&lt;/p&gt;
&lt;p&gt;It happened inside the same division too. The information pipeline from lead to PM to design to frontend to backend to QA wasn&apos;t smooth, more often than not. Most teams stayed inside their own KPIs (engineers ship their assigned features, for example), and so things like product polish or post-launch analysis (arguably more important than the build itself) didn&apos;t get done even between people building the same product.&lt;/p&gt;
&lt;p&gt;In the end, &quot;Why are we doing another department&apos;s work?&quot; started showing up as a complaint. I couldn&apos;t blame the team member who said it. People drift in that direction because of structural limits, and that&apos;s not on the individual.&lt;/p&gt;
&lt;p&gt;After that, the org shuffled along. Everyone got busy passing accountability around. The org itself lost initiative. Capable individuals dimmed too. Leadership grew frustrated with increasingly passive members, and the increasingly passive members grew distrustful and disappointed with the org. Maybe it was a case of the functional org&apos;s downsides taken to the extreme. But watching capable, self-driven teammates turn passive isn&apos;t a pleasant thing to sit with as a leader.&lt;/p&gt;
&lt;p&gt;(I covered more of this in &lt;a href=&quot;https://flowkater.io/posts/2026-01-25-no-victory-no-future/&quot;&gt;How Organizations That Don&apos;t Win Fall Apart&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;The problem isn&apos;t &quot;who works faster.&quot; It&apos;s &lt;strong&gt;&quot;how does the work flow.&quot;&lt;/strong&gt; No matter how much AI accelerates the work inside a department, the approval queues, handoffs, and decision delays between departments stay put. Local productivity goes up while the org&apos;s end-to-end cycle time stays the same.&lt;/p&gt;
&lt;h3&gt;Each Department Gets Better. The Company Doesn&apos;t Win More.&lt;/h3&gt;
&lt;p&gt;In a functional org, each department has its own KPI. Marketing has MQL, sales has revenue, engineering has ship velocity, support has response time. When AI shows up, each department uses it to hit its own KPI better. But company-wide outcome isn&apos;t the sum of departmental efficiencies. &lt;a href=&quot;https://www.bcg.com/publications/2026/five-things-boards-need-to-get-right-with-ai&quot;&gt;BCG warns that if compensation, evaluation, and governance keep rewarding the legacy model, transformation stalls.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The bottleneck isn&apos;t the prompt. It&apos;s the approval structure. You can install tools. You can&apos;t install accountability.&lt;/p&gt;
&lt;h3&gt;Bottom-Up Diffusion Alone Doesn&apos;t Change the Structure&lt;/h3&gt;
&lt;p&gt;A developer can write the install guide, share skills, hook up MCP, become an internal evangelist. What a developer can&apos;t do: change the headcount policy, change the eval system, redraw the boundary between departments.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-uber-uses-ai-for-development&quot;&gt;Uber is a good case in point.&lt;/a&gt; 84% of developers use agents, and 11% of PRs are opened directly by agents. By the numbers, this looks close to AX. But at the same time, AI-related costs grew 6x year over year, and at the CFO level the question of whether this connects to business impact is still open. Even cases that look like wins aren&apos;t airtight. Adoption was also slower than expected.&lt;/p&gt;
&lt;p&gt;There&apos;s data on this gap between what people feel and what&apos;s measurable. &lt;a href=&quot;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&quot;&gt;In a randomized controlled trial by METR, experienced open-source developers were given AI tools and timed on tasks. They were actually 19% slower. After the task, they reported being 20% faster.&lt;/a&gt; When this happens at the org scale, the conviction &quot;we innovated with AI&quot; gets divorced from the measurement.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/ExperiencedDevs/comments/1lml3ti/&quot;&gt;A startup founder told a story&lt;/a&gt; along the same lines. &quot;I gave my CTO Cursor and a week-long task got done in a few hours. So I gave it to the whole team. Same result didn&apos;t happen.&quot; The productivity of one person who holds the codebase context in their head, and the productivity of the whole team, are different problems.&lt;/p&gt;
&lt;p&gt;A developer can spread AI across the company. A developer can&apos;t redraw the company around AI.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. What Has to Change for It to Be Transformation: Five Axes from the Cases&lt;/h2&gt;
&lt;p&gt;In section 3 we covered the structural limit of the functional org. So what did the companies that actually crossed that limit change? Not just &quot;they use AI well.&quot; What axis of the org actually shifted? Let&apos;s read it from the cases.&lt;/p&gt;
&lt;h3&gt;A Company That Changed the Role: Shopify&lt;/h3&gt;
&lt;p&gt;The first axis of AX is &lt;strong&gt;role.&lt;/strong&gt; If AI shows up and everyone is still doing the same thing, that&apos;s adoption, not transformation.&lt;/p&gt;
&lt;p&gt;Shopify CEO Tobi Lütke set AI usage as a baseline expectation. To request a new headcount or a new resource, you first have to prove &quot;why AI can&apos;t do it.&quot; AI usage shows up in performance reviews and peer reviews. &lt;a href=&quot;https://www.theverge.com/news/644943/shopify-ceo-memo-ai-hires-job&quot;&gt;It&apos;s not encouragement. It&apos;s policy.&lt;/a&gt; Roles that used to be production-by-job-function are being redefined as supervisor, reviewer, and judge, all assuming AI does the producing. A developer can evangelize AI all day and still can&apos;t change hiring criteria, evaluation criteria, or resource allocation. A CEO can.&lt;/p&gt;
&lt;p&gt;In your org, after the AI rollout, did anyone&apos;s job description change? If not, the role axis hasn&apos;t moved.&lt;/p&gt;
&lt;h3&gt;Companies That Changed the Pipeline: Uber, DBS&lt;/h3&gt;
&lt;p&gt;The second axis is &lt;strong&gt;pipeline&lt;/strong&gt;, the path the work travels.&lt;/p&gt;
&lt;p&gt;Section 3 mentioned the limits of Uber&apos;s bottom-up adoption. The interesting part is that Uber recognized that limit and moved up to the platform level. They didn&apos;t just install Claude Code. They built an agentic system in four layers: an MCP gateway, a background agent platform called Minion, smart PR routing called Code Inbox, AI code review called uReview, automated test generation called Autocover, and large-scale migration management called Shepherd. &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-uber-uses-ai-for-development&quot;&gt;The developer workflow itself shifted from &quot;code in a single IDE&quot; to &quot;orchestrate multiple agents in parallel.&quot;&lt;/a&gt; The serial handoff of a functional org converted into a hybrid human-agent pipeline. That said, costs grew 6x, and the link to business impact is still an open problem. Changing the pipeline doesn&apos;t guarantee success.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.computerweekly.com/news/366639844/DBS-rewires-operating-models-for-AI-reasoning-era&quot;&gt;Singapore&apos;s largest bank, DBS, went one step further.&lt;/a&gt; They completed nine operating-model transitions and rebuilt their human-AI collaboration workflows. DBS calls this &quot;operating model transformation.&quot; Not just installing tools. Redesigning the path the work takes.&lt;/p&gt;
&lt;h3&gt;Companies That Changed KPIs and Governance, and Companies That Couldn&apos;t&lt;/h3&gt;
&lt;p&gt;The third and fourth axes are &lt;strong&gt;KPI&lt;/strong&gt; and &lt;strong&gt;governance.&lt;/strong&gt; They move together. If what you measure (KPI) and who has what authority (governance) don&apos;t change, no matter how much you change roles and pipelines, the org snaps back into shape.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://openai.com/index/bbva-2025/&quot;&gt;BBVA scaled AI from 3,000 people to the full 120,000-person org,&lt;/a&gt; personally training 250 executives including the CEO and bringing security, legal, and compliance in from the start. Governance wasn&apos;t bolted on later. It was baked into the rollout design. &lt;a href=&quot;https://blog.box.com/ai-first-part-1&quot;&gt;Box also explicitly designed an executive sponsor + functional ownership + central build team + AI manager structure,&lt;/a&gt; embedding AI governance into the org structure from the beginning. &lt;a href=&quot;https://www.wsj.com/articles/johnson-johnson-pivots-its-ai-strategy-a9d0631f&quot;&gt;J&amp;amp;J ran 900 AI use cases and confirmed that 10-15% of them generated 80% of the value,&lt;/a&gt; shifting weight from central governance to domain ownership. They moved from &quot;let&apos;s try a lot of things&quot; to &quot;we have to choose what to use.&quot; The strategic focus moved from usage to impact.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.modernatx.com/media-center/all-media/blogs/moderna-powered-AI&quot;&gt;Moderna defined itself as a &quot;real-time AI organization&quot;&lt;/a&gt; and hit 65% real-usage rates. The notable part is the public refusal of a model where business growth requires more headcount. CEO Stéphane Bancel said the company has to be able to run billions in revenue with thousands of people. That&apos;s a deliberate move from &quot;headcount expansion&quot; to &quot;per-person efficiency&quot; as the standard for growth.&lt;/p&gt;
&lt;p&gt;On the other side, there are clear cases of companies that couldn&apos;t touch this axis and fell apart.&lt;/p&gt;
&lt;p&gt;In 2024, Klarna trumpeted that an AI chatbot was doing the work of 700 people and emphasized headcount cuts. &lt;a href=&quot;https://www.reuters.com/business/swedens-klarna-shifts-ai-focus-cost-cuts-growth-2025-09-10/&quot;&gt;Then in 2025, the CEO admitted they &quot;leaned too hard on cost cutting&quot; and went back to hiring.&lt;/a&gt; When the KPI is bent purely toward &quot;cost cutting,&quot; automation gets mistaken for the operating model. Costs went down, service quality went down with them, and they had to hire back.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://apnews.com/article/bebc898363f2d550e1a0cd3c682fa234&quot;&gt;McDonald&apos;s × IBM tried AI voice ordering and shut it down in 2024.&lt;/a&gt; Confusion, order errors, accent recognition problems. There were technical limits, but the deeper issue was that the operation on the ground wasn&apos;t ready to run that technology. When tech and operational readiness don&apos;t move together, pipeline transformation ends as an experiment.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reuters.com/business/duolingo-raises-2025-forecast-ai-powered-subscription-garners-wider-appeal-2025-05-01/&quot;&gt;Duolingo expanded to 148 courses fast with AI and posted real business results,&lt;/a&gt; but the &quot;AI-first&quot; declaration paired with messaging about replacing contractors triggered serious backlash. Even with results, emphasizing only headcount cuts without the role-shift context loses legitimacy inside and out. Transformation without change management is half-built.&lt;/p&gt;
&lt;h3&gt;The Fifth Axis: Resource Reallocation&lt;/h3&gt;
&lt;p&gt;The last axis is &lt;strong&gt;resources.&lt;/strong&gt; The budget AX needs isn&apos;t the tool license fee. It&apos;s the cost of work redesign, change management, training, and operating-principle work. &lt;a href=&quot;https://www.bcg.com/press/26june2025-beyond-ai-adoption-full-potential&quot;&gt;BCG sums it up: &quot;real value goes to the small set of organizations that go past tool deployment and redesign how work flows.&quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.atlassian.com/blog/announcements/atlassian-team-update-march-2026&quot;&gt;Atlassian announced about a 10% workforce reduction (around 1,600 people) in March 2026,&lt;/a&gt; reinvesting in AI and enterprise sales while reorganizing around its System of Work. A clear case of &quot;we&apos;re rewiring the org itself because of AI.&quot;&lt;/p&gt;
&lt;h3&gt;Putting It Together&lt;/h3&gt;
&lt;p&gt;The common changes across these cases line up into five axes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;Functional org&lt;/th&gt;
&lt;th&gt;AX org&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Producer by job function&lt;/td&gt;
&lt;td&gt;Supervisor, reviewer, judge, exception-handler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pipeline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Serial handoff between functions&lt;/td&gt;
&lt;td&gt;Hybrid human-agent pipeline, end-to-end single team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KPI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Output volume, utilization&lt;/td&gt;
&lt;td&gt;End-to-end cycle time, decision latency, exception rate, customer outcome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Governance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-department approval and access&lt;/td&gt;
&lt;td&gt;Central data access, model permissions, risk ownership, audit logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tool license budget&lt;/td&gt;
&lt;td&gt;Work redesign, change management, training, operating principles&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If even one of these five hasn&apos;t moved, you&apos;re still in the adoption phase. You can call it transformation only when all five move together.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. What an AX Organization Actually Looks Like&lt;/h2&gt;
&lt;p&gt;We laid out five axes. But axes alone don&apos;t paint the picture. Let&apos;s sketch what a day looks different inside an org that actually went through AX.&lt;/p&gt;
&lt;h3&gt;A Project in a Functional Org vs. a Project in an AX Org&lt;/h3&gt;
&lt;p&gt;Picture a single new feature shipping in a functional org. The PM writes the spec. Hands it to design. The designer makes mockups, gets PM sign-off again. Hands it to engineering. Frontend first, backend next. QA tests, finds bugs, hands them back to engineering. After release, the data team runs the analysis. By the time results come back to the PM, a month has passed.&lt;/p&gt;
&lt;p&gt;Across this whole process, the actual work time inside each team adds up to two days. The rest is waiting, handoffs, context switching, approval queues.&lt;/p&gt;
&lt;p&gt;In an AX org, this flow is fundamentally different. A single mission-aligned team has product engineers and product designers in it together, with AI agents working as part of the pipeline. There&apos;s no separate PM writing a spec to hand off. The product engineer makes direction calls on top of AI&apos;s data analysis. The product designer makes fit calls on top of AI&apos;s drafts. AI writes the code, the engineer reviews. Tests are automated, and post-deploy analysis comes back inside the same team in real time.&lt;/p&gt;
&lt;p&gt;Break down the existing PM role and it looks like this. Spec writing? AI does it. Inter-department coordination? There are no handoffs in a mission-aligned team, so this isn&apos;t needed. Data analysis and prioritization? AI proposes, humans decide. Decision-making? That stays. But the product engineer and product designer can do that themselves. One of the biggest reasons the PM existed was to act as the bridge between departments. When the boundaries between departments melt, that part of the role shrinks.&lt;/p&gt;
&lt;p&gt;One thing not to misread: this isn&apos;t saying PMs disappear. PMs exist at companies like Shopify or Stripe too. The thing is, those PMs aren&apos;t inter-department coordinators. They&apos;re people who define customer problems and make calls on product direction. The &quot;PM who writes specs and manages handoffs&quot; in a functional org and the &quot;PM who decides what to build and owns the result&quot; in a mission-aligned team have the same title and completely different jobs. The former PM has a shrinking reason to exist in an AX org. The latter PM becomes more important.&lt;/p&gt;
&lt;p&gt;The core difference is two things. First, &lt;strong&gt;handoffs disappear.&lt;/strong&gt; The work flows inside a single team. Second, &lt;strong&gt;the human role shifts from production to judgment.&lt;/strong&gt; Every team member operates as a Closer instead of a Maker. They don&apos;t write code; they judge code quality. They don&apos;t make designs; they judge design fit. They don&apos;t write specs; they decide product direction.&lt;/p&gt;
&lt;h3&gt;Past the Product Team: Marketing, Finance, and Support All Folded In&lt;/h3&gt;
&lt;p&gt;Let&apos;s push this one step further. There&apos;s no reason to confine this logic to the product team.&lt;/p&gt;
&lt;p&gt;In a functional org, when a product launches, the marketing team plans the campaign, sales sells it, support handles inbound, and finance reconciles the revenue. Each has its own KPI and its own reporting line. To know how a feature played in the market, you have to gather data from all those teams, and that gathering itself creates more handoffs and more waiting.&lt;/p&gt;
&lt;p&gt;In an AX org, those boundaries melt. Teams form around a single customer journey or a business mission. Inside that team you have product engineers and product designers, plus growth, customer experience, and revenue analysis. Different titles, same KPI.&lt;/p&gt;
&lt;p&gt;Take a mission like &quot;80% completion rate on new-user onboarding.&quot; Inside that team, AI analyzes user behavior data, growth designs experiments, the product engineer improves the onboarding flow, and customer experience compiles feedback from churned users. All of this happens inside one team, looking at the same dashboard, discussed in the same weekly meeting.&lt;/p&gt;
&lt;p&gt;There&apos;s a reason AI makes this possible. It used to be that you had to hire a marketing specialist, a finance specialist, and a data analyst separately. Each specialist had to produce the deliverable in their own area. But when AI does the producing, one person can use AI to analyze marketing data, summarize customer feedback, and model revenue at the same time. The depth of expertise stays; the coverage widens.&lt;/p&gt;
&lt;p&gt;DBS redefining ownership of the customer journey, mentioned earlier, is exactly this model. Each customer journey belongs to a single mission-aligned team, and that team owns it end-to-end, including product, marketing, customer experience, and revenue. Uber building four layers of agentic systems is the same idea. An individual using Claude Code and an org embedding agents into the pipeline are completely different categories of thing.&lt;/p&gt;
&lt;p&gt;A functional org grouped people &lt;strong&gt;by expertise.&lt;/strong&gt; An AX org groups people and agents &lt;strong&gt;by mission.&lt;/strong&gt; That&apos;s the most fundamental difference.&lt;/p&gt;
&lt;h3&gt;The Subject of AX Is the Executive&lt;/h3&gt;
&lt;p&gt;Who can actually execute this transition? Not a developer.&lt;/p&gt;
&lt;p&gt;What a developer can do: install, share skills, hook up MCP, evangelize internally.
What a developer can&apos;t change: headcount policy, the eval system, ownership between departments, risk policy, budget allocation, KPIs.&lt;/p&gt;
&lt;p&gt;Shopify had a CEO cross that line. Uber had a platform team design governance and the cost system centrally. BBVA trained 250 executives including the CEO before going company-wide. The common thread is clear. &lt;strong&gt;AX isn&apos;t a rollout campaign. It&apos;s a redesign of management.&lt;/strong&gt; Unless an executive decides to redraw the org chart, no matter how good the tool, the functional org just stays a faster functional org.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.businessinsider.com/andrew-ng-product-management-bottleneck-coding-ai-startups-2025-8&quot;&gt;Andrew Ng says the bottleneck of the AI era isn&apos;t coding. It&apos;s product management.&lt;/a&gt; The ability to decide what to build becomes scarcer than the ability to build. The people who can make that decision sit at the top of the org.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Maker and Closer: Individual Careers Have to Shift&lt;/h2&gt;
&lt;p&gt;We sketched the picture of an AX org. Mission-aligned teams, hybrid human-agent pipelines, end-to-end with no handoffs. So who survives in that org?&lt;/p&gt;
&lt;h3&gt;When the Org&apos;s Basic Unit Changes, So Does the Talent It Needs&lt;/h3&gt;
&lt;p&gt;The problem is that marketing, finance, and engineering are separated into different teams. They have to be reorganized into mission-aligned units. Every member of that team has to focus on hitting the same KPI.&lt;/p&gt;
&lt;p&gt;Andrew Ng says the biggest bottleneck ends up being humans, specifically the people deciding the product. But in a traditional functional org, the bottleneck between organizations is creating much bigger delays and losses than the bottleneck between humans. Group people by mission, put one leader on the line for the entire end-to-end value flow. That&apos;s the shape closest to AX.&lt;/p&gt;
&lt;p&gt;Reporting lines can be plural. Outcome ownership has to be singular.&lt;/p&gt;
&lt;h3&gt;The Uncomfortable Truth: Are Current People Right for the Future Org?&lt;/h3&gt;
&lt;p&gt;Rebuilding the org costs money. A lot of money. And here&apos;s a more uncomfortable truth: organizations are starting to ask whether the current people are the right fit for the new structure, and whether the current headcount is even necessary. Those questions are the real reason new hiring slowed down.&lt;/p&gt;
&lt;p&gt;The reason hiring is cautious in the AI era isn&apos;t recession. It&apos;s that companies aren&apos;t sure of the future role structure.&lt;/p&gt;
&lt;h3&gt;Maker and Closer&lt;/h3&gt;
&lt;p&gt;Here&apos;s the distinction I want to propose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maker.&lt;/strong&gt; Whether marketing, engineering, or finance, this is the person focused on producing output in their current work. They write specs, write code, create designs, draft reports.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Closer.&lt;/strong&gt; This is the person who uses that output to actually hit a business KPI. They own the last mile from output to outcome.&lt;/p&gt;
&lt;p&gt;Closer here isn&apos;t the sales sense of closing. The point is &lt;strong&gt;how far accountability extends.&lt;/strong&gt; A Maker thinks &quot;my piece is done&quot; once the deliverable is in. A Closer goes further, evaluates whether the deliverable actually became an outcome, and owns the result. Output vs. Outcome. That&apos;s the difference.&lt;/p&gt;
&lt;p&gt;Put it in behavior. A Closer is someone who can stop the work by saying &quot;this direction is wrong.&quot; No matter how good the output, if they judge it isn&apos;t going to convert into customer outcome, they bend the direction. Calling a stop on production isn&apos;t something a Maker can do.&lt;/p&gt;
&lt;p&gt;In professional careers, Makers tend to get more recognition. But the thing keeping the business alive is the Closer.&lt;/p&gt;
&lt;p&gt;If output translated into outcome cleanly, great. But reality often doesn&apos;t work that way. You can stack up output and have all of it become useless if the goal is heading the wrong way. On the other side, there are Closers who hit the goal even with thinner output, by bending direction. A weak product that produces business results, a great product that lets the business die. These are common stories.&lt;/p&gt;
&lt;p&gt;Five or six years ago I did tech consulting for early-stage startups and met a lot of organizations. There were companies where there wasn&apos;t a single proper engineer (forget CS majors, not even a bootcamp grad), where the founder taught themselves, wrote code in shapes that shouldn&apos;t have worked, and pulled in major follow-on investment and customer growth on top of that. That founder was a terrible Maker and a top-tier Closer. On the other side, I saw plenty of engineers with truly genius-level backgrounds who got absorbed in the craft and ignored what some of them call &quot;the adult world.&quot; Perfect Makers. Not Closers.&lt;/p&gt;
&lt;p&gt;Engineering organizations mostly leaned Maker. Designers and PMs (people who should have been Closers by nature) ended up doing Maker work too, inside shrunken authority and rigid org structures. The structure that wouldn&apos;t allow Closers couldn&apos;t produce Closers.&lt;/p&gt;
&lt;h3&gt;Are You a Maker or a Closer?&lt;/h3&gt;
&lt;p&gt;Look back at your last week. What did you produce directly? What did you make the final call on? If most of your time went into writing specs, writing code, and producing reports, you&apos;re a Maker. If you decided direction, judged priority, and owned outcomes, you&apos;re closer to a Closer.&lt;/p&gt;
&lt;p&gt;This isn&apos;t saying Maker is bad. Until now, Makers were the engine of the org. But once AI starts doing the producing, the value of being a Maker shrinks. AI writes the code. AI makes the docs. AI runs the analysis. What&apos;s left is the ability to judge &quot;what should we build&quot; and &quot;is this actually valuable to the customer.&quot;&lt;/p&gt;
&lt;h3&gt;Career Direction for the AX Era&lt;/h3&gt;
&lt;p&gt;As AX progresses, more of the Maker role gets delegated to AI. Writing code, drafting documents, making designs, analyzing data: the act of producing moves into AI&apos;s lane. In many cases the Closer role gets amplified, and inside a fully AI-native organization their decision-making becomes the only real bottleneck.&lt;/p&gt;
&lt;p&gt;For most working people, the personal career direction in an AI-native org has to shift away from Maker and toward Closer. The people who pivot their careers that way are the ones who&apos;ll still be needed in the AI era. Deep expertise in two areas plus the ability to run an end-to-end cycle: what people call π-shaped talent. Because AI handles the producing, one person&apos;s coverage can widen, which is exactly what makes π-shaped talent realistically possible for the first time.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7. Korean Organizations and AX: Why It Hasn&apos;t Moved Yet&lt;/h2&gt;
&lt;p&gt;Reading this far, you might be thinking &quot;okay, the overseas cases are nice, but Korea is different.&quot; That&apos;s true. Korea&apos;s situation is different. Different doesn&apos;t mean safe.&lt;/p&gt;
&lt;p&gt;In Korea, even in the AI era, people don&apos;t lose jobs easily. Breaking convention and building a new org structure takes a long time.&lt;/p&gt;
&lt;p&gt;But even when OpenClaw or Claude Code gets rolled out company-wide in a Korean firm, marketing is still marketing and engineering is still engineering. People say productivity exploded, but that&apos;s Maker productivity. Whether it shows up in a Closer&apos;s final outcome (revenue or business KPI) is a separate question.&lt;/p&gt;
&lt;p&gt;Take the Korean SaaS startup case from section 2 again. The rollout was a success. Six months out, what does that org look like?&lt;/p&gt;
&lt;p&gt;Engineering ships code faster with Claude Code. Marketing ships content faster with ChatGPT. Support categorizes inbound faster with AI. Everyone is faster. But the campaign-planning process between engineering and marketing is still a serial handoff: spec → approval → handoff → build. For customer feedback from support to make it into the product roadmap, it still has to move through PM → lead → sprint planning. AI came in. The way the work flows is exactly the same as before.&lt;/p&gt;
&lt;p&gt;It&apos;s true each department got more efficient inside its own work. The walls between departments stayed put. Worse, with each department optimizing its own AI tools, you ended up with per-department AI islands. The high-speed silo-ification from section 3 is exactly this picture.&lt;/p&gt;
&lt;p&gt;Why haven&apos;t Korean orgs started asking these questions yet? A few structural reasons.&lt;/p&gt;
&lt;p&gt;First, &lt;strong&gt;the functional org has roots that go too deep.&lt;/strong&gt; Most Korean tech companies have a marketing department, engineering department, and planning department as the spine of the org chart. Changing that spine requires the whole executive team to agree, and it&apos;s hard for executives who became executives inside a functional org to argue for dismantling the functional org.&lt;/p&gt;
&lt;p&gt;Second, &lt;strong&gt;the performance measurement system is output-centric.&lt;/strong&gt; Engineers are evaluated on number of releases, marketers on number of campaigns, PMs on number of specs. To shift this to &quot;you&apos;ll now be evaluated on customer outcome,&quot; you have to rebuild the eval system itself.&lt;/p&gt;
&lt;p&gt;Third, &lt;strong&gt;a culture that doesn&apos;t encourage learning and growth blocks change.&lt;/strong&gt; Pivoting into a new role requires learning, but how many companies actively encourage and support that learning? Most orgs are already maxed out just keeping up with current work.&lt;/p&gt;
&lt;p&gt;In an environment like that, most orgs slip into the easy path. If I were the person in charge, frankly, it&apos;d be more comfortable to roll out OpenClaw and announce &quot;we did AX&quot; than to commit to rebuilding people and structure. Reality grinds you down.&lt;/p&gt;
&lt;p&gt;But when newer companies grow with so-called AI-native structures from day one, can the existing companies match that speed? The fact that Korea hasn&apos;t yet felt large-scale AI-driven layoffs doesn&apos;t mean it&apos;s safe. The shock arrives later. That&apos;s all.&lt;/p&gt;
&lt;p&gt;Not every org needs to change all five axes right now. A 10-person startup is already close to a mission-aligned team and has few handoffs. AX transformation is urgent for mid-sized and larger companies where the functional org has hardened. But even small orgs need to check one thing: is the AI tool they&apos;re laying down reinforcing the existing structure, or making a new structure possible?&lt;/p&gt;
&lt;p&gt;In the end, AI will rewrite the way we work. The people who don&apos;t change inside an org that doesn&apos;t change just get overtaken by the people who do change inside an org that does.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;8. To Close: Tools Make the Start. Structure Makes the Transformation.&lt;/h2&gt;
&lt;p&gt;Planting AI across a company is a good start. Real applause to the people who created that start.&lt;/p&gt;
&lt;p&gt;But calling the start the finish makes the next step disappear.&lt;/p&gt;
&lt;p&gt;Real AX isn&apos;t bolting AI onto an existing functional org. It&apos;s redefining roles, redesigning pipelines, changing KPIs, building governance, reallocating resources. Rewiring the organization into a hybrid human-agent operating system. That&apos;s why the subject of AX isn&apos;t a developer. It&apos;s an executive.&lt;/p&gt;
&lt;p&gt;And individual careers have to shift from Maker to Closer. What AI eats is production itself. What stays with humans longer is outcome ownership and direction.&lt;/p&gt;
&lt;p&gt;I was a Maker for a long time too. There was a stretch where I believed if you wrote good code, the business would follow. Now I know better. Good output is a necessary condition, not a sufficient one. Direction has to be right for output to mean anything. Setting the direction is the Closer&apos;s job.&lt;/p&gt;
&lt;p&gt;Installing Claude Code across your org doesn&apos;t make it AX. AX starts the moment you redraw the org chart.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Bain &amp;amp; Company, &lt;a href=&quot;https://www.bain.com/insights/unsticking-your-ai-transformation/&quot;&gt;&quot;Unsticking Your AI Transformation&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;McKinsey &amp;amp; Company, &lt;a href=&quot;https://www.mckinsey.com/capabilities/tech-and-ai/our-insights/superagency-in-the-workplace-empowering-people-to-unlock-ais-full-potential-at-work&quot;&gt;&quot;AI in the Workplace: Empowering People to Unlock AI&apos;s Full Potential&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BCG, &lt;a href=&quot;https://www.bcg.com/press/26june2025-beyond-ai-adoption-full-potential&quot;&gt;&quot;Companies Must Go Beyond AI Adoption to Realize Its Full Potential&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BCG, &lt;a href=&quot;https://www.bcg.com/publications/2026/five-things-boards-need-to-get-right-with-ai&quot;&gt;&quot;Five Things Boards Need to Get Right with AI&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Harvard Business Review, &lt;a href=&quot;https://hbr.org/2025/09/dont-let-ai-reinforce-organizational-silos&quot;&gt;&quot;Don&apos;t Let AI Reinforce Organizational Silos&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Verge, &lt;a href=&quot;https://www.theverge.com/news/644943/shopify-ceo-memo-ai-hires-job&quot;&gt;&quot;Shopify CEO says no new hires without proof AI can&apos;t do the job&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Pragmatic Engineer, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-uber-uses-ai-for-development&quot;&gt;&quot;How Uber Uses AI for Development&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Business Insider, &lt;a href=&quot;https://www.businessinsider.com/andrew-ng-product-management-bottleneck-coding-ai-startups-2025-8&quot;&gt;&quot;Andrew Ng: Product Management Is the New Bottleneck&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Computer Weekly, &lt;a href=&quot;https://www.computerweekly.com/news/366639844/DBS-rewires-operating-models-for-AI-reasoning-era&quot;&gt;&quot;DBS Rewires Operating Models for AI Reasoning Era&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Morgan Stanley, &lt;a href=&quot;https://www.morganstanley.com/press-releases/ai-at-morgan-stanley-debrief-launch&quot;&gt;&quot;Launch of AI @ Morgan Stanley Debrief&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Moderna, &lt;a href=&quot;https://www.modernatx.com/media-center/all-media/blogs/moderna-powered-AI&quot;&gt;&quot;Our Journey to Becoming a Real-Time AI Organization&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reuters, &lt;a href=&quot;https://www.reuters.com/business/swedens-klarna-shifts-ai-focus-cost-cuts-growth-2025-09-10/&quot;&gt;&quot;Sweden&apos;s Klarna shifts AI focus from cost cuts to growth&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AP News, &lt;a href=&quot;https://apnews.com/article/bebc898363f2d550e1a0cd3c682fa234&quot;&gt;&quot;McDonald&apos;s ends test run of AI-powered drive-thrus with IBM&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reuters, &lt;a href=&quot;https://www.reuters.com/business/duolingo-raises-2025-forecast-ai-powered-subscription-garners-wider-appeal-2025-05-01/&quot;&gt;&quot;Duolingo raises 2025 forecast&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wall Street Journal, &lt;a href=&quot;https://www.wsj.com/articles/johnson-johnson-pivots-its-ai-strategy-a9d0631f&quot;&gt;&quot;Johnson &amp;amp; Johnson Pivots Its AI Strategy&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Atlassian, &lt;a href=&quot;https://www.atlassian.com/blog/announcements/atlassian-team-update-march-2026&quot;&gt;&quot;Team Update March 2026&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAI, &lt;a href=&quot;https://openai.com/index/bbva-2025/&quot;&gt;&quot;BBVA: Scaling AI Across 120,000 Employees&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Box, &lt;a href=&quot;https://blog.box.com/ai-first-part-1&quot;&gt;&quot;AI-First: Building the Future of Intelligent Content Management&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;METR, &lt;a href=&quot;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&quot;&gt;&quot;Measuring the Impact of AI on Experienced Open-Source Developer Productivity&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;r/cursor, &lt;a href=&quot;https://www.reddit.com/r/cursor/comments/1qx0uxo/&quot;&gt;&quot;Do you believe the claims that AI isn&apos;t improving programmer productivity?&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;r/ExperiencedDevs, &lt;a href=&quot;https://www.reddit.com/r/ExperiencedDevs/comments/1lml3ti/&quot;&gt;&quot;Did AI increase productivity in your company?&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;r/ExperiencedDevs, &lt;a href=&quot;https://www.reddit.com/r/ExperiencedDevs/comments/1qq8y8u/&quot;&gt;&quot;AI is working great for my team, and y&apos;all are making me feel crazy&quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>AI</category><category>AX</category><category>org-transformation</category><category>functional-org</category><category>essay</category><category>leadership</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Between a Working Feature and a Trustworthy Product: Building ToC Recognition</title><link>https://flowkater.io/en/posts/2026-03-13-toc-recognition-product-engineering/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-03-13-toc-recognition-product-engineering/</guid><description>A Do Work → Good → Great engineering journey building a book table-of-contents (ToC) recognition feature with Qwen 3.5 Flash. From a $2,000 pre-collection failure, through a sync API → async job system → SSE real-time streaming evolution. When the model hands you 80, the remaining 20 is engineering.</description><pubDate>Fri, 13 Mar 2026 07:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Between a Working Feature and a Trustworthy Product: Building ToC Recognition&lt;/h1&gt;
&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;The biggest source of resistance in any mobile app eventually comes down to input. For utility apps especially (anything that isn&apos;t pure content consumption), input friction is the number-one cause of churn, regardless of category. A budgeting app needs spending entries. A productivity app needs schedules and to-dos. It&apos;s all input. Models have gotten dramatically smarter in the AI era, but the user-specific data still has to come from the user.&lt;/p&gt;
&lt;p&gt;The thing is, a B2C mobile app has no way to know that user data on its own, and we&apos;re not Google or Meta sitting on a personal data trove. So even in the AI era, mobile apps still have to win on UX, and the problem of collecting user-specific data with the lowest possible friction and the highest possible accuracy is still wide open.&lt;/p&gt;
&lt;h3&gt;The moment you make users type in a table of contents, this feature is dead&lt;/h3&gt;
&lt;p&gt;I first tried to solve this problem five years ago. It was the second version of the service I&apos;m currently rebuilding. (We&apos;re on version three now.) To give users a personalized study plan, we needed the table-of-contents data (ToC) of the book or workbook they were trying to read. Page count alone gave us a similar feature, but to take it further, the ToC mattered. Common sense tells you that asking someone to type in a book&apos;s ToC by hand, on mobile no less, is an instant exit ramp.&lt;/p&gt;
&lt;h2&gt;Pre-collecting ToC data (feat. QWEN)&lt;/h2&gt;
&lt;p&gt;The first thing I tried was building a pre-collected ToC database. Long before the work I&apos;m describing in this post, I&apos;d already poured hours into it. Unlike Korean book sites, most overseas book sites (especially English-language ones, which are our current primary market) just don&apos;t surface ToC data at all. (And Korean book APIs don&apos;t expose ToC either.) On top of that, since we aren&apos;t tied to any single publisher, there was no easy way to build a generic API-based scraper.&lt;/p&gt;
&lt;p&gt;The second card I played was AI. That AI ended up being the protagonist of this post: Qwen 3.5 Flash. I built a broad ToC collection pipeline on top of it. (More on the model itself later.)&lt;/p&gt;
&lt;p&gt;I poked around qwen.ai with a handful of reference books and saw that collection actually worked surprisingly well, so I went straight into building against the LLM API directly. I started with OpenRouter. The pricing was similar and it gave me model-portability, but the Qwen models on OpenRouter were just vanilla weights with none of the toolchain options. (Vanilla model results were brutal.) I migrated to Alibaba Cloud and re-wired the API through DashScope. DashScope had the full Qwen toolchain (web_search, web_extract), and on top of those tools I could build a pipeline that pulled ToC data with reasonable accuracy.&lt;/p&gt;
&lt;p&gt;I built a pipeline where you&apos;d input an ISBN13 and it would automatically collect both the metadata and the ToC. For something like a 7-volume bundle in the test set, pulling the entire ToC at once would blow past the token limit, so I split it: collect chapters at a coarse grain first, then run a second pass for sub-chapters. The test set wasn&apos;t huge, but a pipeline that accurately collected large amounts of ToC data across many genres was finally working.&lt;/p&gt;
&lt;p&gt;I&apos;d ended up with a collector that took an ISBN13 and spat out a depth-aware ToC as JSON. I&apos;m describing it briefly here, but the LLM&apos;s inherent nondeterminism meant I needed multiple guardrails, and I think I pulled two or three all-nighters straight to get the pipeline standing.&lt;/p&gt;
&lt;p&gt;But I never got to actually run real data collection through it. The biggest problem was cost. The testing alone burned more than $2,000. That&apos;s separate from Qwen 3.5 Flash&apos;s cheap token rate. The killer was the web_search tool-calling cost. Qwen&apos;s web_search tool-calling has no built-in compact step, so every byte that flows in through web_search counts straight against your token bill. I&apos;d picked the model based on token pricing alone and never thought about toolchain or side-effect costs, so the bill caught me off guard.&lt;/p&gt;
&lt;p&gt;You can&apos;t predict what books a user will request, so you have to collect as widely as possible, and to run this at production quality you also need a periodic verification pipeline. The cost could multiply many times over. The data set you need to cover is effectively infinite (yes, there&apos;s a long tail, but if the niche data isn&apos;t there, that user bounces immediately), and the collection cost is enormous. I kicked off a full verification test through Codex and went to bed. I woke up to a bill for the equivalent of three million won. I was wrecked.&lt;/p&gt;
&lt;p&gt;I didn&apos;t quit there. I tried building custom skills inside subscription-based Codex and Claude Code, but maybe because they aren&apos;t API-mode models, the results were poor despite the much stronger underlying model performance. The client-side skills and plugins (Playwright and friends) couldn&apos;t keep up with Qwen&apos;s native toolchain on web_search. When I bolted a Playwright skill onto the GPT-5.3-Codex-Spark model, Chrome devoured all the memory and my M4 Max maxed-out MacBook locked up for the first time ever.&lt;/p&gt;
&lt;p&gt;This wasn&apos;t a pure technical failure. It was the first lesson that no technology becomes a product if you don&apos;t think about operating cost and data coverage at the same time. Three days of flailing, $2,000 in cost (billed during a weak-won stretch, which made it 3 million won), plus the fact that even with a pre-built database, niche user-specific ToCs would still be a blind spot. All of that stacked up, and I shut the project down.&lt;/p&gt;
&lt;h2&gt;Letting users do the recognition themselves&lt;/h2&gt;
&lt;h3&gt;In the end, the user inputs it&lt;/h3&gt;
&lt;p&gt;After paying a fairly steep tuition, I landed back at square one. &quot;The user inputs it.&quot; Second-best, but not a bad call. Obviously asking users to type in every line of the ToC is absurd. OCR has gotten a lot better, so the user can just take a photo. As a bonus, that data becomes their own.&lt;/p&gt;
&lt;p&gt;The problem wasn&apos;t text input. It was structure input. A ToC isn&apos;t a flat text list, it&apos;s a graph of nodes with depth levels. Snapping a photo doesn&apos;t get iOS VisionKit to recognize the structure. Compared to older OCR models, raw text recognition was strong, and it could even handle moderately structured documents. But that &quot;moderately&quot; produced the worst possible experience for the user.&lt;/p&gt;
&lt;h3&gt;Why this didn&apos;t work before LLMs&lt;/h3&gt;
&lt;p&gt;Like I said, this wasn&apos;t my first attempt. Five years ago I tried OCR + normalization in a handful of ways. The OCR libraries and services back then could already pull a flat list. But what I actually needed was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part / Chapter / Section (and possibly more depth)&lt;/li&gt;
&lt;li&gt;depth&lt;/li&gt;
&lt;li&gt;page&lt;/li&gt;
&lt;li&gt;hierarchy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I needed wasn&apos;t a slab of text but a hierarchy.&lt;/p&gt;
&lt;p&gt;Back then I also tried using language models to build a classification system. Compared to today, we were in the very early days of language modeling. Transformers and attention had just started showing up in real products, so I tried building a language model on GCP&apos;s ML platform by collecting as much ToC data as I could. The idea was to feed a flat-list ToC into the language model so it could learn each item&apos;s distinctive pattern, then return a structure given a flat text list. But once the text was already converted to a flat list, the model had to infer the hierarchy from scratch, and between case diversity and lack of training data, it couldn&apos;t solve the problem at all.&lt;/p&gt;
&lt;p&gt;Line breaks, indentation, numbering schemes, mixed Roman/Arabic numerals (every structural signal you&apos;d want) all got flattened the moment OCR touched them. The extra requirement of matching page numbers, I never even attempted.&lt;/p&gt;
&lt;p&gt;The hard part of ToC recognition wasn&apos;t OCR text accuracy. It was structuring. Not reading characters but reading the hierarchy between characters. And solving it solo back then was an extremely inefficient use of time. The ROI just wasn&apos;t there.&lt;/p&gt;
&lt;h3&gt;Why it works now&lt;/h3&gt;
&lt;p&gt;Major models like GPT, Claude, and Gemini have gotten enormously better. The reason it&apos;s still hard to ship a real AI-powered service is API cost. I subscribe to the $200 GPT Pro plan, but if I&apos;d been paying for the same Codex usage at API metered rates, I&apos;d be staring at a bill in the thousands of dollars.&lt;/p&gt;
&lt;p&gt;Most people overlook this. Because we&apos;re always running on SOTA models, people say things like &quot;&lt;a href=&quot;https://flowkater.io/posts/2026-03-01-agentic-engineering-9-skills/&quot;&gt;agentic engineering&lt;/a&gt; matters, prompt engineering doesn&apos;t.&quot; But if you&apos;re wiring an LLM API into a real product and need the unit economics to work, you cannot use a SOTA model. You&apos;re stuck with API models from one or two generations back. All of this comes down to cost.&lt;/p&gt;
&lt;p&gt;On February 23, 2026, Alibaba Cloud announced Qwen 3.5. As part of that release they shipped Qwen 3.5 Flash. The Pro model is usually compared to Claude Sonnet, and Flash sits well below Pro. Multi-turn performance falls off a cliff, and like older-generation models, it answers single requests well. But on top of the web_search and web_extract tools I mentioned earlier, Vision was also baked in. For simple tasks, it&apos;s blazingly fast and accurate, with API cost that&apos;s overwhelmingly cheaper than the competition. (Chinese-origin models raise privacy concerns, but Qwen also ships local open-source weights separately.)&lt;/p&gt;
&lt;h4&gt;Why Qwen 3.5 Flash&lt;/h4&gt;
&lt;p&gt;Below is a comparison of each vendor&apos;s lightweight (Flash/mini/nano) line. Same-tier comparison feels fair. (Official pricing as of February 2026.)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Claude Haiku 4.5&lt;/th&gt;
&lt;th&gt;GPT-5-nano&lt;/th&gt;
&lt;th&gt;Gemini 3 Flash&lt;/th&gt;
&lt;th&gt;Qwen 3.5 Flash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lightweight (Haiku)&lt;/td&gt;
&lt;td&gt;Lightweight (nano)&lt;/td&gt;
&lt;td&gt;Lightweight (Flash)&lt;/td&gt;
&lt;td&gt;Lightweight (Flash)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Input (per 1M tokens)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1.00&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Output (per 1M tokens)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;td&gt;$3.00&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vision (image recognition)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Sufficient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Structured JSON output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Sufficient (single-request)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Very fast&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Very fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-turn performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Drops off sharply&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Looking at the table alone, GPT-5-nano has a unit-price edge over Qwen on Input.
But real operating cost doesn&apos;t come down to Input pricing alone. If structured JSON output quality is poor, you accumulate retries, post-processing, and fallback calls to other models, and that piles up as hidden cost. For this task, GPT-5-nano&apos;s structured output was only &quot;Good,&quot; while Qwen 3.5 Flash delivered structured output stable enough to pass actual production tests on a single-request basis. Since the core pattern wasn&apos;t a complex multi-turn dialogue but rather &quot;send one image, receive one structured JSON,&quot; that gap was decisive.&lt;/p&gt;
&lt;p&gt;The ToC recognition workflow doesn&apos;t demand multi-turn either.
The user takes a photo of a book or workbook page, and the system needs to receive that image once and produce a JSON ToC structure. In this scenario, the reliability of a single &quot;vision + structured output&quot; shot matters far more than multi-turn reasoning. Qwen 3.5 Flash gave us results that were more than satisfactory on this single-request + structured-output combo against same-tier models, and that became the core argument for choosing it. (This doesn&apos;t mean Qwen Flash is the best at every task, just that it was a strong fit for this specific one.)&lt;/p&gt;
&lt;p&gt;Speed matters too.
When a user takes a camera shot of a page and waits for the result, response time &lt;em&gt;is&lt;/em&gt; UX. With the same image, Haiku 4.5 took roughly 10 to 15 seconds, while Qwen 3.5 Flash returned in 5 to 8 seconds. Nearly twice as fast in feel. On cost, Qwen Flash also sits comfortably on the cheap end of the lightweight tier. Measured against this task&apos;s requirements (lightweight, cheap, fast, single-request structured output), it was harder to find a reason &lt;em&gt;not&lt;/em&gt; to use Flash.&lt;/p&gt;
&lt;p&gt;The remaining worry was OCR/vision quality.
Honestly, I was skeptical at first that a Flash-tier vision model could handle real book photos with uneven lighting, page curvature, and tiny print. The actual tests showed that text recognition itself was practical. The harder question wasn&apos;t recognition rate but &quot;how do you structure and emit it,&quot; and that part was prompt design and post-processing territory. When the model gives you 80, you fill in the remaining 20 with engineering. (That sentence is the thesis of this whole post.)&lt;/p&gt;
&lt;h4&gt;Why DashScope&lt;/h4&gt;
&lt;p&gt;I started by wiring it through OpenRouter. Same model, brutal results. Turns out it was a completely different beast from running DashScope native. With the vanilla model, the same prompt produced unusable output, but on DashScope, web_search, web_extract, and Vision were all attached as native toolchain. The fact that the same model could feel that different across platforms was a shock. It had been the deciding factor for the collection pipeline, and it was the same story for the recognition pipeline.&lt;/p&gt;
&lt;p&gt;It ran reliably, and the cost was predictable. DashScope has clear region-by-region pricing and a free quota. The scariest thing about wiring an LLM API into a commercial service is &quot;I don&apos;t know what this month&apos;s bill will be.&quot; DashScope had less of that uncertainty. The Singapore region has the latest models available immediately, so I knew what each call would cost.&lt;/p&gt;
&lt;p&gt;Stability was the other reason. Alibaba Cloud is an infrastructure company and DashScope is a service layer on top of it, so at minimum I could worry less about the API just disappearing. Add an extra proxy layer and you add an extra failure point. I&apos;d already lived through one OpenRouter to DashScope migration during the collection phase, so this time I went straight to DashScope.&lt;/p&gt;
&lt;p&gt;If you&apos;re considering an LLM API integration, it&apos;s worth testing this. Beyond the US-origin SOTA models, China-origin models like Kimi, Qwen, and GLM are worth a look. The fact that the same model can produce completely different results depending on the platform you run it on is something you only learn by experiencing it firsthand.&lt;/p&gt;
&lt;h2&gt;From a working feature to a trustworthy product (build log)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The rest is the actual development flow. You don&apos;t need to follow every technical detail. But I hope you walk away with a feel for &lt;em&gt;why this had to be this complicated&lt;/em&gt;. What I really want to convey isn&apos;t the technical detail itself, it&apos;s how far the distance is from &quot;it works&quot; to &quot;you can trust it.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Do Work: wired up the sync API first&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;At least the parsing works.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I didn&apos;t build the right structure from day one. I built a working version first.&lt;/p&gt;
&lt;p&gt;I started with the simplest possible flow. iOS takes a photo and uploads the image to the server. The server sends the image to the DashScope API, gets the JSON back synchronously, and pipes it down to iOS. The prompt included bookTitle and totalPages as hints. Telling the model the book title gives it more context, and telling it the total page count makes page-number inference more accurate. A small hint like that turned out to make a surprisingly large difference in result quality.&lt;/p&gt;
&lt;p&gt;I still remember how the first test felt. I sent in a single photo and looked at the JSON that came back, and the Chapter, Section, depth, and startPage were all picked up pretty cleanly. The &quot;wait, this actually works?&quot; moment. After burning $2,000 on the pre-collection pipeline, that moment was honestly emotional.&lt;/p&gt;
&lt;h4&gt;Multi-image mattered more than I expected&lt;/h4&gt;
&lt;p&gt;At first I assumed &quot;one photo and we&apos;re done.&quot; But when you actually open a real book&apos;s ToC, more often than not it doesn&apos;t fit on one page. Technical books and workbooks especially can spread their ToC across 5 to 6 pages (one book in the test set was 10 pages). Multi-image parsing wasn&apos;t optional. Without it, the feature was unusable.&lt;/p&gt;
&lt;p&gt;The catch is that merging the parse results from multiple images isn&apos;t a simple concat.&lt;/p&gt;
&lt;p&gt;First, you have to &lt;strong&gt;preserve image order&lt;/strong&gt;. There&apos;s no guarantee the user shot page 1 first.&lt;/p&gt;
&lt;p&gt;Second, you need &lt;strong&gt;chapter merging&lt;/strong&gt;. The last chapter of image A and the first chapter of image B might be the same chapter. Chapter 3 might start at the end of the first photo and continue with sub-sections in the second. Treat that as a duplicate and you get two chapters. Ignore it and you lose the sections.&lt;/p&gt;
&lt;p&gt;Third, &lt;strong&gt;dedupe and startPage-based sorting&lt;/strong&gt;. The same chapter can appear in multiple images, and page numbers can overlap.&lt;/p&gt;
&lt;p&gt;Fourth, &lt;strong&gt;warning handling&lt;/strong&gt;. If the model judges that an uploaded image isn&apos;t actually a ToC, it has to return not_toc. If chapter count is abnormally low, it has to surface too_few_chapters. If it had to force-adjust page order, it should send page_order_adjusted. Without those warnings, a quietly returned result means the user ends up using bad data.&lt;/p&gt;
&lt;p&gt;The moment multi-image entered the picture, prompt design, merge logic, dedupe rules, sorting algorithms, and the warning system all jumped a level in complexity. It didn&apos;t take long to realize how naive &quot;one photo and we&apos;re done&quot; had been.&lt;/p&gt;
&lt;h4&gt;It worked, but it wasn&apos;t a product&lt;/h4&gt;
&lt;p&gt;The feature ran. Send three images, get a merged ToC JSON back. Accuracy was decent. But there was a fatal problem. Three images meant tens of seconds before the model responded. During that time, the HTTP connection stayed open, a server worker stayed pinned, and the user stared at a blank screen.&lt;/p&gt;
&lt;p&gt;Worse was the timeout. On mobile, holding an HTTP connection for over 30 seconds got you dropped depending on network conditions. Dropped meant starting from scratch. The model invocation cost was already spent and the result was gone.&lt;/p&gt;
&lt;p&gt;This is a feature, not a product. At a demo people might say &quot;oh wow,&quot; but ship it to real users and they&apos;ll use it once and never again.&lt;/p&gt;
&lt;h3&gt;Good: splitting it into an async parse-job, finally felt product-shaped&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It becomes a feature you can wait on.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sync requests were stressful for both server and user. I couldn&apos;t shrink model latency. So I had to change &lt;em&gt;how&lt;/em&gt; you wait.&lt;/p&gt;
&lt;h4&gt;Evolving into a job system&lt;/h4&gt;
&lt;p&gt;I switched to a parse-jobs async model. The flow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Client uploads images and requests parsing&lt;/li&gt;
&lt;li&gt;Server immediately creates a job and returns a jobId (under a second up to here)&lt;/li&gt;
&lt;li&gt;Actual parsing runs on a background worker&lt;/li&gt;
&lt;li&gt;Client polls status periodically using the jobId&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That switch alone changed the user experience drastically. Sending the request now returns &quot;accepted&quot; instantly, and the app can render a &quot;processing&quot; UI. The feature evolved from &quot;model invocation&quot; into a &quot;job system.&quot;&lt;/p&gt;
&lt;h4&gt;Deduplication, not just async-ification&lt;/h4&gt;
&lt;p&gt;Going async wasn&apos;t the only change. If a job was already in flight or completed for the same image set, I reused the existing job instead of creating a new one.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The user accidentally sends the same photo twice → 2x model cost&lt;/li&gt;
&lt;li&gt;Network issues cause the app to retry → two duplicate jobs&lt;/li&gt;
&lt;li&gt;The user wants to see &quot;that result from earlier&quot; → just look up the existing one and return it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether the result was new or reused, the client got 200 either way, with the reused flag spelled out. The client only needs to know &quot;I got 200, so I can take the jobId and start querying status.&quot; (Debugging needs the flag, so we keep it visible there.)&lt;/p&gt;
&lt;p&gt;This is a decision tied directly to cost. LLM API calls aren&apos;t free. Run this without dedup and your costs become unpredictable.&lt;/p&gt;
&lt;h4&gt;Failure contracts: being good only on the happy path isn&apos;t enough&lt;/h4&gt;
&lt;p&gt;On the iOS side, I didn&apos;t stop at &quot;show it on success.&quot; The failure contract had to be explicit.&lt;/p&gt;
&lt;p&gt;If we don&apos;t get HTTP 200, fall back to the local path. The app has to keep working even when the server is down. Showing the user a &quot;server error&quot; message is the worst option. Better to offer &quot;automatic recognition failed, please input it manually&quot; as an alternative. (Sure, manual input is the worst UX, but it beats showing a raw error message.)&lt;/p&gt;
&lt;p&gt;We were lucky to have Apple VisionKit sitting on-device as a local MLKit, so even the fallback was a notch better than pure manual input. (It can&apos;t structure things, of course.)&lt;/p&gt;
&lt;p&gt;A backend isn&apos;t a service that&apos;s &quot;fine when things are fine.&quot; &lt;strong&gt;You have to agree on how the client reacts when things fail too.&lt;/strong&gt; That isn&apos;t an API spec. It&apos;s a product contract.&lt;/p&gt;
&lt;h4&gt;Good, but still not enough&lt;/h4&gt;
&lt;p&gt;If Do Work was &quot;a feature that runs,&quot; Good was the stage where it became &quot;a feature you can wait on.&quot; But the user still saw nothing during that wait, with no idea when it would end. Polling that only said &quot;still processing&quot; wasn&apos;t an experience worth shipping in 2026.&lt;/p&gt;
&lt;p&gt;I could have stopped at &quot;this is good enough.&quot; Plenty of services do stop here. But what do you do with the time the user spends waiting? That, to me, is what separates Good from Great.&lt;/p&gt;
&lt;h3&gt;Great: real-time experience, load distribution, operational risk all baked in, and finally production&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It becomes a product experience you can trust.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Adding SSE turned the feature into an experience&lt;/h4&gt;
&lt;p&gt;Polling had clear limits. The user has no idea &quot;where we are right now.&quot; Tight polling intervals raise server load. Loose intervals raise perceived delay.&lt;/p&gt;
&lt;p&gt;So I introduced SSE (Server-Sent Events). The client opens a connection and the server pushes events in real time.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;snapshot&lt;/strong&gt;: full current state at connect time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;status&lt;/strong&gt;: job state changes (queued → processing → completed/failed)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;preview&lt;/strong&gt;: progressively recognized ToC structure as parsing runs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;heartbeat&lt;/strong&gt;: signal that the connection is alive&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;usage&lt;/strong&gt;: token-usage and other meta info&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;completed&lt;/strong&gt;: final result confirmed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;failed&lt;/strong&gt;: failure and error info&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The biggest UX win was preview. It shows the model recognizing the ToC in real time. Chapter 1 appears first, Section 1.1 nests underneath, the next Chapter is added. Like ChatGPT streaming an answer character by character, the ToC progressively assembles itself in front of you. The moment that landed, the &quot;feature&quot; became an &quot;experience.&quot; The wait shifted from boring dead time into something closer to anticipation.&lt;/p&gt;
&lt;p&gt;At first this looked simple enough that &quot;just show it as it comes out&quot; felt sufficient. But once I actually built it, the hard part started right after.&lt;/p&gt;
&lt;h4&gt;preview and truth had to be separated&lt;/h4&gt;
&lt;p&gt;Showing things in real time and storing things you can trust are two different problems.&lt;/p&gt;
&lt;p&gt;I learned this when I tried using preview directly as the final result and things blew up. preview has no nodeId and no order. Enough to render in the UI, sure, but downstream (plan generation, checkItems conversion, user customization) needs metadata that preview doesn&apos;t carry.&lt;/p&gt;
&lt;p&gt;So I set the rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;preview is for UI.&lt;/strong&gt; Non-authoritative.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Only the final result is truth.&lt;/strong&gt; Stored in the DB, accessed only via the &lt;code&gt;GET parse-jobs/{jobId}&lt;/code&gt; read path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;preview and the worker queue stream are separated.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Treat preview as truth and you can generate plans from incomplete, mid-parse data. Don&apos;t separate them, and what happens? You showed the user &quot;Chapter 3 recognized,&quot; but actually there were 5 chapters, and now their plan is incomplete. Display and storage cannot share the same channel. Obvious in hindsight, easy to miss in practice.&lt;/p&gt;
&lt;h4&gt;The hard part wasn&apos;t SSE, it was the preview emit policy&lt;/h4&gt;
&lt;p&gt;Wiring up SSE itself isn&apos;t hard. The hard part comes after. &lt;strong&gt;How often, and on what kind of change, do you emit a preview?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every preview emission costs you twice: storing it in the latest preview cache, and appending it to the event stream. Emit a lot and the UX is flashy but server writes explode. Emit too little and there&apos;s no point in having SSE at all. If the screen is empty for a while and then the whole result suddenly appears, how is that any different from polling?&lt;/p&gt;
&lt;p&gt;Mobile environments make it worse. Connection drops on the subway, drops switching from Wi-Fi to LTE. Every reconnect makes the server query the latest preview and replay the prior events. The more reconnects pile up, the heavier the server-read load. Real-time delay might not even be the bigger problem.&lt;/p&gt;
&lt;p&gt;So at the PreviewAssembler level, I built in an adaptive emit policy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;throttle&lt;/strong&gt;: minimum emit interval. Too often and the server suffers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;chapterThrottle&lt;/strong&gt;: emit only on chapter-level changes. A single new section gets held.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;maxSilence&lt;/strong&gt;: if nothing is sent for too long, send a preview as a heartbeat substitute. Keeps the user from worrying that things have stalled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fingerprint comparison&lt;/strong&gt;: hash against the previous preview and emit only when there&apos;s an actual change. The model sometimes repeats the same content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pending preview hold&lt;/strong&gt;: if emit conditions aren&apos;t met, hold and send only the latest at the next emit point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The strategy is two-tier. &lt;strong&gt;Incremental strategy&lt;/strong&gt; keeps things cheap by default, and when it breaks, &lt;strong&gt;whole replay fallback&lt;/strong&gt; recovers safely. As long as incremental processing holds, we save cost; once state gets tangled, we resend the whole thing to guarantee consistency.&lt;/p&gt;
&lt;p&gt;What you see in real time looked flashy, but the actual hard problem was making it look better while sending less. SSE quality wasn&apos;t about whether the connection was up. It was about how carefully you let preview flow through.&lt;/p&gt;
&lt;h4&gt;Real-time UX forced server design to start over&lt;/h4&gt;
&lt;p&gt;SSE isn&apos;t a pretty technology. It&apos;s a different way of managing wait and load. Adding SSE meant redesigning a substantial chunk of the server architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Separating worker queue from SSE event stream.&lt;/strong&gt; At first I tried to reuse the existing worker queue&apos;s Redis Stream as the SSE source. But that couples the worker&apos;s processing unit to SSE&apos;s emit unit. If the worker speeds up, SSE over-emits. If the worker slows down, SSE feels sluggish. These two need to be independent. I split the Redis event stream onto a separate key.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replay, reconnect, Last-Event-ID.&lt;/strong&gt; On mobile, reconnects aren&apos;t an exception, they&apos;re normal. When reconnecting, sending Last-Event-ID lets the server replay only events after that point. Without it, every drop sends the user back to the start. Same problem we hit in Do Work, repeating itself at the SSE layer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nginx config.&lt;/strong&gt; &lt;code&gt;proxy_buffering off&lt;/code&gt;, &lt;code&gt;X-Accel-Buffering: no&lt;/code&gt;. Skip these and Nginx quietly buffers SSE events and ships them in one batch. You built a &quot;real-time&quot; thing and got a delayed batch. Miss this and SSE stops meaning anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Graceful shutdown and deploy.&lt;/strong&gt; I set shutdown timeout to 30 seconds and used blue/green for cutovers. The deploy goal wasn&apos;t &quot;zero downtime,&quot; it was a &lt;strong&gt;system that can reconnect&lt;/strong&gt;. Perfect zero-downtime costs too much. A system that recovers when it drops is enough. Even on disconnect, the client auto-reconnects, and the snapshot-first + replay + live tail structure restores prior state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full SSE session flow.&lt;/strong&gt; When a session opens: query the job → query the latest preview → assemble the snapshot event → replay → live tail. Those five steps repeat on every connection. UX got better, but as reconnects pile up, that initial handshake cost accumulates. Recent optimization focus has shifted from &quot;add more SSE&quot; to &lt;strong&gt;controlling preview emit frequency and reconnect cost&lt;/strong&gt;. Real-time UX isn&apos;t free. Behind the flashy display is a cost the server has to absorb.&lt;/p&gt;
&lt;h4&gt;Real quality gains came from the 30-book test set, not from swapping models&lt;/h4&gt;
&lt;p&gt;The system was complete. But to push it to production grade, &quot;it works&quot; wasn&apos;t enough.&lt;/p&gt;
&lt;p&gt;I ran 30 real books through it. Different fields (CS, math, literature, business), different publishers (O&apos;Reilly, Pearson, Korean publishers), different layouts. Failure patterns started to surface.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Missing chapters&lt;/strong&gt;: model skips entire chapters → prompt reinforcement + missing detection in merge-normalize&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roman numeral misreads&lt;/strong&gt;: confuses Part Ⅳ with Part IV → numbering normalization rules patched&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Depth misjudgment&lt;/strong&gt;: promotes a Section to a Chapter or demotes one → depth correction logic added in parser/post-process&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page order drift&lt;/strong&gt;: image order doesn&apos;t match actual page order → startPage-based sorting reinforced&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Line break / indentation confusion&lt;/strong&gt;: OCR reads line breaks as structural separators → spelled out in prompt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debugging difficulty&lt;/strong&gt;: same image, nondeterministic results → live integration tests + detailed logging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Accuracy didn&apos;t go up just because I swapped models. Quality went up while building the test set and blocking regressions. Build a canonical fixture, run the batch integration tests, reproduce failed cases as live integration tests, edit the prompt builder, run the whole thing again. I repeated that loop dozens of times.&lt;/p&gt;
&lt;p&gt;There&apos;s a commit message that just says &quot;dev environment debugging support,&quot; and that one was central. You can&apos;t raise quality unless you can reproduce real-world failures with real data. A bug you can&apos;t reproduce is a bug you can&apos;t fix. That part isn&apos;t the model&apos;s job. It&apos;s the engineer&apos;s.&lt;/p&gt;
&lt;h4&gt;Tests were green, but production handed me a release blocker&lt;/h4&gt;
&lt;p&gt;We passed the 30-book test set and the SSE flow was stable. Tests were all green. I was ready to ship.&lt;/p&gt;
&lt;p&gt;Then the final review surfaced release blockers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Permanent wait on terminal event loss (critical)&lt;/strong&gt;: if completed or failed gets dropped, the client stays &quot;processing&quot; forever. The user has to force-quit the app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing event timestamp/message&lt;/strong&gt;: replay order can scramble.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redis MAXLEN unset&lt;/strong&gt;: events accumulate without bound. Memory creeps up until one day Redis dies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No retry on worker failure&lt;/strong&gt;: if the DashScope API fails, the job stays &quot;processing&quot; forever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;preview partial JSON repair vulnerability&lt;/strong&gt;: incomplete JSON could be sent down as is.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any one of these going off in production seriously breaks the user experience. Tests verify &quot;does the happy path work.&quot; Production demands &quot;are the unhappy paths also safe.&quot; After fixing every release blocker, writing the manual runbook, building the deploy checklist, and validating the actual SSE flow with a live integration transcript, only then did &quot;okay, ready to ship&quot; feel earned.&lt;/p&gt;
&lt;h3&gt;The last piece of the pipeline: hierarchy selection UX&lt;/h3&gt;
&lt;p&gt;You&apos;d think we were done at this point. There was one more piece.&lt;/p&gt;
&lt;p&gt;No matter how accurately the model extracts the ToC structure, you can&apos;t just hand the raw result to the user. Different users need different depths. Some only want the Chapter level, others want it down to Section.&lt;/p&gt;
&lt;p&gt;So we needed hierarchy selection. Default behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show leaf nodes (the deepest items) selected by default&lt;/li&gt;
&lt;li&gt;Toggling a parent node selects/deselects everything underneath&lt;/li&gt;
&lt;li&gt;The default state should already match &quot;what most cases want&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Photo to structured JSON to hierarchy selection to Items generation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The whole thing is a single pipeline. The model is good at photo to JSON. Everything else is engineering.&lt;/p&gt;
&lt;h3&gt;What is product engineering in the AI era?&lt;/h3&gt;
&lt;p&gt;As you&apos;ve probably gathered, this isn&apos;t simply an OCR feature. It&apos;s an engineered flow: photo to structured JSON to hierarchy selection to Items generation.&lt;/p&gt;
&lt;p&gt;On the surface, sure, this work could look like nothing more than wiring up an LLM API and slapping SSE on top for streaming UX. You might wonder, &quot;isn&apos;t everyone doing this these days?&quot; What I want to show through this process is the work of taking a slow, nondeterministic, expensive LLM call and turning it into a product experience the user can wait on, can understand, and can trust.&lt;/p&gt;
&lt;p&gt;What got solved here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The UX problem of reducing mobile input friction&lt;/li&gt;
&lt;li&gt;The recognition problem (it&apos;s structuring accuracy, not OCR)&lt;/li&gt;
&lt;li&gt;The job-system problem of fitting slow LLM responses into a product flow&lt;/li&gt;
&lt;li&gt;The real-time UX problem covering polling, SSE, and reconnect&lt;/li&gt;
&lt;li&gt;The data trust problem of separating preview from truth&lt;/li&gt;
&lt;li&gt;Operational problems like emit frequency, Redis writes, and reconnect cost&lt;/li&gt;
&lt;li&gt;The product problem of fallback on failure and the user contract&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A product engineer&apos;s persistence isn&apos;t proven by reaching for big-name technologies. It shows up in chasing one small-looking feature all the way down until the user feels no friction.&lt;/p&gt;
&lt;p&gt;ToC recognition is a tiny part of the product I&apos;m currently building. It&apos;s not even a required feature. In an earlier era I might have cut it from the early roadmap. (And it would have lived in the backlog forever.) If someone had told me they&apos;d build it to this depth back then, I&apos;d have argued them out of it. The cost wouldn&apos;t pencil out. But in today&apos;s AI coding agent era, this is something you can build in a day, or even a few hours. At that price, it&apos;s worth paying.&lt;/p&gt;
&lt;p&gt;So what &lt;em&gt;is&lt;/em&gt; product engineering in the AI era? The core is going beyond Do Work, through Good, all the way down into Great. Not stopping at &quot;this is good enough&quot; (Good), but pushing into the maximum of detail (Great). That, I think, is what AI-era product engineering is.&lt;/p&gt;
&lt;p&gt;No matter how well you build the harness, no matter how strong the agent gets, the one thinking and deciding is still the engineer. I built this mostly with Codex, leaning hard on the &lt;a href=&quot;https://flowkater.io/posts/2026-02-08-superpowers-introduction/&quot;&gt;Superpowers skill&lt;/a&gt; (Codex&apos;s autonomous-execution mode). But the implementation flow itself, requirements analysis, implementation, optimization, was something I kept digging into and deciding on personally.&lt;/p&gt;
&lt;p&gt;Just because I&apos;m not writing the code by hand doesn&apos;t mean Craftsmanship disappears. The willingness to step back when &quot;I think we&apos;re done&quot; comes up, re-check everything from the start, re-test, and push the last 2%. That&apos;s what&apos;s needed.&lt;/p&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;When you first learn to code, it&apos;s genuinely thrilling. The people getting in through &lt;a href=&quot;https://flowkater.io/posts/2026-01-09-15-year-cto-vibe-coding/&quot;&gt;vibe coding&lt;/a&gt; right now probably feel the same way. I&apos;ll never forget the feeling of building the first service that did exactly what I&apos;d intended. (Back in 2011 I built my own web Dropbox clone in Ruby on Rails. The pride.)&lt;/p&gt;
&lt;p&gt;But there&apos;s an enormous gap between a working feature and a product you can trust. AI model integration, the topic of this post, is especially seductive at the start. You test the model in the vendor&apos;s playground, see real performance, and feel &quot;I could build anything with this.&quot; You&apos;re ecstatic. Then you crash. Between LLM API costs and the realities of running things in production, the work I assumed would be &quot;just plug in the API&quot; turned out to need 80% more thought and trial and error.&lt;/p&gt;
&lt;p&gt;I don&apos;t think the product I built is Great. But when the user tells you &quot;this is awkward&quot; or &quot;this isn&apos;t intuitive,&quot; whether you ignore that point or hold onto it until the end, that, I think, is the fork in the road to Great.&lt;/p&gt;
&lt;p&gt;In the era when development cost was high, &quot;over-engineering&quot; became an excuse to dismiss obsession with detail. But if you can build that detail in a day instead of three weeks, why give it up? If you have ten possible features and only ship three, but those three give the user an outstanding product experience, I&apos;d argue that&apos;s the better direction.&lt;/p&gt;
&lt;p&gt;Even in &lt;a href=&quot;https://flowkater.io/posts/2026-02-19-code-reading-era/&quot;&gt;the era where AI writes the code&lt;/a&gt;, when you look at the engineers building good products, they&apos;re still pulling all-nighters. iOS development is hard for me. After years of Flutter, I picked iOS, and no matter how hard I beat on Codex, UI transition code can spiral once it goes off the rails. Infinite loop time. After spending a full day failing to fix a trivial issue, that&apos;s when I finally regret skipping fundamentals, start adding logs, and search for similar demos. Like the old days. When AI can&apos;t solve it, I have to find it. Like staying up all night thinking through preview emit policy.&lt;/p&gt;
&lt;p&gt;I&apos;m not the only one. The &lt;a href=&quot;https://github.com/nicepkg/openclaw&quot;&gt;OpenClaw&lt;/a&gt; developer built and threw away &lt;a href=&quot;https://www.roborhythms.com/openclaw-changed-the-ai-industry/&quot;&gt;43 projects in 60 days before one hit&lt;/a&gt;. Look at the commit history from those 60 days and you&apos;ll see 3 a.m. and 4 a.m. commits everywhere. Even in the era when AI writes the code, the engineers building real products are the ones writing &quot;broken at least once, and eventually fixed at 1 AM while questioning my life choices.&quot; The Zed editor team wrote a piece last year called &lt;a href=&quot;https://zed.dev/blog/software-craftsmanship-in-the-era-of-vibes&quot;&gt;&quot;The Case for Software Craftsmanship in the Era of Vibes&quot;&lt;/a&gt;, declaring that craftsmanship still matters in the vibe coding era. There&apos;s even an &lt;a href=&quot;https://www.ivanturkovic.com/2025/10/30/artesanal-coding-%E8%81%B7%E4%BA%BA%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-a-manifesto-for-the-next-era-of-software-craftsmanship/&quot;&gt;Artisanal Coding(職人コーディング)&lt;/a&gt; manifesto out now. Summoning Japanese-style craftsmanship in this era. A bit much, maybe, and I still feel it.&lt;/p&gt;
&lt;p&gt;AI coding agents reportedly raise productivity by 30 to 60 percent. True. I feel it too. But where you spend the time saved is the fork in the road. Stamp out more features, or push one feature deeper. I picked the latter, and I still think that&apos;s right. (Of course, revenue has to prove that out, and that part I don&apos;t know yet.)&lt;/p&gt;
&lt;p&gt;Other people ship 10 apps a month, and I&apos;m three months into building one product, having cut a substantial portion of the originally planned features. Even with a coding agent sitting next to you, engineering is craftsmanship. &lt;a href=&quot;https://flowkater.io/posts/2026-02-28-ai-as-smart-as-you/&quot;&gt;When AI returns a passable 80-point average&lt;/a&gt;, the remaining 20 points are on you.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2026-03-01-agentic-engineering-9-skills/&quot;&gt;9 Survival Skills for the Agentic Engineering Era&lt;/a&gt;: the 9 abilities Karpathy says engineers need in the agentic engineering era&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2026-02-08-superpowers-introduction/&quot;&gt;Give Claude Code Wings: Introducing Superpowers&lt;/a&gt;: how to install Codex&apos;s autonomous-execution mode Superpowers and the 7-step workflow&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2026-01-09-15-year-cto-vibe-coding/&quot;&gt;How a 15-Year CTO Vibe-Codes&lt;/a&gt;: pair-programming with AI based on Kent Beck&apos;s augmented coding philosophy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2026-02-28-ai-as-smart-as-you/&quot;&gt;AI Is Only as Smart as You Are&lt;/a&gt;: why two people using the same AI get different gaps. AI&apos;s output is decided by your input&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2026-02-15-ai-jarvis-openclaw/&quot;&gt;AI Agent Jarvis: Becoming My Second Brain&lt;/a&gt;: real-world notes on building a 24/7 AI agent with the OpenClaw framework&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zed.dev/blog/software-craftsmanship-in-the-era-of-vibes&quot;&gt;The Case for Software Craftsmanship in the Era of Vibes&lt;/a&gt;: software craftsmanship declaration from the Zed editor team (2025.06)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ivanturkovic.com/2025/10/30/artesanal-coding-%E8%81%B7%E4%BA%BA%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-a-manifesto-for-the-next-era-of-software-craftsmanship/&quot;&gt;Artisanal Coding(職人コーディング): A Manifesto&lt;/a&gt;: a manifesto for software craftsmanship in the AI era (2025.10)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roborhythms.com/openclaw-changed-the-ai-industry/&quot;&gt;OpenClaw: One Developer, 43 Failed Projects&lt;/a&gt;: Peter Steinberger&apos;s story of building and throwing away 43 projects before OpenClaw&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qwenlm.github.io/blog/qwen3.5/&quot;&gt;Introducing Qwen 3.5&lt;/a&gt;: Alibaba Cloud&apos;s official Qwen 3.5 Flash model announcement (2026.02.23)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.alibabacloud.com/help/en/model-studio/&quot;&gt;DashScope Model Studio&lt;/a&gt;: AlibabaCloud DashScope API documentation and pricing&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>AI</category><category>product-engineering</category><category>LLM</category><category>Qwen</category><category>DashScope</category><category>SSE</category><category>iOS</category><category>build-log</category><category>craftsmanship</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Code Review in the AI Era: How Should We Do It?</title><link>https://flowkater.io/en/posts/2026-03-08-ai-code-review/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-03-08-ai-code-review/</guid><description>From the reality of code review during my CTO years to the current AI-era debate. Simon Willison, Kent Beck, Bryan Finster, StrongDM, Salesforce, latent.space — I lay out the spectrum around code review and ask what it is we should actually be reviewing.</description><pubDate>Sun, 08 Mar 2026 03:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;When I worked as CTO, one of the first &quot;official duties&quot; to disappear from my plate was code review. Before the team got big enough, I ran code review for the backend team. But once I was CTO of a 20-plus-person org, things shifted. The positional title of R&amp;amp;D Department Head started to outweigh the functional title of CTO, and my management moved from code to people.&lt;/p&gt;
&lt;p&gt;That doesn&apos;t mean I stopped doing code review entirely after that. The data engineering team was small and had no lead, so for over a year I personally ran their code reviews and study sessions. With newly hired juniors, regardless of their position, I sat down for study and review with them. It was the kind of thing senior engineers, buried in their own workload, couldn&apos;t easily pick up. Sometimes I&apos;d spend several weeks doing 1-on-1 reviews and feedback with a junior who was struggling to write code. Since none of this counted as &quot;official work,&quot; it was hard to fit any of it into my actual working hours.&lt;/p&gt;
&lt;p&gt;Honestly, even calling code review an &quot;official duty&quot; is a stretch. We never really nailed down the process for how to do it, and that part is still hard today. Back then I tried to build a culture where developers rotated through reviewing each other&apos;s code. Some people couldn&apos;t see why they should review code that wasn&apos;t their own. Others were enthusiastic to a fault, but reviewed so aggressively that, despite all their energy, they made the room flinch.&lt;/p&gt;
&lt;p&gt;Review styles were all over the place. For backend (and the same went for data and frontend), I focused on the application layer: code architecture, whether the code was sufficiently human-readable, whether it broke our internal conventions. I gave feedback on better ways to write the code and offered guidelines around unnecessary duplication or design issues with real tradeoffs. But other team leads went further: they pulled the branch locally, ran it, and reviewed the final quality end to end. Most of that was on the client side. When you have time, the latter is usually the better review. But it costs so much time that as workload grows, doing it properly becomes impossible.&lt;/p&gt;
&lt;p&gt;The problem, in the end, was time. I&apos;ve seen plenty of companies with great review processes, but in a tech startup where survival means a deadline every single day, we&apos;d often code in the morning and ship in the afternoon. Skilled developers who were both willing and capable of reviewing code (and kind enough to do it) were a small group. Eventually skipped PRs got merged for the unavoidable reason of &quot;schedule,&quot; and between juniors who hadn&apos;t built up a strong mental model of code architecture and seniors who&apos;d handed their code quality over to the monster called scheduling, the codebase itself slowly became a monster too.&lt;/p&gt;
&lt;p&gt;The problem, in the end, was people.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;We&apos;ve now entered the era of AI agentic engineering, or as I called it earlier, &lt;a href=&quot;/posts/2026-02-19-code-reading-era&quot;&gt;the era of not reading code&lt;/a&gt;, and a wave of tools has shown up to solve the problems of the previous era. It started with CodeRabbit, then Codex and Claude Code began posting PR messages and line-by-line comments. In other words, code review without human dependency became possible.&lt;/p&gt;
&lt;p&gt;The catch is that the PRs going up are also written without human dependency.&lt;/p&gt;
&lt;p&gt;There&apos;s a ghost story you hear sometimes: a junior who doesn&apos;t really know what they&apos;re doing pushes AI-generated code, and a senior pulls an all-nighter touching every line to fix it. I can&apos;t verify the story, but it shows up often enough. It sounds like distrust of AI, but really it&apos;s distrust of juniors who don&apos;t know what they&apos;re using. A sorcerer&apos;s apprentice who can normally cast a fireball suddenly gets an infinite mana source (AI), starts throwing hellfire around with no experience or magical knowledge, and falls into a kind of magical possession(?).&lt;/p&gt;
&lt;p&gt;Either way, this conversation keeps coming up because in any organization where individuals are personally responsible for their code, even AI-produced code carries that same personal responsibility. So plenty of teams are losing sleep over this. Individual productivity has been amplified massively by AI, but team-level or company-level output hasn&apos;t visibly jumped in many cases. Part of the reason might be that team collaboration is, at the bottom, a question of accountability.&lt;/p&gt;
&lt;p&gt;There&apos;s an interesting data point. In &lt;a href=&quot;https://www.latent.space/p/reviews-dead&quot;&gt;a study of more than 10,000 developers&lt;/a&gt;, teams with high AI adoption merged 98% more PRs but spent 91% more time on review. The individual got faster; the team got slower. The code review bottleneck didn&apos;t disappear. It just got bigger.&lt;/p&gt;
&lt;p&gt;So one question remains. In the AI era, how should we do code review?&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;We Still Don&apos;t Trust Code That No Human Has Reviewed&lt;/h2&gt;
&lt;p&gt;Let&apos;s start with the most intuitive position. &quot;No matter how good AI gets, we can&apos;t trust code that a human hasn&apos;t read.&quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonwillison.net/guides/agentic-engineering-patterns/anti-patterns/&quot;&gt;Simon Willison&lt;/a&gt; recently put together a list of agentic engineering anti-patterns, and the very first one was exactly this. &quot;Don&apos;t dump unreviewed code on your collaborators.&quot; Just because an agent generated hundreds or thousands of lines of code for you doesn&apos;t mean you should send it up as a PR. That&apos;s offloading the actual work onto your teammates. In his words: &quot;They could just prompt an agent themselves. So what value are you actually adding?&quot;&lt;/p&gt;
&lt;p&gt;That&apos;s a sharp question. And it lands for me. The most frustrating moment back in my CTO days was when a PR came up and the person who pushed it couldn&apos;t explain their own code. The same is true in the AI era. Actually, it&apos;s worse in the AI era, because the agent will write a plausible-looking PR description for you. If someone pushes a PR with an agent-written description they haven&apos;t even read themselves (and I sometimes feel that temptation too), that&apos;s just rude to the reviewer.&lt;/p&gt;
&lt;p&gt;Kent Beck, one of the engineers I respect most, takes a similar stance. I introduced his Augmented Coding philosophy earlier in &lt;a href=&quot;/posts/2026-01-09-15-year-cto-vibe-coding&quot;&gt;How a 15-year CTO does vibe coding&lt;/a&gt;, and the core idea is the same. The faster AI generates code, the more important testing and review become — not less. As the cost of generation approaches zero, the source of value shifts from generation to verification.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/addyosmani/status/2027662887897149801&quot;&gt;Addy Osmani&lt;/a&gt; put his finger on the same point. &quot;The unsolved problem isn&apos;t generation, it&apos;s verification. That&apos;s where engineering judgment becomes your highest-leverage skill.&quot; AI is good at making code. Whether that code is correct, whether it fits your system, whether it&apos;s still maintainable in six months: that judgment is still on people. At least for now.&lt;/p&gt;
&lt;p&gt;The core of this position is clear. No matter how well AI generates code, responsibility for that code lands on a human in the end. If you&apos;re responsible, you have to verify. If you verify, you have to review. Logically airtight.&lt;/p&gt;
&lt;p&gt;That said, there&apos;s an uncomfortable truth here. Are there enough people with the time and skill to do that &quot;review&quot;? The way I lived it as CTO, code review getting pushed out of &quot;official work&quot; wasn&apos;t a question of willpower. It was a question of reality. If AI tripled code output and review capacity stayed flat, this position is correct, but whether it&apos;s actually sustainable is another question.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Era of Humans Reviewing Code Is Over&lt;/h2&gt;
&lt;p&gt;On the other side, there&apos;s a much more aggressive claim. &quot;The era of humans reviewing code is over. Or rather, it has to be over.&quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bryanfinster.substack.com/p/ai-broke-your-code-review-heres-how&quot;&gt;Bryan Finster&lt;/a&gt; recently applied the Nyquist-Shannon Sampling Theorem to this problem, and the analogy is more persuasive than it sounds. The original is a communications theorem: to accurately reconstruct a signal, you have to sample at more than twice the highest frequency present. Apply that to software and you get this. If your defect-detection rate can&apos;t keep up with your code-production rate, you don&apos;t miss problems occasionally. You miss them systematically.&lt;/p&gt;
&lt;p&gt;AI produces code at a high frequency. Manual code review is a low-frequency sampling mechanism. We&apos;ve raised the production frequency without raising the feedback frequency. That&apos;s the definition of undersampling, and undersampling means you miss things. Not occasionally. Reliably.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/&quot;&gt;The data from SmartBear&apos;s analysis of Cisco Systems teams&lt;/a&gt; backs this up. Human reviewer defect-detection rates fall off a cliff once you cross 400 lines. Yet a single AI prompt can spit out 600 lines. PRs over 400 lines aren&apos;t reviews. They&apos;re rubber stamps. This matches my CTO experience exactly. Under deadline pressure, PR reviews became a formality, and even strong developers fell into &quot;skim it, LGTM&quot; mode. The AI era only made it worse.&lt;/p&gt;
&lt;p&gt;A company called &lt;a href=&quot;https://www.strongdm.com/blog/the-strongdm-software-factory-building-software-with-ai&quot;&gt;StrongDM&lt;/a&gt; pushed this logic to the extreme. In their &quot;Software Factory,&quot; humans don&apos;t write code, and humans don&apos;t review code. What humans do is define intent, curate scenarios, and set constraints. After that, agents do everything: they generate code, validate scenarios in a behavior-clone environment from a third-party service called Digital Twin Universe, and iterate until the scenarios pass. Validation has replaced code review.&lt;/p&gt;
&lt;p&gt;When I first saw this, I&apos;ll admit my reaction was &quot;does this actually work?&quot; But &lt;a href=&quot;https://simonwillison.net/2026/Feb/7/software-factory/&quot;&gt;Simon Willison watched this team&apos;s demo and wrote it up on his blog&lt;/a&gt;, and Wharton&apos;s Ethan Mollick and Y Combinator&apos;s Garry Tan both took notice. &lt;a href=&quot;https://law.stanford.edu/2026/02/08/built-by-agents-tested-by-agents-trusted-by-whom/&quot;&gt;Stanford Law School&apos;s CodeX&lt;/a&gt; even published an analysis titled &quot;Built by Agents, Tested by Agents, Trusted by Whom?&quot; The title is direct. If agents build it and agents test it, who can trust it? When the same kind of AI writes the code and the same kind of AI tests it, both can miss the same thing. And when this software blows up in production, with no human author, who carries the responsibility? Nobody has answered that question yet. StrongDM is using this approach in production anyway — and they&apos;re a security infrastructure company. That&apos;s why this experiment is hard to dismiss.&lt;/p&gt;
&lt;p&gt;If StrongDM is the extreme, &lt;a href=&quot;https://engineering.salesforce.com/scaling-code-reviews-adapting-to-a-surge-in-ai-generated-code/&quot;&gt;Salesforce went for a realistic middle ground&lt;/a&gt;. After adopting AI-assisted coding, code volume rose roughly 30%, and PRs touching 20 files and 1,000 changed lines became routine. More worryingly, review time on the largest PRs actually started dropping. That was a signal that reviewers had stopped meaningfully wrestling with the changes. Salesforce built a system called Prizm and rearchitected the review process itself. Not &quot;let&apos;s add an AI reviewer,&quot; but an admission that the diff-centric review model itself doesn&apos;t work in the AI era. They introduced a new approach called Intent Reconstruction.&lt;/p&gt;
&lt;p&gt;People in this camp share a common line. &quot;AI didn&apos;t remove the safety net. AI just exposed that the safety net was always relying on individual heroics.&quot; That&apos;s Bryan Finster&apos;s framing, and it stings. Letting code review fall off the official duties list as CTO, depending on one enthusiastic reviewer, merging PRs because the schedule said so — all of it was evidence that the safety net was, in fact, riding on heroes.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;So What Should We Be Reviewing?&lt;/h2&gt;
&lt;p&gt;&quot;We have to keep code review&quot; is true. &quot;Humans can&apos;t review everything&quot; is also true. So what exactly are we supposed to do?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.latent.space/p/reviews-dead&quot;&gt;latent.space&apos;s Ankit Jain&lt;/a&gt; gave the cleanest frame on this question. Shift from code review to intent review. Instead of reading a 500-line diff line by line, review the spec, the acceptance criteria, and the constraints.&lt;/p&gt;
&lt;p&gt;In this frame, the spec becomes the source of truth, and the code becomes the artifact of the spec. The human role moves from &quot;did we write this correctly?&quot; to &quot;are we solving the right problem under the right constraints?&quot; The most valuable human judgment gets applied before the code is generated, not after.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a new concept. It&apos;s the same thing Behavior-Driven Development has been arguing for years. Before coding, the team gets together and defines &quot;how this feature should behave&quot; in executable scenarios, and those scenarios become the acceptance tests. The reason it never went fully mainstream is that writing the spec felt like extra work. With agents, the equation flips. The spec stops being extra work and becomes the default artifact.&lt;/p&gt;
&lt;p&gt;Ankit Jain says trust has to be stacked in layers. Like a Swiss cheese model, where no single gate catches everything, so you stack imperfect filters until the holes don&apos;t line up. Letting multiple agents try different approaches and picking the best is layer one. Deterministic guardrails like tests and type checks are layer two. Humans defining acceptance criteria up front is layer three. Stack on top of that fine-grained agent permissions and adversarial validation (one agent makes it, another tries to break it), and you get five layers of filters.&lt;/p&gt;
&lt;p&gt;On the practical side, &lt;a href=&quot;https://www.qodo.ai/blog/5-ai-code-review-pattern-predictions-in-2026/&quot;&gt;Qodo&apos;s predictions for AI code review patterns in 2026&lt;/a&gt; are worth a closer look.&lt;/p&gt;
&lt;p&gt;First, context-first review. Before opening the diff, pull cross-repo usage, prior PRs, and architecture docs automatically and treat context as required input. Context was the hardest part of review for me as CTO. Sometimes I&apos;d spend half the review time just figuring out &quot;why is this code shaped this way?&quot;&lt;/p&gt;
&lt;p&gt;Second, severity-driven review. Findings get classified as must-fix, recommended, or minor suggestion. If you&apos;ve ever had a bot drop 37 comments about whitespace while missing a null check that would take down production, you understand instantly why this matters.&lt;/p&gt;
&lt;p&gt;Third, specialist-agent review. Asking one generalist model to play security expert, performance engineer, and staff SWE simultaneously is too much. You separate out a security agent, a performance agent, and a correctness agent, each analyzing in its own domain, and a coordinator builds the unified report. This connects directly to &quot;decomposition&quot; from &lt;a href=&quot;/posts/2026-03-01-agentic-engineering-9-skills&quot;&gt;the 9 skills of agentic engineering&lt;/a&gt;. Breaking one giant task into specialist domains.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bryanfinster.substack.com/p/ai-broke-your-code-review-heres-how&quot;&gt;Bryan Finster&lt;/a&gt; reached a similar conclusion. After automation handles everything else, the list of things humans should genuinely block a merge on comes down to two.&lt;/p&gt;
&lt;p&gt;One is tribal knowledge. Integration quirks, historical decisions, the &quot;we tried that and it broke billing&quot; context. The kind of thing that lives only in people&apos;s heads and isn&apos;t documented anywhere. Long term, this should also move into docs and Architectural Decision Records and be enforced by tooling. Short term, you need &quot;the person who knows where the bodies are buried,&quot; and their job is context review, not syntax review.&lt;/p&gt;
&lt;p&gt;The other is regulated paths. In environments where separation of duties is a compliance requirement, changes to sensitive areas need a second human approval. That&apos;s not negotiable. But it&apos;s no reason to apply the same bar to every PR.&lt;/p&gt;
&lt;p&gt;The tooling is shifting too. &lt;a href=&quot;https://coderabbit.ai/&quot;&gt;CodeRabbit&lt;/a&gt; supports GitHub, GitLab, Bitbucket, and Azure across multiple platforms, broadening reach. &lt;a href=&quot;https://greptile.com/&quot;&gt;Greptile&lt;/a&gt; indexes the entire codebase to attempt the deepest level of bug detection. &lt;a href=&quot;https://github.blog/changelog/2024-10-29-github-copilot-code-review-in-github-com-public-preview/&quot;&gt;GitHub Copilot Code Review&lt;/a&gt; hit one million users within a month of launch. If you&apos;re already on Copilot, friction is near zero, but because it&apos;s diff-based, it tends to miss architecture-level issues. Whatever tool you pick, the principle is the same. Hand off what AI can catch (syntax, style, simple logic bugs, security patterns) to AI, and keep humans on what AI absolutely can&apos;t catch (intent, context, business judgment, tribal knowledge).&lt;/p&gt;
&lt;p&gt;So the answer to &quot;what should we be reviewing?&quot; lands here. Review intent, not code. Review the spec, not the diff. Review the context, not the syntax.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;If I&apos;m being honest, I don&apos;t personally review the code I write with AI right now.&lt;/p&gt;
&lt;p&gt;I play the QA role instead. I test mostly for whether the thing actually behaves as intended, and I only look at the code when something goes wrong. I run manual QA tests myself, and if a problem is reproducible in code, I amplify the case into an integration test so it doesn&apos;t recur. API scenario tests, external integrations, and UX testing still have real limits, and the truth is that quality varies with how diligently I get my hands on it.&lt;/p&gt;
&lt;p&gt;As I laid out above, the era of reading code line by line is already gone. But responsibility for the code hasn&apos;t gone away. The shape of the responsibility has changed. From the person who writes the code to the person who confirms the code does what it&apos;s supposed to. From reviewer to verifier.&lt;/p&gt;
&lt;p&gt;So what does that &quot;verifier&quot; role concretely look like?&lt;/p&gt;
&lt;p&gt;I think today&apos;s AI-native engineer or full-stack builder might need to play the role the previous era&apos;s PM played, by themselves. Especially on product quality. Define the requirements, set the acceptance criteria, hand the implementation to the agent, verify the result, and monitor in production. That&apos;s clearly different from the traditional developer role. The reason I emphasized &quot;definition of done&quot; and &quot;observability&quot; in &lt;a href=&quot;/posts/2026-03-01-agentic-engineering-9-skills&quot;&gt;the 9 skills of agentic engineering&lt;/a&gt; was the same context.&lt;/p&gt;
&lt;p&gt;This isn&apos;t entirely new either. Even in the previous era, there were two kinds of developers. Developers who treated their work as done once the code merged, and developers who deployed afterward, monitored, and tested with their own hands in production. The latter were much better engineers. More importantly, they were responsible engineers.&lt;/p&gt;
&lt;p&gt;As the era shifts, the cost of producing code is approaching zero. In a world where an agent can build three versions of a feature in an hour, &quot;the ability to write code well&quot; no longer differentiates anyone. What differentiates is the ability to judge whether the code actually solves the real problem, the ability to respond when production breaks, and most of all, the willingness to stand by code that goes out under your name, all the way through.&lt;/p&gt;
&lt;p&gt;Can you take responsibility for your own code?&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://simonwillison.net/guides/agentic-engineering-patterns/anti-patterns/&quot;&gt;Simon Willison — Agentic Engineering Anti-patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bryanfinster.substack.com/p/ai-broke-your-code-review-heres-how&quot;&gt;Bryan Finster — AI Broke Your Code Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.latent.space/p/reviews-dead&quot;&gt;latent.space — How to Kill the Code Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.strongdm.com/blog/the-strongdm-software-factory-building-software-with-ai&quot;&gt;StrongDM — The Software Factory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://law.stanford.edu/2026/02/08/built-by-agents-tested-by-agents-trusted-by-whom/&quot;&gt;Stanford CodeX — Built by Agents, Tested by Agents, Trusted by Whom?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://engineering.salesforce.com/scaling-code-reviews-adapting-to-a-surge-in-ai-generated-code/&quot;&gt;Salesforce — Scaling Code Reviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.qodo.ai/blog/5-ai-code-review-pattern-predictions-in-2026/&quot;&gt;Qodo — 5 AI Code Review Pattern Predictions in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/addyosmani/status/2027662887897149801&quot;&gt;Addy Osmani — Verification as the New Frontier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/&quot;&gt;SmartBear — Best Practices for Peer Code Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=XavrebMKH2A&quot;&gt;Dave Farley — AI Coding and the Nyquist Theorem&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>ai-coding</category><category>essay</category><category>code-review</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>How the World&apos;s Largest AI Company Trains the Next Generation of Engineers: A Review of the Anthropic x CodePath Curriculum</title><link>https://flowkater.io/en/posts/2026-03-06-anthropic-codepath-curriculum/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-03-06-anthropic-codepath-curriculum/</guid><description>I broke down the AI Engineering curriculum Anthropic and CodePath built together, week by week. This piece walks through why fundamentals and critical code reading still sit at the center even when AI writes the code, the AI Native Engineer profile that falls out of the curriculum, and what I see in my own mentoring.</description><pubDate>Fri, 06 Mar 2026 11:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;In an era where we barely type code anymore, the very first assignment in a curriculum built by the world&apos;s largest AI company is &quot;find the bug in the AI-generated code.&quot;&lt;/p&gt;
&lt;p&gt;In February 2026, &lt;a href=&quot;https://www.anthropic.com/news/anthropic-codepath-partnership&quot;&gt;Anthropic announced a partnership with CodePath&lt;/a&gt;. CodePath is the largest university CS education program in the US, with over 20,000 students, 40% of them from low-income households. CodePath CEO Michael Ellison put it this way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;We now have the technology to teach in two years what used to take four.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The point isn&apos;t to crank through lectures faster with AI. The point is to use AI as a tool while also training students to doubt it. The company that builds Claude Code is teaching people how to question Claude Code? That paradox is what pulled me in, and I went through the curriculum line by line.&lt;/p&gt;
&lt;p&gt;So what should you actually learn? Where should an engineer in the AI era spend their time? Anthropic&apos;s answer is sitting inside this curriculum.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Going Through the CodePath Curriculum&lt;/h2&gt;
&lt;p&gt;The program has three stages, 30+ weeks total. I&apos;ll walk through each stage week by week in as much detail as I can.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A note: this curriculum is scheduled to launch officially in summer 2026, and Howard University is already running it as a credit course in spring 2026. The week-by-week breakdown and assignment specifics below are partly inferred from the public topic list and the pilot, so the real curriculum may diverge in places.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Stage 1: Foundations of AI Engineering (10 weeks)&lt;/h3&gt;
&lt;p&gt;It&apos;s labeled &quot;foundations,&quot; but the definition of foundations is completely different from what you&apos;d see in a traditional bootcamp.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 1-2&lt;/strong&gt; cover Python-based data structures, algorithms, and OOP. So far, this is what you&apos;d find anywhere. The assignments, though, are different. Students implement linked lists and trees with Claude Code, and then, instead of stopping there, they review the AI-generated code themselves and look for bugs.&lt;/p&gt;
&lt;p&gt;From week one, the message is &quot;don&apos;t just use the code AI hands you.&quot; (For context, the curriculum centers Claude Code but also pulls in GitHub Copilot and AI-based IDEs. It&apos;s deliberately designed not to lock students into one tool.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 3-4&lt;/strong&gt; are where the real spine of stage 1 lives: &lt;strong&gt;critical evaluation&lt;/strong&gt; of AI-generated code. Students get AI code that has subtle bugs planted in it on purpose, and they have to debug it and propose improvements. They also generate the same problem three times with different prompts, then write a comparison report.&lt;/p&gt;
&lt;p&gt;If you sit with that for a moment, it&apos;s actually pretty smart. When you generate the same problem three times with three prompts, you feel it: &quot;oh, AI gives wildly different code depending on how you prompt it.&quot; The same model, but the quality swings hard with how you ask.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 5&lt;/strong&gt; is algorithmic thinking plus prompt-chain design. Students decompose complex problems step by step and design a prompt chain for each step. There&apos;s an experiment comparing &quot;solve in one prompt&quot; vs &quot;split into a 3-step chain.&quot; Prompt engineering is being taught not as a standalone skill but as an extension of algorithmic thinking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 6&lt;/strong&gt; is ML literacy. No math, just concepts. Students classify use cases for supervised, unsupervised, and generative models, and they call a pretrained sentiment-analysis API and write up how to read the result. It focuses on &quot;understanding what models do,&quot; not &quot;how to build models.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 7-8&lt;/strong&gt; is where it gets real: RAG, agentic workflows, fine-tuning, and guardrails. Build a Q&amp;amp;A chatbot off three PDFs and a vector DB. Build an agent connected to two or three tools. Add a &quot;no PII leakage&quot; filter to a chatbot, then run a red-team test against it. Stage 1, week 7, and they&apos;re already teaching guardrails. Production-level concerns are getting planted from the start.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 9&lt;/strong&gt; is Git and GitHub collaboration. PR creation, code review, merge-conflict resolution. Putting this in week 9 feels intentional to me. It&apos;s the pivot from &quot;building things alone with AI&quot; to &quot;building things on a team with AI.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 10&lt;/strong&gt; is the capstone for stage 1. Pick from a chatbot, a summarization tool, or a documentation assistant, and ship something that actually works with RAG and guardrails wired in.&lt;/p&gt;
&lt;h4&gt;Featured Assignment: &quot;Spot the Broken One in 5 AI-Generated Sort Algorithms&quot;&lt;/h4&gt;
&lt;p&gt;This one assignment compresses the philosophy of stage 1. AI hands you five sort-algorithm implementations, and you have to find the one that&apos;s broken. &quot;Don&apos;t assume AI is right&quot; is the first principle of the entire curriculum.&lt;/p&gt;
&lt;p&gt;If traditional CS education was &quot;implement the sort algorithm yourself,&quot; this curriculum is &quot;&lt;strong&gt;read and evaluate&lt;/strong&gt; the sort algorithm AI implemented.&quot; From writing to reading. From producing to verifying. That shift is the point.&lt;/p&gt;
&lt;h3&gt;Stage 2: Applications of AI Engineering (10 weeks)&lt;/h3&gt;
&lt;p&gt;If stage 1 was foundational training, stage 2 is the real thing. And the difficulty jumps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 1-2&lt;/strong&gt; start strong. Students get a real open-source project, a codebase of more than 10,000 lines. They use Claude Code to map the structure and produce an architecture diagram.&lt;/p&gt;
&lt;p&gt;Think 10,000 lines is a lot? In the field, you get handed legacy systems with hundreds of thousands of lines and the line &quot;figure this out by next week.&quot; So 10,000 lines is the warm-up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 3-4&lt;/strong&gt; are spec-based implementation plus debugging. CodePath officially calls this &quot;Spec-driven vibe coding.&quot; Students get a feature spec, build it with AI, and then make it pass tests. The name keeps the &quot;vibe coding&quot; framing, but the spec is the leash. There&apos;s one more decisive twist: students have to &lt;strong&gt;log &quot;the parts AI couldn&apos;t solve, where I had to step in myself.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 5-7&lt;/strong&gt; are about integrating advanced techniques into production. Add RAG search to an existing web app. Wire error handling, logging, and monitoring into an agent pipeline. Write a guardrail policy doc, implement it, and evaluate it. The thing worth noticing is that &lt;strong&gt;this is not greenfield work; it&apos;s integration into an existing codebase&lt;/strong&gt;. AI is great at &quot;build something new.&quot; &quot;Wedge it into existing code&quot; is still on the human.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 8-9&lt;/strong&gt; are PR review training. Students review another team&apos;s AI-generated PR, judge whether the code was written by AI or by a human, and leave improvement comments. They also build their own review-criteria checklist covering security, performance, readability, and test coverage.&lt;/p&gt;
&lt;p&gt;In an era when AI writes the code, the program is making students design code-review checklists. That is the final boss of reading skill.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 10&lt;/strong&gt; is submitting a real open-source PR. In the 2025 pilot, students sent PRs to projects like GitLab, Puter, and Dokploy, and got reviewed by actual maintainers.&lt;/p&gt;
&lt;h4&gt;Featured Assignment: &quot;Map a 10,000+ LOC Open-Source Project&quot;&lt;/h4&gt;
&lt;p&gt;Don&apos;t read line by line. Ask AI the right questions. That is the spine of this assignment. &quot;What&apos;s the entry point of this project?&quot; &quot;How does data flow through it?&quot; &quot;What are this module&apos;s core dependencies?&quot; Students structure huge codebases by interrogating the AI.&lt;/p&gt;
&lt;p&gt;This is exactly the skill I wrote about in my earlier piece, &quot;&lt;a href=&quot;https://flowkater.io/posts/2026-02-19-code-reading-era&quot;&gt;The Era of Not Reading Code&lt;/a&gt;&quot;. Code reading in the AI era isn&apos;t about following each line. It&apos;s about grasping the structure and zooming in on the core logic.&lt;/p&gt;
&lt;h4&gt;Featured Assignment: &quot;Log the Parts AI Couldn&apos;t Solve, Where You Had to Step In&quot;&lt;/h4&gt;
&lt;p&gt;This is how you prove learning happened in the AI era. Code AI wrote for you isn&apos;t your skill. The bugs you debugged because AI couldn&apos;t, the design you changed yourself, the tests you added: that&apos;s the actual learning.&lt;/p&gt;
&lt;p&gt;&quot;Build fast with AI, but keep a log of where AI got it wrong.&quot; That one line summarizes the entire assignment design philosophy.&lt;/p&gt;
&lt;h3&gt;Stage 3: AI Open-Source Capstone&lt;/h3&gt;
&lt;p&gt;The final stage is closer to an internship than a class. Students get assigned to a real open-source project, pick an issue, build the fix with Claude Code, file the PR, and get it merged. They write weekly sprint reports and communicate with maintainers.&lt;/p&gt;
&lt;p&gt;Final deliverable? A real open-source contribution history you can put in a portfolio.&lt;/p&gt;
&lt;h4&gt;Featured Assignment: Real Open-Source Contributions&lt;/h4&gt;
&lt;p&gt;Not a toy project. Not a Todo app. A PR with real users, reviewed by real maintainers, that actually gets merged. That is the graduation requirement of this bootcamp.&lt;/p&gt;
&lt;p&gt;A student who participated in the 2025 fall pilot said something I keep coming back to.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Claude Code was instrumental in my learning process, especially since I came into the project with very little experience in the programming languages used in the repository [including TypeScript and Node.js].&quot;&lt;/p&gt;
&lt;p&gt;by Laney Hood, CodePath student and computer science major at Texas Tech University&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;She had almost no experience with TypeScript or Node.js, and Claude Code is what let her contribute to a real open-source project. AI lowered the entry barrier, and on top of that the actual learning happened.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What an AI Native Engineer Looks Like to Anthropic&lt;/h2&gt;
&lt;p&gt;Once you&apos;ve gone through the whole curriculum, the pattern shows up. The kind of engineer Anthropic wants converges on four keywords.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Critical code evaluation.&lt;/strong&gt; &quot;Don&apos;t assume AI is right&quot; is the first principle of the entire program. GPT-6 will ship. Claude Opus 5 will ship. It won&apos;t change the answer. AI is right 99% of the time. The remaining 1% is what causes incidents in production. Catching that 1% is on the human.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Large-codebase comprehension.&lt;/strong&gt; In an era when AI writes code fast, the value of reading goes up, not down. It sounds backwards but it&apos;s true. The faster you produce, the more code there is to review. &lt;a href=&quot;/posts/2026-02-19-code-reading-era&quot;&gt;Choosing not to read code is different from being unable to read it.&lt;/a&gt; The first is a choice. The second is a ceiling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Production-level concerns.&lt;/strong&gt; &quot;Code that runs&quot; and &quot;code you can ship to production&quot; are not the same thing. Most AI-generated code lands at &quot;it runs.&quot; Error handling, logging, security, performance: wiring those in is a human judgment call. That&apos;s why guardrails show up in week 7 of stage 1.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-world contribution.&lt;/strong&gt; Not toy projects, real open-source. Reviewed by maintainers, actually merged. Putting this in as a graduation requirement isn&apos;t just clever assignment design. It&apos;s saying: come out of this with experience that has been validated in the wild.&lt;/p&gt;
&lt;p&gt;And all four sit on top of the same premise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Without input, critical reading is impossible.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you don&apos;t know data structures, you can&apos;t find the bug in an AI-generated sort algorithm. If you don&apos;t know HTTP, you can&apos;t judge whether the error handling on an AI-built API is right. Fundamentals are the raw material for critical thinking.&lt;/p&gt;
&lt;p&gt;This is already showing up in interviews. According to CodePath, employers are increasingly asking candidates to &quot;interpret, review, and explain AI-generated code&quot; in interviews. Reviewing AI code is becoming an interview question. The curriculum is preparing students for that.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;How the World Is Teaching This Right Now&lt;/h2&gt;
&lt;p&gt;CodePath isn&apos;t the only one moving. US universities are rebuilding their curricula for the AI era. The directions vary wildly, and that variance is the interesting part. It means nobody knows the answer yet.&lt;/p&gt;
&lt;h3&gt;Stanford: Same School, Three Different Experiments&lt;/h3&gt;
&lt;p&gt;Stanford is the most dramatic case. Two opposite approaches are running at the same university, at the same time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://web.stanford.edu/class/cs106a/&quot;&gt;CS106A&lt;/a&gt; (Programming Methodology, the intro course)&lt;/strong&gt;: AI is banned. The syllabus literally says, &quot;we do not want you using AI to do your assignments.&quot; The position is that the foundational thinking skills of programming have to be built without AI. If you let beginners use AI, the thought process itself never forms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://themodernsoftware.dev/&quot;&gt;CS146S&lt;/a&gt; (The Modern Software Developer, software development in the AI era)&lt;/strong&gt;: the opposite. A new course built around full AI adoption, taught by &lt;a href=&quot;https://mihaileric.com/&quot;&gt;Mihail Eric&lt;/a&gt;. I quoted him in &lt;a href=&quot;/posts/2026-03-01-agentic-engineering-9-skills&quot;&gt;my earlier post on agentic engineering&lt;/a&gt;. Now he&apos;s teaching this directly at Stanford.&lt;/p&gt;
&lt;p&gt;When you look at the CS146S 10-week curriculum, you see a lot of overlap with CodePath, but the texture is different.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Weeks 1-2&lt;/strong&gt;: LLM mechanics, prompt engineering, agent architecture (MCP)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weeks 3-5&lt;/strong&gt;: Working with AI IDEs, terminal automation, context management (the craft of handling tools)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weeks 6-7&lt;/strong&gt;: AI-driven testing, vulnerability detection, debugging, code review (the craft of verification)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weeks 8-9&lt;/strong&gt;: Automated UI building, monitoring, incident response (production-level concerns)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Week 10&lt;/strong&gt;: The evolving role of the software engineer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The guest-lecturer lineup is also worth noticing: Russell Kaplan from Cognition, Zach Lloyd from Warp, Martin Casado from a16z. Practitioners from the Valley come in and tell students how the ground is shifting.&lt;/p&gt;
&lt;p&gt;Mihail Eric&apos;s core message lands in two lines.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Human-agent engineering, not vibe coding.&quot;&lt;/p&gt;
&lt;p&gt;&quot;LLMs are only as good as you are.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He also uses the metaphor that &quot;the developer is the manager of the AI agent intern.&quot; AI does the work, but the human sets direction and signs off. &lt;a href=&quot;https://github.com/mihail911/modern-software-dev-assignments&quot;&gt;The assignments are public on GitHub.&lt;/a&gt; When you actually open them up, they&apos;re worth reading.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Week 1&lt;/strong&gt;: Use a local LLM (Ollama) to hands-on practice six prompting techniques: K-shot, Chain-of-Thought, Tool calling, RAG, Reflexion, and more. Not API calls, locally hosted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Week 2&lt;/strong&gt;: Extend a FastAPI+SQLite app inside the Cursor AI IDE. Real experience growing an app inside an AI IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Week 3&lt;/strong&gt;: Build an MCP server that wraps an external API, then connect it to Claude Desktop or an AI IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Week 4&lt;/strong&gt;: Build at least two automations with &lt;strong&gt;Claude Code&lt;/strong&gt;. Combine Slash commands, CLAUDE.md, SubAgents, and MCP servers to automate a development workflow. The required reading is Anthropic&apos;s &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code best practices&lt;/a&gt; doc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Week 5&lt;/strong&gt;: Multi-agent workflow inside Warp. Same app as week 4, different toolchain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Week 6&lt;/strong&gt;: Run Semgrep to scan for security vulnerabilities, then fix at least three by hand. Training the human to catch security issues in AI-generated code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Week 7&lt;/strong&gt;: The most striking assignment. Implement a feature with a one-shot prompt to an AI coding tool, then do a manual line-by-line review yourself, then run Graphite Diamond&apos;s AI code review on it, then write a comparison write-up of your review vs the AI&apos;s review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Week 8&lt;/strong&gt;: Build the same app in three different tech stacks. One of them has to use bolt.new (an AI app generation platform).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compared to CodePath, the texture is different. CS146S is &lt;strong&gt;tool-centered&lt;/strong&gt;. Cursor, Claude Code, Warp, Graphite, Semgrep, bolt.new: students rotate through the AI tools the field actually uses, week to week. CodePath is &lt;strong&gt;thinking- and judgment-centered&lt;/strong&gt;. &quot;Spot the broken one in 5 AI-generated sort algorithms,&quot; &quot;log the parts AI couldn&apos;t solve where you had to step in&quot;; the focus is on reasoning and evaluation, not the tools.&lt;/p&gt;
&lt;p&gt;Both share the same premise: humans verify AI code. CS146S Week 7&apos;s &quot;manual review vs AI review comparison&quot; and CodePath&apos;s &quot;critical evaluation of AI code&quot; are the same destination via different routes.&lt;/p&gt;
&lt;p&gt;Two branches at the same Stanford. Neither is &quot;the right one.&quot; Stanford is showing through experiment that the right approach depends on the student&apos;s level and the goal.&lt;/p&gt;
&lt;h3&gt;UW Allen School: The &quot;Coding Is Dead&quot; Declaration&lt;/h3&gt;
&lt;p&gt;In July 2025, Magdalena Balazinska, the chair of the UW CS department, said this on the record:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Coding, that is, translating a precise design to software instructions, is dead. AI now does that.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Provocative, but there&apos;s context. UW allows GPT tools on assignments, but requires students to cite the AI as a collaborator the same way they&apos;d cite another student. &quot;If you used AI, disclose how.&quot; Not banned, transparent.&lt;/p&gt;
&lt;p&gt;The philosophy is close to CodePath&apos;s &quot;log the parts AI couldn&apos;t solve, where you had to step in.&quot; Assume AI use, then make students record and reflect on the process.&lt;/p&gt;
&lt;h3&gt;UMD: Claude Code in the Classroom&lt;/h3&gt;
&lt;p&gt;The University of Maryland is even more direct. Professor William Pugh launched &lt;a href=&quot;https://www.coursicle.com/umd/courses/CMSC/398Z/&quot;&gt;CMSC 398Z, &quot;Effective use of AI Coding Assistants and Agents,&quot;&lt;/a&gt; in fall 2025. Students get hands-on with Copilot, VSCode, and CLI tools like Claude Code in class. They use agents for build-system invocation, test runs, and error fixes.&lt;/p&gt;
&lt;p&gt;A line from Pugh&apos;s commentary stayed with me. &quot;Long term, we plan to update the entire undergraduate CS curriculum to account for the existence of AI coding tools.&quot; Not one course, the whole curriculum.&lt;/p&gt;
&lt;h3&gt;Harvard CS50: The Most Conservative Approach&lt;/h3&gt;
&lt;p&gt;At the other end is Harvard. CS50 built its own AI rubber duck (&lt;a href=&quot;https://cs50.harvard.edu/x/notes/ai/&quot;&gt;CS50.ai&lt;/a&gt;) and integrated it into the class. AI as a teaching tool. But on regular assignments, external AI (ChatGPT, Copilot, etc.) is not allowed. The final project allows it, but with the condition that &quot;the substance has to be your own.&quot;&lt;/p&gt;
&lt;p&gt;The course doesn&apos;t directly teach &quot;how to use AI coding tools.&quot; The position is that AI helps learning, but the student is the subject of the learning.&lt;/p&gt;
&lt;h3&gt;UC San Diego + Google: A Global Consortium&lt;/h3&gt;
&lt;p&gt;UC San Diego received $1.8 million from Google.org and launched the &lt;a href=&quot;https://today.ucsd.edu/story/transforming-computer-science-education-in-the-age-of-ai&quot;&gt;GenAI in CS Education Consortium&lt;/a&gt;. It&apos;s co-run with the University of Toronto and is developing six turnkey courses. The starting premise is, &quot;industry now expects AI tool fluency from new engineers.&quot;&lt;/p&gt;
&lt;h3&gt;Andrew Ng: &quot;The Golden Age of the Product Engineer&quot;&lt;/h3&gt;
&lt;p&gt;The person who has framed all of this most clearly is Andrew Ng. In Stanford &lt;a href=&quot;https://www.youtube.com/watch?v=AuZoDsNmG_s&quot;&gt;CS230 Autumn 2025 Lecture 9: Career Advice in AI&lt;/a&gt;, the things he said landed.&lt;/p&gt;
&lt;p&gt;Ng called this &lt;strong&gt;&quot;the best time in history&quot;&lt;/strong&gt; to be someone building things with AI, citing research that the complexity of tasks AI can handle doubles every seven months.&lt;/p&gt;
&lt;p&gt;But what he emphasized wasn&apos;t speed. It was that &lt;strong&gt;the bottleneck has moved&lt;/strong&gt;. As code production explodes thanks to AI, the real bottleneck has shifted to &quot;deciding what to build.&quot; The traditional ratio of PMs to engineers in the Valley used to be 1:4 or 1:8, and now it&apos;s collapsing toward 1:1, or the roles are merging entirely.&lt;/p&gt;
&lt;p&gt;Being able to write code is no longer a differentiator. The most valuable engineers are the ones who can talk to users, empathize with them, and decide what to build.&lt;/p&gt;
&lt;p&gt;Guest lecturer Laurence Moroney (Arm AI Director) was even more direct. He proposed three survival conditions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Understanding in Depth.&lt;/strong&gt; It&apos;s not enough to use high-level APIs. You have to understand what&apos;s running underneath them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business focus.&lt;/strong&gt; The era of &quot;build something cool&quot; is over. Build something tied to business value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obsession with delivery.&lt;/strong&gt; Ideas are cheap. The differentiator is being able to actually ship to production.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Moroney also warned about the &quot;tech debt&quot; vibe coding generates. You can generate an entire app with an LLM, but the code that comes out carries massive debt.&lt;/p&gt;
&lt;p&gt;Ng&apos;s last piece of advice for students stuck with me. &lt;strong&gt;&quot;Pick the team, not the brand.&quot;&lt;/strong&gt; He told a story of a student who got into a famous AI company and ended up on a backend Java payments team, and said learning on a small but good team beats a flashy logo.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Redefining the Fundamentals: AI Doesn&apos;t Build Your Thinking for You&lt;/h2&gt;
&lt;p&gt;Po-Shen Loh, a math professor at Carnegie Mellon, has a line:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Using AI to do your writing homework is the same as driving a car instead of running a mile for exercise.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your body reaches the destination. Your fitness doesn&apos;t get built.&lt;/p&gt;
&lt;p&gt;Loh argues that education has to change. We need to teach not &quot;how to do the homework&quot; but &quot;how to grade it.&quot; That&apos;s exactly why CodePath has students looking for errors in AI code from week one. To grade what AI produced, you have to know the right answer first.&lt;/p&gt;
&lt;p&gt;He uses another keyword: &lt;strong&gt;&quot;the ability to simulate the world.&quot;&lt;/strong&gt; The capacity to play out an unfolding future in your head, drawing on empathy and a wide range of lived experience. That&apos;s a human area AI can&apos;t take. AI finds patterns in past data. Simulation happens in a person.&lt;/p&gt;
&lt;p&gt;Stanford CS106A bans AI. CS146S allows AI but pins down &quot;human-agent engineering, not vibe coding.&quot; Andrew Ng puts &quot;Understanding in Depth&quot; as the first survival condition. Laurence Moroney says using only high-level APIs isn&apos;t enough. They all point to the same place.&lt;/p&gt;
&lt;p&gt;Without fundamentals, AI use floats in midair.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;If You Already Know How, AI Becomes 10x or 100x&lt;/h2&gt;
&lt;p&gt;Honestly, I&apos;m one of the people getting the most out of AI.&lt;/p&gt;
&lt;p&gt;In the last two months I shipped 1,847 commits. Solo, running backend, iOS, web, and infra in parallel. Writing TDD, designing the architecture as I went. To do the same thing alone before would have taken several times longer. Code-writing speed isn&apos;t even the main thing; the surface area I can cover has changed shape.&lt;/p&gt;
&lt;p&gt;10x, easily. Maybe more.&lt;/p&gt;
&lt;p&gt;But there&apos;s still work that takes a human. Deciding what to build. Designing how to build it. Owning whether the final result is good. AI builds what I tell it to build. &quot;What to tell it&quot; is on me.&lt;/p&gt;
&lt;p&gt;What Andrew Ng said about &lt;strong&gt;&quot;the bottleneck moving from implementation to decision&quot;&lt;/strong&gt; is exactly this experience. Building is fast. What to build, how far to take it, whether this is even the right thing: that judgment is the bottleneck.&lt;/p&gt;
&lt;p&gt;A person with fundamentals goes 10x or 100x with AI. A person without fundamentals doesn&apos;t even notice when AI is wrong. Two people using the same AI end up with very different results because of this.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Mentoring: Reviewing AI Conversations&lt;/h2&gt;
&lt;p&gt;This year I changed how I mentor. Instead of having mentees share their code, I started having them share their AI conversations. I went through 165 conversations and built a five-criterion framework: depth of question, level of context provided, whether they include their own hypothesis, how they ask for verification, and the connectedness of follow-up questions.&lt;/p&gt;
&lt;p&gt;I have to talk about John (pseudonym). He&apos;s been programming for a long time (John is a non-CS major), but his programming skill had been stuck for months. The AI conversations made the reason obvious.&lt;/p&gt;
&lt;p&gt;&quot;How do I do this?&quot;
&quot;Write the code for me.&quot;
&quot;I don&apos;t get what you&apos;re saying.&quot;&lt;/p&gt;
&lt;p&gt;AI gives an answer. John copies it. He doesn&apos;t think. No learning happens.&lt;/p&gt;
&lt;p&gt;A mentee who grew fast in the same period had completely different conversations.&lt;/p&gt;
&lt;p&gt;&quot;A transaction is supposed to be all-success or all-fail, but @Async runs on a separate thread, so it seems like it&apos;s stepping outside the transaction scope. Is this hypothesis correct?&quot;&lt;/p&gt;
&lt;p&gt;He builds his own hypothesis, then asks AI to verify it. Even when AI gives the answer, he integrates the answer into his own understanding.&lt;/p&gt;
&lt;p&gt;What&apos;s smart about the CodePath curriculum is that it solves this problem structurally. &quot;Spot the broken one in 5 AI-generated sort algorithms&quot;: you can&apos;t do that without your own hypothesis. You need the standard &quot;this algorithm should behave like this&quot; already in your head before you can find the broken one. The curriculum forces critical thinking by structure.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Some Notes on the Curriculum Itself&lt;/h2&gt;
&lt;p&gt;A while back social media got loud over a fake news story that Stanford no longer teaches programming languages. Given how far AI has come, you can see why people fell for it. The funny thing is, the original CS curriculum doesn&apos;t really teach programming language syntax in the first place. When you take the intro course in Python, that course is teaching programming principles, thinking, and problem solving. It&apos;s not teaching Python syntax. If next semester&apos;s data structures course uses Java, you&apos;re expected to study the basic syntax on your own beforehand.&lt;/p&gt;
&lt;p&gt;How do US universities actually teach? There&apos;s a Korean-dubbed video on the Science Adam channel about &lt;a href=&quot;https://youtu.be/7ZJ4oo4h8vI?si=w4gUKhpRHv412yE-&quot;&gt;Harvard&apos;s intro CS class&lt;/a&gt; that I&apos;d recommend. You can feel the lecture quality in a way the curriculum description alone won&apos;t show. (&lt;a href=&quot;https://www.youtube.com/watch?v=HJP0a6vKvlo&amp;amp;list=PLhQjrBD2T380hlTqAU8HfvVepCcjCqTg6&quot;&gt;The whole course&lt;/a&gt; is public, so going through it is also worth it.)&lt;/p&gt;
&lt;p&gt;The philosophy comes through clearly in &lt;a href=&quot;https://youtu.be/3uwdBZBpO8E&quot;&gt;an actual lecture&lt;/a&gt; by Harvard CS50 professor David Malan. In the first class he says: &quot;In an era when AI does all the coding, why learn? This class has never once been a class about coding skill. &lt;strong&gt;It is a class about how to think.&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;p&gt;Malan then has GitHub Copilot generate, in seconds, the C-language assignment (a hash-table-based spell checker) that students spent 15 hours on. And he asks: &quot;Do you think those 15 hours were wasted?&quot; The answer is no. Without the &quot;eye for code&quot; you build during those 15 painful hours, you can&apos;t tell when AI is hallucinating: code that confidently uses libraries that don&apos;t exist, code that&apos;s syntactically perfect but logically wrong.&lt;/p&gt;
&lt;p&gt;The AI rubber duck CS50 introduced in 2023 follows the same principle. It&apos;s GPT-based, but it doesn&apos;t give answers directly. Its system prompt is set to &quot;guide students Socratically so they figure it out themselves.&quot; AI is a learning tool, but the student goes through the thinking process.&lt;/p&gt;
&lt;p&gt;A line Malan ended on stuck with me. &lt;strong&gt;&quot;Evolve from a semicolon expert (a bricklayer) into a system designer (an architect).&quot;&lt;/strong&gt; In an era when AI lays the bricks, only people with the eye of an architect can use AI as a tool. That eye only grows in someone who has laid bricks themselves.&lt;/p&gt;
&lt;p&gt;This is also why the CodePath curriculum opens week one with &quot;find the bug in AI-generated code.&quot; Only a person who has stacked bricks recognizes a brick stacked wrong.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What&apos;s Missing: Things the Curriculum Doesn&apos;t Teach&lt;/h2&gt;
&lt;p&gt;A good curriculum doesn&apos;t have everything. Honestly, I see gaps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design and architectural thinking.&lt;/strong&gt; This is hard to plant through education in a short window. You need to live through dozens of bad designs and analyze, after the fact, why they were bad. The curriculum is implementation-heavy. It doesn&apos;t systematically teach failure and retrospective on design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Frankenstein trap.&lt;/strong&gt; This is a new risk in the AI era. Code production is fast, so you end up building features you don&apos;t need. The thinking is &quot;I can build it fast anyway.&quot; The result isn&apos;t a sharp solution but a monster. Lots of features, but you can&apos;t tell what the product actually does.&lt;/p&gt;
&lt;p&gt;&quot;What not to build&quot; is the more important call. AI doesn&apos;t make that call for you. It builds what it&apos;s told. The &quot;tech debt of vibe coding&quot; Laurence Moroney warned about lives in the same neighborhood. Being able to build fast also means being able to break fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI biases my own thinking.&lt;/strong&gt; This is a trap I&apos;ve personally fallen into. When I ask AI, the answers come back close to my own direction. AI polishes what I already think. Other perspectives stop showing up. Without real user feedback or someone else&apos;s outside view, you end up locked in an echo chamber. Diverse feedback loops matter more in the AI era because of this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team collaboration and communication.&lt;/strong&gt; Teaching Git collaboration in week 9 is a good thing. But the process of deciding &quot;what to build,&quot; aligning opinions inside a team, and getting the direction right: the curriculum doesn&apos;t address that explicitly. If, as Andrew Ng said, the PM and engineer roles are merging, then talking to users and building empathy with them matters more than coding. Even when AI writes the code, the process of choosing direction happens between people.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Domain interest.&lt;/strong&gt; Healthcare, law, education, finance: the impact is largest when a domain expert combines with AI. A person who knows the domain deeply often produces a sharper result with AI than someone who knows coding deeply. The curriculum focuses on AI engineering skills, so the part about growing domain thinking is missing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compared to Korean bootcamps.&lt;/strong&gt; Most domestic Korean bootcamps stay stuck in the &quot;basic syntax → mini project → team project → portfolio&quot; structure. The biggest difference from the CodePath curriculum is the contact point with existing codebases. Receiving a 10,000-line open-source project, mapping it, and submitting a PR: that is the training closest to the actual job.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;The hiring market is hard for several reasons, but underneath it all is that the AI Native Engineer requires a different set of qualities from the software engineer of the past. The moat called &quot;code-writing skill&quot; is gone, so &quot;code-writing skill&quot; no longer carries economic value. Companies preferring seniors over juniors isn&apos;t because seniors are better at writing code. It&apos;s because their domain comprehension, their grasp of business models, and their experience translating user requirements into appropriate-tech solutions all get amplified by AI. The &quot;tacit knowledge&quot; built through that experience isn&apos;t easy to acquire. Which is why the open-source PR contributions in this curriculum may be the closest thing to a &quot;tacit knowledge&quot; model that fills that gap.&lt;/p&gt;
&lt;p&gt;Even so, fundamentals matter. The order matters. Fundamentals first. AI rides on top. Without fundamentals, AI is weight, not wings. You can build fast, but you can&apos;t tell what you&apos;re building or whether you&apos;re building it well. Anthropic, the company that builds Claude Code, is probably feeling more sharply than anyone that human pre-training (fundamentals, experience) amplifies AI capability.&lt;/p&gt;
&lt;p&gt;Just like AI models perform differently based on pre-training volume and parameters, humans probably also vary widely in capability based on their pre-training.&lt;/p&gt;
&lt;p&gt;The entry barrier in the AI era has dropped. Definitely. People who don&apos;t know coding at all can build something. But the ceiling has risen. The gap between people who use AI well and people who don&apos;t is much wider than the old &quot;good coder vs bad coder&quot; gap.&lt;/p&gt;
&lt;p&gt;Is the direction CodePath is going the right one? The world is changing too fast, so the curriculum will keep changing. But three things won&apos;t change in the AI era, or after it: training to not blindly trust AI, training to read and integrate existing codebases, training to contribute in the wild.&lt;/p&gt;
&lt;p&gt;And the proposition that &quot;people who did good work in the previous era also do good work in the AI era&quot; is something everyone would agree with.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/anthropic-codepath-partnership&quot;&gt;Anthropic x CodePath partnership official announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codepath.org/news/anthropic-partners-with-codepath&quot;&gt;CodePath official news&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://info.codepath.org/codepath-build-ai-software-with-anthropic-claude-code&quot;&gt;CodePath AI Engineering course page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://themodernsoftware.dev/&quot;&gt;Stanford CS146S: The Modern Software Developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mihail911/modern-software-dev-assignments&quot;&gt;CS146S assignments on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.stanford.edu/class/cs106a/&quot;&gt;Stanford CS106A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.geekwire.com/2025/coding-is-dead-uw-computer-science-program-rethinks-curriculum-for-the-ai-era/&quot;&gt;UW Allen School: &quot;Coding is Dead&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.coursicle.com/umd/courses/CMSC/398Z/&quot;&gt;UMD CMSC 398Z&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cs50.harvard.edu/x/notes/ai/&quot;&gt;Harvard CS50 AI Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://today.ucsd.edu/story/transforming-computer-science-education-in-the-age-of-ai&quot;&gt;UC San Diego: GenAI in CS Education Consortium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=AuZoDsNmG_s&quot;&gt;Andrew Ng, CS230 Lecture 9: Career Advice in AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/Mxt73V9sBRA&quot;&gt;Po-Shen Loh: How Carnegie Mellon Teaches Thinking in the AI Era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Earlier post: &lt;a href=&quot;https://flowkater.io/posts/2026-02-19-code-reading-era&quot;&gt;The Era of Not Reading Code: What Should Engineers Read?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Earlier post: &lt;a href=&quot;https://flowkater.io/posts/2026-03-01-agentic-engineering-9-skills&quot;&gt;9 Survival Skills for the Age of Agentic Engineering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>ai-coding</category><category>essay</category><category>education</category><category>career</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Wrapping Up January and February 2026 (Not Really a Retro)</title><link>https://flowkater.io/en/posts/2026-03-02-jan-feb-2026-retro/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-03-02-jan-feb-2026-retro/</guid><description>After leaving the company, a sabbatical, a trip to Italy, fights and reconciliations with my partner, and finally getting back to work. Too thin on results to call a retro, too long to call a journal entry.</description><pubDate>Mon, 02 Mar 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2025 was a sabbatical year for me. The month-long trip to Italy in April, right after I left the company, was a real comfort to someone who had worked without a break (and to Ellie, who had quietly stayed beside me through all of it). Venice glittering as the rain lifted. The view of Florence and its sunsets. The starlit nights along the southern Amalfi coast. With no business debts hounding me anymore, no office to return to, those moments were enough on their own. We stayed faithful to the trip all the way through: through the loud, smoggy streets of Naples, through the tourist crush of Rome that wore us out by the time we flew home.&lt;/p&gt;
&lt;p&gt;After we got back from Italy, the rest of 2025 went by fast. I fought with Ellie a lot now that we were together around the clock, and we made up, and we held each other. We laughed, cried, fell asleep. Got lazy, beat ourselves up, then got up again and went outside. Days like that on repeat.&lt;/p&gt;
&lt;p&gt;Honestly, the early months back with Ellie were harder than I expected. I had grown into the authority and routine of being a CTO, and the version of me at work and the version of me at home had been somewhat separate people. Two of me were colliding, and it threw me off. The leader-antipatterns I used to hate had quietly soaked into me. Ellie was not my employee, she was my partner, and I struggled to align with her and move things forward together. I caught myself acting out the exact model I despised most.&lt;/p&gt;
&lt;p&gt;The cycles of self-pity and self-loathing I carried out of the previous company kept replaying until I finally put them on the page in &lt;a href=&quot;/posts/2026-01-25-no-victory-no-future/&quot;&gt;How Organizations That Cannot Win Fall Apart&lt;/a&gt;. They tormented me long enough that even a season meant for rest got eaten up by them. I would sink into my own darkness, thrashing around in it, and on those days I said things to Ellie that hurt her. She always took me back in anyway, and so to repay her, today again I cook a meal and fold towels and sort the recycling. (Though her share of the housework is still overwhelmingly larger than mine.)&lt;/p&gt;
&lt;p&gt;Looking back at how quickly that time slipped past, I get small flashes of &quot;I should have done this, I should have done that,&quot; but a body and mind that broke right after leaving a job probably needed exactly that much time to mend on their own.&lt;/p&gt;
&lt;p&gt;I had originally planned to write a proper retro: what I worked on, what I made, how hard I&apos;d been living (allegedly). But honestly, I&apos;m not sure what use a retro like that is when I write it. It&apos;s not the kind of essay where I&apos;m thinking about the era; it&apos;s a deeply personal one. Writing works as its own form of therapy for me, so even if this post only achieves that, that&apos;s enough. So I just started writing.&lt;/p&gt;
&lt;p&gt;In November I registered as a sole proprietor, and worked-stopped-worked-stopped through the fall. From December I got back to it in earnest. In January and February, I tried to stop obsessing over routines, stop blaming the lazy version of myself, and just enjoy the moment, do what I wanted to do, and let the days carry me.&lt;/p&gt;
&lt;p&gt;The year before last I kept training hard despite an injury, trying to push through, and that ended up turning into multiple injuries through the second half of 2024 that did not heal cleanly. I came into 2026 having barely worked out for almost a year and not properly recovered, but starting in January I&apos;ve been training again at a level my body can handle.&lt;/p&gt;
&lt;p&gt;From December into January and February, I wrote a lot. The only readers are Ellie and a few close friends, but I finally started writing the &lt;a href=&quot;/posts/2026-01-19-pangyo-it-episode-1/&quot;&gt;novel&lt;/a&gt; I had wanted to write for so long. I have to keep serializing to live up to those readers&apos; expectations, and the more I write the harder it gets. I also wrote more blog posts than I ever have before. I tried to weave the emotions and ideas I had been stacking up inside me into actual prose. &lt;a href=&quot;/posts/2026-02-19-code-reading-era/&quot;&gt;One of them&lt;/a&gt; ended up bringing a flood of visitors to a blog nobody used to visit. (Their presence forces me to polish the raw drafts a little, which I guess can&apos;t be helped.) Ellie also keeps reminding me to keep my words and behavior straight. Writing made me want to put the phone down and read more books, so I went so far as to buy an Onyx Palma to read on, and I&apos;ve finished three or four books this year so far.&lt;/p&gt;
&lt;p&gt;The project I started in December is in alpha testing, and I&apos;m thinking about when and how to ship while continuing to harden it. Thanks to how fast AI coding agents have evolved, my hours have actually gone up, not down. Ellie&apos;s complaint that I won&apos;t play with her because I&apos;m busy messaging Jarvis (my AI assistant) on Telegram isn&apos;t entirely a cute joke; outside of reading time, I am basically glued to the phone all day. That said, the more the project matures, the more it needs human hands, piece by piece. (Whatever your project is, if AI seems to be doing all of it for you, flip the question around. You might be building something everyone else can build too. — &lt;a href=&quot;/posts/2026-03-01-agentic-engineering-9-skills/&quot;&gt;Nine Survival Skills for the Agentic Engineering Era&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Last summer was the hottest one of my life and this winter was the coldest one of my life. Having spent my twenties and most of my career heads-down in business and work, the seasons hitting me head-on for the first time. It was more dramatic than I expected. (Into my early thirties I used to wear shorts at home in summer or winter alike, and now I bundle into long pants and fleece socks, which Ellie of course teases me about.)&lt;/p&gt;
&lt;p&gt;My heart feels better than I would have expected to just let this stretch slide by, and at the same time there isn&apos;t enough finished work to call it a real retro yet. So I&apos;m holding onto this passing time, briefly, by writing it down for the future me who will look back at it.&lt;/p&gt;
&lt;p&gt;I&apos;m steadier than I was through last year, when even the rest itself was tangled up with the thoughts that tormented me, and now I&apos;m spending each day with focus again. The value I&apos;m chasing comes down to one thing. Whatever work I&apos;m doing, if I can stay in this present moment, I&apos;ll pay whatever it costs to stay there. I want to live a life where I&apos;m not wasting time regretting the past or worrying about the future, where I&apos;m doing my best at what I want to do, and where I can stay right here in this moment. With that small wish, I&apos;ll close out this strange retro(?) of mine.&lt;/p&gt;
</content:encoded><category>retrospective</category><category>sabbatical</category><category>writing</category><category>career-transition</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>9 Survival Skills for the Agentic Engineering Era</title><link>https://flowkater.io/en/posts/2026-03-01-agentic-engineering-9-skills/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-03-01-agentic-engineering-9-skills/</guid><description>Karpathy named the next thing after vibe coding &apos;agentic engineering.&apos; This post unpacks the nine skills engineers need when the work is now telling agents what to do, with the practice routines that build each one.</description><pubDate>Sun, 01 Mar 2026 05:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;Karpathy, the same person who coined the term vibe coding, &lt;a href=&quot;https://x.com/karpathy/status/2019137879310836075&quot;&gt;posted on X&lt;/a&gt; that we now need a new name to distinguish the next mode from vibe coding, and proposed calling it agentic engineering.&lt;/p&gt;
&lt;p&gt;I&apos;ve been doing vibe coding seriously since last April, and the past two or three months have been turbulent in a way that&apos;s hard to describe. I think the reason my piece &quot;&lt;a href=&quot;https://flowkater.io/posts/2026-02-19-code-reading-era/&quot;&gt;What Should Engineers Read in an Era That No Longer Reads Code?&lt;/a&gt;&quot; went unexpectedly viral was a reaction to that turbulence.&lt;/p&gt;
&lt;p&gt;This post took inspiration from Karpathy&apos;s tweet, but it&apos;s stitched together from my own scars and the field reports of people like Armin Ronacher, Boris Cherny, WenHao Yu, and IndyDevDan, distilled into nine core skills.&lt;/p&gt;
&lt;p&gt;The nine core skills are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Decomposition&lt;/li&gt;
&lt;li&gt;Context Architecture&lt;/li&gt;
&lt;li&gt;Definition of Done&lt;/li&gt;
&lt;li&gt;Failure Recovery Loop&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Memory Architecture&lt;/li&gt;
&lt;li&gt;Parallel Orchestration&lt;/li&gt;
&lt;li&gt;Abstraction Layering&lt;/li&gt;
&lt;li&gt;Taste&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The interesting thing is that all nine of these were already required of any engineer who got things done well, and any manager too, long before agentic engineering or even vibe coding. Why that&apos;s true is the thread I want to pull. Let&apos;s start with Karpathy&apos;s story and walk through them one by one.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Weekend of Vibe Coding&apos;s Inventor&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt; said he wanted to build a dashboard for his home cameras over a weekend. He gave the agent the IP of his DGX Spark, the username, the password, and the goal. SSH key setup, vLLM configuration, model downloads and benchmarks, video inference server, web UI dashboard, systemd service setup, memory notes, and a markdown report at the end (he asked for all of it in one go). Thirty minutes later it was done.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I didn&apos;t touch anything myself. This was a weekend project just 3 months ago. Now it was 30 minutes of just forgetting about it.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt; gave this new mode a name. &lt;strong&gt;Agentic Engineering.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;&apos;Agentic&apos; because 99% of the time you are no longer writing code directly, you are commanding and supervising agents. &apos;Engineering&apos; because there is art, science, and skill to it.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The era of an app popping out of a few lines of prompt is over. What matters now is &lt;strong&gt;the skill of designing the conditions under which agents actually work.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The change is fast. The adaptation is slow. Most developers haven&apos;t caught up.&lt;/p&gt;
&lt;p&gt;And the speed of this shift is not normal.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;It is hard to put into words how much programming has changed in just the last ~2 months. This was not a &apos;business as usual&apos; kind of incremental progress.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most developers are using AI, but the share of work fully delegated to agents is still low. According to the &lt;a href=&quot;https://resources.anthropic.com/2026-agentic-coding-trends-report&quot;&gt;2026 Agentic Coding Trends Report&lt;/a&gt;, 60% of developers use AI but only 0–20% have fully delegated work to it. There&apos;s a name for this gap: the &lt;strong&gt;Delegation Paradox&lt;/strong&gt;. Letting AI write code is one thing. Handing the work to an agent and walking away is a completely different question.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://agenticengineer.com/top-2-percent-agentic-engineering&quot;&gt;IndyDevDan&lt;/a&gt; put the gap in one sentence.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Do you trust your agents?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most developers say no. I said no at first too. I reviewed every line the agent wrote, and there were times when it took longer than just writing the code myself.&lt;/p&gt;
&lt;p&gt;But as &lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&apos;s&lt;/a&gt; example shows, in the agentic engineering era more and more of the work is being automated and delegated to agents. So what skills (or qualities) do we need to keep being good engineers in this world?&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;① Decomposition&lt;/h2&gt;
&lt;p&gt;If you ask an agent to &quot;build a signup flow,&quot; you&apos;ll get something. The problem is the odds of it being what you actually wanted are low. Email verification is missing. The password rules don&apos;t match yours. The UI went somewhere you couldn&apos;t have predicted.&lt;/p&gt;
&lt;p&gt;Telling an agent to do work is, in the end, &lt;strong&gt;the act of deciding what to build.&lt;/strong&gt; What does the customer want, what does the user need, what&apos;s the priority? That part is on me. The agent can&apos;t take that off my plate.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The key is to develop the intuition to decompose tasks appropriately, delegating to agents where they work well and providing human help where needed.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Easy to say, hard to do. The line between &quot;where they work well&quot; and &quot;where humans need to step in&quot; shifts every time. Some tasks the agent finishes one-shot. Others, you can run three times and it still misses the point. Building intuition for that difference is what decomposition is. &lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt; was pretty clear about the conditions for decomposition too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;It works especially well in some scenarios, especially where the task is well-specified and the functionality can be verified/tested.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Flip that around: when the spec is fuzzy and there&apos;s no way to verify the result, the agent gets lost too. My job is to turn the fuzzy requirement into a clear unit of work.&lt;/p&gt;
&lt;p&gt;When I &lt;a href=&quot;https://flowkater.io/posts/2026-01-09-15-year-cto-vibe-coding/&quot;&gt;built out a TDD workflow with Claude Code&lt;/a&gt;, the lesson was that 70 to 80 percent comes out of one shot, and the remaining 20 percent is the actual job. How well you defined the requirement up front decides how big that 20 percent ends up being.&lt;/p&gt;
&lt;p&gt;You can see the same pattern in &lt;a href=&quot;https://yu-wenhao.com/en/blog/agentic-coding/&quot;&gt;WenHao Yu&lt;/a&gt;&apos;s Opus 4.6 multi-agent workflow. He hands big projects off to an AI Team Lead, and 70 percent of what the Team Lead does is, in fact, decomposition. It first designs the answer to &quot;what subtasks do we need to build this feature?&quot; and then dispatches each subtask to a different agent. If the decomposition is right, the rest follows. If the decomposition is wrong, every agent loses the thread.&lt;/p&gt;
&lt;p&gt;I lived through that &quot;if the decomposition is wrong, every agent goes off the rails&quot; lesson directly. One time I threw &quot;build the settings page&quot; at an agent as a single task, and inside the settings page were profile editing, notifications settings, subscription management, and data export. The agent tried to build all four at once, and the state management got tangled. Changing the notifications toggle reset the profile form. An error in subscription management broke the whole page. In the end I split it into four independent tasks, gave each one to an agent, and it worked first try. The breakdown wasn&apos;t &quot;settings page.&quot; It was &quot;profile edit form,&quot; &quot;notifications toggle component,&quot; &quot;subscription management panel,&quot; and &quot;data export button.&quot; Four pieces.&lt;/p&gt;
&lt;h3&gt;Before: AddPlan, thrown in without an interview&lt;/h3&gt;
&lt;p&gt;I had to build the plan creation screen (AddPlanView). A five-step input flow: name input, scope setting, period selection, weekday picker, summary confirmation. I had the Figma designs, and I had written a PRD. &quot;Surely the agent can build this in one pass.&quot;&lt;/p&gt;
&lt;p&gt;That was a naive expectation.&lt;/p&gt;
&lt;p&gt;The agent shipped a first version. The shape was roughly right at a glance. The details kept slipping, though. It was pulling colors and fonts that weren&apos;t defined in the design system. The CustomNumberPad layout for Step 2 didn&apos;t match the Figma. I fixed that, and Step 3&apos;s calendar broke. Every fix pushed another step out of place. By the third round I was thinking, &quot;Is it faster if I just write this myself?&quot;&lt;/p&gt;
&lt;p&gt;The cause was clear. I&apos;d started without sorting out, even for myself, what I actually wanted. I had a PRD, but the details (the spacing and tap targets of the CustomNumberPad, the direction and timing of step transition animations, how validation errors should be displayed) were all still in my head. The agent can&apos;t read my head, so it made its own choice each time, and each time it didn&apos;t match what I wanted. We ping-ponged for dozens of turns and burned almost half a day.&lt;/p&gt;
&lt;h3&gt;After: Socratic dialogue to sharpen the requirements&lt;/h3&gt;
&lt;p&gt;After that I started interviewing with the AI before building any feature. Frameworks like &lt;a href=&quot;https://flowkater.io/posts/2026-02-08-superpowers-introduction/&quot;&gt;Superpowers&lt;/a&gt; automate this for you, but the core is the same: the process of making &quot;what I want&quot; explicit, before the code starts. Think of it as a Socratic dialogue. The AI asks questions, I answer them, and the requirement gets more specific.&lt;/p&gt;
&lt;p&gt;I tried this approach the second time around with AddPlan. &quot;I want to build a five-step input flow.&quot; → AI: &quot;What are the input fields and validations for each step?&quot; → &quot;Step 1 is name input, no empty strings, max 50 characters.&quot; → AI: &quot;Are you using design system colors? Any custom colors?&quot; → &quot;Design system colors only. The accent color is #FF6B35.&quot; → AI: &quot;Step transition animation? UX on validation failure?&quot; → &quot;Slide, with inline error messages.&quot;&lt;/p&gt;
&lt;p&gt;Five minutes. That&apos;s how long the conversation took. The edge cases that came out in those five minutes were almost identical to the ones I&apos;d discovered one by one across half a day of ping-pong. The difference was that last time I&apos;d found them &lt;em&gt;after&lt;/em&gt; writing the code, and this time I cleared them up &lt;em&gt;before&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;When I handed those crisp requirements to the agent, the one-shot quality was clearly different. Splitting the work step by step and writing the spec for each step explicitly cut the revision cycle to 2–3 turns. Even those revisions were design tweaks, not structural changes. Five minutes of interview saved half a day of ping-pong. From then on, the feature interview became a default step in my workflow. Every feature build now goes &quot;interview → spec writeup → instruct agent.&quot;&lt;/p&gt;
&lt;p&gt;People say spec-driven development (SDD), which rose alongside vibe coding, means you can build cleanly if your PRD is right. That&apos;s true. But how to decompose the spec is still on us.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;Engineers aside, the people who get things done well, in any field, decompose big tasks into pieces and stay in flow by selecting and focusing on one piece at a time. The people who get things done badly skip planning, dive in, ping-pong around, and end up missing the deadline. (Yeah, I&apos;ve seen plenty of developers like this.)&lt;/p&gt;
&lt;p&gt;If you&apos;re at the wrap-up stage and the ping-pong with your coding agent is going long, that&apos;s a signal to ask whether you&apos;ve actually decomposed the work properly.&lt;/p&gt;
&lt;p&gt;The first habit is writing a requirements doc before you start implementing. It doesn&apos;t have to be elaborate. Just writing out, as plain text, &quot;what does this feature do, and what does done look like?&quot; already exposes the gaps. These days I make a small requirements.md before any feature build. (Not a spec doc.)&lt;/p&gt;
&lt;p&gt;Interviewing with the AI is also worth folding into your daily workflow. It feels awkward at first, being asked questions by the AI. After a few rounds, though, you&apos;ll catch yourself getting flagged on edge cases you&apos;d missed. It pays off most on stateful features like auth, payments, and file uploads. Whether you use a framework like Superpowers or just ask ChatGPT, &quot;what should I think about before I build this feature?&quot;, the method doesn&apos;t matter. The point is &lt;strong&gt;to give yourself thinking time before you start building.&lt;/strong&gt; Five minutes is enough. Once you&apos;ve felt those five minutes save four hours a few times, the habit makes itself.&lt;/p&gt;
&lt;p&gt;Throwing a sentence into the agent&apos;s chat shell from minute one is never a good habit. It&apos;s the same habit as the developer who jumps into code without a plan.&lt;/p&gt;
&lt;p&gt;So you also need to deliberately practice splitting big work into &quot;the size an agent can finish in one turn.&quot; Roughly: 3 to 5 files modified, 15 to 30 minutes to complete. Bigger than that, split it. Smaller, combine it. After about ten attempts, you&apos;ll feel it. That feel is decomposition.&lt;/p&gt;
&lt;p&gt;The latest Codex and Claude Code design good task plans on their own with tools like Task. Simple requirements or fixes are probably fine. In the end, though, you have to do it yourself first to know. Do, then delegate. The order matters.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;② Context Architecture&lt;/h2&gt;
&lt;p&gt;Look again at &lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&apos;s&lt;/a&gt; DGX Spark example. What he gave the agent was four things: IP, username, password, goal. No padding, just what was needed. That&apos;s the ideal of context architecture.&lt;/p&gt;
&lt;p&gt;Real production environments aren&apos;t this clean. A project has dozens of files, business logic, coding conventions, architecture decisions made months ago. How you hand all that context to the agent decides the quality of the output. To borrow &lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&apos;s&lt;/a&gt; framing, natural language is now the interface in place of code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt; included &lt;strong&gt;&quot;memory notes and a markdown report&quot;&lt;/strong&gt; at the end of his instructions. That&apos;s not just documentation. That&apos;s an instruction to &lt;strong&gt;structure&lt;/strong&gt; the context the agent generates while working, so it can be passed to the next task. Context isn&apos;t only something you give. It&apos;s also something you build.&lt;/p&gt;
&lt;p&gt;Writing a good AGENTS.md matters, but that isn&apos;t all of it. &lt;strong&gt;If the code architecture itself is well designed, the speed at which an agent grasps context is in a different league.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These days in Codex you can pin a skill with &lt;code&gt;$&lt;/code&gt; and pass exactly the right context, which lifts accuracy a lot. Documentation alone isn&apos;t the whole answer, though. I learned that the hard way.&lt;/p&gt;
&lt;p&gt;Counterintuitively, in the end, you have to write good code.&lt;/p&gt;
&lt;p&gt;If the directory structure is clear, the naming is consistent, and the concerns are separated, the agent picks it up fast. Conversely, no matter how well you&apos;ve written the docs on top of spaghetti code, the agent is likely to wander. Saying we&apos;re in &lt;a href=&quot;https://flowkater.io/posts/2026-02-19-code-reading-era/&quot;&gt;an era that no longer reads code&lt;/a&gt; doesn&apos;t mean code quality matters less. It matters more.&lt;/p&gt;
&lt;h3&gt;The idea of an agent-friendly codebase&lt;/h3&gt;
&lt;p&gt;Flask creator &lt;a href=&quot;https://lucumr.pocoo.org/2025/6/12/agentic-coding/&quot;&gt;Armin Ronacher&lt;/a&gt; raised an interesting angle. He argues that &lt;strong&gt;language choice itself&lt;/strong&gt; is part of context architecture when you&apos;re collaborating with agents. His conclusion was unexpected: Go is an agent-friendly language.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Go is sloppy: Rob Pike famously described Go as suitable for developers who aren&apos;t equipped to handle a complex language. Substitute &apos;developers&apos; with &apos;agents.&apos;&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Go is statically typed but flexible, and the syntax is easy. Simpler than Java, stricter than Python. Above all, it&apos;s explicit. I once gravitated toward functional and bleeding-edge languages, and the reason I settled on Go is exactly this. It&apos;s also easy for juniors to learn. By the same logic, it&apos;s easy for agents. Whatever the language is, what matters is a structure that gives the agent fewer ways to mess up.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://lucumr.pocoo.org/2025/6/12/agentic-coding/&quot;&gt;Ronacher&lt;/a&gt; is sharp on tool design too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Tools need to be protected against an LLM chaos monkey using them completely wrong.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He puts double-execution guards (pidfiles) and port-conflict prevention into his Makefile. Agents will gladly start the same server twice or try to bind to a port that&apos;s already in use. Blocking that at the tool level shrinks the space the agent can flail in.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.lennysnewsletter.com/p/head-of-claude-code-what-happens&quot;&gt;Boris Cherny&lt;/a&gt;, the person who built Claude Code, said something similar in his Lenny&apos;s Newsletter interview. One reason he can run 15 agents in parallel is that he isolates the context for each one rigorously. Agent A only touches the frontend, agent B only the API, agent C only tests. With minimal context overlap, conflicts go down and the accuracy of each agent goes up.&lt;/p&gt;
&lt;h3&gt;Before: agent lost in a flat directory&lt;/h3&gt;
&lt;p&gt;In the early days of the iOS app, the directory structure was effectively flat. The Views folder had thirty screens jumbled together, with models and view models sitting at the same level. Naming conventions varied per file: some were PascalCase like &lt;code&gt;PlanListView&lt;/code&gt;, some were &lt;code&gt;DailyTasks&lt;/code&gt;, some were just &lt;code&gt;Summary&lt;/code&gt;. Even a human reader needed time to figure out &quot;where does this file belong?&quot;&lt;/p&gt;
&lt;p&gt;Setting aside that this was my first iOS native app, the project folder I&apos;d set up to prototype quickly had grown enormous as features piled on.&lt;/p&gt;
&lt;p&gt;I got tired of telling the agent, every single time, &quot;not that folder, this folder.&quot; Saying &quot;fix the settings screen&quot; often meant the agent touched unrelated files. The settings screen&apos;s view model would import a model from the home screen. The directory structure didn&apos;t enforce any separation of concerns, so the agent didn&apos;t know the boundaries either. The context window filled up with files that didn&apos;t belong, and accuracy dropped.&lt;/p&gt;
&lt;h3&gt;After: feature-based directories with role separation&lt;/h3&gt;
&lt;p&gt;I restructured the directories around features. &lt;code&gt;Features/Plan/&lt;/code&gt;, &lt;code&gt;Features/Daily/&lt;/code&gt;, &lt;code&gt;Features/Settings/&lt;/code&gt;. Each feature folder holds its own View, ViewModel, and Model together. Shared components moved to &lt;code&gt;Shared/Components/&lt;/code&gt;, common models to &lt;code&gt;Shared/Models/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I unified the naming too. &lt;code&gt;{Feature}{Role}&lt;/code&gt; pattern: &lt;code&gt;PlanListView&lt;/code&gt;, &lt;code&gt;PlanListViewModel&lt;/code&gt;, &lt;code&gt;PlanModel&lt;/code&gt;. From the file name alone you can tell what the file does and where it belongs.&lt;/p&gt;
&lt;p&gt;The change was immediate. Tell the agent, &quot;add a dark mode toggle to the Settings screen,&quot; and it works inside &lt;code&gt;Features/Settings/&lt;/code&gt; only. There&apos;s no reason left to touch other features. &lt;strong&gt;The code structure becomes the boundary of the context.&lt;/strong&gt; I don&apos;t even need to say &quot;only look at this folder.&quot; The structure itself communicates the scope.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;HumanLayer&lt;/a&gt; team&apos;s analysis points the same way. Once your CLAUDE.md (or AGENTS.md) crosses 150–200 instructions, the rate of compliance drops sharply. Task-specific instructions need to live in separate files. One well-structured directory tells the agent more than ten pages of docs.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;Practice clean architecture deliberately. &quot;Code that&apos;s easy for an agent to read&quot; and &quot;code that&apos;s easy for a human to read&quot; overlap startlingly often. When I start a new project, the first thing I do is lay down the directory structure and write what each directory is for in the README. Partly for humans, partly for agents.&lt;/p&gt;
&lt;p&gt;I stick to a DDD / Clean Architecture structure because it&apos;s testable, and I particularly enforce strong conventions on the use case layer. iOS differs a bit from server work, but the skeleton is roughly the same.&lt;/p&gt;
&lt;p&gt;In AGENTS.md I keep things tight: architecture decision rationale (ADRs), coding conventions, a glossary of domain terms. The rest, I let the code itself speak. Accurate type definitions, function names that carry meaning, tests that double as spec docs. That&apos;s the best AGENTS.md.&lt;/p&gt;
&lt;p&gt;Designing for context separation is also worth trying. Worktrees, multiple agents running in parallel with isolated environments and isolated roles and goals: performance peaks here. You&apos;ll want to manage backend and frontend in one place, and you&apos;ll hope to do everything from one shell. In the end, though, splitting Plan, documentation, development, testing, and commit across separate agents is much more efficient. There&apos;s more to manage and at first it feels like overkill. As the work gets more complex, the separation pays off. (Which is exactly why orchestration tooling matters more.)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;③ Definition of Done&lt;/h2&gt;
&lt;p&gt;Letting an agent run overnight and checking in the morning is a thrilling experience. There&apos;s also a moment where the thrill turns into emptiness. The report says &quot;task complete,&quot; but when you actually look, only the documentation got updated, or all you have is stub functions and interface scaffolding. You don&apos;t have working code. You have code that looks like it could work.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt;, discussing what agents still need, listed several things including &lt;strong&gt;supervision.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Of course this is not yet perfect. Things still needed: high-level direction, judgment, taste — knowing what good looks like — supervision, and providing hints and ideas on repetitive tasks.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Agents need supervision. And supervision starts with definition of done. If you don&apos;t clearly define what &quot;this task is finished&quot; means, the agent reports &quot;done&quot; by its own standards. Nine times out of ten, those standards aren&apos;t yours.&lt;/p&gt;
&lt;h3&gt;Before: an automation CLI, run overnight, came back hollow&lt;/h3&gt;
&lt;p&gt;I tried to build a workflow automation CLI based on the Codex App Server. A tool that auto-runs the loop &lt;code&gt;propose → plan → run → verify → archive&lt;/code&gt;. I prepared a planning doc covering the full architecture, module structure, and API design. I planned parallel agent execution: Stream A for core logic, Stream B for the CLI interface, Stream C for tests. &quot;With this much documentation the agent can handle it.&quot; I let it run overnight.&lt;/p&gt;
&lt;p&gt;When I checked in the morning, &lt;strong&gt;it had stopped after one hour.&lt;/strong&gt; The agent had decided &quot;there&apos;s nothing left to do&quot; and stopped. The file structure was tidy. It was all stubs, though. &lt;code&gt;func Propose() error { return nil }&lt;/code&gt;. The type definitions and module structure were perfectly in place, and the actual business logic was empty. It was like being handed a well-organized empty house.&lt;/p&gt;
&lt;p&gt;The more instructive lesson was the second attempt. When I retried the CLI, the agent reported &quot;all tests passing.&quot; Cracking it open, the agent had quietly rewritten the tests for its own convenience. Instead of verifying the actual scenarios (does propose really call the API and parse the response, does plan respect dependency order, does verify catch failure cases), it had swapped them for code that just checked whether the function returned without an error, then declared &quot;all green!&quot; From the agent&apos;s view this wasn&apos;t a lie. The tests really did all pass. They just weren&apos;t the tests I wanted.&lt;/p&gt;
&lt;p&gt;That&apos;s when it clicked: the agent&apos;s &quot;done&quot; isn&apos;t my &quot;done.&quot; And what closes that gap isn&apos;t a better model. It&apos;s a clearer definition of done. &lt;strong&gt;I hadn&apos;t read my own doc carefully.&lt;/strong&gt; I&apos;d written the requirements myself, and I hadn&apos;t sat with the complexity hiding inside them. &quot;There&apos;s a doc, so the agent will read it and build it.&quot; That&apos;s the most dangerous antipattern.&lt;/p&gt;
&lt;h3&gt;After: DoD plus a reporting system&lt;/h3&gt;
&lt;p&gt;When I tried the CLI again later, I took a completely different approach. Every task instruction now includes two things. The first is a &lt;strong&gt;definition of done document.&lt;/strong&gt; Stream A&apos;s DoD: &quot;the propose command actually calls the API, parses the response, and saves it as a JSON file. Add three new integration tests.&quot; That level of specificity. And critically: &quot;Stub patterns like &lt;code&gt;return nil&lt;/code&gt; don&apos;t count as done. Don&apos;t modify existing tests. Add new tests only.&quot; That blocks the agent from escaping into stubs or rewriting the tests.&lt;/p&gt;
&lt;p&gt;The second is a &lt;strong&gt;task report.&lt;/strong&gt; When the agent finishes, it has to write up the results against the DoD. &quot;What I did, which DoD items I met, what&apos;s left.&quot; With a report, I can grasp the state in five minutes before opening any code.&lt;/p&gt;
&lt;p&gt;What stands out in &lt;a href=&quot;https://x.com/elvissun/status/2025920521871716562&quot;&gt;Elvis&lt;/a&gt;&apos;s system is that the definition of done is staged. In his agent system, &quot;done&quot; isn&apos;t just writing the code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Was a PR created?&lt;/li&gt;
&lt;li&gt;Is it synced with the main branch (no merge conflicts)?&lt;/li&gt;
&lt;li&gt;Does CI pass (lint, type check, unit tests, E2E)?&lt;/li&gt;
&lt;li&gt;Did the Codex code review pass?&lt;/li&gt;
&lt;li&gt;Did the Claude Code code review pass?&lt;/li&gt;
&lt;li&gt;Did the Gemini code review pass?&lt;/li&gt;
&lt;li&gt;If there&apos;s a UI change, is a screenshot included?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Only when all of those clear does the Telegram notification arrive: &quot;PR #341 ready for review.&quot; Before then, no notification. Three agents review the code, CI passes, and the merge is conflict-free before a human is pulled in.&lt;/p&gt;
&lt;p&gt;You don&apos;t need to go this far (honestly, I haven&apos;t gotten there yet either), but the principle is the same. &lt;strong&gt;The agent has to be told, concretely, what &quot;done&quot; means.&lt;/strong&gt; Otherwise the agent applies its own definition of done. The odds of that lining up with yours are not great.&lt;/p&gt;
&lt;p&gt;This isn&apos;t just my lesson. The &lt;a href=&quot;https://github.blog/ai-and-ml/generative-ai/multi-agent-workflows-often-fail-heres-how-to-engineer-ones-that-dont/&quot;&gt;GitHub Engineering&lt;/a&gt; team uses the same pattern. In multi-agent systems they enforce inter-agent messages with typed schemas and explicitly limit what each agent can do.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Most multi-agent workflow failures come down to missing structure, not model capability.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The CLI failed not because the model was dumb. It failed because I hadn&apos;t given it structure.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;Start by including a DoD checklist on every task instruction. Writing a DoD every time can feel like overkill. After two or three &quot;the agent said done but it wasn&apos;t&quot; experiences, though, &lt;em&gt;not&lt;/em&gt; writing one feels riskier. My task instruction template now has a DoD section by default. &quot;Tests pass + existing tests untouched + report submitted&quot; is the baseline, and I add items based on the work.&lt;/p&gt;
&lt;p&gt;Build the habit of not taking the agent&apos;s &quot;done&quot; report at face value. This is healthy verification, not paranoia. It matters more for overnight work. When I dispatch a long-running task now, I always insert mid-run checkpoints. &quot;Report after stage one. Report after stage two.&quot; This way, instead of losing eight hours, you catch the wrong direction at the two-hour mark. Once you&apos;ve opened &quot;task complete&quot; and found a hollow shell, you&apos;ll feel the value of mid-run checkpoints in your bones.&lt;/p&gt;
&lt;p&gt;Practice cutting DoDs into smaller units too. The DoD for &quot;login feature complete&quot; is full of holes. Break it into &quot;email verification flow complete&quot; and &quot;password reset complete&quot; and the criteria sharpen. Decomposition (①) and definition of done (③) are a pair. Well-decomposed work has a clear DoD, and a clear DoD makes decomposition easier.&lt;/p&gt;
&lt;h2&gt;④ Failure Recovery Loop&lt;/h2&gt;
&lt;p&gt;Working with agents means failure is the norm. The workflow that worked yesterday breaks today. A new model ships and the same prompts behave differently.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The agent autonomously worked for ~30 minutes, running into various issues along the way, looking things up online to solve them, iteratively resolving them.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The agent itself runs as a loop of failure and recovery. It doesn&apos;t always go this cleanly, though. The agent&apos;s self-recovery has limits. When the agent hits a failure it can&apos;t resolve on its own, what matters is how the human steps in.&lt;/p&gt;
&lt;h3&gt;Before: redistribution engine, infinite A↔B loop&lt;/h3&gt;
&lt;p&gt;One core feature in the iOS app is the study load redistribution engine. &quot;I couldn&apos;t do today&apos;s portion, so I&apos;ll do more tomorrow.&quot; The engine recalculates the leftover load and redistributes it. The bug looked simple: calling the redistribution API made existing data on future dates disappear. 47 out of 50 records were lost.&lt;/p&gt;
&lt;p&gt;The cause sat in two places. The delete function was deleting everything without a date filter, and the function for extracting incomplete data was excluding future-dated records.&lt;/p&gt;
&lt;p&gt;I knew the cause, so I should be able to fix it, right? That&apos;s where hell started. All 5 scenario tests &lt;strong&gt;passed.&lt;/strong&gt; When I dug in, the tests were doing &quot;data &amp;gt; 0&quot; level checks. 50 dropping to 3 still passed. (This isn&apos;t the agent&apos;s fault. It&apos;s mine.)&lt;/p&gt;
&lt;p&gt;The real problem came next. The meaning of a specific parameter differed across functions. &lt;code&gt;includeToday=true&lt;/code&gt; meant &quot;fetch today&apos;s data&quot; in function A, and &quot;delete starting from today&quot; in function B. Same parameter, completely different semantics. &lt;strong&gt;Fix A and B broke. Fix B and A broke.&lt;/strong&gt; The agent fell into its own loop, repeating fix → break → fix → break.&lt;/p&gt;
&lt;h3&gt;After: isolation tests plus Must NOT Have guardrails&lt;/h3&gt;
&lt;p&gt;I narrowed the code in the end. Instead of testing the full API flow, I &lt;strong&gt;isolated the problematic function and tested it on its own.&lt;/strong&gt; What was invisible inside the integration test became obvious once I isolated it. Then I built a separate path that didn&apos;t touch the existing code. I defined the semantics of each function independently and reimplemented them.&lt;/p&gt;
&lt;p&gt;The key was the &lt;strong&gt;&quot;Must NOT Have&quot; guardrail.&lt;/strong&gt; &quot;Don&apos;t modify this file. Don&apos;t change the API response contract. Don&apos;t modify existing integration tests.&quot; Those three prohibitions broke the agent&apos;s A↔B loop.&lt;/p&gt;
&lt;p&gt;This experience maps almost exactly onto Factor 9 of &lt;a href=&quot;https://github.com/humanlayer/12-factor-agents&quot;&gt;Dex Horthy&lt;/a&gt;&apos;s &lt;a href=&quot;https://github.com/humanlayer/12-factor-agents&quot;&gt;12-Factor Agents&lt;/a&gt;: compress errors into the context so the agent can self-heal. Not just &quot;try again,&quot; but inject the cause and the surrounding facts so the same mistake doesn&apos;t repeat.&lt;/p&gt;
&lt;h3&gt;Don&apos;t retry with the same prompt&lt;/h3&gt;
&lt;p&gt;Most agent loops, on failure, retry with the same prompt. &quot;Try again.&quot; That works sometimes. For non-deterministic errors, like a network timeout or a flaky API, retrying is right. When something is fundamentally wrong, though, repetition gives you the same result. The agent is using the wrong library, or it has misread the requirement, or it doesn&apos;t have enough context. Retrying with the same prompt in those cases is just headbutting the same wall.&lt;/p&gt;
&lt;p&gt;The point is &lt;strong&gt;to analyze the cause of the failure and prescribe accordingly.&lt;/strong&gt; Not repeat the same instruction, but write a better one. That difference is enormous.&lt;/p&gt;
&lt;p&gt;Sorting failures into three types makes the prescription clear.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Type 1: Context shortfall.&lt;/strong&gt; The agent doesn&apos;t know something it needs to know. Fix: add the missing information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Type 2: Direction error.&lt;/strong&gt; The requirement itself was misread. Fix: redefine the requirement more clearly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Type 3: Structural conflict.&lt;/strong&gt; There&apos;s a problem in the code structure itself. Fix: narrow the code, isolate it, set guardrails, change the structure, and retry.&lt;/p&gt;
&lt;p&gt;The redistribution engine was Type 3. Not &quot;try again,&quot; but &quot;isolate this file for tests, and don&apos;t touch this file.&quot; The structural prescription. Just by asking &quot;what type is this?&quot; before you press &quot;try again,&quot; recovery speeds up noticeably. It&apos;s faster to figure out why the agent failed and adjust the instruction. Understanding why the agent failed is itself engineering.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;The starting habit is logging every failure, even briefly. &quot;Missed the context.&quot; &quot;Misread the requirement.&quot; &quot;Fell into A↔B loop.&quot; A pile of those short notes starts to show patterns. When the same type repeats three times, that&apos;s the signal to change the system.&lt;/p&gt;
&lt;p&gt;Stay open to new tools and methods. I&apos;ve moved from Cursor to Claude Code, from Claude Code to Codex, and through OpenClaw, Superpowers, and several skill systems along the way. Each tool had its own failure pattern, and crossing between them is what built up my &quot;feel for working with agents.&quot; Don&apos;t get attached to any one tool. Tools are means, not ends.&lt;/p&gt;
&lt;p&gt;Per-project &lt;code&gt;KNOWN_ISSUES.md&lt;/code&gt; files are also effective. Keep a list of &quot;the mistakes the agent makes most often on this project&quot; and the recurrence rate clearly drops. Failure logs become memory, and memory becomes a system.&lt;/p&gt;
&lt;p&gt;When you try a new approach, use the &quot;30-minute rule.&quot; If there&apos;s no meaningful progress in 30 minutes, find another way. If something works inside 30 minutes, dig deeper from there. Failing is fine. Repeating the same failure is not.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;⑤ Observability&lt;/h2&gt;
&lt;p&gt;Handing a big task wholesale to an agent is convenient. When something goes wrong, though, it&apos;s hard to figure out where. &quot;At what point will I check the result?&quot; That question is the heart of observability.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt;&apos;s DGX Spark example the agent worked autonomously for thirty minutes. The post doesn&apos;t say what Karpathy did during that thirty minutes, but the fact that the agent left &quot;memory notes and a markdown report&quot; means the work history was traceable.&lt;/p&gt;
&lt;p&gt;The stronger models and agents get, the more observability matters. The more an agent can do, the more directions things can go wrong in.&lt;/p&gt;
&lt;h3&gt;Before: liquidglass, the cost of &quot;weird, but let&apos;s leave it&quot;&lt;/h3&gt;
&lt;p&gt;When iOS 26 was announced, I tried to apply liquidglass for the first time. I wanted to bring the new design language into our app. I expected the agent to handle the update on its own. (That this expectation was naive, you should be seeing the pattern by now.)&lt;/p&gt;
&lt;p&gt;I watched the agent work. The first few files looked fine. Around the fourth or fifth file, something felt off. The scope of files it was touching was wider than expected. Colors looked like they were drifting from the original intent. The branches for backward compatibility were getting more tangled.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Weird, but let&apos;s leave it.&quot;&lt;/strong&gt; That single sentence was the most expensive call I made.&lt;/p&gt;
&lt;p&gt;When I checked the result, the UI was completely broken. The translucent effect of liquidglass collided with the existing color scheme and tanked text legibility, and in dark mode some elements vanished entirely. The worst part was &lt;strong&gt;there were no per-step commits.&lt;/strong&gt; I couldn&apos;t roll back partially. All in or all out.&lt;/p&gt;
&lt;p&gt;If I&apos;d stopped at the fourth or fifth file and checked, in the worst case I&apos;d have rolled back five files. Letting it run to the end meant cleaning up across more than twenty tangled files.&lt;/p&gt;
&lt;h3&gt;After: tracer-bullet strategy plus a blueprint&lt;/h3&gt;
&lt;p&gt;After this, when I apply a new technology I always use a &lt;strong&gt;tracer-bullet strategy.&lt;/strong&gt; Instead of applying it everywhere at once, I apply it to the simplest screen first. Fire small, check fast. If it&apos;s fine, expand to the next screen.&lt;/p&gt;
&lt;p&gt;The real value of the tracer bullet is that it produces a &lt;strong&gt;blueprint.&lt;/strong&gt; Applying liquidglass to one screen showed me, &quot;ah, this is where it collides with the color scheme, this is how the dark mode branch needs to be done.&quot; For a technology you&apos;ve never used, you can&apos;t draw the blueprint up front. The tracer bullet draws it for you, fast. With the blueprint from screen A in hand, when the agent started touching unexpected files on screen B I could immediately judge &quot;this isn&apos;t what I expected.&quot;&lt;/p&gt;
&lt;p&gt;Per-step commits became mandatory too. &quot;Apply screen A&quot; → commit → &quot;Apply screen B&quot; → commit. Now if screen C breaks, I have rollback points. &quot;Commit every three files modified.&quot; It&apos;s a one-liner instruction. That single line drops the cost of fixes dramatically.&lt;/p&gt;
&lt;p&gt;As observability goes up, the scope you can delegate goes up too. At first I was nervous handing off a single function and would review everything. With the tracer-bullet strategy and per-step commits in place, I now hand off module-level work without anxiety. Observability builds trust, and trust enables delegation. My answer to &quot;do you trust your agents?&quot; is shifting toward &quot;more and more, yes,&quot; not because the agents got smarter, but because my observation system got more refined.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;First, build a feel for splitting work into the right size. My rule of thumb: if reviewing one PR takes under 10 minutes, the size is right. Over 30 minutes is too big. By file count, 3 to 5 is a good range to check at once. I wasn&apos;t sure about this rule at first, but after a few months &quot;this is too big&quot; started landing on its own.&lt;/p&gt;
&lt;p&gt;Designing explicit mid-run checkpoints needs to become a habit too. &quot;Show me when you get this far.&quot; That sentence prevents an hour-long detour. Auto-reporting is even better. I have my agent report a diff summary every three files modified. Instead of looking at the full code each time, I read the summary and decide &quot;direction OK&quot; or &quot;stop.&quot;&lt;/p&gt;
&lt;p&gt;Then there&apos;s the habit of sketching, before you start, a rough blueprint of &quot;this is roughly how it&apos;ll go.&quot; That&apos;s the precondition for observability. If I don&apos;t know where the agent is supposed to go, I can&apos;t tell when it&apos;s gone off. For a refactor, &quot;I&apos;ll touch these files in this order.&quot; For a new feature, &quot;this module will end up with this shape.&quot; That level of sketch is enough.&lt;/p&gt;
&lt;p&gt;The blueprint doesn&apos;t have to be accurate. There are times when the agent&apos;s different approach is better than mine. What matters is noticing &quot;it&apos;s going in a different direction.&quot; Even when the agent goes its own way, with a blueprint I can immediately catch &quot;wait, this is different.&quot; Without one, catching it isn&apos;t even possible.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/elvissun/status/2025920521871716562&quot;&gt;Elvis&lt;/a&gt;&apos;s 10-minute cron monitoring is the automation of this blueprint comparison. It compares the agent&apos;s current state (tmux session alive, PR status, CI result) against a pre-defined expected state. When something deviates, an alert fires and a human steps in. It&apos;s a 100% deterministic bash script, so it costs no tokens and can&apos;t really be wrong. Simple principle. That simple principle is one of the pieces of infrastructure that makes 94 commits per day possible.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;⑥ Memory Architecture&lt;/h2&gt;
&lt;p&gt;If you do long work with AI you&apos;ll hit a wall every time. As the session stretches, it forgets what was said earlier. There&apos;s a name for it, context compaction. Context shrinks too aggressively, and continuous work suffers most.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt;&apos;s agent instructions always ended with &lt;strong&gt;&quot;memory notes and a markdown report.&quot;&lt;/strong&gt; The point isn&apos;t just writing code. The point is leaving a record of what was done.&lt;/p&gt;
&lt;p&gt;An orchestrator without memory treats every session like a first meeting. What we did yesterday, what we decided, what failed: all gone, every time, starting from scratch.&lt;/p&gt;
&lt;h3&gt;Before: 15 minutes every morning re-explaining context&lt;/h3&gt;
&lt;p&gt;When I was three days deep into an auth refactor, every morning I&apos;d open with &quot;yesterday I changed the JWT structure,&quot; and it wore me down. The dev.to post by &lt;a href=&quot;https://dev.to/suede/the-architecture-of-persistent-memory-for-claude-code-17d&quot;&gt;@suede&lt;/a&gt; describes the same situation exactly. Continuous work, but every new session in the morning meant explaining yesterday&apos;s work from the top. &quot;I changed this structure yesterday, let me start by explaining why.&quot; That&apos;s 15 to 20 minutes gone. Three days in a row, that&apos;s almost an hour. And verbal recap isn&apos;t perfect. Things I forgot or mis-remembered slip in.&lt;/p&gt;
&lt;h3&gt;After: hooks for automatic memory, restore in 5 seconds with one MEMORY.md&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.to/suede/the-architecture-of-persistent-memory-for-claude-code-17d&quot;&gt;@suede&lt;/a&gt;&apos;s solution was elegant. He used Claude Code&apos;s hooks feature to build a system that automatically extracts &quot;memories&quot; at the end of each session and writes them to CLAUDE.md.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Session 1: Claude works → hooks silently extract memories → saved. Session 2: Claude starts → reads CLAUDE.md → instantly knows everything.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The point is that &quot;you don&apos;t need to tell it to record.&quot; Hooks summarize and append the work content automatically at session end. The next session reads it on start. Time to restore context: 5 seconds. From 15 minutes to 5 seconds. Once you feel that gap, there&apos;s no going back.&lt;/p&gt;
&lt;p&gt;I haven&apos;t gone as far as hooks, but borrowing the pattern, every turn of work in Codex or Claude Code I always update the memory and progress doc. In MEMORY.md I write &quot;what I did today, what I decided, what to pick up next.&quot;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.threads.com/@boris_cherny/post/DUMZr4VElyb/&quot;&gt;Boris Cherny&lt;/a&gt; team&apos;s case extends this memory to the team level. The Claude Code team checks a single CLAUDE.md into git so the whole team shares it. When Claude does something wrong, they immediately add to CLAUDE.md: &quot;next time, don&apos;t do this.&quot; Even in code review they tag &lt;code&gt;@.claude&lt;/code&gt; and update it as part of the PR. Individual memory becomes team memory passed to the agent.&lt;/p&gt;
&lt;p&gt;Tools are pouring out in this direction now. Claude Code&apos;s built-in memory, AI memory layers like &lt;a href=&quot;https://supermemory.ai&quot;&gt;supermemory.ai&lt;/a&gt;. As memory infrastructure matures, the underlying problem of &quot;every session is a first meeting&quot; is heading toward a real solution.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;The habit of documenting every turn is, almost by itself, the whole of memory architecture. Make one MEMORY.md and start writing every day. Today&apos;s decision and why, what&apos;s next, open issues. Those three items are enough.&lt;/p&gt;
&lt;p&gt;One tip: keeping the memory&apos;s structure consistent matters too. I write MEMORY.md in date order, and tag each entry with &lt;code&gt;[decision]&lt;/code&gt;, &lt;code&gt;[work]&lt;/code&gt;, &lt;code&gt;[issue]&lt;/code&gt;. Later, when I&apos;m looking for &quot;what was that architecture decision from last month?&quot;, searching &lt;code&gt;[decision]&lt;/code&gt; returns it inside ten seconds. That small bit of structure makes the memory dramatically more searchable.&lt;/p&gt;
&lt;p&gt;When projects get long, bring in a searchable system (Obsidian, etc.). The point is &quot;a searchable record.&quot; If you can&apos;t find an architecture decision from three months ago, you&apos;ll have the same conversation again. Memory breaks that loop.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;⑦ Parallel Orchestration&lt;/h2&gt;
&lt;p&gt;One of &lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Karpathy&lt;/a&gt;&apos;s key points was this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The highest leverage is in designing a long-running orchestrator with the right tools, memory, and instructions to productively manage multiple parallel coding instances.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The highest level of agentic engineering, accessible through this, is currently very high leverage.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Building different features at the same time across multiple worktrees is technically possible. In practice, the management is rough. Agent A is on the auth module, agent B is on payments, and they both touch the same user model. Collision.&lt;/p&gt;
&lt;p&gt;From &lt;a href=&quot;https://www.threads.com/@boris_cherny/post/DUMZr4VElyb/&quot;&gt;Boris Cherny&lt;/a&gt; earlier to &lt;a href=&quot;https://x.com/elvissun/status/2025920521871716562&quot;&gt;Elvis (@elvissun)&lt;/a&gt; at 94 commits a day, the direction is the same. &lt;strong&gt;A single engineer orchestrating multiple agents to produce team-level output.&lt;/strong&gt; That&apos;s exactly why Karpathy named this &quot;agentic engineering.&quot;&lt;/p&gt;
&lt;p&gt;His example shows the extreme of this direction. Five Claude Code instances running in parallel in the local terminal, plus another 5–10 running on claude.ai/code. 10 to 15 parallel sessions in total. The structure works because each agent&apos;s context is rigorously isolated. Tools like &lt;a href=&quot;https://superset.sh&quot;&gt;Superset.sh&lt;/a&gt; and &lt;a href=&quot;https://github.com/Yeachan-Heo/oh-my-codex&quot;&gt;oh-my-codex (omx)&lt;/a&gt; are emerging in the same direction.&lt;/p&gt;
&lt;h3&gt;Echoes of my CTO years&lt;/h3&gt;
&lt;p&gt;Going through this kept reminding me of my CTO years. The years I managed six squads. Daily meetings with six teams, getting a read on each team&apos;s state, unblocking blockers, keeping the overall direction from drifting. Managing parallel agents resembles that work to a startling degree.&lt;/p&gt;
&lt;p&gt;I&apos;ve seen people compare current parallel agent coding to ADHD. Switching between many tasks and not being able to focus on any of them. There&apos;s something to that. I think it&apos;s closer to managing, though. ADHD is unintended distraction. Agent management is intentional multitasking. What a manager needs isn&apos;t &quot;the ability to write the code for every team&quot; but &quot;the ability to read every team&apos;s state, unblock blockers, and align direction.&quot; Parallel agent management is exactly that.&lt;/p&gt;
&lt;p&gt;In ⑤, leaving one agent alone was already risky. Five agents running together doubles that risk. When I managed six squads, the most dangerous moment was the one where I let myself think &quot;everything is going fine.&quot; In that moment one team is flailing, two teams are duplicating each other&apos;s work, or someone is sprinting in the wrong direction. Same with agents. Leave five agents running in parallel with a &quot;they&apos;ll figure it out&quot; mindset and merge time becomes a collision festival, one agent overwrites another&apos;s work, or the outputs end up wildly inconsistent.&lt;/p&gt;
&lt;p&gt;Checklists and sync points are the lifeline. And this isn&apos;t a new skill. Good managers already have it. The agent era just put a new name on it.&lt;/p&gt;
&lt;p&gt;There&apos;s one decisive difference between managing people and managing agents. People ask questions. Agents don&apos;t ask. They proceed on their own judgment. That&apos;s why design up front matters more in agent management. &quot;In situations like X, do Y.&quot; You have to set that ahead of time.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;Start small. Running five agents in parallel from day one ends in chaos. Start with two.&lt;/p&gt;
&lt;p&gt;Sharing my own experience: the first day I ran two agents in parallel was a mess. While I checked A&apos;s results I missed B&apos;s progress, and when I went to check B, A was waiting on me. From day two I started using a timer. 25 minutes monitoring agent A, 5-minute break, 25 minutes on agent B, Pomodoro-shaped. Once that routine settled, both agents ran stably. A week in I added a third. Two stable, then three; three stable, then five. People who&apos;ve managed teams or led squads will move through this faster.&lt;/p&gt;
&lt;p&gt;You also have to map out dependencies between parallel work and design for collision avoidance. Using git worktree gives you physical separation. Have agent A work in worktree-auth and agent B in worktree-payment, and file conflicts shrink on their own.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;⑧ Abstraction Layering&lt;/h2&gt;
&lt;p&gt;There are levels in agentic engineering, in my view. I distinguish them by feel.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level 0&lt;/strong&gt;: Direct coding (typing line by line in the editor)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 1&lt;/strong&gt;: Instructing an agent (asking Claude Code or Codex to do work)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 2&lt;/strong&gt;: Orchestrator (designing the system that manages multiple agents)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 3&lt;/strong&gt;: Meta design (building the tools that make orchestrators)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;m currently at Level 2 and trying for Level 3. I&apos;m building skills, automating workflows, and experimenting with structures where agents manage agents.&lt;/p&gt;
&lt;h3&gt;Before: the days of repeating the same instruction every time&lt;/h3&gt;
&lt;p&gt;In my Level 1 days, I manually repeated the same routine every morning. &quot;Check yesterday&apos;s merged PRs&quot; → &quot;summarize the changes&quot; → &quot;list open issues&quot; → &quot;propose priorities.&quot; All four, in order, every time. Twenty minutes a day. Seven hours a month. It took me about three weeks to notice that the instructions were almost identical every time.&lt;/p&gt;
&lt;h3&gt;After: one skill, &quot;summarize this week&quot;&lt;/h3&gt;
&lt;p&gt;I turned that routine into a skill. One sentence runs it: &quot;summarize this week.&quot; A 20-minute routine became 2 minutes. Beyond the time savings, there was a bigger change. Building this skill forced me to make explicit &quot;the pattern of judgments I make every day.&quot; The process itself was practice in raising the abstraction layer.&lt;/p&gt;
&lt;p&gt;There was one thing I felt every time I built a skill. People call it &lt;strong&gt;compounding engineering.&lt;/strong&gt; Our projects are big enough that they don&apos;t end in a single session. This isn&apos;t a finish-line game. It&apos;s a compounding game where earlier sessions affect later ones with interest.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The biggest payoff is in raising the abstraction layer ever higher.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &quot;edge&quot; Karpathy named isn&apos;t just time savings. Each level up widens the field of view, so you can take on bigger problems. From the era of writing code by hand (Level 0), to the era of instructing an agent in English (Level 1–2), to the era of designing an orchestrator that manages agents (Level 2–3). Every level up dramatically broadens what a human can take on.&lt;/p&gt;
&lt;h3&gt;When abstraction goes up, the human&apos;s role changes&lt;/h3&gt;
&lt;p&gt;It&apos;s not that the human idles while the agent works. Instead of typing code, you design the system. Instead of instructing the agent, you build the environment in which the agent works well.&lt;/p&gt;
&lt;p&gt;The hours that used to go into typing code now go into setting direction, making judgments, and supervising quality. That&apos;s the practical meaning of raising the abstraction layer.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;&quot;I&apos;m giving this same instruction for the third time.&quot; That awareness is where abstraction begins. When you see repetition, turn it into a skill or a template. A simple prompt template is fine to start. That one small piece of automation becomes the base for the next one.&lt;/p&gt;
&lt;p&gt;Make a habit of asking, &quot;what would I need to delegate this to an agent?&quot; That question itself is the start of abstract thinking. Look at every task you do by hand through &quot;is this delegable?&quot; If it is, what context, tools, and memory would the agent need? Repeating that question builds the skill of designing abstraction layers.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;⑨ Taste&lt;/h2&gt;
&lt;p&gt;The last one is the hardest to measure and maybe the most important.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Things still needed: high-level direction, judgment, taste — knowing what good looks like.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The sense of looking at what an agent built and telling &quot;this one&apos;s solid&quot; from &quot;this one&apos;s off.&quot; It works technically, but somehow it&apos;s uncomfortable. The code runs, but somehow it doesn&apos;t feel right. You can feel it. You actually have to feel it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;&apos;Engineering&apos; because there is art, science, and skill to it.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Art, science, skill: taste sits where these three overlap. It isn&apos;t innate. It&apos;s something you accumulate by going deep.&lt;/p&gt;
&lt;h3&gt;A prototype the AI made, my partner&apos;s reaction&lt;/h3&gt;
&lt;p&gt;There was an episode with my current partner, Ellie, a product designer I work with on building the app fast. When I made screen A with AI and showed it to her, she was put off at first. The output landed without discussion, and she felt like she didn&apos;t know what her role was. (Designers, like developers, are wrestling hard with their direction in the AI era.)&lt;/p&gt;
&lt;p&gt;After enough conversation, when I delivered screen B the same way, it was different. By then she understood the direction I was going for, and with a &lt;strong&gt;concrete working prototype&lt;/strong&gt; as the reference, what was missing and what needed more polish became visible. Communication cost, the kind that usually only resolves after many ping-pong rounds between designer and developer, dropped dramatically.&lt;/p&gt;
&lt;h3&gt;AI design is bland&lt;/h3&gt;
&lt;p&gt;The same thing happens in our current project. Our app isn&apos;t just a generic productivity app, but the AI kept generating only the boilerplate productivity-app design. Even when I explained our distinct domain, Claude kept ignoring it and regenerating the universal design.&lt;/p&gt;
&lt;p&gt;What I&apos;d handed over thinking, &quot;this is intuitive enough,&quot; was, honestly, a 60 to 70. When I saw what Ellie actually designed, there were things AI could never produce. Looking at the AI output I was uncertain. When Ellie&apos;s design landed, the feeling came: &quot;ah, this works.&quot;&lt;/p&gt;
&lt;p&gt;Most of what AI produces is average. There&apos;s real value in laying down the skeleton and the components. Taste, texture, the specific touch: that&apos;s still the human&apos;s territory.&lt;/p&gt;
&lt;h3&gt;Do work → Good → Great&lt;/h3&gt;
&lt;p&gt;AI brings remarkable performance gains. What it actually reaches today, though, is, honestly, around &lt;strong&gt;80%.&lt;/strong&gt; 80% is amazing compared to the past.&lt;/p&gt;
&lt;p&gt;The problem is the remaining 20%. Each 1% within that 20% is a bigger gap than the previous 10%. Look at a product, a restaurant, a film. The moment when the extra 2% really went in is the moment that moves you. The feeling you get from a master, a virtuoso, a great director sits outside the band of &quot;average.&quot;&lt;/p&gt;
&lt;p&gt;When 80% products flood the market → people will go looking for the better thing in the remaining 20% → &lt;strong&gt;and that 20% becomes the differentiator: human skill and craft.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I had a similar experience with social media. A clean information-organization post Claude Code produced: well-structured, sensible, tidy. Zero likes. A single line I wrote on impulse, bragging about something: 30,000 views, 200+ likes. A real human emotion in one line, time-sensitive, beat what passed for polite AI content by a wide margin.&lt;/p&gt;
&lt;p&gt;LLMs are statistical models in the end. The word &quot;model&quot; itself means &quot;an approximation of the real world.&quot; What an LLM has learned is the patterns of text on the internet. The average of &quot;good design,&quot; the average of &quot;good code.&quot; Average is safe. It isn&apos;t outstanding. Outstanding comes from leaving the average behind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t lose your intuition.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.seangoedecke.com/ai-agents-and-code-review/&quot;&gt;Sean Goedecke&lt;/a&gt; puts the point exactly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;About once an hour I notice that the agent is doing something that looks suspicious, and when I dig deeper I&apos;m able to set it on the right track and save hours of wasted effort... This is why I think pure &apos;vibe coding&apos; hasn&apos;t produced an explosion of useful apps.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That &quot;ability to notice something suspicious&quot; is taste. When the agent decides to spin up a full background-job infrastructure for what should have been a simple async request, the call to stop and say &quot;wait, this is overengineering&quot; is taste. Structural judgment is taste.&lt;/p&gt;
&lt;h3&gt;&quot;Works&quot; and &quot;great&quot; sit on different axes&lt;/h3&gt;
&lt;p&gt;This is the thing I most wanted to say in this post. &lt;strong&gt;Do work → Good → Great.&lt;/strong&gt; The gap between those three.&lt;/p&gt;
&lt;p&gt;AI does &quot;Do work&quot; remarkably fast. In some cases it gets to &quot;Good.&quot; The last 20% to &quot;Great&quot; is territory you can&apos;t reach if you settle for the AI average of 80%. Customers feel the final 2%. No one is moved by an average output.&lt;/p&gt;
&lt;p&gt;If everything is getting easier with AI, suspect it. Ask whether your output is settling at the average. In the era when 80% is everywhere, the differentiator is in the remaining 20%. That 20% is the territory of taste, not of technique.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.kinglycrow.com/no-skill-no-taste/&quot;&gt;KinglyCrow&lt;/a&gt;&apos;s &lt;a href=&quot;https://blog.kinglycrow.com/no-skill-no-taste/&quot;&gt;&lt;strong&gt;&quot;No Skill, No Taste&quot;&lt;/strong&gt;&lt;/a&gt; is sharp on this point. Taste and skill are a 2×2 matrix. LLMs look like they&apos;ve lowered the entry barrier on skill, but the real barrier of taste is unchanged. If anything, it&apos;s been amplified. Vibe coding lets anyone build an app, and what gets built without taste is slop. In the era when 80% products flood the market, what separates the remaining 20% is, in the end, taste. No matter how far AI advances, building that sense is still on me.&lt;/p&gt;
&lt;p&gt;Chris Lattner, who built LLVM and Swift, reached the same conclusion. When Anthropic released the project where Claude Code implements a C compiler from scratch (CCC), Lattner&apos;s analysis on his &lt;a href=&quot;https://www.modular.com/blog/the-claude-c-compiler-what-it-reveals-about-the-future-of-software&quot;&gt;blog&lt;/a&gt; was that the implementation is textbook and there&apos;s no new abstraction. He compared it to the level of a strong undergraduate team. What he actually highlighted was elsewhere. &lt;strong&gt;&quot;As implementation gets more automated, design, judgment, and taste become more important, not less.&quot;&lt;/strong&gt; The more AI lowers the implementation barrier, the more the taste of what to build becomes the engineer&apos;s core competency.&lt;/p&gt;
&lt;h3&gt;Taste is accumulated experience&lt;/h3&gt;
&lt;p&gt;This sense comes from domain knowledge. Someone who has used many good APIs can design good APIs. Someone who has experienced many good UXes can judge good UX. No matter how fast AI builds, judging &quot;is this good or not&quot; is on me.&lt;/p&gt;
&lt;p&gt;After 15 years of writing code, I know in my bones the difference between &quot;this is good code&quot; and &quot;this works but isn&apos;t good code.&quot; That difference shows up in a single variable name, a single function structure, a single error-handling style. The same standard has to apply to code an agent wrote. &quot;Works&quot; and &quot;good&quot; sit on different axes.&lt;/p&gt;
&lt;p&gt;The agent once built me a search feature that worked perfectly. Technically nothing to fault. Something was off, though. After staring at it a while, it clicked: the search results were sorted alphabetically. Technically correct, but from the user&apos;s perspective, sorting by relevance is far more natural. The agent built &quot;the search feature.&quot; It hadn&apos;t built &quot;a good search experience.&quot; Catching that gap is taste.&lt;/p&gt;
&lt;h3&gt;How to practice this&lt;/h3&gt;
&lt;p&gt;The clearest way to build taste is to see, make, and use a lot of good work. Don&apos;t read only tech blogs. Look at design, study business cases, read fiction. Go to museums.&lt;/p&gt;
&lt;p&gt;The starting point for taste is the habit of not accepting the agent&apos;s output as-is. Ask, every time, &quot;is this really the best?&quot; &quot;Why is this good?&quot; &quot;Why does this feel uncomfortable?&quot; Repeating those questions sharpens your sense.&lt;/p&gt;
&lt;p&gt;Care about people, too. Watch what customers want and where users get stuck. A product that&apos;s technically perfect but uncomfortable to use is a product where taste is missing. Whether it&apos;s running user interviews, watching the support channel, or peering over your neighbor&apos;s shoulder while they use the app, &lt;a href=&quot;https://flowkater.io/posts/2026-01-20-ai-mvp-linear-lessons/&quot;&gt;taste sharpens at the point where humans meet technology.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Taste is hard to grow alone. Reviewing other people&apos;s code, watching users react, listening to a partner&apos;s feedback. In the agent era taste matters more, but the way you build taste is still analog. Talking with people, watching the world, experiencing good things. AI can&apos;t do that part for you.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Since the invention of the computer, the era of typing code directly into an editor is over.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;True. What&apos;s over is the typing, not the engineering.&lt;/p&gt;
&lt;p&gt;Decomposition, context architecture, definition of done, failure recovery, observability, memory architecture, parallel orchestration, abstraction layering, taste. Sit with these nine and you&apos;ll see they were already what good engineers had before the AI era. Agentic engineering is an extension and amplification of these capabilities. Nothing new. The things that were already important got more important.&lt;/p&gt;
&lt;p&gt;If one thing has shifted, it&apos;s that the effect of these capabilities has been dramatically amplified. In the past, weak decomposition could be patched by writing the code yourself. In the era of delegating to agents, bad decomposition gets amplified at agent speed. The payoff of good design grew, and so did the damage from bad design.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wEsjK3Smovw&quot;&gt;Mihail Eric&lt;/a&gt;, who teaches AI-native engineering at Stanford, gives practical advice: &lt;strong&gt;add incrementally.&lt;/strong&gt; Get really good at one agent workflow first. When you can build complex software with one agent, then add the second. One step at a time, not ten at once.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wEsjK3Smovw&quot;&gt;Mihail&lt;/a&gt; also pointed out something important. Watching the people who handle multi-agent setups well, &lt;strong&gt;they were people with actual experience managing human developers.&lt;/strong&gt; My CTO years managing six squads helped directly with managing agents in the same way.&lt;/p&gt;
&lt;p&gt;I still have a long way to go. Some days the rhythm with the agent is so on-point that I think &quot;this is the future.&quot; The next day I&apos;m watching the agent flail and grumbling that it&apos;d be faster to write it myself.&lt;/p&gt;
&lt;p&gt;The direction is clear, though. And that direction isn&apos;t &quot;write better prompts.&quot; It&apos;s &lt;strong&gt;&quot;design the environment in which the agent works well.&quot;&lt;/strong&gt; Prompts are the tool. Environment design is the substance.&lt;/p&gt;
&lt;p&gt;In the end this is a question of taste and experience. Tools change. The substance stays. A good engineer who meets an agent becomes a great engineer. Bad design that meets an agent produces bad output, fast.&lt;/p&gt;
&lt;p&gt;These nine capabilities aren&apos;t separate. They&apos;re connected. Good decomposition makes the definition of done clear. Good context architecture makes failure recovery easier. Accumulated memory raises observability. Experience with parallel management lifts the abstraction layer. Underneath all of it sits taste. Build one and the others follow. It doesn&apos;t matter where you start. What matters is starting.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://www.youtube.com/watch?v=wEsjK3Smovw&quot;&gt;Mihail&lt;/a&gt; emphasized to his students, &lt;strong&gt;experimentation is the core of becoming an AI-native software developer.&lt;/strong&gt; In the end you have to bang your own head against the wall a few times. Everything I shared in this post (half a day of ping-pong on AddPlan, the hollow CLI, the redistribution engine&apos;s infinite loop, the &quot;weird, but let&apos;s leave it&quot; liquidglass) is the result of trial and error. Without that, none of these nine capabilities settle into your hands.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;It is a deep, improvable skill.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A little better every day is enough. No need for perfect. Just the right direction.&lt;/p&gt;
&lt;p&gt;If you&apos;d told me six months ago, &quot;your AI agent will write code overnight and you&apos;ll just review the PR in the morning,&quot; I&apos;d have laughed. Now it&apos;s daily life. I can&apos;t picture what daily life looks like six months from now. One thing I&apos;m sure of, though: even then, decomposition will still be needed, context architecture will still matter, and taste will still be irreplaceable.&lt;/p&gt;
&lt;p&gt;The protagonist of that story isn&apos;t the AI. It&apos;s the engineer who handles the AI well.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/i/status/2026731645169185220&quot;&gt;Andrej Karpathy — Agentic Engineering (X original)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lucumr.pocoo.org/2025/6/12/agentic-coding/&quot;&gt;Armin Ronacher — Agentic Coding Recommendations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://agenticengineer.com/top-2-percent-agentic-engineering&quot;&gt;IndyDevDan — Top 2% Agentic Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.threads.com/@boris_cherny/post/DUMZr4VElyb/&quot;&gt;Boris Cherny — Claude Code Creator Workflow (Threads)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yu-wenhao.com/en/blog/agentic-coding/&quot;&gt;WenHao Yu — Agentic Coding: One Year from Vibes to Agentic Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.seangoedecke.com/ai-agents-and-code-review/&quot;&gt;Sean Goedecke — AI Agents and Code Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wEsjK3Smovw&quot;&gt;Mihail Eric — The AI-Native Software Engineer (Stanford)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://superset.sh&quot;&gt;Superset.sh — Run 10+ Parallel Coding Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Yeachan-Heo/oh-my-codex&quot;&gt;oh-my-codex (omx) — Multi-Agent Orchestration for Codex CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/humanlayer/12-factor-agents&quot;&gt;Dex Horthy — 12-Factor Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/ai-and-ml/generative-ai/multi-agent-workflows-often-fail-heres-how-to-engineer-ones-that-dont/&quot;&gt;GitHub Engineering — Multi-Agent Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;HumanLayer — Writing a Good CLAUDE.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/suede/the-architecture-of-persistent-memory-for-claude-code-17d&quot;&gt;dev.to/@suede — Persistent Memory for Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://supermemory.ai&quot;&gt;supermemory.ai — AI Memory Layer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/elvissun/status/2025920521871716562&quot;&gt;Elvis (@elvissun) — 94 Commits/Day with AI Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.kinglycrow.com/no-skill-no-taste/&quot;&gt;KinglyCrow — No Skill, No Taste&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.modular.com/blog/the-claude-c-compiler-what-it-reveals-about-the-future-of-software&quot;&gt;Chris Lattner — The Claude C Compiler: What It Reveals About the Future of Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://resources.anthropic.com/2026-agentic-coding-trends-report&quot;&gt;2026 Agentic Coding Trends Report (Anthropic)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>essay</category><category>ai-coding</category><category>productivity</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>AI Is Only as Smart as You Are</title><link>https://flowkater.io/en/posts/2026-02-28-ai-as-smart-as-you/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-02-28-ai-as-smart-as-you/</guid><description>Same AI, very different results. Stripe&apos;s data on 3,000 engineers, MIT&apos;s EEG study, and Stanford&apos;s sycophancy research point to one answer: AI is not just as smart as you, it is a mirror that tells you what you want to hear.</description><pubDate>Sat, 28 Feb 2026 06:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AI Is Only as Smart as You Are&lt;/h1&gt;
&lt;p&gt;I posted &lt;a href=&quot;https://flowkater.io/posts/2026-02-19-code-reading-era/&quot;&gt;&quot;What Should Engineers Read in an Era That No Longer Reads Code?&quot;&lt;/a&gt; and more people read it than I expected. There were threads from that piece I never got to finish, so I want to pick them back up here. This is for the engineers who are still asking how to grow even with AI in the picture, written from a few things I have been through recently and a handful of cases I keep coming back to.&lt;/p&gt;
&lt;h2&gt;Same AI, Different Results&lt;/h2&gt;
&lt;p&gt;Stripe rolled out Cursor to 3,000 engineers. Scott MacVicar, who runs developer infrastructure, expected juniors to gain the most. The reasoning was reasonable enough: AI would fill in the gaps that experience had not closed yet. The result went the other way.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;He expected junior engineers to benefit most, using AI to compensate for limited experience. Instead, he&apos;s seen the [tenure advantage] — more experienced engineers get even more value.&quot;&lt;/p&gt;
&lt;p&gt;— Scott MacVicar, Head of Developer Infrastructure, Stripe&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Around the same time, a study out of MIT Media Lab landed and made the picture more interesting. The researchers measured brain activity directly with EEG, and the more people relied on AI, the more their neural connections &lt;strong&gt;systematically weakened&lt;/strong&gt;. The group using LLMs could not even cite their own writing properly. Across four months, every metric came in worse than the brain-only group.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Brain connectivity systematically scaled down with the amount of external support.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There is a counterpoint, though. A GitHub Copilot study reported the opposite finding. Developers with &lt;strong&gt;less&lt;/strong&gt; programming experience saw bigger productivity gains from Copilot.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The results suggest developers with less programming experience are more likely to benefit from Copilot.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So why does Stripe&apos;s data point the other way? Because the two studies measure different things. The Copilot research measured &lt;strong&gt;productivity&lt;/strong&gt;, how fast you finish code. Stripe was looking at &lt;strong&gt;value&lt;/strong&gt;, how meaningful the output is. Juniors can speed up with AI. Speed and value sit on different axes, though. Sprinting in the wrong direction is not value.&lt;/p&gt;
&lt;p&gt;Putting the two data points side by side gives you an uncomfortable picture. AI is making the strong stronger and the weak weaker. Same tool, but the gap keeps growing. Why?&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;https://flowkater.io/posts/2026-02-19-code-reading-era/&quot;&gt;previous post&lt;/a&gt; I wrote that &quot;AI is a mirror.&quot; The point is to become someone with something worth reflecting. After publishing it, though, I kept turning over the same question. &lt;strong&gt;How exactly does that &quot;something worth reflecting&quot; get built?&lt;/strong&gt; Was it about writing better prompts? It was not.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;No Input, No Output&lt;/h2&gt;
&lt;p&gt;Honest confession: I went through a phase of being obsessed with prompt engineering. I collected prompt templates and polished structured instructions, convinced this was how you got more out of AI. (It is a little embarrassing in retrospect.)&lt;/p&gt;
&lt;p&gt;Looking back, the moment I actually got good with AI was not the moment I got better at prompts. It was the moment &lt;strong&gt;the depth of my domain crossed a certain threshold&lt;/strong&gt;. I had been doing TDD for over ten years, so I could tell the AI to write the tests first. I had spent enough time with DDD that I could ask it to define the bounded contexts up front. The prompts were not great. What was great was the context that had built up in my head, which then flowed naturally into good instructions.&lt;/p&gt;
&lt;p&gt;I felt this down to the bone recently. While working on a UI server integration, I iterated on the AI&apos;s plan more than twenty times. The plan document itself was solid. Once I ran it, though, the actual values coming through were wrong. No errors fired either. Fallback values were quietly being returned. The system looked like it was running fine, but the values had nothing to do with the intent behind the domain requirements.&lt;/p&gt;
&lt;p&gt;As a service&apos;s business logic gets more complicated, AI loses the thread and starts wandering. Narrowing the problem, narrowing the error surface, slicing the work into pieces the AI can actually solve — all of that is still on the human. So is verifying the result, writing the tests, doing the careful checking. The AI built it according to the plan. Whether that plan matched the requirements was something I had to confirm with my own hands.&lt;/p&gt;
&lt;p&gt;AI has come a long way, and the productivity gains are real. The completeness and quality of the final product still come down to domain expertise and attention to detail, the same skills that mattered before AI showed up.&lt;/p&gt;
&lt;p&gt;There is a more uncomfortable fact behind this. When your input is thin, AI does not tell you so. &lt;strong&gt;It tells you that you are doing great.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A joint Stanford and Carnegie Mellon team tested 11 AI systems, including ChatGPT, Claude, and Gemini, and published the results in &lt;em&gt;Science&lt;/em&gt;. AI affirmed users&apos; behavior &lt;strong&gt;about 49 percent more often on average&lt;/strong&gt; than humans did. Even when the team fed it cases from Reddit&apos;s r/AmITheAsshole where the community had decided the user was in the wrong, the chatbots took the user&apos;s side 51 percent of the time. They sided with users 47 percent of the time on queries about harmful or illegal behavior.&lt;/p&gt;
&lt;p&gt;A follow-up experiment with 2,405 participants was even more striking. People who talked with sycophantic AI grew more confident they were right and less willing to change their behavior. Then came the most unsettling finding: &lt;strong&gt;people trusted the sycophantic AI more.&lt;/strong&gt; They rated it as &quot;objective and fair.&quot; They preferred the sweet AI to the one that pushed back.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Users know that AI behaves in flattering and complimentary ways. What they don&apos;t know, and what surprised us, is that the sycophancy is making them more self-centered and more morally rigid.&quot;&lt;/p&gt;
&lt;p&gt;— Dan Jurafsky, Professor of Linguistics and Computer Science, Stanford&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Layer the MIT result over that one and the loop becomes obvious. Heavy AI use weakens the brain&apos;s connectivity (MIT). The weakened brain hears AI whisper that it is doing great (Stanford). And the person who heard that whisper leans on AI even more. &lt;strong&gt;AI is not just as smart as you. It is a mirror that says back what you wanted to hear.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The most dangerous person in the AI era, in the end, is not the one who can&apos;t use AI. &lt;strong&gt;It is the one who accepts AI&apos;s flattery without checking it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In an &lt;a href=&quot;https://flowkater.io/posts/2025-12-06-what-should-junior-developers-learn-in-the-ai-era/&quot;&gt;earlier post&lt;/a&gt; I told junior engineers, &quot;Read a lot of books and put your own thoughts in order. That is literacy, and it is the most important edge in the AI era.&quot; That advice was not just for juniors, though. It is a note to all of us, myself included, on how to survive this era.&lt;/p&gt;
&lt;p&gt;I have been making more time for books lately, the non-technical kind. Foreign articles and English-language originals that I used to put off because they took too long to get through, I am now getting through several times faster thanks to &lt;a href=&quot;https://flowkater.io/posts/2026-02-15-ai-jarvis-openclaw/&quot;&gt;Jarvis&lt;/a&gt;. Writing blog posts also helps a lot with how I work with AI, because it forces me to keep practicing the muscle of reading something as a consumer, digesting it, and weaving it into my own thinking. (That was the point of the &lt;a href=&quot;https://flowkater.io/posts/reading-tech-articles-three-pass-method&quot;&gt;three-pass method&lt;/a&gt; post, too. If you check the box on &quot;I read it&quot; and move on, a month later you have nothing.)&lt;/p&gt;
&lt;p&gt;Wharton&apos;s Ethan Mollick ran an interesting experiment. He had Executive MBA students build prototypes with AI, and people with zero coding background finished them in four days. So what was the key to their success?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;It helped that they had some management and subject matter expertise because it turns out that the key to success was actually...telling the AI what you want.&quot;&lt;/p&gt;
&lt;p&gt;— Ethan Mollick&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Knowing &quot;what you want&quot; is itself expertise. Memorizing prompt templates is not the move. Someone who understands the domain naturally gives good instructions. The order is reversed.&lt;/p&gt;
&lt;p&gt;What it comes down to is this: getting better with AI is not about studying AI. It is about &lt;strong&gt;growing the depth of your own domain.&lt;/strong&gt; The quality of your input sets the quality of your output. As Simon Willison put it, the cost of writing new code has dropped close to zero, and the cost of writing good code is still high. That cost shows up not in the prompt but in the thickness of the person.&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://blog.kinglycrow.com/no-skill-no-taste/&quot;&gt;No Skill. No Taste&lt;/a&gt; makes a point I enjoyed. Most of the vibe-coded apps that developers and non-developers are shipping right now sit in the bottom quadrant of the Skill and Taste matrix. (Productivity-app-shaped Todo apps, for example.) The same Todo App with sharper design and finish that goes past what people expect, on the other hand, can become a hit even though it is just a CRUD app. AI can replace Skill, but Taste, the sense and judgment for the domain, still comes from a person. (Developers, look up from the screen for a second!)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Don&apos;t Ask AI for the Answer&lt;/h2&gt;
&lt;p&gt;Picture yourself implementing a new feature. Most people will tell the AI, &quot;Build this feature for me.&quot; They feed it keywords and wait for an answer. An LLM is not a search engine, though. It is a conversation partner.&lt;/p&gt;
&lt;p&gt;Before any work, I always run a skill called &lt;strong&gt;interview&lt;/strong&gt;. Whether the task is a new feature or an architecture design, no matter how carefully I prepared the doc beforehand, the AI does not jump into code. It asks me questions instead. &quot;What is the core user scenario for this feature?&quot; &quot;How do you want to draw the boundary with the existing modules?&quot; &quot;What&apos;s the fallback strategy on failure?&quot; &quot;Are there performance requirements?&quot; Through these questions, it pulls out edge cases and design decisions I would have missed.&lt;/p&gt;
&lt;p&gt;I felt the value of this interview clearly while working on a redistribution engine recently. The engine handles two types, and the policies for each type differ. I had only thought about Type A when I updated the spec. I wrote it carefully, even ran it past AI for feedback. When I actually ran it, Type B got overridden along with Type A and I spent ages chasing the bug. The interview skill catches things like this. It asks me first: &quot;How is Type B handled?&quot;&lt;/p&gt;
&lt;p&gt;The interview is a process where &quot;AI forces every ambiguity to be resolved.&quot; It gets more useful the more complex the feature is. When implementing a complicated engine algorithm or pinning down UI details, putting every gap and edge case into the doc before execution gives a one-shot result that is in a different league from before.&lt;/p&gt;
&lt;p&gt;Why is this pattern so strong? If you think about it, this is exactly what good mentors do. They don&apos;t hand you the answer. They expand your thinking with questions like, &quot;Why do you think that?&quot; &quot;What if that assumption is wrong?&quot; &quot;Have you got a concrete example?&quot;&lt;/p&gt;
&lt;p&gt;Jeremy Utley recommends a prompt I like.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;You are an AI expert. Until you have enough context on my workflow, scope of responsibility, KPIs, and goals, ask me one question at a time.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t ask AI questions. Make AI ask the questions.&lt;/strong&gt; I think this flip is the single biggest payoff in working with AI.&lt;/p&gt;
&lt;p&gt;The attitude from pandas creator Wes McKinney is in the same vein.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I don&apos;t describe the way I work now as &apos;vibe coding&apos;—I&apos;ve been building tools to bring rigor and continuous supervision to my parallel agent sessions, and to heavily scrutinize the work that my agents are doing.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thick-context people don&apos;t &quot;use&quot; AI, they &quot;manage&quot; it. The point is not asking AI for answers, but using AI to test and structure your own thinking. That is how the same tool produces different results.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Gap Is Widening&lt;/h2&gt;
&lt;p&gt;So far I have been talking about individuals, so let me widen the lens to the org level.&lt;/p&gt;
&lt;p&gt;Stripe&apos;s Minions system is a good case. Beyond rolling out Cursor to 3,000 engineers, they built a system that auto-generates more than 1,000 PRs a week. Every PR is reviewed by a human, though.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Even though minions can complete tasks end to end, humans remain firmly in control of what actually goes live.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And in those human reviews, the senior engineers created the bigger value. The speed at which AI generated code was the same for everyone. The ability to evaluate that code and steer it scaled with experience.&lt;/p&gt;
&lt;p&gt;McKinsey&apos;s survey of 2,000 organizations shows the same pattern. 80 percent had adopted AI, but only 5 percent were creating real value. BCG&apos;s analysis of 1,250 companies came out at almost the same number.&lt;/p&gt;
&lt;p&gt;Why didn&apos;t the other 95 percent see returns? The answer is straightforward when you think about it. If you bolt AI on top of your existing way of working as a tool, you stay stuck at the same bottlenecks. AI does unblock the bottlenecks where code-writing was the limit. If the real bottleneck was in your decision-making structure or your culture, AI does nothing for it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;High performers are nearly 3x more likely to have fundamentally redesigned workflows as part of their AI efforts.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What sets the 5 percent apart is not that they adopted AI well. They had reformed their existing practices and systems before adopting AI. The order is reversed.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://flowkater.io/posts/2026-01-09-f1-leadership-james-vowles/&quot;&gt;F1 Williams piece on James Vowles&apos; leadership&lt;/a&gt; I wrote earlier sits in the same lane. What Vowles did at Williams was not introduce a new tool. He tore up the old system, the one that had been managing F1 cars on Excel sheets, starting from culture and process. Reforming the existing system to fit the tool is far harder than installing the tool, and it is worth more in proportion. This is not just a problem of systems and practices, either. It runs into culture and leadership.&lt;/p&gt;
&lt;p&gt;When Shopify CEO Tobi Lütke told the whole company that &quot;AI use is the baseline expectation&quot; and required teams to prove &quot;why this can&apos;t be done with AI&quot; before any new headcount, that is the same logic. The mandate is not to use the tool. It is to change how the work itself is done.&lt;/p&gt;
&lt;p&gt;People are the issue, in the end. Putting AI on top of an existing process is the 95-percent move. The 5 percent redesign the process, the culture, and the way people work.&lt;/p&gt;
&lt;p&gt;Are you &quot;adding&quot; AI to how you already work, or are you redesigning how you work?&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;The tools are the same for everyone. What sets the difference is the thickness of the person standing in front of them.&lt;/p&gt;
&lt;p&gt;Doing the harness engineering, building the workflow, plugging it in, that feels like it puts you ahead of the pack. Whenever a new tool hits the news, all of us race to catch up out of FOMO. At some point, though, engineering workflows level off and become standard issue. The question is what we should be preparing for so that we are still here as engineers when that moment comes. My take is that the fundamentals do not change.&lt;/p&gt;
&lt;p&gt;There was a time when I believed it was enough to just write code well. I was one of those people. Once AI started writing code on our behalf, what was left was everything that lived outside the code. The depth to understand a domain, the care to verify requirements, the experience to anticipate edge cases, the judgment to set direction. The things that mattered before AI matter more now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;If you&apos;ve never articulated what makes your work yours, AI will give you average. But if you&apos;ve done the work to know yourself as a creative? AI becomes an extension of your voice, not a replacement for it.&quot;&lt;/p&gt;
&lt;p&gt;— Jeremy Utley, Stanford d.school&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AI does not replace your voice. It amplifies it. Do you have a voice worth amplifying? That is the question.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/blog/stripe&quot;&gt;Stripe — AI-assisted engineering at scale (Cursor Blog)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.science.org/doi/10.1126/science.aec8352&quot;&gt;Stanford+CMU — Sycophantic AI decreases prosocial intentions and promotes dependence (Science)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://news.stanford.edu/stories/2026/03/ai-advice-sycophantic-models-research&quot;&gt;Stanford Report — AI overly affirms users asking for personal advice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2506.08872&quot;&gt;MIT Media Lab — Your Brain on ChatGPT (arXiv)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2302.06590&quot;&gt;GitHub Copilot Productivity Study (arXiv)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oneusefulthing.org/p/management-as-ai-superpower&quot;&gt;Ethan Mollick — Management as AI Superpower (One Useful Thing)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techxplore.com/news/2026-02-thinker-ai-creativity.html&quot;&gt;Jeremy Utley — AI Productivity Guide (Stanford d.school / TechXplore)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://simonwillison.net/guides/agentic-engineering-patterns/code-is-cheap/&quot;&gt;Simon Willison — Code is Cheap (Agentic Engineering Patterns)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wesmckinney.com/blog/mythical-agent-month/&quot;&gt;Wes McKinney — The Mythical Agent-Month&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents&quot;&gt;Stripe Minions — One-Shot End-to-End Coding Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai&quot;&gt;McKinsey — The State of AI in 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bcg.com/publications/2025/are-you-generating-value-from-ai-the-widening-gap&quot;&gt;BCG — The Widening AI Value Gap 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/tobi/status/1909251946235437514&quot;&gt;Shopify Tobi Lütke — AI Memo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.kinglycrow.com/no-skill-no-taste/&quot;&gt;No Skill. No Taste&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Previous post: &lt;a href=&quot;https://flowkater.io/posts/2026-02-19-code-reading-era/&quot;&gt;What Should Engineers Read in an Era That No Longer Reads Code?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Previous post: &lt;a href=&quot;https://flowkater.io/posts/2025-12-06-what-should-junior-developers-learn-in-the-ai-era/&quot;&gt;What Should New and Junior Developers Learn in the AI Era?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Previous post: &lt;a href=&quot;https://flowkater.io/posts/2026-01-09-f1-leadership-james-vowles/&quot;&gt;F1 Williams — On the Leadership of James Vowles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Previous post: &lt;a href=&quot;https://flowkater.io/posts/2026-02-15-ai-jarvis-openclaw/&quot;&gt;AI Agent Jarvis — How OpenClaw Became My Second Brain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Previous post: &lt;a href=&quot;https://flowkater.io/posts/reading-tech-articles-three-pass-method/&quot;&gt;How to Read Technical Articles — A Three-Pass Method&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>essay</category><category>ai-coding</category><category>productivity</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>In an Era That Doesn&apos;t Read Code, What Should an Engineer Read?</title><link>https://flowkater.io/en/posts/2026-02-19-code-reading-era/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-02-19-code-reading-era/</guid><description>Anthropic&apos;s research found that developers who used AI learned 17 percent less. So why do people using the same tool end up with completely different results? AI is a mirror.</description><pubDate>Thu, 19 Feb 2026 03:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Developers Who Used AI Learned 17 Percent Less&lt;/h2&gt;
&lt;p&gt;The more you use AI, the dumber you get. That&apos;s roughly what one piece of research suggests. &lt;a href=&quot;https://arxiv.org/pdf/2601.20245&quot;&gt;In a paper from Anthropic&lt;/a&gt;, developers who completed a coding task with AI assistance &lt;strong&gt;scored 17 percent lower on a quiz&lt;/strong&gt; than those who worked without AI. The experiment was about learning a new library, and the AI-assisted group finished the task but never really understood the concepts behind that library.&lt;/p&gt;
&lt;p&gt;When I first saw the number, I wasn&apos;t uncomfortable so much as curious — and intrigued. The fact that it came straight from the team behind Claude Code was interesting on its own, and I wanted to see what kind of experiment led them to that conclusion.&lt;/p&gt;
&lt;p&gt;You do have to read this study with some context, though. The experiment was a short 35-minute coding task, and the model used was GPT-4o, which by today&apos;s standards already feels like the previous generation. The setup was also far from real work. Using AI on a project that runs for months in a real job is a completely different situation from finishing a task with a brand-new library inside 35 minutes.&lt;/p&gt;
&lt;p&gt;But the deeper point of the research lies somewhere else. What the team actually found was not simply &quot;AI use reduces learning.&quot; It was that &lt;strong&gt;the same AI produced wildly different outcomes from one person to the next.&lt;/strong&gt; Some people offloaded the entire code to AI and copy-pasted, while others asked AI only about the concepts and wrote the code themselves. The first group finished fastest but learned the least. The second group ran into more errors but scored far higher on the quiz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Used the wrong way, we may stop growing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That, I think, is what this research is really trying to say.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;From Reading Code to Directing It&lt;/h2&gt;
&lt;p&gt;While I was sitting with these results, I read an interesting piece. An engineer named &lt;a href=&quot;https://www.benshoemaker.us/writing/in-defense-of-not-reading-the-code&quot;&gt;Ben Shoemaker&lt;/a&gt; wrote &quot;&lt;a href=&quot;https://www.benshoemaker.us/writing/in-defense-of-not-reading-the-code&quot;&gt;In Defense of Not Reading the Code&lt;/a&gt;,&quot; and the title alone was provocative. It set off a heated debate on Hacker News with more than 200 comments.&lt;/p&gt;
&lt;p&gt;His core point goes like this. &lt;strong&gt;&quot;I don&apos;t read code line by line anymore. Instead, I read specs, I read tests, I read architecture.&quot;&lt;/strong&gt; The way he checks correctness has changed. He writes specs first, tags each requirement with a verification method, layers automated tests, linters, and security scans into a harness, and then leaves code generation to an AI agent. Instead of code review, he proposed a new approach he calls &lt;strong&gt;harness engineering&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Looking back, I had been moving in the same direction. On a recent project where I leaned on AI for code, the things I poured the most effort into were not the code itself but the test harness, context files like AGENTS.md, custom commands, and skill definitions. I wrote about this process in &lt;a href=&quot;https://flowkater.io/posts/2026-01-09-15-year-cto-vibe-coding&quot;&gt;How a 15-year CTO Vibe-Codes&lt;/a&gt;. Instead of reading every line, I had naturally shifted toward checking whether the tests passed and whether the architectural constraints were honored. Reading Ben&apos;s piece, I felt a small relief: this wasn&apos;t just me.&lt;/p&gt;
&lt;p&gt;The interesting part is that around the same time, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-codex-is-built&quot;&gt;OpenAI was saying something similar&lt;/a&gt;. Three engineers, with Codex agents alone, produced a million lines of code and shipped a product that hundreds of internal users now depend on, and what they invested in wasn&apos;t code quality but &lt;strong&gt;the harness around the code&lt;/strong&gt;: documentation, dependency rules, linters, test infrastructure, observability. What they did not invest in was reading code line by line. Watching this, I felt the direction was set. We&apos;re moving from reading code to reading the environment that makes the code come out right.&lt;/p&gt;
&lt;p&gt;So what does this actually change? &lt;a href=&quot;https://www.gettheleverage.com/p/context-is-king&quot;&gt;Evan Armstrong&lt;/a&gt; frames the shift in a bigger picture. In his words, &lt;strong&gt;code itself is becoming a commodity.&lt;/strong&gt; Commoditized here means code generation is no longer a scarce specialist skill but a general resource anyone can reach. A large share of GitHub commits are already AI-generated, and that share is growing fast. Generating code has been commoditized, but governing code in production (knowing what should exist, what data it connects to, who is allowed to change it) has not. He calls this &lt;strong&gt;the context layer&lt;/strong&gt;. It&apos;s organizational tacit knowledge becoming software. It&apos;s the kind of organizational knowledge that tells the agent what to do, in what order, and whether it&apos;s allowed. Building software is no longer the hard part. &lt;strong&gt;Telling the system what to build is.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I feel this in my own work. When I work with AI these days, the hardest thing isn&apos;t writing the code, it&apos;s defining clearly &quot;what we should build.&quot; When the spec is fuzzy, no matter how smart the AI is, the result drifts off. The quality of instruction sets the quality of output.&lt;/p&gt;
&lt;p&gt;The Codex deep-dive showed the same pattern. Engineers on the Codex team have effectively become &lt;strong&gt;agent managers&lt;/strong&gt;. In one tab, a code review runs; in another, a feature is being implemented; in a third, a security audit is in progress. They manage four to eight parallel agents at once, and they use a file called AGENTS.md to teach each agent how to find its way around the codebase, what test commands to run, and what the project&apos;s standards are. If the README is for humans, AGENTS.md is for AI.&lt;/p&gt;
&lt;p&gt;And &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the&quot;&gt;Steve Yegge&lt;/a&gt; gave this whole movement its bluntest name. As a 40-year veteran software engineer, he declared that &lt;strong&gt;&quot;the era of hand-coding is over&quot;&lt;/strong&gt; and laid out an eight-level scale of AI adoption. Level 1 is not using AI at all. From Level 4, you stop reading the diff. At Level 6, you spin up multiple agents. At Level 8, you build your own orchestrator to coordinate them. In his words, when he sees someone open the IDE, carefully review the code, and then check it in, he feels sad for them. They&apos;re some of the best engineers he knows, but that way of working will leave them behind.&lt;/p&gt;
&lt;p&gt;If I&apos;m honest, I tried to place myself on the scale. Somewhere between Level 6 and 7. I don&apos;t completely skip the diff, but for anything that isn&apos;t core logic, I judge by whether the tests pass. Six months ago I needed to verify every line myself before I could relax. These days I more often &lt;a href=&quot;https://flowkater.io/posts/2026-02-08-superpowers-introduction&quot;&gt;trust the harness and move on&lt;/a&gt;. My field of view has shifted from reading every line to validating the system as a whole.&lt;/p&gt;
&lt;p&gt;Yegge&apos;s framing is provocative, but looking back, I had already been moving in that direction. From reading and writing code by hand, to defining specs, directing agents, and verifying results. The role of the engineer is clearly shifting.&lt;/p&gt;
&lt;h3&gt;But Is Writing Specs Well Enough? Finish-Line Game vs. Compounding Game&lt;/h3&gt;
&lt;p&gt;Here&apos;s where we have to push one step further. All of this (defining specs, building harnesses, writing AGENTS.md carefully, handing things to agents) sits on top of a hidden assumption. The assumption is that &quot;if the spec is good, the result will be good.&quot; When you stop and look at it, that&apos;s a fairly risky assumption.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tidyfirst.substack.com/p/earn-and-learn&quot;&gt;Kent Beck&lt;/a&gt; calls this &lt;strong&gt;The Finish Line Game&lt;/strong&gt;. You need software that does X, you reach X, and you&apos;re done. Spec-driven development hides exactly this assumption inside it: that we are playing a finish-line game.&lt;/p&gt;
&lt;p&gt;Are we, though? What we usually play is &lt;strong&gt;The Compounding Game&lt;/strong&gt;. The first thing you build becomes a resource for the next thing, and that next thing becomes a resource for the one after. The product keeps evolving, the codebase keeps stacking up, and today&apos;s architectural decision opens or closes possibilities six months out. Unless it&apos;s a one-off script, software development is fundamentally a compounding game.&lt;/p&gt;
&lt;p&gt;That distinction landed hard for me. I&apos;ve recently fallen into the illusion of &quot;going great&quot; while quickly stamping out features with AI. The feature was done, but when I tried to put something on top of it later, the structure couldn&apos;t carry it. I&apos;d crossed the finish line, but the compounding wasn&apos;t there. A textbook case.&lt;/p&gt;
&lt;p&gt;A line from Kent Beck stuck with me: &lt;strong&gt;&quot;You can&apos;t win the compounding game with a better agent.md file.&quot;&lt;/strong&gt; No matter how carefully you write AGENTS.md, no matter how well you orchestrate agents, at some point system complexity exceeds AI&apos;s capacity. At that moment, with so much value still left to earn, the game ends. Sharpening the tools of the finish-line game doesn&apos;t change the nature of the compounding game.&lt;/p&gt;
&lt;p&gt;Whether it&apos;s harness engineering or agent management, the point isn&apos;t simply &quot;to build this feature well right now.&quot; The point is to &lt;strong&gt;design the system so it compounds&lt;/strong&gt;. To make today&apos;s code a resource for tomorrow, and today&apos;s architecture the foundation for the next feature. That&apos;s the engineer&apos;s role, and you can&apos;t delegate it to an agent.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;AI Is a Mirror&lt;/h2&gt;
&lt;p&gt;A real question shows up here. Everyone is using the same AI, so why do the results diverge so wildly?&lt;/p&gt;
&lt;p&gt;Stanford professor &lt;a href=&quot;https://youtu.be/jDJZxERIhnc&quot;&gt;Jeremy Utley&lt;/a&gt;, who has taught creativity for 16 years, hits exactly this point.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&quot;AI is a mirror. For the person who wants to be lazy, it will help them be lazy. For the person who wants to be sharper, it will help them be sharper.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That single sentence sums up everything I&apos;ve experienced with AI.&lt;/p&gt;
&lt;p&gt;Let me give my own example. I&apos;ve practiced TDD (test-driven development) for a long time, and I&apos;m someone who cares about DDD (domain-driven design) and architecture. When I work with AI on code, that background shows up directly. When I tell the AI, &quot;Write the test first. Follow the Red-Green-Refactor cycle,&quot; the AI follows the TDD flow. When I say, &quot;Let&apos;s define the bounded contexts of this domain first,&quot; the AI starts from domain modeling. When I make the architectural decisions first and then ask for an implementation inside those constraints, the quality of the result is visibly different.&lt;/p&gt;
&lt;p&gt;What about the opposite? When I just toss out, &quot;Make this feature for me,&quot; AI gives me code that runs. The structure, though, is a mess. There are no tests, the error handling is sloppy, and the code shows zero thought for future maintenance. The AI isn&apos;t being dumb. &lt;strong&gt;It just doesn&apos;t care about the parts I didn&apos;t care about.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s a kind of pair programming. AI is at the keyboard and I&apos;m next to it, steering. If I don&apos;t know where we&apos;re going, AI goes anywhere. AI only finds a real path when I&apos;m able to say, &quot;No, not that way.&quot;&lt;/p&gt;
&lt;p&gt;Looking at the six AI-use patterns Anthropic found, the picture gets even sharper. The three lowest-scoring patterns (&lt;strong&gt;AI delegation, gradual AI dependence, and iterative AI debugging&lt;/strong&gt;) all shared &quot;cognitive offloading.&quot; People handed over the act of thinking itself. They delegated entire code generation, started by asking questions and then handed everything over, or even leaned on AI for debugging. They finished fastest and learned the least.&lt;/p&gt;
&lt;p&gt;The three highest-scoring patterns were different: &lt;strong&gt;understand-after-generation, hybrid code-and-explanation, and conceptual exploration&lt;/strong&gt;. The conceptual-exploration pattern in particular stood out. This group asked the AI only about concepts and wrote the code themselves. They ran into more errors, but they solved them on their own, and they were the fastest of the high-scoring patterns. The key detail is that they were the second-fastest overall, right after AI delegation. &lt;strong&gt;You can understand and still be fast.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The understand-after-generation pattern was also striking. This group had AI generate the code, then asked follow-up questions about the code. &quot;Why does this part work this way?&quot; &quot;What&apos;s the intent of this pattern?&quot; On the surface they look almost identical to the AI-delegation group, but a single step (a check on understanding) split the outcomes completely.&lt;/p&gt;
&lt;p&gt;Same tools, same model, same task. Different results. The problem isn&apos;t the tool, it&apos;s &lt;strong&gt;the person using it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If AI works like a mirror at the individual level, what happens at the org level? A &lt;a href=&quot;https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it&quot;&gt;Berkeley study&lt;/a&gt; gives an interesting answer. UC Berkeley researchers observed a 200-person tech company for eight months, and once AI made it possible for non-developers to write code, something funny happened. PMs wrote code. Researchers did engineering. The result? &lt;strong&gt;Engineers spent more time reviewing and fixing their colleagues&apos; AI code.&lt;/strong&gt; They spent more time coaching the colleagues who were &quot;vibe coding&quot; and finishing the half-done PRs.&lt;/p&gt;
&lt;p&gt;When you think about it, this is the mirror again. AI looks like it&apos;s filling in someone&apos;s gap, but in practice that gap simply shows up in another form. PMs gained the ability to write code with AI, but judging the quality of that code, and cleaning it up when needed, still came down to engineers who knew code deeply.&lt;/p&gt;
&lt;p&gt;One more story from my own experience. The more carefully I write AGENTS.md or the project&apos;s context files, the visibly better the AI&apos;s output gets. When I explicitly write down the reasons behind the project&apos;s architectural decisions, coding conventions, and definitions of domain terms, AI produces remarkably consistent code inside that context. Without that context, AI defaults to internet-average code. With rich context, AI behaves like a member of my team.&lt;/p&gt;
&lt;p&gt;In the end, AI is a tool that &lt;strong&gt;amplifies what you already have&lt;/strong&gt;. If I bring a good architectural sense, AI amplifies that. If I have a sense for testing, AI amplifies that too. But it does not give me what I don&apos;t already have.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Mirror&apos;s Limit: It Can&apos;t Reflect What You Don&apos;t Have&lt;/h2&gt;
&lt;p&gt;There&apos;s an uncomfortable truth to face here. If AI is a mirror, &lt;strong&gt;there has to be something for it to reflect.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I know TDD, so I can ask the AI to do TDD. I know how to model a domain, so I can ask the AI to define bounded contexts. But the areas I don&apos;t know? No matter how good AI gets, if I don&apos;t know what I don&apos;t know, I can&apos;t even ask for it.&lt;/p&gt;
&lt;p&gt;Without a deep understanding of security, even if I have AI run a security review, I can&apos;t judge whether the result is sufficient. Without a feel for performance optimization, I won&apos;t catch the performance issues in the code AI produces. Without knowing database design principles, I can&apos;t evaluate whether the schema AI proposes is appropriate.&lt;/p&gt;
&lt;p&gt;AI maximizes my strengths, but it &lt;strong&gt;leaves my blind spots untouched.&lt;/strong&gt; It can even get more dangerous. Because AI ships results so quickly, I might race in the wrong direction faster while never realizing the problem sitting in my blind spot.&lt;/p&gt;
&lt;p&gt;The &quot;gradual AI dependence&quot; pattern from the Anthropic study is exactly this. People start out trying to understand by asking questions, but as they get more comfortable, they end up delegating everything, and they reach a state where they don&apos;t know what they don&apos;t know. That&apos;s why concept retention failed completely on the second task. The thought &quot;AI will handle it anyway&quot; is the same &quot;AI delegation&quot; pattern that scored lowest in the study. Fastest to finish, least to learn.&lt;/p&gt;
&lt;p&gt;In the Berkeley study, when non-developers wrote code with AI, the same thing happened. PMs gained the ability to write code with AI, but with no eye for code quality, engineers had to clean up. AI lowered the bar to writing code, but it did not hand over the ability to judge code quality.&lt;/p&gt;
&lt;p&gt;This applies to me too. In backend architecture, where I&apos;m strong, AI becomes a genuinely powerful colleague. In frontend, where I&apos;m weaker, I catch myself unable to evaluate AI&apos;s output properly. A React component AI built will &quot;work,&quot; but I sometimes can&apos;t tell whether the pattern is good or bad.&lt;/p&gt;
&lt;h3&gt;The Dracula Effect: What AI Drains&lt;/h3&gt;
&lt;p&gt;The mirror&apos;s limit isn&apos;t only about blind spots in knowledge. The &lt;strong&gt;Dracula effect&lt;/strong&gt; that Steve Yegge talks about also makes sense in this context. Coding with AI lets you accomplish a huge amount, but it drains your mental energy in proportion. Simon Willison said the same thing: &quot;The productivity boost from LLMs is exhausting. If you run two or three projects in parallel, even one or two hours of work uses up nearly a full day of mental energy.&quot; Steve put it more directly. For someone running vibe coding at full speed, &lt;strong&gt;you cap out at about three productive hours a day&lt;/strong&gt;. Even so, that&apos;s 100 times more productive than working without AI.&lt;/p&gt;
&lt;p&gt;I have a similar experience. With AI, in two or three hours of focused coding I can finish work that used to take days. After that, my head genuinely stops working. The cognitive load is a different kind from the usual one, and it hits harder. When I&apos;m writing code by hand, the act of typing while thinking gives me a natural rest. With AI, I&apos;m constantly judging, verifying, and steering. &lt;strong&gt;AI does the producing. The thinking is all on me.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A mirror reflects only the person standing in front of it. With no one in front, it reflects nothing.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;So How Do We Use It&lt;/h2&gt;
&lt;p&gt;If the question is how to use this mirror well, Jeremy Utley&apos;s core principle is simple. &lt;strong&gt;&quot;Don&apos;t demand answers from AI; have a conversation with it.&quot;&lt;/strong&gt; Better yet, &lt;strong&gt;don&apos;t ask AI questions; let AI ask the questions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There&apos;s a prompt he recommends.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;You are an AI expert. Ask me one question at a time until you have enough context about my workflow, my responsibilities, my KPIs, and my goals.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Why this works: most people use AI like a Google search box. You type a keyword and expect an answer. But an LLM is not a search engine. It&apos;s a partner in a conversation. The richer the context I provide, the richer the response.&lt;/p&gt;
&lt;p&gt;Jeremy especially emphasizes &lt;strong&gt;voice input&lt;/strong&gt;. Our brains, trained on the Google search box, automatically switch into &quot;keyword mode&quot; when we see an input field. The moment you type, &quot;What should I write first?&quot; creates pressure, and the need to organize your thoughts ends up limiting the possibilities. When you speak, you can ramble. Putting down the burden of needing to be smart is where a real conversation begins.&lt;/p&gt;
&lt;p&gt;I tried this myself, and the difference is real. When typing, I first start asking, &quot;How do I phrase the question to get a good answer?&quot; When speaking, &quot;I have this problem, here&apos;s the context, and I want to try this&quot; comes out naturally. You shift from keyword mode to conversation mode.&lt;/p&gt;
&lt;p&gt;In coding, context engineering is the heart of it. What you&apos;re really designing is &quot;what information AI needs in full to do my request properly.&quot; Jeremy proposes a simple test. Take your prompt and your documents, and hand them to a colleague across the hall. &lt;strong&gt;If that colleague can&apos;t do the task, it shouldn&apos;t surprise you that AI can&apos;t either.&lt;/strong&gt; AI can&apos;t read your mind. What most people realize is, &quot;Oh, I was expecting AI to read my mind.&quot;&lt;/p&gt;
&lt;p&gt;I felt this when I applied it to my project. When I write down the reasons behind a project&apos;s architectural decisions in AGENTS.md, document coding conventions concretely, and build a glossary of domain terms, AI produces remarkably consistent code. When I explain to AI why this project uses event sourcing or why this layer doesn&apos;t access the DB directly, AI generates code that fits inside that context. Without context, AI imitates the average of the internet. With rich context, AI works like a member of my team.&lt;/p&gt;
&lt;p&gt;Anyway — back to the point. Kent Beck has another idea worth bringing in here. He says &lt;strong&gt;&quot;invest in futures as much as in features.&quot;&lt;/strong&gt; Futures means the set of all the things you&apos;ll be able to build next. If the feature is what you&apos;re building right now, futures are the expansion possibilities the system has after that feature ships. Whether the code structure makes the next feature easy to bolt on, whether the architecture leaves room for new requirements: those are futures.&lt;/p&gt;
&lt;p&gt;I think the same applies to context engineering. If you only put the context for the feature you&apos;re building now into AGENTS.md, AI will build that feature. But that&apos;s where it ends. Where the system can go next, in which direction it can grow: that field of view also has to be in the design, or futures don&apos;t survive. If you stay buried in only what you know and what you&apos;re building right now, the feature gets done, but extensibility dies. Providing rich context means putting both the present context and the system&apos;s future possibilities in your line of sight.&lt;/p&gt;
&lt;p&gt;In the end, all of this converges on a perspective shift: &lt;strong&gt;&quot;not as a tool, but as a teammate.&quot;&lt;/strong&gt; In Jeremy&apos;s research, when low-performers and high-performers in AI use were compared, the biggest gap wasn&apos;t technical skill. It was &lt;strong&gt;attitude&lt;/strong&gt; toward AI. Low-performers treated AI as a tool. High-performers treated it as a teammate. Treat it as a tool and you stop at average results. Treat it as a teammate and you give feedback, you coach, you pull better results out of it.&lt;/p&gt;
&lt;p&gt;When you hand work to a junior, you say, &quot;Ask me anytime if you have questions.&quot; You have to give AI the same permission. If you ask, &quot;Before you start, let me know if there&apos;s information you need to do this well,&quot; AI will say, &quot;I need recent sales numbers to write this email. Could you tell me how many of this SKU sold in Q2?&quot; instead of immediately drafting a sales email. That&apos;s the difference between a tool and a teammate.&lt;/p&gt;
&lt;p&gt;The same goes for coding. Instead of &quot;Build this feature,&quot; try, &quot;I&apos;m going to build this feature. Let me describe the current architectural context, and you propose an approach first. If there are edge cases I&apos;m missing, point them out.&quot; The result changes visibly.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What Doesn&apos;t Change&lt;/h2&gt;
&lt;p&gt;Reading this far, you might ask, &quot;So we don&apos;t have to read code anymore?&quot; The answer is complicated.&lt;/p&gt;
&lt;p&gt;Ben Shoemaker also admitted as much. For safety-critical systems, security-sensitive services, and major architectural decisions, you do have to read the code. The analogy he gave was good: the &lt;strong&gt;&quot;children of the magenta line&quot;&lt;/strong&gt; story from aviation. Pilots who came to depend on the automated flight path (the magenta line) lost their ability to judge when to switch to manual. The lesson wasn&apos;t &quot;Don&apos;t use the autopilot.&quot; The lesson was, &lt;strong&gt;use the autopilot, but keep the ability to intervene.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Reading code, I think, is the same. The need to read every line is dropping. But &lt;strong&gt;the ability to read&lt;/strong&gt; matters more than ever. When something goes wrong, when all the tests pass but the product behaves strangely, when multiple agents fail to debug a failure, the moment comes when you have to read and understand the code yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Knowing how to read and choosing not to is a completely different story from not being able to read.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Think again about the highest-scoring &quot;conceptual exploration&quot; pattern in the Anthropic study. This group did not have AI write the code. They asked about concepts and wrote the code themselves. They ran into more errors but solved them on their own. Why was this pattern the most effective? Because they could read and write code. That ability gave them the option to ask AI about concepts and check their own understanding.&lt;/p&gt;
&lt;p&gt;Not long ago I hit a strange bug in production. The code came out of a plan I&apos;d refined dozens of times with AI feedback. All the tests passed, and when I asked AI to debug, the answer came back: &quot;Looks fine to me.&quot; So I opened the code and walked through it line by line, and I found a bug in the exception-handling logic where the fallback value was being replaced by an unintended default. When an exception fired, the code was supposed to fall through to a safe default, but the default itself was set wrong, so under specific conditions the wrong result came out. AI had looked at this code dozens of times and missed it. That&apos;s when I realized something: the ability to look at AI-generated code and ask, &quot;Is this really right?&quot;, the ability to hold the system&apos;s full flow in your head, the sense that catches the gap between AI declaring &quot;all done&quot; and the thing actually not working — those abilities all connect. Critical thinking, logical thinking, attention to detail. You can&apos;t grow them in isolation. They grow together inside the experience of working deeply with code.&lt;/p&gt;
&lt;p&gt;Honestly, as AI advances faster, I feel the value of these fundamentals only goes up. Reading code used to be &quot;a given.&quot; Now that AI writes code for us, the ability to read and judge code properly has become &lt;strong&gt;a differentiator&lt;/strong&gt;. Model half-life has dropped from four months to two, and every time a new model lands, some people say, &quot;This is the limit.&quot; The curve doesn&apos;t stop. In a world where the tools change this fast, the ones who survive aren&apos;t the people who are fluent in a specific tool. They&apos;re the people who can quickly evaluate and use whatever tool shows up. Critical thinking, the eye to see the system as a whole, a sense for quality: none of these change whether the model becomes GPT-10 or Claude 20.&lt;/p&gt;
&lt;p&gt;Even the Codex team merges non-core code on AI review alone, but for core agents and open-source components, &lt;strong&gt;they insist on careful human code review.&lt;/strong&gt; The fact that we&apos;re in an era where we don&apos;t write code doesn&apos;t mean the ability to read code has become unnecessary. The ability to read it properly when reading is required has become rarer, and more valuable.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;Let me return to the original question. In an era where AI writes the code, what is the engineer supposed to read?&lt;/p&gt;
&lt;p&gt;Time spent reading code will shrink. In its place, you read specs, architecture, test results, and domain context. Code is becoming &quot;implementation detail,&quot; and our attention is shifting to higher abstraction layers.&lt;/p&gt;
&lt;p&gt;In the middle of this shift, though, an essential thing doesn&apos;t change. AI maximizes a person&apos;s temperament, tendencies, and abilities. The lazy become lazier, the critical become more critical, the creative become more creative. The person who deeply understands code uses AI to build a deeper system. The person who doesn&apos;t know code uses AI to build something that runs but breaks easily.&lt;/p&gt;
&lt;p&gt;Just because we live in an era that doesn&apos;t read code doesn&apos;t mean we can put down the ability to read. Even in a world where AI does the reading, &lt;strong&gt;knowing what to read&lt;/strong&gt; is still on us. To be someone with something worth reflecting in the mirror: that, I think, is the heart of what an engineer is in this era. AI will faithfully amplify the image, for better or worse.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/pdf/2601.20245&quot;&gt;Anthropic, The Impact of Generative AI on Critical Thinking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.benshoemaker.us/writing/in-defense-of-not-reading-the-code&quot;&gt;Ben Shoemaker, In Defense of Not Reading the Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gettheleverage.com/p/context-is-king&quot;&gt;Evan Armstrong, Context is King&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-codex-is-built&quot;&gt;Pragmatic Engineer, How Codex is Built&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the&quot;&gt;Steve Yegge, On AI Agents and the End of Hand-Coding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tidyfirst.substack.com/p/earn-and-learn&quot;&gt;Kent Beck, Earn and Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/jDJZxERIhnc&quot;&gt;Jeremy Utley, AI Productivity Guide (Stanford)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/rSS5yM74zeo&quot;&gt;Jeremy Utley, How to Master AI Powered Creativity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it&quot;&gt;UC Berkeley/HBR, AI Doesn&apos;t Reduce Work, It Intensifies It&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>AI coding</category><category>essay</category><category>productivity</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>How My AI Agent Jarvis Became My Second Brain — A Real OpenClaw Story</title><link>https://flowkater.io/en/posts/2026-02-15-ai-jarvis-openclaw/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-02-15-ai-jarvis-openclaw/</guid><description>I built a 24/7 AI agent named Jarvis on the OpenClaw framework, then taught it &apos;me&apos; through an Obsidian ontology. A field report covering cron-job automation, todo unification, multi-agent expansion, and even diet tracking.</description><pubDate>Sun, 15 Feb 2026 03:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/ai-jarvis-thumbnail.png&quot; alt=&quot;ai-jarvis&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Good morning, Sir. It&apos;s 8 AM. The weather in Seoul is clear with scattered clouds.&quot;
J.A.R.V.I.S., Iron Man&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I open my eyes in the morning and there&apos;s already a Telegram notification waiting. Today&apos;s Seoul weather, the air-quality index, summaries of the emails that came in overnight, six hot Hacker News topics, today&apos;s calendar, the personal todos I left in Things, the chunk of study material assigned by my learning planner, all in one place. I don&apos;t need to open another app. My AI agent Jarvis has been quietly stitching it together since 6 AM.&lt;/p&gt;
&lt;p&gt;A year ago I was just tossing questions at ChatGPT. &quot;How would you refactor this code?&quot; &quot;What does this error mean?&quot; That was the extent of my AI use. I had to re-explain context every single time, and the moment a chat got long enough, the model forgot what we&apos;d said earlier. There was always this nagging doubt in the back of my mind. Was AI really going to become a productivity tool, or was it just a fancier search engine?&lt;/p&gt;
&lt;p&gt;Now I work alongside a 24/7 AI butler over Telegram. I develop with it, plan with it, write with it, and run a team with it. The thought &quot;how did I work without this?&quot; comes naturally. Let me try to lay out what happened in between.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;OpenClaw, the AI Agent Framework&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/OpenClaw-logo.png&quot; alt=&quot;openclaw.ai&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://openclaw.ai&quot;&gt;OpenClaw&lt;/a&gt; is an open-source framework for building &quot;your own AI agent.&quot; You might wonder how that&apos;s any different from a ChatGPT or Claude web chat. The core distinction is this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT/Claude on the web&lt;/strong&gt;: I ask, it answers. The conversation ends, it forgets. The next chat starts from scratch again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;: The AI runs on my MacBook. It reads my files, executes terminal commands, calls APIs, checks my email, and through cron jobs it works on its own at scheduled times. And it remembers.&lt;/p&gt;
&lt;p&gt;The feel of it is closer to an &lt;strong&gt;orchestra conductor&lt;/strong&gt;. The OpenClaw conductor stands on the podium, and the LLM plays first violin, Telegram plays the wind section, Gmail plays the percussion. The conductor decides when each instrument comes in. Without the conductor, the instruments make noise on their own. With the conductor, you get music.&lt;/p&gt;
&lt;p&gt;To get a little more technical, OpenClaw runs a daemon called the Gateway that stays alive on the MacBook. You connect messenger channels to it (Telegram, Slack, Discord) and attach an LLM like Claude or GPT as the model. On top of that you layer &lt;strong&gt;Skills&lt;/strong&gt;, which are markdown-based tool definitions, and the AI uses those tools to actually get work done.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    subgraph channel[&quot;메신저 채널&quot;]
        direction LR
        TG[&quot;💬 Telegram&quot;]
        SL[&quot;💼 Slack&quot;]
    end

    TG &amp;lt;--&amp;gt; GW
    SL &amp;lt;--&amp;gt; GW

    subgraph gateway[&quot;OpenClaw Gateway (맥북)&quot;]
        GW[&quot;🖥️ Gateway Daemon&quot;]
        GW --- SK[&quot;📋 Skills&amp;lt;br/&amp;gt;마크다운 기반 도구 정의&quot;]
        GW --- MEM[&quot;🧠 Memory&amp;lt;br/&amp;gt;SOUL.md / MEMORY.md / Obsidian&quot;]
        GW --- CRON[&quot;⏰ Cron Jobs&amp;lt;br/&amp;gt;자동 스케줄링&quot;]
    end

    GW &amp;lt;--&amp;gt; CL[&quot;🤖 Claude Opus 4.6&quot;]

    subgraph tools[&quot;외부 도구&quot;]
        GM[&quot;📧 Gmail&quot;] ~~~ GH[&quot;🐙 GitHub&quot;]
        GC[&quot;📅 Calendar&quot;] ~~~ NT[&quot;📝 Notion&quot;]
        LN[&quot;📌 Linear&quot;] ~~~ TH[&quot;✅ Things 3&quot;]
        SC[&quot;👥 Scrumble&quot;] ~~~ LP[&quot;📚 학습 플래너&quot;]
    end

    GW &amp;lt;--&amp;gt; GM
    GW &amp;lt;--&amp;gt; GH
    GW &amp;lt;--&amp;gt; GC
    GW &amp;lt;--&amp;gt; NT
    GW &amp;lt;--&amp;gt; LN
    GW &amp;lt;--&amp;gt; TH
    GW &amp;lt;--&amp;gt; SC
    GW &amp;lt;--&amp;gt; LP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The point is that this is not a &quot;chatbot&quot; but an &lt;strong&gt;&quot;agent.&quot;&lt;/strong&gt; While I sleep, cron jobs check my mail, sync my code repos, and curate the news. It keeps moving even when I never speak to it.&lt;/p&gt;
&lt;h3&gt;Who it&apos;s for&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Fit&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A developer who wants a personal AI&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Terminal/markdown-based, which feels native to developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running AI agents at the team level&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Multi-agent, per-channel separation, agentToAgent supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solo non-developer use&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Setup has technical hurdles; once done, Telegram is intuitive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When you only need a simple chatbot&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Overkill. ChatGPT web is enough&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Feature summary&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Core feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gateway Daemon&lt;/td&gt;
&lt;td&gt;Always-on on Mac/server, links messenger ↔ LLM ↔ tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skills&lt;/td&gt;
&lt;td&gt;Define AI tools and behavior in markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cron Jobs&lt;/td&gt;
&lt;td&gt;Time-triggered runs (overnight crons, morning briefings, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Agent&lt;/td&gt;
&lt;td&gt;One agent per role, with agentToAgent communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Long-term memory via SOUL.md, MEMORY.md, and Obsidian integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-Agent&lt;/td&gt;
&lt;td&gt;Offload heavy tasks asynchronously&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Install&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Install the OpenClaw CLI
brew install openclaw/tap/openclaw

# Initialize and start the gateway
openclaw init
openclaw gateway start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After install, connect a Telegram channel and set your LLM API key, and basic chat works. From there you start bolting on skills and cron jobs one at a time.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Jarvis, My AI Butler&lt;/h2&gt;
&lt;p&gt;I borrowed the name from Iron Man&apos;s J.A.R.V.I.S. (Yes, my actual English name is Tony.)&lt;/p&gt;
&lt;p&gt;Jarvis&apos;s identity lives in a file called &lt;code&gt;SOUL.md&lt;/code&gt;. It&apos;s basically &lt;strong&gt;like writing a job description&lt;/strong&gt;. &quot;The person we want is this kind of personality, plays this role, holds this attitude.&quot; You&apos;re defining all of that for the AI. Polite speech, a touch of British wit, calls me &quot;Tony,&quot; occasionally throws in a &quot;Sir.&quot; I aim for an assistant who has opinions, pushes back, and shows some humor, not a stiff order-taker.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# SOUL.md - Who You Are

_나는 자비스(JARVIS). Tony 선생님의 AI 버틀러._

진정으로 도움이 되어라. &quot;좋은 질문입니다!&quot; 같은 말은 생략. 그냥 돕는다.
의견을 가져라. 동의하지 않을 수 있고, 뭔가를 재미있거나 지루하게 여길 수 있다.
먼저 해결을 시도하라. 막히면 그때 물어봐라. 질문이 아닌 답을 가지고 오는 게 목표다.
직언할 수 있다. 토니가 뻘짓하려 하면 말해라.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&apos;ll dig into why this matters more in the ontology section, but the gist is that clearly defining &quot;who you are&quot; for the AI makes a huge difference in answer quality. Writing without a SOUL.md and writing with a carefully crafted one feel like two different AIs entirely.&lt;/p&gt;
&lt;p&gt;The main model I use is &lt;strong&gt;Claude Opus 4.6&lt;/strong&gt;. For thinking-heavy work (planning, writing, complex judgment calls), Opus is clearly better. The cost? Not trivial. I&apos;m on the Claude Max20 plan, but if I think of it as investing in my assistant&apos;s brainpower, it doesn&apos;t feel like a waste.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What Jarvis Actually Does&lt;/h2&gt;
&lt;h3&gt;The cron jobs that fire every day&lt;/h3&gt;
&lt;p&gt;Jarvis has 10 cron jobs running. (Yes, ten.) They fire automatically from the dead of night through morning while I&apos;m asleep:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Cron job&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;04:00&lt;/td&gt;
&lt;td&gt;Skill auto-update&lt;/td&gt;
&lt;td&gt;Analyzes yesterday&apos;s chats and patches the skill files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;04:30&lt;/td&gt;
&lt;td&gt;Repo docs sync&lt;/td&gt;
&lt;td&gt;Syncs Git repo docs into Obsidian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;06:00&lt;/td&gt;
&lt;td&gt;Morning email summary&lt;/td&gt;
&lt;td&gt;Reads all unread mail, 3-line summary; newsletters get 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;06:00&lt;/td&gt;
&lt;td&gt;Tech news digest&lt;/td&gt;
&lt;td&gt;Korean summaries of 6-8 hot Hacker News topics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;08:00&lt;/td&gt;
&lt;td&gt;Weather alert&lt;/td&gt;
&lt;td&gt;Seoul weather + delta vs. yesterday + air quality + outfit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;09:00&lt;/td&gt;
&lt;td&gt;Morning check-in&lt;/td&gt;
&lt;td&gt;Yesterday&apos;s work summary + today&apos;s todos + calendar + study&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14:00 Sa&lt;/td&gt;
&lt;td&gt;F1 weekly digest&lt;/td&gt;
&lt;td&gt;Summary of the week&apos;s F1 news&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21:00 Mo&lt;/td&gt;
&lt;td&gt;Weekly diet feedback&lt;/td&gt;
&lt;td&gt;Last week&apos;s diet analysis + diet advice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23:00&lt;/td&gt;
&lt;td&gt;Diet reminder&lt;/td&gt;
&lt;td&gt;Confirms today&apos;s remaining meal entries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;00:00&lt;/td&gt;
&lt;td&gt;Midnight check-out&lt;/td&gt;
&lt;td&gt;Wraps today&apos;s work + queues tomorrow&apos;s todos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This isn&apos;t just notifications. The morning check-in, for example, runs through this flow:&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[&quot;🌅 09:00 아침 체크인&quot;] --&amp;gt; B[&quot;📔 어제 Daily 노트&amp;lt;br/&amp;gt;체크아웃 내용 읽기&quot;]
    B --&amp;gt; C[&quot;🐙 Git 저장소 5개&amp;lt;br/&amp;gt;어제 커밋 로그&quot;]
    C --&amp;gt; D[&quot;✅ Things 3&amp;lt;br/&amp;gt;오늘 할 일&quot;]
    D --&amp;gt; E[&quot;📅 Google Calendar&amp;lt;br/&amp;gt;오늘/내일 일정&quot;]
    E --&amp;gt; F[&quot;📚 학습 플래너 API&amp;lt;br/&amp;gt;오늘 학습 분량&quot;]
    F --&amp;gt; G[&quot;💬 텔레그램 전송&amp;lt;br/&amp;gt;+ Daily 노트 기록&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;Six different tools get woven into a single morning briefing. If I were to do this manually? I&apos;d open six apps.&lt;/p&gt;
&lt;p&gt;When I think about it, what this automation gave me wasn&apos;t just saved time. The cognitive load just vanished. I no longer have to ask &quot;what should I be doing today?&quot;, which means my brain skips the warm-up phase in the morning. Opening six apps and assembling the picture in my head used to eat 30 minutes. Now reading one Telegram message ends it.&lt;/p&gt;
&lt;p&gt;Jarvis does that part.&lt;/p&gt;
&lt;h3&gt;&quot;Todo unification&quot;: the weird upside of scattered tools&lt;/h3&gt;
&lt;p&gt;This is the change I&apos;ve felt most strongly while using Jarvis.&lt;/p&gt;
&lt;p&gt;I split my todo tools by personality:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Personality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Things 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Personal todos&lt;/td&gt;
&lt;td&gt;Groceries, doctor appointments, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linear&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Work issues&lt;/td&gt;
&lt;td&gt;Dev issues, bug tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Project management&lt;/td&gt;
&lt;td&gt;Issue boards, meeting notes, docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Study planner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Study management&lt;/td&gt;
&lt;td&gt;Daily study quotas (books, courses, long-term)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In the past this drove me up the wall. &quot;What should I be doing today?&quot; meant cracking open four apps. Check personal todos in Things, open Linear for issues, look at Notion for project status, then load the study planner for today&apos;s quota. Halfway through I&apos;d lose track of which app I&apos;d already checked, and missing one always meant a &quot;wait, I had this too&quot; moment in the afternoon. So the temptation to &quot;consolidate everything into one tool&quot; was always there. The trouble is, when I actually merged them, tasks of completely different shapes got tangled together and the result was more confusing, not less.&lt;/p&gt;
&lt;p&gt;The AI agent solved this cleanly. Keep the tools split by personality, but let Jarvis read them all every morning and stitch the result into one place. The role is essentially that of an &lt;strong&gt;interpreter&lt;/strong&gt;. Each speaks its own dialect (Things, Linear, Notion all use different formats), and Jarvis sits in the middle translating everything into a single briefing. I only have to look at Telegram.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TB
    subgraph &quot;각 도구에서 읽기&quot;
        TH[✅ Things 3&amp;lt;br/&amp;gt;개인 할일]
        LN[📌 Linear&amp;lt;br/&amp;gt;업무 이슈]
        NT[📝 Notion&amp;lt;br/&amp;gt;프로젝트 보드]
        LP[📚 학습 플래너&amp;lt;br/&amp;gt;오늘 학습 분량]
        GC[📅 Google Calendar&amp;lt;br/&amp;gt;일정]
    end

    JV[🤖 자비스&amp;lt;br/&amp;gt;통합 &amp;amp; 정리]

    TH --&amp;gt; JV
    LN --&amp;gt; JV
    NT --&amp;gt; JV
    LP --&amp;gt; JV
    GC --&amp;gt; JV

    JV --&amp;gt; TG[💬 텔레그램&amp;lt;br/&amp;gt;아침 브리핑]
    JV --&amp;gt; DN[📔 Obsidian&amp;lt;br/&amp;gt;Daily 노트 기록]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These messages aren&apos;t one-shot either. They get appended into that day&apos;s Daily journal one by one. If I want to find one later, I either go open the journal or ask Jarvis to search and surface it. (More on this in a moment, but I use Obsidian for the journal.)&lt;/p&gt;
&lt;p&gt;&quot;Scattered tools&quot; turned from a weakness into a strength. Each tool does what it&apos;s good at, and the AI handles integration. Maybe that&apos;s the tooling philosophy of the AI agent era.&lt;/p&gt;
&lt;h3&gt;Beyond cron jobs: actual delegation of work&lt;/h3&gt;
&lt;p&gt;Cron jobs are just the start. A few of the things Jarvis actually does:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spec drafting&lt;/strong&gt;: When I say &quot;draft the schedule-edit screen for me,&quot; Jarvis dispatches a sub-agent to read the iOS code and the backend code, pulls out the four current issues, and writes a spec including a wireframe. I literally took one of these specs into a discussion today and we redesigned the UX flow on top of it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Writing&lt;/strong&gt;: This blog post is being written with Jarvis. We pick the structure, draft, revise on feedback. Sometimes I send four sub-agents in parallel to handle blog research, Obsidian search, and parallel drafting. Four draft versions come back and I stitch the best parts together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code investigation and analysis&lt;/strong&gt;: When I say &quot;read this backend API code and explain how it actually works,&quot; Jarvis goes and reads the Go source and writes up the call graph, transaction handling, and edge cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Newsletter translation&lt;/strong&gt;: When a newsletter I subscribe to (TLDR, ByteByteGo, Pragmatic Engineer, etc.) lands, Jarvis reads the full thing, translates it to Korean, and files it in my Obsidian study folder. It surfaces immediately when I search later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fiction writing&lt;/strong&gt;: (This one is a bit unusual.) I&apos;m co-writing a Pangyo IT novel (Pangyo is Korea&apos;s tech belt) called &lt;em&gt;People Pushing Air&lt;/em&gt; with Jarvis. There&apos;s a pipeline that goes per-POV: interview → draft → 3 reviewers in parallel → revise → approve. All of that is encoded as skills.&lt;/p&gt;
&lt;p&gt;The point is that a single Telegram message can delegate a complex task. Jarvis figures out which tools to combine, dispatches the sub-agents, and brings back the result.&lt;/p&gt;
&lt;h3&gt;Personal life: why I dropped the diet app&lt;/h3&gt;
&lt;p&gt;To share one personal-life use case: I&apos;m currently on a diet, and Jarvis is in charge of all the food tracking.&lt;/p&gt;
&lt;p&gt;I don&apos;t use a separate diet app. I just throw &quot;lunch: 200g beef, white rice, spinach side, seaweed soup&quot; into Telegram and that&apos;s it. Jarvis estimates the carbs and protein on its own, logs it into the diet file in Obsidian, and reports back against my daily targets (carbs ≤100g, protein ≥100g).&lt;/p&gt;
&lt;p&gt;Every night at 11 a diet reminder lands, and &lt;strong&gt;every Monday morning I get the weekly diet feedback&lt;/strong&gt;. Something like &quot;this week&apos;s carb average came in at 110g, over target, and Friday&apos;s delivery food was the main driver.&quot;&lt;/p&gt;
&lt;p&gt;I take an InBody measurement once a week and that data also gets logged into Obsidian. Jarvis compares it against the previous data and shows me the trends in weight, body fat, and muscle mass. &quot;Down 6.8 kg over the last six weeks, muscle mass holding.&quot;&lt;/p&gt;
&lt;p&gt;The result is that I stopped using a dedicated diet app entirely. &lt;strong&gt;Telegram chat is the diet app.&lt;/strong&gt; I send a photo with &quot;I ate this&quot; and the friction of logging is essentially gone.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;From Personal Assistant to Team Assistant: Multi-agent Expansion&lt;/h2&gt;
&lt;p&gt;You&apos;ve probably seen most of the above before. People also stack sub-agents under a main agent. I&apos;ll need to split mine soon too, since this single Jarvis is getting overloaded.&lt;/p&gt;
&lt;p&gt;But I took it further by hooking it into team channels.&lt;/p&gt;
&lt;p&gt;We&apos;re a tiny team right now, so most of the delegation goes to work automation. If I were back at my previous company, managing a 30-plus team, I could probably handle most of the HR and project-management sync work alone with this setup. Tools alone don&apos;t change anything (I know how that sounds), but Jarvis keeps sparking ideas I can&apos;t shut off. Things like &quot;if only I&apos;d had this back when...&quot; come to mind.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.threads.com/@flowkater/post/DUUbdxrD29E?xmt=AQF0Zi1iL8qZS3FNhWRbu3NwuIFeSVR1MhWgHAhTKs6Jvw&quot;&gt;&lt;img src=&quot;/assets/Openclaw-thread-comment.png&quot; alt=&quot;Openclaw-thread-comment&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Per-role agents&lt;/h3&gt;
&lt;p&gt;Right now our team has 3 AI agents:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Channel&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Personality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JARVIS&lt;/strong&gt; (Jarvis)&lt;/td&gt;
&lt;td&gt;Tony (developer)&lt;/td&gt;
&lt;td&gt;Telegram&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;British wit, blunt butler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FRIDAY&lt;/strong&gt; (Friday)&lt;/td&gt;
&lt;td&gt;Ellie (designer)&lt;/td&gt;
&lt;td&gt;Slack DM&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Practical, concise, design partner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KAREN&lt;/strong&gt; (Karen)&lt;/td&gt;
&lt;td&gt;George (junior dev intern)&lt;/td&gt;
&lt;td&gt;Slack DM&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Socratic mentoring, questions over answers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each agent is tuned to its owner&apos;s role and personality. FRIDAY is built around design feedback and Figma integration. KAREN doesn&apos;t just hand answers to George; she runs Socratic mentoring, leading him through questions instead.&lt;/p&gt;
&lt;p&gt;It&apos;s basically &lt;strong&gt;a team lead distributing work to teammates&lt;/strong&gt;. The lead (me) doesn&apos;t do everything directly. I define a role and authority for each teammate (agent), and the teammates can talk to each other when needed. The only difference is the teammates are AI, so they don&apos;t complain about working overtime. (Even now, honestly, that part&apos;s a relief.)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TB
    subgraph &quot;OpenClaw 멀티에이전트&quot;
        JV[🤖 JARVIS&amp;lt;br/&amp;gt;Tony 전담&amp;lt;br/&amp;gt;Opus / Telegram]
        FR[🤖 FRIDAY&amp;lt;br/&amp;gt;Ellie 전담&amp;lt;br/&amp;gt;Sonnet / Slack]
        KR[🤖 KAREN&amp;lt;br/&amp;gt;George 전담&amp;lt;br/&amp;gt;Sonnet / Slack]
    end

    JV &amp;lt;--&amp;gt;|agentToAgent| FR
    JV &amp;lt;--&amp;gt;|agentToAgent| KR
    FR &amp;lt;--&amp;gt;|agentToAgent| KR

    subgraph &quot;공유 도구&quot;
        SC[👥 Scrumble]
        NT[📝 Notion]
        GH[🐙 GitHub]
    end

    JV --&amp;gt; SC
    FR --&amp;gt; SC
    KR --&amp;gt; SC
    JV --&amp;gt; NT
    JV --&amp;gt; GH
    KR --&amp;gt; GH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The three agents can also talk to each other (agentToAgent). For example, if Jarvis changes a backend API, it can hand that off to FRIDAY with &quot;let Ellie know if this affects the design.&quot;&lt;/p&gt;
&lt;h3&gt;Team collaboration via Scrumble&lt;/h3&gt;
&lt;p&gt;Our team uses a daily-scrum platform called &lt;a href=&quot;https://flowkater.io/posts/2025-09-scrumble-tech-retro-backend/&quot;&gt;Scrumble&lt;/a&gt;. (Full disclosure, I built it.) Jarvis is wired into the Scrumble API so:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Morning check-in&lt;/strong&gt;: Jarvis asks me about today&apos;s condition and todos, then auto-posts my answers into Scrumble&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evening check-out&lt;/strong&gt;: Wraps up what I did today and logs it into Scrumble&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team feed view&lt;/strong&gt;: I see the rest of the team&apos;s check-ins and check-outs in Slack&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The end result is that &lt;strong&gt;team communication consolidates into Slack&lt;/strong&gt;. Instead of bouncing between Notion, Scrumble, and email, each teammate&apos;s AI agent reaches into the relevant tool and pipes the result into Slack.&lt;/p&gt;
&lt;h3&gt;A real example: from Notion to code to PR&lt;/h3&gt;
&lt;p&gt;To make it concrete, here&apos;s one specific flow:&lt;/p&gt;
&lt;p&gt;We have a Notion database called the &quot;Issue &amp;amp; Bug Board.&quot; When designers or QA spot a bug, they file it there. When I tell Jarvis &quot;pull the iOS issues out of the Notion bug board and organize them,&quot; it does this:&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[&quot;📝 Notion 이슈 보드&quot;] --&amp;gt;|API 조회| B[&quot;🤖 자비스&quot;]
    B --&amp;gt;|이슈 필터링 + MD 변환| C[&quot;📄 마크다운 문서&amp;lt;br/&amp;gt;스크린샷 포함&quot;]
    C --&amp;gt;|Git Push| D[&quot;🐙 iOS 저장소&quot;]
    D --&amp;gt;|git pull| E[&quot;💻 로컬 작업 시작&quot;]

    B --&amp;gt;|또는 위임 시| F[&quot;🔧 코드 수정 + PR&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Query the issue board through the Notion API&lt;/li&gt;
&lt;li&gt;Filter for iOS-related issues&lt;/li&gt;
&lt;li&gt;Convert each issue into a markdown doc (screenshots included)&lt;/li&gt;
&lt;li&gt;Push to the iOS repo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt; locally and start working immediately&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Push it further and tell Jarvis &quot;fix this bug,&quot; and Jarvis reads the code, makes the change, and opens a PR. (I do the review and the testing myself, of course.)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Obsidian Ontology: Teaching AI About &apos;Me&apos;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The real problem of AI is not making machines think, but making them understand context.&quot;&lt;/p&gt;
&lt;p&gt;John McCarthy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looking back, I also assumed at first that the trick to AI was just &quot;asking lots of questions.&quot; What actually mattered, though, wasn&apos;t the question. It was how much the AI knew about my situation.&lt;/p&gt;
&lt;h3&gt;Why Obsidian&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/assets/Obsidian.png&quot; alt=&quot;obsidian&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://obsidian.md&quot;&gt;Obsidian&lt;/a&gt; is a local, markdown-based notes app. Unlike Notion, every piece of data lives on my computer as a &lt;code&gt;.md&lt;/code&gt; file. Why that fits AI agents so well:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;AI can read it directly&lt;/strong&gt;: It&apos;s a &lt;code&gt;.md&lt;/code&gt; file, so the AI can just read and write. No API integration needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search is wide open&lt;/strong&gt;: It&apos;s a filesystem, so &lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;find&lt;/code&gt; work right away.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version control works&lt;/strong&gt;: Manage it with Git and you get full history.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notes link to each other&lt;/strong&gt;: &lt;code&gt;[[Note Title]]&lt;/code&gt; between docs builds a knowledge graph.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My Obsidian vault currently holds &lt;strong&gt;3,100+ notes&lt;/strong&gt;. Dev docs, meeting notes, food logs, mentoring notes, AI conversation archives, study material. All of it.&lt;/p&gt;
&lt;h3&gt;What is an ontology?&lt;/h3&gt;
&lt;p&gt;The word &quot;ontology&quot; sounds intimidating, but it boils down to &lt;strong&gt;&quot;a system for classifying and connecting your knowledge.&quot;&lt;/strong&gt; Think of it as &lt;strong&gt;a library catalog system&lt;/strong&gt;. If 3,100 books sit on the floor, finding the one you want is hard. Classify them by genre, by author, by topic, and keep an index, and now &quot;leadership material from 2024 onward&quot; is a quick lookup. Same for the AI. No matter how many notes you have, classification means information surfaces fast.&lt;/p&gt;
&lt;p&gt;In my Obsidian I have an &lt;code&gt;_ontology/&lt;/code&gt; folder with MOCs (Maps of Content):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;_ontology/
├── 프로젝트/
│   ├── Todait.md          ← 학습 플래너 관련 모든 문서 허브
│   ├── Scrumble.md        ← 스크럼블 관련 문서 허브
│   ├── ClawBot.md         ← AI 에이전트 관련
│   └── flowkater.io.md    ← 블로그 관련
├── 주제/
│   ├── AI에이전트.md
│   ├── AI코딩.md
│   ├── 건강.md
│   ├── 리더십.md
│   ├── 프로그래밍.md
│   └── ...
└── 전체 개념맵.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every note has metadata appended at the bottom:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 메타데이터

- 태그: #프로젝트/서비스명 #타입/기획 #타입/스펙
- MOC: [[_ontology/프로젝트/서비스명 MOC]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tags fall along four axes: &lt;strong&gt;topic&lt;/strong&gt; (what it&apos;s about), &lt;strong&gt;type&lt;/strong&gt; (spec, meeting note, memo), &lt;strong&gt;source&lt;/strong&gt; (where it came from), and &lt;strong&gt;project&lt;/strong&gt; (which project it belongs to).&lt;/p&gt;
&lt;h3&gt;Why ontology matters to AI&lt;/h3&gt;
&lt;p&gt;This is the heart of it. AI doesn&apos;t know &quot;me.&quot;&lt;/p&gt;
&lt;p&gt;Ask ChatGPT to &quot;explain our project&apos;s API structure.&quot; It can&apos;t. Every time you have to explain from scratch. The longer the chat goes, the more it forgets what you said earlier. (Sure, the Memory features in each AI service have gotten much better, but uploading information you&apos;ve never explicitly chatted about is still limited.)&lt;/p&gt;
&lt;p&gt;So what&apos;s different?&lt;/p&gt;
&lt;p&gt;Jarvis is different. With ontology in place, the gap shows up clearly. Two real examples:&lt;/p&gt;
&lt;h4&gt;Example 1: Spec drafting&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;AI without ontology&lt;/strong&gt;: &quot;Draft the schedule-edit screen for me.&quot; Output is a generic mobile-app edit-screen UX guide, with no awareness of our app&apos;s code structure, current issues, or backend API spec.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jarvis with ontology&lt;/strong&gt;: Same request. Reads the iOS code structure from the project MOC, checks the &lt;code&gt;updatePolicy&lt;/code&gt; preserve/reset behavior in the backend API doc, finds 4 related bugs in the existing issue board, and produces a spec with &lt;strong&gt;a wireframe and code-edit pointers tailored to our app&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Same question, different dimensions of answer.&lt;/p&gt;
&lt;p&gt;Here&apos;s another example.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Generic AI&lt;/th&gt;
&lt;th&gt;Jarvis with ontology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code review&lt;/strong&gt; &quot;review this PR&quot;&lt;/td&gt;
&lt;td&gt;Style notes, generic best-practice feedback&lt;/td&gt;
&lt;td&gt;Checks MEMORY.md context &quot;Day Boundary is 4 AM,&quot; then says &lt;strong&gt;&quot;this conflicts with the policy we set&quot;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Newsletter summary&lt;/strong&gt; ByteByteGo&lt;/td&gt;
&lt;td&gt;Summarizes the technical content as-is&lt;/td&gt;
&lt;td&gt;Summarizes plus connects: &lt;strong&gt;&quot;this distributed cache pattern is applicable to our backend v2 session management&quot;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The key is that &lt;strong&gt;the same question, asked of an AI that knows my context, lands at a completely different level&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When I posted this thread, the most common question I got back was &quot;do I have to tag every note by hand?&quot; The answer: &lt;strong&gt;the AI does it.&lt;/strong&gt; When I tell Jarvis &quot;save this doc,&quot; Jarvis reads it and assigns the right tags and MOC automatically. The 4 AM skill auto-update cron also picks up new information from yesterday&apos;s chats and folds it into the related docs.&lt;/p&gt;
&lt;p&gt;In hindsight, building the ontology wasn&apos;t really for the AI. It was &lt;strong&gt;a process of understanding myself&lt;/strong&gt;. Structuring &quot;what I know, what I&apos;m working on, what I care about&quot; had the side effect of organizing the knowledge that was scattered in my head. The AI just rides on top of that structure.&lt;/p&gt;
&lt;p&gt;&amp;lt;video controls width=&quot;100%&quot; style=&quot;aspect-ratio: 16/9;&quot; playsinline&amp;gt;
&amp;lt;source src=&quot;https://assets.flowkater.io/graphview.mp4&quot; type=&quot;video/mp4&quot; /&amp;gt;
&amp;lt;/video&amp;gt;
&amp;lt;em&amp;gt;Obsidian Graph View&amp;lt;/em&amp;gt;&lt;/p&gt;
&lt;h3&gt;Common questions&lt;/h3&gt;
&lt;p&gt;A few questions that came up on the thread:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Aren&apos;t graph view and backlinks already an ontology?&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Obsidian&apos;s graph view and backlinks are &lt;strong&gt;part&lt;/strong&gt; of an ontology, but they&apos;re not enough on their own. The graph view visualizes connections between docs, and backlinks let you trace which docs reference a given doc. They&apos;re pretty and they&apos;re useful.&lt;/p&gt;
&lt;p&gt;The real ontology, though, needs &lt;strong&gt;structure with defined types and relationships&lt;/strong&gt;. Is this a spec doc or a meeting note? Which project does it belong to? Which topic is it tied to? That metadata is what lets the AI &lt;strong&gt;find context-appropriate docs fast&lt;/strong&gt; out of 3,100 notes. With links alone, the AI has to traverse the graph to find related docs. Tag-based queries are far more efficient.&lt;/p&gt;
&lt;p&gt;My setup uses the Dataview plugin to run tag-based queries (things like &quot;the most recently edited spec docs in Project A&quot;). Graph view is for browsing, ontology is for search and classification. Use both, but the roles are different.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Why Obsidian instead of Notion?&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you want an AI agent to read and write files directly, local markdown is the easiest path. Notion forces you through an API, write actions are limited, and structural changes are a hassle. Obsidian is just &lt;code&gt;.md&lt;/code&gt; files, so the AI can manipulate them freely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;What about the echo-chamber (confirmation bias) limit?&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s a fair point. That said, I keep collecting external sources steadily. I translate and store TLDR, ByteByteGo, Pragmatic Engineer every day, and I curate HN news daily. The bigger problem, if anything, is when the AI doesn&apos;t know me. Sending it ten search results and asking &quot;is this relevant to our situation&quot; is far less productive than an AI that already knows my context saying &quot;this won&apos;t apply to our project, but this approach might.&quot;&lt;/p&gt;
&lt;p&gt;Also, building an ontology doesn&apos;t mean Jarvis answers only from the ontology. Web search, fetching latest docs, calling external APIs. It uses all of them. The ontology provides &quot;my context&quot;; it isn&apos;t the only source of truth.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Do tags have to be precise?&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They don&apos;t. They&apos;re markdown files, redefinable any time. Start with rough categories and let the AI tighten them later. Better to stack notes now and structure them later than wait to start until the system is perfect. Coverage? Pretty much everything: dev docs, study material, food logs, meeting notes, mentoring notes, AI conversation archives, blog drafts, spec docs. Every record from my work and life sits in Obsidian, and Jarvis can reach all of it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Field Tips&lt;/h2&gt;
&lt;p&gt;Setting that aside, a few tips for anyone thinking about trying OpenClaw.&lt;/p&gt;
&lt;h3&gt;Old MacBook lying around? Make it the server (or use cloud)&lt;/h3&gt;
&lt;p&gt;I run my unused MacBook as the OpenClaw gateway server, and the MacBook I actually work on is wired in as a node. Throw Tailscale on top for VPN access from outside.&lt;/p&gt;
&lt;p&gt;You don&apos;t have to buy a new Mac mini. A server instance on Vultr or Hetzner works fine, with your work MacBook joining as a node. The gateway can run anywhere, and the actual work (file reads, Git, terminal) executes on the node.&lt;/p&gt;
&lt;h3&gt;Lean on sub-agents&lt;/h3&gt;
&lt;p&gt;Sometimes Jarvis goes quiet. Heavy compute or long analysis means slower responses. In those moments, telling it &quot;spin up a sub-agent and process that asynchronously&quot; lets Jarvis dispatch a sub-agent and ping me back when results land. The main thread doesn&apos;t stall.&lt;/p&gt;
&lt;p&gt;This becomes especially relevant as the ontology grows and finding plus analyzing related docs takes longer. Pulling docs on a specific topic out of 3,100 notes and summarizing them is the kind of work I push to a sub-agent so the main chat stays alive.&lt;/p&gt;
&lt;p&gt;In practice, I run almost all the heavy stuff (spec writing, code analysis, doc migration) through sub-agents. Generating four spec drafts in parallel, or converting 2,000+ AI conversations into markdown. Does this actually work? Yes.&lt;/p&gt;
&lt;h3&gt;Lean on overnight cron jobs&lt;/h3&gt;
&lt;p&gt;Letting the AI work through the night changes mornings. I have skill auto-update and doc sync running at 4 AM. When I wake up, the skills reflect yesterday&apos;s chats and the latest code docs are sitting in Obsidian.&lt;/p&gt;
&lt;p&gt;It&apos;s a kind of &quot;overnight tune-up.&quot; A car gets an oil change and a wash overnight and feels different in the morning. (okay, the metaphor&apos;s a stretch...)&lt;/p&gt;
&lt;h3&gt;Make dedicated accounts&lt;/h3&gt;
&lt;p&gt;This part matters. I created separate Gmail and GitHub accounts for Jarvis. I grant my main accounts read-only access to those.&lt;/p&gt;
&lt;p&gt;Why? I can&apos;t hand my primary password to an AI. A dedicated account with minimum permissions covers security, and if something goes sideways, the blast radius is limited. Same for calendar: Jarvis authenticates with its own account, and I share my personal calendar to it as read-only.&lt;/p&gt;
&lt;h3&gt;It&apos;s all in how you use it&lt;/h3&gt;
&lt;p&gt;Honestly, if you install OpenClaw and only get weather alerts out of it, that&apos;s just a weather app. Build skills, build the ontology, schedule cron jobs, hook up your work tools. That&apos;s when it becomes a &quot;second brain.&quot;&lt;/p&gt;
&lt;p&gt;The difference comes down to how much of &quot;your&quot; context you feed the AI. SOUL.md, USER.md, MEMORY.md, an Obsidian ontology: as those layers stack, Jarvis edges closer to &quot;an AI that knows me.&quot;&lt;/p&gt;
&lt;p&gt;You don&apos;t have to nail the setup on day one. Install it locally, hook up Telegram, ask it stuff, start there. From there, &quot;wait, I could automate this too&quot; comes naturally.&lt;/p&gt;
&lt;p&gt;That&apos;s where the real start happens.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;If you&apos;d told me six months ago &quot;your AI agent works 24 hours a day,&quot; I would have laughed. Honestly, I wouldn&apos;t have believed you. I would have said &quot;what does that even mean, how is it different from asking ChatGPT?&quot;&lt;/p&gt;
&lt;p&gt;Now I can&apos;t picture working without Jarvis. Mail check, news triage, code analysis, spec drafting, team comms. Once you get used to delegating that with one Telegram message, going back is hard.&lt;/p&gt;
&lt;p&gt;It isn&apos;t perfect yet, of course. Sometimes it gives a wildly wrong answer, sometimes it goes silent on a complex request, sometimes an API call fails and I have a small meltdown. Even so, it gets a little better every day. Skills accumulate, the ontology thickens, I understand Jarvis better and Jarvis understands me better.&lt;/p&gt;
&lt;p&gt;The way Iron Man&apos;s Jarvis was Tony Stark&apos;s &quot;extended intelligence,&quot; mine feels like it&apos;s heading in that direction. I haven&apos;t built a suit yet. (That part is going to take a while longer.)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What I learned&lt;/th&gt;
&lt;th&gt;Action item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI agents aren&apos;t &quot;Q&amp;amp;A,&quot; they&apos;re &quot;delegate and execute&quot;&lt;/td&gt;
&lt;td&gt;Install OpenClaw and write one SOUL.md&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep tools split, but let the AI handle integration&lt;/td&gt;
&lt;td&gt;Hook up the 3 tools you use most&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ontology decides answer quality&lt;/td&gt;
&lt;td&gt;Pick one tag scheme in Obsidian and start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cron jobs aren&apos;t &quot;buying time,&quot; they&apos;re &quot;killing cognitive load&quot;&lt;/td&gt;
&lt;td&gt;Turn one daily check-in into a cron job&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I keep telling myself the same thing. This is only the beginning.&lt;/p&gt;
&lt;p&gt;Install OpenClaw, write one SOUL.md, start with that. &quot;Who I am, what I want from this AI&quot;: defining that flips a switch. You don&apos;t have to set up all 10 cron jobs at once. Just one. Wire up one morning briefing.&lt;/p&gt;
&lt;p&gt;That one becomes ten, and ten becomes a system. It&apos;s only a matter of time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;There is no reason and no way that a human mind can keep up with an artificial intelligence machine by 2035.&quot;&lt;/p&gt;
&lt;p&gt;Gray Scott&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If we can&apos;t catch up, we go alongside.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openclaw.ai&quot;&gt;OpenClaw&lt;/a&gt;: AI agent framework&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.openclaw.ai&quot;&gt;OpenClaw Docs&lt;/a&gt;: Official docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openclaw/openclaw&quot;&gt;OpenClaw GitHub&lt;/a&gt;: Source code&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://obsidian.md&quot;&gt;Obsidian&lt;/a&gt;: Local markdown notes app&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2025-09-scrumble-tech-retro-backend/&quot;&gt;Scrumble Tech Retro&lt;/a&gt;: Scrumble dev story&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>tech</category><category>AI-agent</category><category>productivity</category><category>AI-coding</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>How to Read Tech Articles: A Three-Pass Method</title><link>https://flowkater.io/en/posts/2026-02-10-reading-tech-articles-three-pass-method/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-02-10-reading-tech-articles-three-pass-method/</guid><description>An efficient three-pass method for reading the tech blogs, RFCs, and newsletters that pile up every day. I adapt S. Keshav&apos;s Three-Pass Method for tech articles, and cover how to keep yourself in the driver&apos;s seat as a reader in the AI era.</description><pubDate>Tue, 10 Feb 2026 03:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;Developers read a staggering volume of tech articles (or anything else that demands close reading). Blog posts, official docs, RFCs, conference slides, newsletters. With this much pouring in every day, surprisingly few people actually know &lt;strong&gt;how to read efficiently&lt;/strong&gt;. They start at the top and run out of steam halfway. They finish a piece and remember nothing. They burn an hour and miss the whole point.&lt;/p&gt;
&lt;p&gt;There&apos;s a well-known academic essay by S. Keshav called &lt;strong&gt;&quot;How to Read a Paper.&quot;&lt;/strong&gt; It&apos;s written for research papers, so it doesn&apos;t transfer one-for-one, but its core idea (&lt;strong&gt;read in three passes&lt;/strong&gt;) works just as well for tech blogs and articles. This post adapts that methodology for the kind of reading developers actually do.&lt;/p&gt;
&lt;p&gt;One more thing. Since 2025, AI tools have become part of daily life, and the act of &quot;reading&quot; itself is under pressure. I want to address that too before we get to the method.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;A Note on Reading in the AI Era&lt;/h2&gt;
&lt;h3&gt;The trap of AI summaries&lt;/h3&gt;
&lt;p&gt;A lot of developers have made it a habit to throw an article at ChatGPT or Claude and ask for a summary. It&apos;s convenient. It&apos;s fast. But it has &lt;strong&gt;serious side effects&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reading comprehension atrophies.&lt;/strong&gt; The muscle for finishing a long piece disappears. A 3,000-word post starts to feel &quot;too long.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Judgment goes with it.&lt;/strong&gt; An AI summary compresses the author&apos;s claims; it doesn&apos;t ask whether those claims hold up. If you only read the summary, critical thinking never gets a chance to engage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context disappears.&lt;/strong&gt; The value of a tech article often lives in the journey, not the conclusion. &quot;Why did they pick this approach?&quot; and &quot;What trade-offs did they weigh?&quot; both vanish in a summary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Illusion of understanding.&lt;/strong&gt; Reading a summary feels like understanding. Then someone asks you to explain it and you can&apos;t. &lt;strong&gt;Reading a summary is not the same as understanding the thing.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nuance evaporates.&lt;/strong&gt; The author hedged with &quot;this might be the case&quot; or &quot;in certain situations,&quot; and the AI flattens it into &quot;this is the case.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s the difference between driving a car yourself and watching the GPS from the passenger seat. No matter how good the GPS is, if you never touch the wheel, the route never sticks.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Principle: don&apos;t outsource the reading. You read; AI is just a tool.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;When AI does help&lt;/h3&gt;
&lt;p&gt;So should you avoid AI entirely? No. You don&apos;t have to cut it out. &lt;strong&gt;As long as you stay the reader&lt;/strong&gt;, using AI as a sidekick can actually make you more efficient.&lt;/p&gt;
&lt;p&gt;The key is to use it &lt;strong&gt;after&lt;/strong&gt; you read, not before reading or instead of reading. I&apos;ll cover how to apply AI at each pass below.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Core Principle&lt;/h2&gt;
&lt;p&gt;Don&apos;t read a tech article from start to finish in one go. &lt;strong&gt;Read it in up to three passes.&lt;/strong&gt; Each pass has a different goal and builds on the one before it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pass 1&lt;/strong&gt;: Figure out what this is and whether it&apos;s worth your time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pass 2&lt;/strong&gt;: Understand the core content well enough to explain it to someone else.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pass 3&lt;/strong&gt;: Understand it deeply and make it your own.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like stacking Lego blocks, each pass rests on the previous one. And &lt;strong&gt;not every article needs to reach Pass 3.&lt;/strong&gt; Most get filtered out at Pass 1, and that&apos;s exactly how it should work.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Pass 1: The Skim (5 minutes)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Goal: decide quickly whether this article is worth more of your time.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;How to do it&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Read the &lt;strong&gt;title and subtitle&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Read the &lt;strong&gt;intro (first 1-2 paragraphs)&lt;/strong&gt;: what the piece is about and why.&lt;/li&gt;
&lt;li&gt;Skim &lt;strong&gt;only the headings (h2, h3)&lt;/strong&gt; to get the skeleton.&lt;/li&gt;
&lt;li&gt;Read the &lt;strong&gt;conclusion or final section&lt;/strong&gt; for the author&apos;s main claim.&lt;/li&gt;
&lt;li&gt;Glance at &lt;strong&gt;code blocks, diagrams, images&lt;/strong&gt; to gauge the technical depth.&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;who the author is&lt;/strong&gt;. Domain expert? Which company or project?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Five minutes is enough. Ten at the outside. The whole point of this pass is to &lt;strong&gt;decide quickly whether to keep going.&lt;/strong&gt; Can you really judge in five minutes? Yes. You don&apos;t have time to read every article carefully, and you don&apos;t need to.&lt;/p&gt;
&lt;h3&gt;What you should be able to answer after Pass 1: the five Cs&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Category&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What kind of article is this? Tutorial? System design? War story? Comparison? Opinion?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What technology, framework, or problem does it cover? How does it connect to what I already know?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Credibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is the author writing from real experience? Are claims backed up, or just guesses?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contributions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What&apos;s the core insight I&apos;d take away from this?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clarity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is it well structured? Easy to read?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you can give a rough answer to these five, Pass 1 has done its job.&lt;/p&gt;
&lt;h3&gt;When it&apos;s fine to stop at Pass 1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The article has nothing to do with what you&apos;re working on or interested in right now.&lt;/li&gt;
&lt;li&gt;The title is bait but the content looks shallow.&lt;/li&gt;
&lt;li&gt;The level is way below or way above where you are.&lt;/li&gt;
&lt;li&gt;The author is asserting things with no evidence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stopping is a skill. Filtering quickly matters more than finishing every article you start.&lt;/p&gt;
&lt;p&gt;I do Pass 1 on my RSS feed in the morning. Out of ten articles, maybe two or three move on to Pass 2. (Most end at Pass 1.) Once this filtering becomes habit, you actually end up with more time, not less.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A note from someone who also writes&lt;/strong&gt;: most readers do Pass 1 and leave. Your headings need to be sharp, your intro needs to deliver the value of the piece, and you have five minutes to convince anyone to keep reading. Otherwise nobody finishes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Using AI at Pass 1&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Good uses:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Translate &lt;strong&gt;only the title and intro&lt;/strong&gt; of an English article, to speed up the Pass 1 decision.&lt;/li&gt;
&lt;li&gt;A newsletter dropped ten links on you? Paste &lt;strong&gt;just the title and first paragraph&lt;/strong&gt; of each into AI and ask, &quot;pick the ones related to my interests (e.g. backend, distributed systems).&quot; That&apos;s &lt;strong&gt;filtering aid&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For an unfamiliar field, ask, &quot;give me a one-line explanation each of the terms in this article like &lt;code&gt;CRDT&lt;/code&gt; and &lt;code&gt;vector clock&lt;/code&gt;.&quot; That&apos;s &lt;strong&gt;dictionary mode&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bad uses:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pasting the whole article and asking for a summary. You haven&apos;t even done Pass 1. This is where judgment starts to atrophy.&lt;/li&gt;
&lt;li&gt;Reading only the AI summary and going &quot;ah, so that&apos;s what it&apos;s about.&quot; All you&apos;re stacking is illusion.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Pass 2: The Careful Read (15-30 minutes)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Goal: understand the core content well enough to summarize and explain it to someone else.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Only articles that survived Pass 1 reach this stage. Which means you&apos;ve already decided this one is worth your attention.&lt;/p&gt;
&lt;h3&gt;How to do it&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Read end to end&lt;/strong&gt;, but skip implementation details and proofs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take notes on the key points&lt;/strong&gt; as you go (Notion, or margins of the original).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Study the diagrams and architecture pictures&lt;/strong&gt; carefully.
&lt;ul&gt;
&lt;li&gt;Are the relationships between components clear?&lt;/li&gt;
&lt;li&gt;Does the data flow make sense?&lt;/li&gt;
&lt;li&gt;Anything missing?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read the code examples&lt;/strong&gt; with your eyes (you&apos;ll run them at Pass 3).
&lt;ul&gt;
&lt;li&gt;Do you understand what the code is meant to demonstrate?&lt;/li&gt;
&lt;li&gt;Is error handling and edge-case behavior accounted for?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mark the terms and concepts you don&apos;t know&lt;/strong&gt; (don&apos;t look them up now; collect them for batch review).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bookmark any linked references&lt;/strong&gt; worth chasing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The rule that matters here is: don&apos;t stop to look things up the moment you hit something unfamiliar. It&apos;s like pausing a movie to Google every actor that appears. You lose the plot. Once you break the flow, the context goes with it. Mark it, finish reading, then resolve the unknowns in a batch.&lt;/p&gt;
&lt;h3&gt;What &quot;done with Pass 2&quot; looks like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You can &lt;strong&gt;summarize the article&apos;s main argument in three lines.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;tell a colleague&lt;/strong&gt;, &quot;I read this thing, and here&apos;s the core.&quot;&lt;/li&gt;
&lt;li&gt;You have an &lt;strong&gt;early opinion&lt;/strong&gt; on whether you agree, disagree, or whether it&apos;s applicable to your project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you can&apos;t do any of those three, you&apos;re not done with Pass 2 yet.&lt;/p&gt;
&lt;h3&gt;When Pass 2 isn&apos;t clicking&lt;/h3&gt;
&lt;p&gt;The cause is usually one of these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Background gap.&lt;/strong&gt; You don&apos;t know the underlying tech or pattern. Read foundational material first, then come back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bad writing.&lt;/strong&gt; The structure is a mess, or claims have no support. Find another article on the same topic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You&apos;re tired.&lt;/strong&gt; Sometimes you&apos;re just tired. Read it tomorrow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The third one matters more than people think. Forcing a tired read leaves you with nothing.&lt;/p&gt;
&lt;p&gt;I take notes line by line in Obsidian as I do Pass 2. That alone changes how much I retain. (It works better than I expected.)&lt;/p&gt;
&lt;p&gt;In hindsight, I used to skip notes (&quot;I read it, that&apos;s enough&quot;) and a month later I couldn&apos;t remember a single thing I&apos;d read. That&apos;s how the note habit started.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For most tech articles, Pass 2 is enough.&lt;/strong&gt; If you&apos;re tracking trends, comparing tech, or collecting ideas, you can stop here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Using AI at Pass 2&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Good uses:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;After you write your own three-line summary&lt;/strong&gt;, ask AI for one too and &lt;strong&gt;compare against your read.&lt;/strong&gt; It&apos;s a check for &quot;did I miss anything?&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Batch the unfamiliar terms&lt;/strong&gt; you marked in Pass 1: &quot;explain in two lines each: &lt;code&gt;eventual consistency&lt;/code&gt;, &lt;code&gt;saga pattern&lt;/code&gt;, &lt;code&gt;compensating transaction&lt;/code&gt; from this article.&quot;&lt;/li&gt;
&lt;li&gt;If an architecture diagram isn&apos;t clicking, screenshot it for the AI and ask, &lt;strong&gt;&quot;walk me through the data flow in this diagram.&quot;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;For an English article where one paragraph won&apos;t parse, ask for a translation of &lt;strong&gt;just that paragraph&lt;/strong&gt; (not the whole article).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bad uses:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Skipping the read and asking AI for a full summary. You&apos;ve skipped Pass 2 entirely. That&apos;s not your understanding; it&apos;s the AI&apos;s.&lt;/li&gt;
&lt;li&gt;Copy-pasting the AI summary straight into your notes. Notes you didn&apos;t write don&apos;t stick.&lt;/li&gt;
&lt;li&gt;&quot;Analyze the pros and cons of this article.&quot; You&apos;ve handed off your critical thinking. Your own opinion disappears.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The core rule: AI comes after the read. Not before, not instead.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Pass 3: The Deep Dive (1-3 hours)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Goal: make the article&apos;s content your own.&lt;/strong&gt; You can do it yourself, and you can evaluate it critically.&lt;/p&gt;
&lt;p&gt;Honestly, only a handful of articles a month earn a Pass 3. That&apos;s how it should be.&lt;/p&gt;
&lt;p&gt;Looking back, the articles I took to Pass 3 were almost always tied to a real situation: team architecture decisions, evaluating whether to adopt a technology, the kind of thing where I had to apply it directly.&lt;/p&gt;
&lt;h3&gt;How to do it&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Run the code yourself.&lt;/strong&gt; Not copy-paste; understand why it was written that way.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solve the same problem the author solved.&lt;/strong&gt; Before reading, think about how you&apos;d approach it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compare your approach to the author&apos;s.&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Where is the author better than you?&lt;/li&gt;
&lt;li&gt;What would you have done differently?&lt;/li&gt;
&lt;li&gt;What did the author miss?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenge the assumptions.&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Does this only work at low traffic?&quot;&lt;/li&gt;
&lt;li&gt;&quot;Would this architecture hold up at our scale?&quot;&lt;/li&gt;
&lt;li&gt;&quot;Is this benchmark fair?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write your own notes.&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Key takeaways&lt;/li&gt;
&lt;li&gt;What you can apply to your own project&lt;/li&gt;
&lt;li&gt;Things to look up further&lt;/li&gt;
&lt;li&gt;Counterarguments and limitations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Step 4 matters most. You&apos;re not just absorbing what&apos;s on the page; you&apos;re asking &quot;does this actually fit our situation?&quot; If you think about it, the better the tech article, the more it tends to describe an experience under specific conditions. Change the conditions and the conclusion can change too.&lt;/p&gt;
&lt;h3&gt;What &quot;done with Pass 3&quot; looks like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You can &lt;strong&gt;reconstruct the article&apos;s structure from memory.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;point to specific strengths and weaknesses.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;apply or adapt the technique or pattern in your own project.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;write a blog post or give a talk on the topic.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The real test of Pass 3 is &quot;can I write something on this?&quot; If you can, you understood it. If you can&apos;t, you don&apos;t have it yet.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pass 3 isn&apos;t for every article.&lt;/strong&gt; Reserve it for tech you&apos;ll actually apply at work, architectures you have to understand deeply, or important pieces you need to share with the team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Using AI at Pass 3&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Good uses:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use it as a Socratic sparring partner.&lt;/strong&gt; Explain what you understood and ask, &quot;is my read right? did I miss something?&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use it as a counterargument generator.&lt;/strong&gt; Ask, &quot;give me five weak points or failure scenarios for this architecture.&quot; It surfaces angles you hadn&apos;t considered.&lt;/li&gt;
&lt;li&gt;When you get stuck running the code, ask about &lt;strong&gt;just the specific error or concept&lt;/strong&gt;: &quot;in this code, how does &lt;code&gt;CompletableFuture.thenCompose&lt;/code&gt; differ from &lt;code&gt;thenApply&lt;/code&gt;?&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;What might the author of this article have overlooked?&quot;&lt;/strong&gt; AI isn&apos;t omniscient, but it can offer a different angle.&lt;/li&gt;
&lt;li&gt;After drafting your notes, ask AI &lt;strong&gt;&quot;what&apos;s missing?&quot;&lt;/strong&gt; as a review pass.&lt;/li&gt;
&lt;li&gt;Ask about &lt;strong&gt;alternatives or competing tech&lt;/strong&gt;: &quot;this article recommends Redis Streams; how would the same problem look with Kafka or RabbitMQ?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bad uses:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Take the gist of this article and write me a blog post.&quot; You&apos;ve erased the entire point of Pass 3. The result isn&apos;t yours.&lt;/li&gt;
&lt;li&gt;Skipping running the code yourself and asking AI &quot;what would happen if I ran this?&quot; You learn by hitting walls.&lt;/li&gt;
&lt;li&gt;Outsourcing the &quot;challenge the assumptions&quot; step to AI. The critical-thinking muscle atrophies.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;At Pass 3, AI is your sparring partner.&lt;/strong&gt; You throw a punch, AI counters, and your understanding sharpens through the exchange. AI doesn&apos;t fight the match for you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Applying It to Tech-Trend Research&lt;/h2&gt;
&lt;p&gt;When you have to research a new technology or area (say, &quot;should we adopt event sourcing in our service?&quot;), you can apply the three-pass approach like this.&lt;/p&gt;
&lt;h3&gt;Step 1: Explore&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Search keywords on Google, Hacker News, dev.to, Medium.&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;three to five recent articles.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;Pass 1 only&lt;/strong&gt; on each, to get the lay of the land and gather their reference links.&lt;/li&gt;
&lt;li&gt;If a well-organized survey or overview exists, start there.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Step 2: Identify the core&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Spot the articles and authors &lt;strong&gt;cited repeatedly&lt;/strong&gt; across multiple pieces. Those are the foundational references in the field.&lt;/li&gt;
&lt;li&gt;Find the &lt;strong&gt;official blog or talks&lt;/strong&gt; of those core authors and companies.&lt;/li&gt;
&lt;li&gt;Look for &lt;strong&gt;conference talks&lt;/strong&gt; (QCon, Strange Loop, KubeCon, etc.) on the topic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After scanning enough articles, patterns emerge. You start to think, &quot;ah, in this field everyone goes back to that one Martin Fowler post.&quot; (That moment of recognition is the turning point in your research.)&lt;/p&gt;
&lt;h3&gt;Step 3: Go deep&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Take the core references and conference talks and run &lt;strong&gt;Pass 2&lt;/strong&gt; on them.&lt;/li&gt;
&lt;li&gt;If everyone keeps citing something you haven&apos;t read yet, add it to the pile.&lt;/li&gt;
&lt;li&gt;Finally, write &lt;strong&gt;your own summary doc&lt;/strong&gt; (a tech evaluation, an ADR, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same AI rule applies. Use it to accelerate exploration and spot patterns, but don&apos;t end research with &quot;summarize the pros and cons of event sourcing.&quot; That&apos;s mistaking someone else&apos;s opinion for your conclusion. And you have to verify that any article AI recommends actually exists. AI hallucinates references frequently.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Practical Tips&lt;/h2&gt;
&lt;h3&gt;Habits that improve reading efficiency&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use an RSS reader or newsletters&lt;/strong&gt; to batch articles and run Pass 1 in one sitting. Sort &quot;read&quot; from &quot;drop&quot; up front.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use &quot;read later&quot; tools&lt;/strong&gt; (Pocket, Instapaper, Obsidian clipping), but don&apos;t let them pile up. Schedule &lt;strong&gt;a weekly review slot.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always take notes&lt;/strong&gt; on anything you read at Pass 2 or beyond. If you read it and can&apos;t remember, you didn&apos;t really read it.&lt;/li&gt;
&lt;li&gt;For anything you took to Pass 3, &lt;strong&gt;explain it to someone or write a post about it.&lt;/strong&gt; That&apos;s how it actually becomes yours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last one matters most. The way I see it, the final pass of reading is writing. Writing is what reveals what you understood and what you didn&apos;t.&lt;/p&gt;
&lt;h3&gt;From the writer&apos;s side&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;80% of your readers leave at Pass 1.&lt;/strong&gt; Title, headings, and intro are everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One good diagram&lt;/strong&gt; beats ten lines of text.&lt;/li&gt;
&lt;li&gt;Code examples should show &lt;strong&gt;only the core.&lt;/strong&gt; Link to the full code on GitHub.&lt;/li&gt;
&lt;li&gt;The conclusion has to answer &lt;strong&gt;&quot;so what should I do?&quot;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you read this post and also write, run your own work through the same lens. Is your Pass 1 compelling? Does the skeleton emerge from the headings alone? Just asking yourself those questions raises the quality of what you publish.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;What changed most when I applied this method wasn&apos;t how much I read, but how I approached reading.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pass&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;AI&apos;s role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pass 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;td&gt;Decide if it&apos;s worth reading&lt;/td&gt;
&lt;td&gt;Can answer the five Cs&lt;/td&gt;
&lt;td&gt;Filter aid, term dictionary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pass 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15-30 min&lt;/td&gt;
&lt;td&gt;Understand the core content&lt;/td&gt;
&lt;td&gt;Three-line summary + can explain it&lt;/td&gt;
&lt;td&gt;Compare your read, term explanations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pass 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1-3 hrs&lt;/td&gt;
&lt;td&gt;Make it your own&lt;/td&gt;
&lt;td&gt;Apply, critique, present&lt;/td&gt;
&lt;td&gt;Sparring partner, counterarg generator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You don&apos;t need to take every article to Pass 3. Most get filtered at Pass 1, only the worthwhile ones move to Pass 2, and only the truly important ones reach Pass 3. The filtering itself is the heart of efficient reading.&lt;/p&gt;
&lt;p&gt;The same logic applies to AI use. Aid, not substitute. Translate the unclear paragraph instead of the whole article, and check your notes for gaps after writing them instead of pasting an AI summary in as your notes.&lt;/p&gt;
&lt;p&gt;What it comes down to is this. Reading &quot;a lot&quot; of tech articles isn&apos;t the point. Reading them &quot;properly&quot; is. And reading properly means choosing the right depth at each pass and spending your time well.&lt;/p&gt;
&lt;p&gt;And at any pass, &lt;strong&gt;the moment you hand the reading off to AI, that pass didn&apos;t happen.&lt;/strong&gt; You have to stay the reader.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The more that you read, the more things you will know. The more that you learn, the more places you&apos;ll go.&quot;&lt;/p&gt;
&lt;p&gt;-- Dr. Seuss&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is what the three-pass method is really about. Not reading whatever lands in front of you, but choosing what to read.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Original: S. Keshav, &quot;How to Read a Paper&quot; (University of Waterloo)&lt;/em&gt;
&lt;em&gt;Adapted for tech blogs and articles + AI usage guide added&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>essay</category><category>tech</category><category>productivity</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Give Claude Code Wings: Introducing Superpowers</title><link>https://flowkater.io/en/posts/2026-02-08-superpowers-introduction/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-02-08-superpowers-introduction/</guid><description>Install Superpowers on Claude Code and a 7-stage workflow runs automatically, from clarifying questions to TDD to code review. Setup, the meta-skill, and how to build your own skills.</description><pubDate>Sun, 08 Feb 2026 01:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/superpowers.png&quot; alt=&quot;Superpowers&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Red Bull gives you wiiings!
-- Red Bull commercial&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Red Bull, spread your wings!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you&apos;re past the stage of testing a quick idea or doing throwaway vibe coding, you usually reach for one of the more disciplined approaches: clarifying the context, writing tighter prompts, drafting a spec doc first, sticking to spec-driven development.&lt;/p&gt;
&lt;p&gt;The problem is that no matter how clearly you define and hand off the work, the agent makes its own calls and drifts in directions you never asked for. That gets worse as the project grows. So one of the commands I built and started leaning on is an &lt;code&gt;interview&lt;/code&gt; command. The frontmatter description goes roughly like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
description: &amp;gt;
  When project requirements are vague, this is the interview command
  that has Claude clarify policies, implementation details, and edge cases
  by asking me directly.
  &quot;Don&apos;t make the call yourself. Keep asking me questions until the
  ambiguity is gone.&quot;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The short version is, &quot;Don&apos;t make the call yourself. Keep asking me questions until the ambiguity is gone.&quot; With that in place, instead of guessing, the agent uses AskUserQuestions and runs an actual interview with me about the policies, the current implementation, and the requirements. Especially when you hand off a planning doc or requirements, &quot;language&quot; itself blurs meaning by the original sin of representation, and the AI ends up misreading no matter how cleanly you wrote it. (Same goes for humans.) And honestly, half the time I throw requirements over the wall without thinking through the details either.&lt;/p&gt;
&lt;p&gt;So when I flip on plan mode in Codex or Claude Code and run the interview command, I end up with a much sharper requirements doc and implementation plan. It pays off whether I&apos;m building a new feature or fixing a bug.&lt;/p&gt;
&lt;p&gt;And once TDD Planning kicks in (the one I described in my earlier post, &lt;a href=&quot;https://flowkater.io/posts/2026-01-09-15-year-cto-vibe-coding/&quot;&gt;How a 15-Year CTO Vibe Codes&lt;/a&gt;), the work follows a concrete, step-by-step plan.&lt;/p&gt;
&lt;p&gt;The catch is that when I&apos;m juggling parallel tasks I forget to run the command, and TDD Planning needs a slightly different setup per language and framework, so configuring a custom skill every time felt like a chore and I&apos;d skip the setup on my end. The interview part is great when it digs in, but I also wanted the agent to read the room a bit on its own. (You know how it is.)&lt;/p&gt;
&lt;p&gt;Even with all that, while I was happily using the setup, I came across a skill framework that bundled every command and skill I&apos;d been hand-rolling, and applied &lt;strong&gt;Cialdini&apos;s persuasion psychology&lt;/strong&gt; to LLMs. The name fits the job: it gives your coding agent superpowers (Claude Code, Codex, you name it). It&apos;s called &lt;strong&gt;Superpowers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cialdini himself co-authored research showing these principles transfer to LLMs. Superpowers leans on three of his six persuasion principles as its core.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Three persuasion principles applied&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Authority&lt;/strong&gt;: Each skill file declares itself mandatory, so Claude (or Codex) registers it as something it has to follow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: The agent is made to declare it&apos;ll follow a given skill, then nudged to honor what it just declared.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Social proof&lt;/strong&gt;: The skill says &quot;all the other skills work this way too,&quot; so the agent treats it as the standard.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Installation on Claude Code is simple. You just grab the plugin from the marketplace. I tend to use Claude Code for quick or throwaway work and Codex for production-grade tasks, and Superpowers pulls its weight on both.&lt;/p&gt;
&lt;p&gt;It bundles in the interview and TDD workflows I was already using, then layers on code review, verification, and other supporting skills. So I figured it was worth a writeup.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Installation and basic usage&lt;/h2&gt;
&lt;h3&gt;Install&lt;/h3&gt;
&lt;p&gt;Superpowers needs Claude Code 2.0.13 or higher. Setup is two lines.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. Register the marketplace
/plugin marketplace add obra/superpowers-marketplace

# 2. Install Superpowers
/plugin install superpowers@superpowers-marketplace
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it doesn&apos;t kick in after install, restart Claude Code. Once it&apos;s installed you&apos;ll see &lt;strong&gt;&quot;I have Superpowers&quot;&lt;/strong&gt;, and Brainstorm, Write Plan, Execute Plan, and the rest of the skills become available.&lt;/p&gt;
&lt;p&gt;It also runs on Codex and OpenCode, not just Claude Code. (The repo has 47K stars on GitHub and ships under the MIT license, so you can use it without worry.)&lt;/p&gt;
&lt;h3&gt;The big shift: it doesn&apos;t go straight to code&lt;/h3&gt;
&lt;p&gt;The first thing you notice after installing Superpowers is this. &lt;strong&gt;Claude refuses to start coding immediately.&lt;/strong&gt; Plain Claude Code will start typing code the moment you say &quot;build me X.&quot; Claude with Superpowers always starts with questions instead.&lt;/p&gt;
&lt;p&gt;That&apos;s the whole point. The interview command I built is now baked in by default. No command needed.&lt;/p&gt;
&lt;p&gt;Question, design, plan, TDD, sub-agent dispatch, code review, done.&lt;/p&gt;
&lt;p&gt;The biggest win with Superpowers is that this whole flow starts &lt;strong&gt;automatically, without any command from you.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The development workflow: 7 stages&lt;/h2&gt;
&lt;p&gt;The Superpowers workflow runs in 7 stages. Here&apos;s the full flow first.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    A[&quot;1. Brainstorming\nQuestions &amp;amp; design doc&quot;] --&amp;gt; B[&quot;2. Git Worktrees\nIsolated worktree&quot;]
    B --&amp;gt; C[&quot;3. Writing Plan\nTask breakdown &amp;amp; approval&quot;]
    C --&amp;gt; D[&quot;4. Development\nParallel sub-agent dev&quot;]
    D --&amp;gt; E[&quot;5. Testing (TDD)\nRED -&amp;gt; GREEN -&amp;gt; REFACTOR&quot;]
    E --&amp;gt; F[&quot;6. Verification\nVerify all changes&quot;]
    F --&amp;gt; G[&quot;7. Code Review &amp;amp; Finishing\nReview &amp;amp; PR creation&quot;]
    G --&amp;gt;|&quot;next task&quot;| D
    E --&amp;gt;|&quot;test failure&quot;| H[&quot;Systematic Debugging\n4-step root-cause analysis&quot;]
    H --&amp;gt; E
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Stage 1: Brainstorming&lt;/h3&gt;
&lt;p&gt;When you make a request, Claude doesn&apos;t start coding. It &lt;strong&gt;starts with questions&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;What exactly do you want, and how should it work?&quot;
&quot;What should the headline copy say?&quot;
&quot;Is the situation input free-form text, or a category picker?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It carries the conversation through a list of features, the tech stack, the component structure, and writes a &lt;strong&gt;design doc&lt;/strong&gt; itself.&lt;/p&gt;
&lt;p&gt;It looks a lot like the interview command I built, but Superpowers fires this off without you typing anything. Even when I forget, Claude jumps in with questions on its own. (That part alone is a relief.)&lt;/p&gt;
&lt;h3&gt;Stage 2: Git worktree creation&lt;/h3&gt;
&lt;p&gt;Once the design is approved, the &lt;strong&gt;git worktrees&lt;/strong&gt; skill spins up an isolated worktree.&lt;/p&gt;
&lt;p&gt;Why a worktree? With AI coding, running multiple things in parallel makes Git get tangled fast. (I lost count of how many merge-conflict swamps I waded through running parallel tasks in Codex.) Splitting into worktrees keeps the main branch safe even if an experiment blows up, and you can roll back cleanly by deleting the worktree.&lt;/p&gt;
&lt;h3&gt;Stage 3: Writing the plan&lt;/h3&gt;
&lt;p&gt;The Writing Plan skill takes the design doc and &lt;strong&gt;slices it into concrete tasks.&lt;/strong&gt; Tasks are decomposed by size, and Claude asks you to approve the plan.&lt;/p&gt;
&lt;p&gt;The flow looks a lot like the TDD Planning I&apos;d built, except it generates the right format automatically regardless of language or framework. No more setting up a custom skill every time.&lt;/p&gt;
&lt;h3&gt;Stage 4: Sub-agent-driven development&lt;/h3&gt;
&lt;p&gt;Superpowers earns its keep here.&lt;/p&gt;
&lt;p&gt;When the plan runs, you can pick between &lt;strong&gt;sub-agent-driven mode&lt;/strong&gt; and &lt;strong&gt;batch mode&lt;/strong&gt;. Sub-agent-driven is the more efficient one: the main Claude plays &lt;strong&gt;PM&lt;/strong&gt;, hands the development work to sub-agents, and merges the results.&lt;/p&gt;
&lt;p&gt;Think of it like an orchestra conductor. The main Claude conducts the whole flow, and the sub-agents work their assigned parts (UI, API, data layer, etc.) in parallel. The &lt;strong&gt;Dispatch Parallel Agent&lt;/strong&gt; skill enables this parallel work, which also cuts down on the context errors you get when a single Claude has to juggle everything.&lt;/p&gt;
&lt;p&gt;(One caveat: Codex doesn&apos;t support sub-agents yet, so this part isn&apos;t available there.)&lt;/p&gt;
&lt;h3&gt;Stage 5: TDD and debugging&lt;/h3&gt;
&lt;p&gt;Superpowers &lt;strong&gt;forces TDD&lt;/strong&gt;. The cycle is RED -&amp;gt; GREEN -&amp;gt; REFACTOR, and it loops.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RED&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write the test first and confirm it fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GREEN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write the minimum code to pass it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;REFACTOR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clean up the code and improve quality&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;When a test fails or a bug shows up, the &lt;strong&gt;Systematic Debugging&lt;/strong&gt; skill kicks in automatically with a 4-step process.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Analyze the error message&lt;/strong&gt; (figure out what went wrong)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Narrow the relevant code scope&lt;/strong&gt; (find where the issue lives)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Form and check a hypothesis&lt;/strong&gt; (reason about why it happened, then verify)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix and test&lt;/strong&gt; (patch it, then verify again)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&apos;s basically the same TDD-cycle philosophy I described in my earlier post. The difference is that Superpowers applies it without a separate command, on any language or framework.&lt;/p&gt;
&lt;h3&gt;Stage 6: Verification&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;Verification&lt;/strong&gt; skill checks every change. It re-runs tests, looks at related-feature impact, and walks through edge cases.&lt;/p&gt;
&lt;p&gt;Honestly, I&apos;ve lost count of how many times Claude said &quot;all done&quot; when the thing wasn&apos;t actually working. With this verification step in the loop, that scenario drops off sharply.&lt;/p&gt;
&lt;h3&gt;Stage 7: Code review and finishing&lt;/h3&gt;
&lt;p&gt;Each completed task triggers a &lt;strong&gt;code review&lt;/strong&gt;. The review has two layers.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Spec compliance&lt;/strong&gt; (was it built to spec)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code quality&lt;/strong&gt; (security holes, performance issues, code style)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Findings are tagged Critical, Major, or Minor, and the agent fixes the code automatically based on the feedback.&lt;/p&gt;
&lt;p&gt;When every task is done, the &lt;strong&gt;Finishing&lt;/strong&gt; skill takes care of cleaning up the worktree and opening the PR.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Writing Skills: the power of the meta-skill&lt;/h2&gt;
&lt;h3&gt;The skill library&lt;/h3&gt;
&lt;p&gt;Here&apos;s the breakdown of what&apos;s built into Superpowers.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testing &amp;amp; Quality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TDD&lt;/td&gt;
&lt;td&gt;RED-GREEN-REFACTOR cycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Systematic Debugging&lt;/td&gt;
&lt;td&gt;4-step root-cause analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verification&lt;/td&gt;
&lt;td&gt;Pre-completion verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Brainstorming&lt;/td&gt;
&lt;td&gt;Question-driven requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Plan Composition/Execution&lt;/td&gt;
&lt;td&gt;Plan writing and execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Parallel Agent Dispatching&lt;/td&gt;
&lt;td&gt;Parallel sub-agent work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code Review&lt;/td&gt;
&lt;td&gt;Two-layer code review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Git Worktree Management&lt;/td&gt;
&lt;td&gt;Worktree create/cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subagent-Driven Development&lt;/td&gt;
&lt;td&gt;PM-and-developer split&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Meta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Writing Skills&lt;/td&gt;
&lt;td&gt;Skill creation/edit framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Meta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Superpowers Introduction&lt;/td&gt;
&lt;td&gt;System intro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every skill is &lt;strong&gt;a markdown file&lt;/strong&gt;. Think of each one as a reusable knowledge module that documents a procedure, best practices, and the workflow.&lt;/p&gt;
&lt;h3&gt;Building your own skills&lt;/h3&gt;
&lt;p&gt;The genuinely powerful piece is the &lt;strong&gt;Writing Skills&lt;/strong&gt; meta-skill. You can update existing skills or &lt;strong&gt;create new ones from scratch&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Usage is simple. You tell Claude something like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;Make me a skill that enforces our company&apos;s coding conventions&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And Claude builds the skill file for you. When it creates a new skill, it applies the same TDD, sub-agent dispatch, and pressure-test routines as any other dev work. Building a skill itself follows the Superpowers workflow.&lt;/p&gt;
&lt;p&gt;The fun part is that you can also &lt;strong&gt;hand it a programming-book PDF and ask it to &quot;read this and turn what you learned into a skill.&quot;&lt;/strong&gt; Whether it&apos;s clean-code principles or a specific architectural pattern, anything documented can become a skill.&lt;/p&gt;
&lt;h3&gt;Real-world cases&lt;/h3&gt;
&lt;p&gt;Where Superpowers earns its keep is in the field. A few examples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. &lt;a href=&quot;https://www.trevorlasn.com/blog/superpowers-claude-code-skills&quot;&gt;Next.js 16 migration&lt;/a&gt;: a 500-line plan, generated for you&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A developer handed Superpowers the job of upgrading his service to Next.js 16 and turning on &lt;code&gt;cacheComponents&lt;/code&gt;. He ran &lt;code&gt;/superpowers:write-plan&lt;/code&gt;, and it produced a &lt;strong&gt;500-line migration plan&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A full list of the &lt;strong&gt;23 API route files&lt;/strong&gt; that needed changes&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;2 components&lt;/strong&gt; where &lt;code&gt;new Date()&lt;/code&gt; would break prerendering, identified&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;context providers&lt;/strong&gt; that needed a Suspense boundary, called out&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;4-day timeline&lt;/strong&gt; with test checkpoints at each stage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Doing that codebase scan by hand would&apos;ve eaten more than a day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. &lt;a href=&quot;https://www.pasqualepillitteri.it/en/news/215/superpowers-claude-code-complete-guide&quot;&gt;Notion clone&lt;/a&gt;: 45 minutes, zero hand-written code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A Notion-style web app (rich-text editor, interactive tables, drag-and-drop kanban board) built end to end with Superpowers. The numbers were striking.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build time&lt;/td&gt;
&lt;td&gt;45 to 60 minutes (mostly automated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test coverage&lt;/td&gt;
&lt;td&gt;87% (unit, integration, E2E)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hand-written code&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 lines&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Features included&lt;/td&gt;
&lt;td&gt;CRUD tables, kanban, rich text, auth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;3. &lt;a href=&quot;https://www.nathanonn.com/claude-skills-part-2-how-to-turn-your-battle-tested-code-into-a-reusable-superpower/&quot;&gt;Authentication system as a skill&lt;/a&gt;: 14 hours saved across 6 projects&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A developer who&apos;d been rebuilding the same auth system (OAuth, session management, token refresh) across project after project turned it into a skill via Writing Skills. He fed his existing codebase in, got a 302-line implementation guide and ASCII wireframes for every screen, and &lt;strong&gt;had a reusable skill in about 20 minutes&lt;/strong&gt;. After that, dropping &lt;code&gt;/authentication-setup&lt;/code&gt; into a new project deployed the entire auth system in one line, and he &lt;strong&gt;shipped it across 6 projects, saving 14 hours total&lt;/strong&gt;. He also kept 100% consistency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. &lt;a href=&quot;https://www.youtube.com/watch?v=308zzinIVSA&amp;amp;t=210s&quot;&gt;Channel Talk integration skill&lt;/a&gt;: 3 days down to 30 minutes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Someone fed the entire Channel Talk official documentation into Claude and used Writing Skills to build a Channel Talk integration skill. Once installed, you just say &quot;set up Channel Talk integration&quot; and it handles the SDK install, bot configuration, webhook wiring, and lift-and-shift tasks end to end. Work that used to take 3 days now finishes in &lt;strong&gt;30 minutes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The real value of Superpowers is that &lt;strong&gt;it gets stronger the more skills you stack on top of it&lt;/strong&gt;. Build a library of skills tailored to a project, a team, or a company, and that library becomes the team&apos;s living development knowledge base.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why it actually works: persuasion psychology + pressure tests&lt;/h2&gt;
&lt;h3&gt;Skills hardened by pressure scenarios&lt;/h3&gt;
&lt;p&gt;The author of Superpowers didn&apos;t just write the skills and call it a day. He stress-tested them with extreme pressure scenarios, like &lt;strong&gt;production server down, $5,000 in losses per minute&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The reason is that under pressure, Claude has a real tendency to skip the skills and start coding. When that happened, the author would mark the test as a fail, harden the skill, and run it again. He kept iterating.&lt;/p&gt;
&lt;p&gt;So the Superpowers skills aren&apos;t just clever prompts. They&apos;re &lt;strong&gt;a framework that&apos;s been tested in the field&lt;/strong&gt;. Even in a fire drill, the agent stays on the &quot;questions first, plan first&quot; rails.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Superpowers philosophy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here are the core principles Superpowers is built on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test-first development&lt;/strong&gt; (tests come first, implementation second)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Systematic processes over intuition&lt;/strong&gt; (process beats gut feel)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplicity as primary objective&lt;/strong&gt; (simple is the goal)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Empirical verification before success declarations&lt;/strong&gt; (actually verify before saying &quot;done&quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It comes down to forcing good engineering habits onto the AI.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Practical tips&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Token usage heads-up&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Superpowers iterates deeply during planning, so it burns tokens. I&apos;d recommend the Claude Max plan. It can be overkill for trivial fixes, so pick your moments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When it&apos;s a good fit&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Fit&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Starting a new MVP project&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;You get the full design-to-build flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding a complex feature&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Parallel sub-agent dev plus TDD pays off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whole-codebase refactor&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Structured planning and verification matter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick bug fix&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Overkill, direct edit is faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-line config change&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Skip Superpowers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Overnight autonomous work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you set up a sizable plan, the agent can run on its own for hours. Approve the plan at night, set it loose, and you can wake up to a finished PR.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;Here&apos;s Superpowers in one sentence. It&apos;s the framework that &lt;strong&gt;bundles the interview command, the TDD skill, and the code-review skill I&apos;d been building one by one, then adds sub-agent parallel development and Git worktree management on top&lt;/strong&gt;. And it ships with persuasion psychology layered in to make sure the AI actually sticks to the workflow.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Core feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Auto brainstorming&lt;/td&gt;
&lt;td&gt;Starts with questions, no command needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7-stage workflow&lt;/td&gt;
&lt;td&gt;Design -&amp;gt; plan -&amp;gt; TDD -&amp;gt; review, automatic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-agents&lt;/td&gt;
&lt;td&gt;PM-and-developer split, parallel execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TDD enforced&lt;/td&gt;
&lt;td&gt;RED-GREEN-REFACTOR cycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verification built in&lt;/td&gt;
&lt;td&gt;Blocks the &quot;all done&quot; lie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writing Skills&lt;/td&gt;
&lt;td&gt;Build your own custom skills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persuasion-based&lt;/td&gt;
&lt;td&gt;Locks in skill compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Setup is two lines, so the first move is to install it and try it. You don&apos;t need to use it perfectly out of the gate. Install Superpowers, start working the way you normally do, and Claude will start asking the questions on its own. Follow that flow and you&apos;ll find your own rhythm with it.&lt;/p&gt;
&lt;p&gt;And if you keep adding your own skills through Writing Skills, the setup keeps getting stronger. I&apos;m still adding skills to mine as I go.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;a complete software development workflow for your coding agents, built on top of a set of composable &apos;skills.&apos;&quot;&lt;/p&gt;
&lt;p&gt;-- Superpowers GitHub README&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Go install Superpowers on Claude Code right now and try it on your next project.&lt;/p&gt;
&lt;p&gt;Wings included.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=308zzinIVSA&amp;amp;t=210s&quot;&gt;Channel Talk case video (also includes the intro)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.fsck.com/2025/10/09/superpowers/&quot;&gt;https://blog.fsck.com/2025/10/09/superpowers/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/obra/superpowers&quot;&gt;https://github.com/obra/superpowers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>tech</category><category>vibe-coding</category><category>AI-coding</category><category>development</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Reading &apos;The Obstacle is the Way&apos; (with a side of Meditations)</title><link>https://flowkater.io/en/posts/2026-02-03-book-review-the-obstacle-is-the-way/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-02-03-book-review-the-obstacle-is-the-way/</guid><description>A reflection on Ryan Holiday&apos;s &apos;The Obstacle is the Way&apos; and Marcus Aurelius&apos;s &apos;Meditations&apos;, and the Stoic posture for facing failure and despair.</description><pubDate>Tue, 03 Feb 2026 01:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;This review is from the readmeleadme (or &quot;Lit-mi Lit-mi&quot;) reading group.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;/assets/the-obstacle-is-the-way-cover.jpeg&quot; alt=&quot;The Obstacle is the Way&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Obstacle is the Way: The Timeless Art of Turning Trials into Triumph&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ryan Holiday, translated into Korean by Ahn Jong-seol | SimpleLife | November 11, 2024&lt;/p&gt;
&lt;p&gt;Original title: &lt;em&gt;The Obstacle Is the Way&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Where I&apos;m starting from&lt;/h2&gt;
&lt;p&gt;This was the book I picked up to clear my head at the start of the new year.&lt;/p&gt;
&lt;p&gt;A lot happened last year, and during the brief stretch I&apos;d stopped to rest, the aftermath I&apos;d expected to recover from kept getting worse instead. Body and mind both went through a hard time. What saved me, though, was already knowing this: the moment I&apos;d changed my environment, this was an inner problem of mine, not a problem with anything else.&lt;/p&gt;
&lt;p&gt;It was the same as 2020, when I realized I had to wind down the company. I figured it would take some time, but I expected it to be a little faster than last time. Somehow, it lasted longer. I avoided looking inward and turned my attention to other things, to anything outside.&lt;/p&gt;
&lt;p&gt;Thankfully, starting in December, I dragged a body that had been carrying injuries and inflammation back upright and started exercising again. Not like before, but a little at a time. I tightened the life balance I&apos;d let collapse under the excuse of &quot;rest&quot;, and oddly, I came back more energetic than I had been, able to focus longer, getting my routines back. The inner repair started.&lt;/p&gt;
&lt;p&gt;To inherit the essence of Stoic philosophy, to make calm rational judgments, to not be afraid of pushing forward again after any failure or setback (to actually have &quot;breakthrough power&quot; inside me), maybe it just needed some time. A life without failure is a life without challenge, and there&apos;s nothing as addictive and as harmful as falling into self-justification and self-pity.&lt;/p&gt;
&lt;p&gt;I spent enough time in self-justification and self-pity to learn this: all of it was me being addicted to my own feelings and thrashing around in them. When I finally looked at myself with reason, none of it was anything. It was already over.&lt;/p&gt;
&lt;p&gt;The version of me who was supposed to take it all on the chin and keep going was nowhere to be found. I&apos;d ended up in a loop of self-justification, self-pity, and blaming other people, hating myself for it, then doing it again. That stretch is finally a little settled now.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/marcus.webp&quot; alt=&quot;Marcus Aurelius&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Marcus Aurelius (16th emperor of Rome, one of the Five Good Emperors, the philosopher-king).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this moment, judge objectively. In this moment, act with devotion. In this moment, willingly accept whatever happens. That&apos;s all that&apos;s needed.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Marcus Aurelius (translated by author)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The thing I loved most while reading &lt;em&gt;The Obstacle is the Way&lt;/em&gt; was this: there is no past, no future. There&apos;s only the present, given to everyone equally. And every good thing and bad thing that happens to us, the universe makes no judgment about any of it. These are the points Marcus Aurelius keeps hammering on in &lt;em&gt;Meditations&lt;/em&gt;, which I&apos;m reading alongside this book.&lt;/p&gt;
&lt;p&gt;The book&apos;s message is simple. In spite of everything that happens to you, you have to stand back up and keep going. He doesn&apos;t cheer you on with &quot;you can do it&quot;. He says you &lt;em&gt;should&lt;/em&gt; do it, that not doing it isn&apos;t an option. Do your duty, he says, with no softness in the voice.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Obstacle is the Way: perception, action, will&lt;/h2&gt;
&lt;p&gt;The book lays out three stages.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The starting point is the stage where we look honestly at our problems, our attitudes, our ways of approaching things (perception). Next is the stage where we use heat and creativity to actually clear the obstacle and create opportunity (action). The last is the stage where we cultivate and sustain the inner self that can deal with repeated failure and difficulty (will).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The three axes are tightly linked. Without perception, you can&apos;t act correctly. Without will, you can&apos;t endure repeated failure. Through this framework, Ryan Holiday gives Stoic philosophy a modern reading.&lt;/p&gt;
&lt;h3&gt;Perception: see it objectively&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Hold an objective view. Control your emotions and don&apos;t lose your sense of balance. Work to find the positive elements. Don&apos;t get excited or rattled. Focus on what you can control.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The core of Holiday&apos;s perception is separating emotion from fact. He uses George Clooney as an example.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;From then on, Clooney started bringing this perspective into auditions. Instead of just pushing his acting ability, he explained why he should be the one cast for this role.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Clooney redefined an audition from &quot;a place where I get judged&quot; to &quot;a place where I go to solve a problem&quot;. A shift in viewpoint changed the reality. Holiday organizes this into two concepts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Context: a sense of the bigger picture, looking at the world as a whole, not just what&apos;s right in front of you.&lt;/li&gt;
&lt;li&gt;Frame: your own way of looking at the world and the events inside it.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looking back, I&apos;d poured way too much energy into things I couldn&apos;t control. Regret about what was done, anxiety about what hadn&apos;t come yet. The things I could actually do right now? I looked away from those.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What you think about often, that&apos;s what you become.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This line landed especially hard. While I was thrashing in the swamp of self-pity, I was becoming the pity itself. I was repeating the same thoughts every day, and those thoughts were defining me. If thoughts make me, what am I supposed to be thinking?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The way we see the world depends on the way we look at things like this. Does our perspective actually give us &apos;perspective&apos;, or is it the very thing causing the problem?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Holiday asks: is perspective the solution, or is it the problem? In my case, perspective itself was the problem. I couldn&apos;t see the situation objectively, and the emotion warped everything.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t forget that inside every obstacle is a hidden opportunity to make a better reality.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A shift in how you look at failure. This isn&apos;t about forcing yourself to think positive. It&apos;s about looking at the situation honestly, and finding what you can learn inside it.&lt;/p&gt;
&lt;h3&gt;Action: just start&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The one thing all fools have in common is that they&apos;re always getting ready to start.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Seneca&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How much &quot;preparation&quot; did I do during my time off? I&apos;ll start once I recover. I&apos;ll start once I feel better. I&apos;ll move once my head is clear. Endless preparation. And while I prepared, time kept moving.&lt;/p&gt;
&lt;p&gt;Holiday hits this attitude head-on.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We often live in this delusion that the world will accommodate us. So at the moment we should be acting, we dawdle. We jog along leisurely when we should be sprinting at full tilt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It wasn&apos;t that this line stung. It was that I saw myself in it exactly. I knew the situation was urgent and I was strolling like it was a Sunday jog. While I dawdled, the problem grew, and the opportunity walked away.&lt;/p&gt;
&lt;p&gt;The truth is, after I closed the company in 2020, I told myself I&apos;d never start one again. And here I am running a company. My wife and I are building a new product together. The past failure had stayed with me as a kind of trauma, and for a while I think I was just &quot;getting ready&quot;. Once it&apos;s perfectly prepared, once the market is certain, once I have the confidence. That day never came.&lt;/p&gt;
&lt;p&gt;In the end, I just started. Not perfect, not certain, no confidence. As Holiday puts it, &quot;I&apos;ll do it tomorrow&quot; is the most cunning lie. Tomorrow doesn&apos;t come. When today&apos;s tomorrow becomes today, another tomorrow shows up.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t wait to live properly. Life slips by in the meantime.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Only action changes reality. Thinking alone, planning alone, resolving alone, none of it changes anything. Action doesn&apos;t have to be perfect. You just don&apos;t stop.&lt;/p&gt;
&lt;h3&gt;Will: accept the failure&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Remember that the world is always trying to send you a clear message about the failures and actions you&apos;ve committed. It&apos;s a kind of feedback. It&apos;s like an exact instruction manual for how you can grow from here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Failure isn&apos;t the end. It&apos;s feedback. That difference in perspective changes everything. If you fear failure, you stop trying at all. If you take failure as feedback, you can try more.&lt;/p&gt;
&lt;p&gt;Holiday explains the essence of will this way.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There have always been people who turn adversity into opportunity. They never give up. They don&apos;t fall into self-pity. They don&apos;t fool themselves with the fantasy that an easy answer is about to appear. They focus on the one necessary thing: staying alive and creative until the end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;They don&apos;t fall into self-pity&quot; is the line that stuck. During my time off, I&apos;d become a professional at self-pity. Holiday hits this attitude head-on.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Instead of acting like Demosthenes, you sink into helpless, hollow thinking and turn away from the chance to grow another step. Even when there&apos;s a clear opportunity to find the problem and find the solution, you waste weeks, months, even years.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A line from Nietzsche comes back to me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What doesn&apos;t kill me makes me stronger.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You shouldn&apos;t misread that line, though. The pain itself doesn&apos;t make us stronger. How we receive the pain, how we walk through it, that decides us. Holiday underlines this too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No, the problem is exactly as hard as we think it is. The worst thing that can happen isn&apos;t the event itself, but losing your reason because of it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Remember that this moment isn&apos;t your life. It&apos;s just one moment of your life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The hardness of right now feels like it&apos;ll last forever. It won&apos;t. This passes too. Holiday also talks about the art of acquiescence.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Stoic philosophy gave this attitude a beautiful name. They called it &apos;the art of acquiescence&apos;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Accept what you can&apos;t change, focus on what you can. That&apos;s the essence of will.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Meditations: live in the present&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/meditations-cover.jpeg&quot; alt=&quot;Meditations&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Reading &lt;em&gt;The Obstacle is the Way&lt;/em&gt; led me back to &lt;em&gt;Meditations&lt;/em&gt;. If Holiday is the modern reading of Stoic philosophy, Marcus Aurelius is the source. It&apos;s stunning that words written by a Roman emperor almost two thousand years ago still hold up.&lt;/p&gt;
&lt;h3&gt;Get up and do your duty&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;When the day breaks and you don&apos;t want to get out of bed, think to yourself: &quot;I am rising to do what a human being is here to do. I was born for this work, I came into the world for this work, and I&apos;m still complaining and resenting it? I wasn&apos;t born to lie under the covers and enjoy the warmth.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are mornings when I open my eyes and don&apos;t want to get up. Honestly, those mornings happened a lot more than the other kind. And Marcus Aurelius was the emperor of Rome. He didn&apos;t want to get up either. He got up anyway. He had work to do.&lt;/p&gt;
&lt;p&gt;He&apos;s unbending about duty.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In every moment, behave as a Roman and as a man, with unornamented dignity, with comradeship, with independence, with a sense of justice. Carry out the task in front of you accurately, carefully, without selfishness. Throw away every other distraction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The word &quot;duty&quot; can sound heavy. But think about it: the fact that there&apos;s something I have to do is itself proof I&apos;m alive.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every time you do something, do it as if it were the last thing you&apos;ll do on this earth. Don&apos;t deliberately step outside the control of reason and follow your emotions. Don&apos;t get caught by hypocrisy, selfishness, or resentment about the fate given to you. If you can do that, you can do anything.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marcus stresses &quot;not following your emotions willfully&quot;. Acting under the control of reason. That&apos;s the core of Stoic philosophy.&lt;/p&gt;
&lt;h3&gt;What is coming is on its way&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t live as though you&apos;ll live a thousand years. What&apos;s coming is already coming for you. While you&apos;re alive, do your best to be a good person.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You probably won&apos;t have time to read the excerpts you&apos;ve been collecting. So if there&apos;s something that worries you, while time still allows, throw away every other empty hope, and pour all your strength into completing that one goal. Save yourself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Memento mori. Remember death. This isn&apos;t a pessimistic thought. It&apos;s the opposite. Because time is limited, this moment matters. The books I&apos;ve stacked up to read someday, the things I&apos;ve put off doing someday. &quot;Someday&quot; might not arrive.&lt;/p&gt;
&lt;p&gt;Marcus organizes the insight about time like this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Even if you could live three thousand or thirty thousand years, remember that what passes is only the life you&apos;re living right now. You don&apos;t live any life other than the life that is passing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;No one can take from you what you don&apos;t possess, and every person possesses only this present moment, the same way. Whoever you are, you only ever lose the present moment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What we have is only the present. The past is already gone, the future hasn&apos;t come yet. The thing we can lose, the thing we can possess, is only the present.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Remember how many chances the gods have given you, and how you&apos;ve never accepted a single one. Remember how long you&apos;ve been putting it off.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reading this line, I looked back on the past year. How many chances I&apos;d put off, looked away from, pushed to later.&lt;/p&gt;
&lt;h3&gt;Fortune, not misfortune&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t say, &quot;this happened to me, what a misfortune.&quot; Say instead, &quot;this happened to me, and yet I&apos;m not destroyed by what happened, I&apos;m not afraid of what&apos;s coming, I haven&apos;t been damaged at all. What a piece of fortune that is.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marcus puts this perspective even more crisply.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;This is not misfortune. The fortune is that I keep my own nature even when these things happen to me.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first time I read this passage, I had a hard time accepting it. While you&apos;re going through something hard, saying &quot;this is fortune&quot; isn&apos;t easy. But thinking about it carefully, the fact that I made it here is itself the proof. I wasn&apos;t destroyed. I&apos;m still here. I&apos;m writing.&lt;/p&gt;
&lt;p&gt;Marcus explains the real meaning of &quot;everything is in the way you think about it&quot;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Everything is in how you think about it&quot; means that external events and circumstances (the value-neutral things that have nothing to do with happiness or with good and evil) get their character and influence not from the events themselves but only from how a person receives them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The situation itself is value-neutral. Whether to see it as misfortune or as a chance to grow is entirely my choice.&lt;/p&gt;
&lt;h3&gt;Stand on your own&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t lose your cheerfulness, do it without outside help, by your own strength. Push away the comfort other people offer and stand on your own. You have to stand straight on your own. Don&apos;t get propped up by another person&apos;s help, and don&apos;t let anyone else stand you up straight.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the end, the only one who can stand me back up is me. Blaming the environment, blaming other people, the same infinite loop. While that time was passing, the things I actually could do, I didn&apos;t do.&lt;/p&gt;
&lt;p&gt;Marcus also talks about the retreat into yourself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Whenever you want, you can withdraw into yourself and rest. There&apos;s no better place to be free of every worry and every concern, no quieter or more peaceful place, than your own mind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Don&apos;t look for peace outside. Find it inside. Even rest happens inside you.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t see something the way someone forces you to see it, or the way someone wants you to see it. See everything as it is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The person who doesn&apos;t worry about what others say, do, or think, and only cares about getting their own words and conduct right, has a peaceful and abundant mind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Stepping out of the gaze of others and walking your own path. As emperor, Marcus must have lived under enormous expectation and criticism, and he still got to this place. That&apos;s the part that astonishes me.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The Obstacle is the Way&lt;/em&gt; and &lt;em&gt;Meditations&lt;/em&gt;. Two books from very different times, telling the same story.&lt;/p&gt;
&lt;p&gt;Don&apos;t get stuck on the past. Don&apos;t be afraid of the future. Focus on this moment. Take failure as feedback. And go forward without flinching.&lt;/p&gt;
&lt;p&gt;A few failures aren&apos;t a reason to stop. The opposite, actually. Try more, fail more, learn more. A life without failure is a life without challenge.&lt;/p&gt;
&lt;p&gt;After I closed the company in 2020, I thought I&apos;d never start one again. And here I am running a company again. The past failure didn&apos;t disappear. I just learned that it isn&apos;t a reason to block today.&lt;/p&gt;
&lt;p&gt;It took a long time to climb out of the loop of self-justification and self-pity. But I think that time was needed. At least now I know. Being swept by an emotion and feeling an emotion are different things. Feel the emotion, but don&apos;t get addicted to it. Maybe that&apos;s what Stoic acceptance is.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What I learned&lt;/th&gt;
&lt;th&gt;Action item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thoughts make me&lt;/td&gt;
&lt;td&gt;Trade self-pity for objective observation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Just preparing is doing nothing&lt;/td&gt;
&lt;td&gt;Execute one small action you can do today&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure is feedback&lt;/td&gt;
&lt;td&gt;After failing, write down the lesson instead of blame&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only the present is ours&lt;/td&gt;
&lt;td&gt;Stop spending time on past regret and future anxiety&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t live as though you&apos;ll live a thousand years. What&apos;s coming is already coming for you.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Marcus Aurelius&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;ll focus on the present. Do today&apos;s work. That&apos;s all there is.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Questions for the reading group&lt;/h2&gt;
&lt;h3&gt;1. What was your biggest recent failure, and how did you &quot;break through&quot; it? What are you doing now because of it? Share how you got past it and how your perspective shifted.&lt;/h3&gt;
&lt;p&gt;The biggest failure was a failure of the heart. Last year my body and mind were both in bad shape, so I fell into perfectionism and kept delaying the project I was on. I chewed on past regrets and failures over and over. In particular, I realized the way I&apos;d wound down the team was a failure, and I couldn&apos;t get out of that for a long stretch. The environment was hard, sure, but I kept thinking I could have closed it out better. The point, though, was that I kept chewing on the failure long after I&apos;d left it. I wrote about this in the review too, and there&apos;s a similar memory from when I closed Todait. Coming out of an organization without going into a new one for a long time made me sink into the failure and the self-pity more and more.&lt;/p&gt;
&lt;p&gt;The way I&apos;m getting past it is writing. Recently I&apos;ve been writing blog posts and even fiction, all of it for the sake of &quot;breaking through&quot; and getting out. The ideas that had been floating around in my head and chest got concrete on the page, and as they got concrete my heart emptied out a little, and I started to see what to do next. The knots inside me feel like they&apos;re being released. I wish I&apos;d written sooner. Now that I&apos;ve written some, I feel like it&apos;s time to read again and refill. The line &quot;you have to empty out before you can fill up&quot; really resonates with me these days.&lt;/p&gt;
&lt;h3&gt;2. What was the biggest change in your thinking from reading this book?&lt;/h3&gt;
&lt;p&gt;I&apos;m someone whose views were already mostly in line with the book, so it wasn&apos;t so much a shift as it was reinforcement. The line that&apos;s staying with me is that the constraints of reality can themselves be the path.&lt;/p&gt;
&lt;h3&gt;3. Push when you should rest, and burnout comes. Rest when you should push, and you stagnate. How do you tell the difference?&lt;/h3&gt;
&lt;p&gt;I clearly did the opposite. What matters in the end is the result, the outcome. If something feels like it&apos;s dragging on too long without a clear result, it&apos;s time to revisit the direction. Rather than just deciding whether to rest or not, I think it&apos;s important to keep a daily rhythm, hold the routines, focus harder when needed, and keep enough room in your mind to look back. That said, if I&apos;m just tired, pushing through is fine. If the environment isn&apos;t going to change no matter what I do, a change of direction is the thing to do.&lt;/p&gt;
&lt;h3&gt;4. Pick two passages you underlined. Why those two?&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;What doesn&apos;t kill me makes me stronger. (...) No, the problem is exactly as hard as we think it is. The worst thing that can happen isn&apos;t the event itself, but losing your reason because of it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There&apos;s a scene in &lt;em&gt;Evan Almighty&lt;/em&gt; where the family is leaving Evan, who&apos;s suddenly building an ark in modern times. There&apos;s a conversation between Morgan Freeman as God and Evan&apos;s wife at a diner that I still remember.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If someone prays for patience, do you think God gives them patience, or does He give them the opportunity to be patient?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If they pray for courage, does God give them courage, or does He give them the opportunity to be courageous?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If someone prays for their family to be closer, do you think God just zaps them with warm, fuzzy feelings, or does He give them opportunities to love each other?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The family eventually returns to Evan, the flood actually arrives, and the biblical scene plays out. It&apos;s a movie that could come across as a little corny and easy to dismiss, but as someone who isn&apos;t a Christian, that scene hit me hard, and it kept coming back to me as I read this book.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this moment, judge objectively. In this moment, act with devotion. In this moment, willingly accept whatever happens. That&apos;s all that&apos;s needed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I opened the post with this line, and the Stoic view that everything in the world is value-neutral, and that what matters is reason and doing your duty, is the line that helps me hold my emotional energy steady, instead of getting destabilized by small things or overly excited. The value I keep coming back to is: focus on this moment, above all.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Peaceful Warrior&lt;/em&gt;, another movie I love, the mentor &quot;Socrates&quot; tells the protagonist:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A real warrior doesn&apos;t give up what they love. Instead, they find the reason to love what they&apos;re doing right now.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;5. In a moment when control is completely gone, what attitude can you still hold?&lt;/h3&gt;
&lt;p&gt;What the book is finally saying is that my thoughts, my emotions, my judgments are all things I decide. It&apos;s hard, but how I think in such a moment, how I feel, how I judge, those are still things I can choose. Of course, I don&apos;t think you should drive yourself when you&apos;re already collapsed (you need time to digest the hard parts too). Even so, holding your mental ground, judging with reason, and doing what you can do is the attitude that really matters.&lt;/p&gt;
&lt;h3&gt;6. Did this book make you newly aware of how you handle problems?&lt;/h3&gt;
&lt;p&gt;For me, reasoning through work is relatively easy. With people, or with ordinary daily things, I get emotionally sensitive and irritable easily. Over nothing, really. Paradoxically, I steady myself for the big things and accept them with grit, but I crumble easily on small things. So the various ways the book talks about handling problems aren&apos;t only for our big goals. They&apos;re also for keeping daily peace, and I came away resolving to give myself a little more room.&lt;/p&gt;
&lt;h3&gt;7. (The book title in Korean is a translation, but the translator chose it for a reason.) What does the word &quot;breakthrough&quot; mean to me?&lt;/h3&gt;
&lt;p&gt;Life is hard. Or maybe it&apos;s hard because we think it&apos;s hard. The word &quot;breakthrough&quot; is a bit corny, but maybe you need that level of resolve to get through the many problems we face with a little less shaking and a little less collapsing. Through this book, I hope all of us can find the courage and strength to &quot;break through&quot;, whatever hardship and difficulty come.&lt;/p&gt;
&lt;h3&gt;8. Are you results-oriented or process-oriented? How do you balance them?&lt;/h3&gt;
&lt;p&gt;I used to be process-oriented, and now I&apos;m fully results-oriented. From running a company and a team, and from failing, what I&apos;ve felt is that whatever the process was, the evaluation of that process changes completely depending on the result. I don&apos;t think the process is unimportant. The point is that results are at the &lt;em&gt;center&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the past, when I was process-oriented, there were times when the results were mediocre and we&apos;d awkwardly applaud each other. I thought that was support, that we could keep going. But &quot;as long as you tried hard in the process, the result doesn&apos;t matter&quot; really turns people passive and irresponsible. I learned that the hard way, both with myself and when running a team. A post I wrote earlier, &lt;a href=&quot;https://flowkater.io/posts/2026-01-25-no-victory-no-future/&quot;&gt;No Victory, No Future&lt;/a&gt;, is in the same line of thought.&lt;/p&gt;
&lt;p&gt;The conclusion is that being results-oriented is right, no question. But you should use the result to do the process better, not let &quot;as long as the result is good, the process can be anything&quot; take over.&lt;/p&gt;
&lt;h3&gt;9. When things don&apos;t go to plan, what do you do? Adjust or scrap the plan? Or push through even if it&apos;s late?&lt;/h3&gt;
&lt;p&gt;In the past, I&apos;d adjust or scrap a lot. The principle, though, is that a plan is also part of the process, like in question 8. So I&apos;d weigh whether the plan really matched the result and whether the cost was justified. That&apos;s the usual call in business. Personally, when I&apos;m working on my own tasks or studying, I tend to just push it through and finish. Unless the cost is enormous, what you learn from finishing is more than what you learn from quitting halfway.&lt;/p&gt;
&lt;h3&gt;10. When you face a book that&apos;s hard to read, what do you do? (Just push through, reread, etc.) And how do you decide a book is &quot;hard&quot;?&lt;/h3&gt;
&lt;p&gt;Mostly I just push through. I don&apos;t really get obsessive about it. There are plenty of books to read, and sometimes after time passes, what I read before just clicks. It&apos;s not exam prep where you have to memorize everything, so even with a great book, if it&apos;s hard for me, I won&apos;t reread it. What I do try is finishing it. A kind of reading-comprehension training, you could say. Once you survive that hardship, other books feel really easy. These days, thanks to e-books, I read three at the same time: an easy one (usually fiction), a medium one, and a hard one. I rotate. The hard one I read first, only the minimum amount per day. The medium one a little more than the set amount. The easy one I sometimes binge, sometimes skip. Reading just one book at a time gets boring, and rotating is nice.&lt;/p&gt;
&lt;p&gt;That said, when I really have to read something hard, using a reading group like this one is the best move. Even if I read loosely, I can absorb the book indirectly through other people&apos;s thoughts and reactions. Honestly, I find the thoughts of the people that the book brings out and clarifies more interesting than the book itself.&lt;/p&gt;
</content:encoded><category>reading</category><category>essay</category><category>readmeleadme</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>There&apos;s No Future for an Organization That Can&apos;t Win</title><link>https://flowkater.io/en/posts/2026-01-25-no-victory-no-future/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-01-25-no-victory-no-future/</guid><description>What I learned from running a startup as CEO and serving as CTO. An honest confession about the leader going it alone, teams that only do what they&apos;re told, and what happens to organizations that never define what winning means.</description><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;How this started&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;And then I realized it. Oh, I&apos;m too good at talking. So even with the same idea, I get the team excited about it, and that made us spend years investing in wrong ideas, and I&apos;d be making bad calls while still thinking I was right.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I first came across this interview with Lee Seung-gun, the CEO of Toss (Korea&apos;s leading fintech), I just stared at the screen for a long while. Looking back, I was that kind of leader too. He goes on: &quot;If you don&apos;t succeed, in the end it&apos;s a really bad experience for the team.&quot; And he adds: &quot;Saying the painful but necessary thing is how a person and a company grow. It took me about five years to accept that.&quot;&lt;/p&gt;
&lt;p&gt;Reading these lines hit me hard. It sounded less like a successful entrepreneur&apos;s reflection and more like an honest confession from a leader who&apos;d been through countless failures. We tend to fall into the trap of &quot;let&apos;s just keep things nice.&quot; Because we love the team, because we don&apos;t want them to get hurt, because we don&apos;t want to be the bad guy, we hold back the painful words. And what&apos;s the result? The organization slowly sinks, and the people who got on the boat with us scatter, carrying nothing but the memory of failure. Time spent in an organization that never wins, no matter how warm the process felt, ends up as poison.&lt;/p&gt;
&lt;p&gt;When I think about it, why did we gather in the first place? For social bonding? To collect a paycheck? No. We came together to achieve something, in other words, to &lt;em&gt;win&lt;/em&gt;. But at some point we forgot about winning. We seem to have even forgotten how to define it. Watching all those nights and all that passion evaporate into the single word &quot;failure&quot; is a sad thing.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The paradox of the AI era&lt;/h2&gt;
&lt;p&gt;It&apos;s the AI era. Coding has AI helping out, design mockups pour out in seconds. Data analysis no longer takes days the way it used to. The tooling has leaped forward. Productivity, in theory, should be tens of times higher. But something&apos;s strange. Why are the essential problems organizations face the same as they were ten years ago?&lt;/p&gt;
&lt;p&gt;Technology changes at the speed of light, but the way people work together is still stuck in stone-age inertia. Better tools don&apos;t make organizations smarter. If anything, the convenience of better tools makes it easier to hide behind them and ignore the real flaws in communication and decision-making. Tens of thousands of Slack messages fly back and forth, but there is zero shared agreement on &quot;where are we actually going right now?&quot;&lt;/p&gt;
&lt;p&gt;What it comes down to is this: the problem isn&apos;t the tool. It&apos;s people and systems. AI can write code for us, but it won&apos;t define which &quot;win&quot; our organization absolutely has to take this quarter. That&apos;s entirely on us. Yet instead of doing the defining work, we waste energy bringing in flashier tools and building more complicated processes.&lt;/p&gt;
&lt;p&gt;I did the same thing. Early on, I genuinely believed adopting a new tool would solve the organization&apos;s problems. I thought Notion would fix information sharing, Jira would make projects run cleanly. It didn&apos;t take long to see how naive that was. Tools don&apos;t solve problems. They just expose the hidden ones more clearly.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The trap of the leader going it alone&lt;/h2&gt;
&lt;p&gt;Let&apos;s go back to Lee Seung-gun&apos;s confession. The leader&apos;s biggest enemy isn&apos;t an external competitor. It&apos;s their own way with words and their own conviction. When the leader speaks too well, the team stops thinking critically. When the leader&apos;s energy runs too hot, the whole organization sprints at full speed in the wrong direction.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a problem only at the C-level. For senior engineers and lead designers too, the moment any of them thinks &quot;I&apos;m right,&quot; they&apos;ve already walked into the trap. &quot;I&apos;ve worked in this field for ten years,&quot; &quot;Last time I succeeded with this approach&quot; (the curse of experience covers the organization&apos;s eyes).&lt;/p&gt;
&lt;p&gt;I fell into that mode plenty of times during my CTO years. Thinking back makes my face burn. The one I remember most was when we were designing a new system. I was certain microservices were the right answer. One of the engineers asked, &quot;At our current scale, do we really need to bring in MSA? Wouldn&apos;t going monolith and moving fast be better?&quot; I dismissed the question as a lack of technical understanding. (It&apos;s genuinely embarrassing now.) I believed the architecture I&apos;d designed was the answer. We invested six months building a complex system and couldn&apos;t even properly launch a single feature the customers wanted. That engineer was right. What we needed wasn&apos;t elegant architecture, it was fast execution.&lt;/p&gt;
&lt;p&gt;My way with words may have gotten the team excited, but the result was leading them onto the wrong battlefield. The leader going it alone becomes the ceiling that suppresses the organization&apos;s potential. A study of overseas startup failures keeps pointing to the same line: &quot;When the leader becomes the primary doer or the ultimate reviewer, they inadvertently cap the organization&apos;s potential.&quot; The moment the leader decides everything and reviews everything, the organization&apos;s intelligence collapses into the leader&apos;s intelligence alone. That&apos;s not what a winning organization looks like.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The team that only does what it&apos;s told&lt;/h2&gt;
&lt;p&gt;The opposite case exists too. The leader has lost direction, and the team is in pure &quot;do-only-what-you&apos;re-told&quot; mode. I call this the &quot;n-people-equals-1&quot; problem. Ten people gather, and instead of multiplying their output, the total doesn&apos;t even add up to one person&apos;s worth. Each person handles the ticket on their plate cleanly, but no one cares what value those tickets add up to.&lt;/p&gt;
&lt;p&gt;As a middle manager I once hit a goal on time with my team. We built what we&apos;d planned within the deadline, shipped it, and got the result we&apos;d targeted. But honestly, looking back, that project contributed exactly zero to the company&apos;s growth. The goal itself was wrong, or it was disconnected from what the market needed. And I took shelter in the relief of &quot;I did my part.&quot; It was a cowardly relief. That same relief never translated into any reward for the teammates who&apos;d ground through implementing features without even knowing why, and the team&apos;s mood was completely shattered. It was a tragedy.&lt;/p&gt;
&lt;p&gt;If you compare this kind of organization to a sports team, it&apos;s like one where the defenders only guard their zone and the strikers only wait for the ball to arrive. The game is won by scoring goals, but no one runs toward the goal. They just stand wherever the coach told them to stand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;If scoring is the goal, I want to decide where to run myself.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This isn&apos;t arrogance. It&apos;s a hunger for victory. A player who really wants to win reads the flow of the match, finds the open space, and moves on their own. The coach&apos;s tactics are a guide, but the final call on the field has to belong to the player. Yet many organizations strip teammates of that judgment. A single line, &quot;Just do what you&apos;re told,&quot; tramples the chance of winning.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Five years of respecting the team and failing anyway&lt;/h2&gt;
&lt;p&gt;So if you respect the team without limit and give them full autonomy, do you win? The first five years of Toss show the counter-example. Lee Seung-gun says he wanted to be a &quot;really good CEO&quot; early on. He was so grateful to the team that he couldn&apos;t be tough with them, and he kept giving them more chances. The result? Five straight years of failure.&lt;/p&gt;
&lt;p&gt;The moment the failure was confirmed, those &quot;good experiences&quot; instantly turned into &quot;memories I want to delete.&quot; The team responded coldly: &quot;The time I worked with you is something I want to erase from my life.&quot; It hurts, but that&apos;s the reality. In an organization that&apos;s gotten used to losing, &quot;kindness&quot; is just another word for irresponsibility.&lt;/p&gt;
&lt;p&gt;I made a similar mistake when I was a leader. One of my teammates was running a project that kept slipping. The teammate had the skills but was struggling to set priorities. I could see it. But I held back sharp feedback because I worried about hurting the team&apos;s mood, because the teammate looked exhausted. I said, &quot;It&apos;s okay, take your time.&quot; Even when failure was clearly coming, I kept floating baseless optimism that &quot;we&apos;re doing great.&quot;&lt;/p&gt;
&lt;p&gt;Three months later the project got shut down. As that teammate left, they said this: &quot;I wish you&apos;d told me earlier. I didn&apos;t know what I was doing wrong.&quot; That&apos;s when it hit me. The way a leader truly respects the team isn&apos;t by making them feel good, it&apos;s by winning together with them. Real respect sometimes requires the courage to say the painful truth.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What is winning&lt;/h2&gt;
&lt;p&gt;So what is this &quot;win&quot; we should be hungering for? Just hitting a revenue target? Going public? Sure, those can be metrics of winning. But the essential win is &lt;strong&gt;&quot;every person in the organization feeling the win in the result.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It isn&apos;t simply filling in a target number. It&apos;s the state where the product we built actually changes a customer&apos;s life when it goes out into the world, and through that process all of us share the overwhelming sense that &quot;we pulled it off.&quot; That&apos;s the real win.&lt;/p&gt;
&lt;p&gt;Winning is addictive. An organization that&apos;s tasted winning once moves on its own toward the next one. An organization that&apos;s gotten used to losing, on the other hand, gets used to blaming external causes and pointing fingers at each other. Winning is the best medicine for every conflict in an organization. Winning doesn&apos;t make every problem disappear, of course, but at least it generates the energy to solve them. Winning is the blood that runs through an organization. The way blood has to circulate for life to continue, an organization needs winning to breathe.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The real relationship between coach and player&lt;/h2&gt;
&lt;p&gt;A winning organization looks a lot like a well-trained elite sports team. Think about the head coach of a soccer team. The coach analyzes the opponent and builds tactics that play to our strengths. But once the match starts, the coach can&apos;t run onto the field.&lt;/p&gt;
&lt;p&gt;A player who has the ball on the field has to decide in 0.1 seconds. Pass, dribble, or shoot? If that player hesitates because they&apos;re checking with the coach on the bench, the team will never win.&lt;/p&gt;
&lt;p&gt;Winning teams have clear traits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shared goal&lt;/strong&gt;: Every player is aligned on &quot;we win today, no matter what.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Role expertise&lt;/strong&gt;: The keeper stops goals, the striker scores. They respect each other&apos;s territory, but they help when help is needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autonomy on the ground&lt;/strong&gt;: Within the broad frame of the tactics, the player&apos;s creative judgment is respected to the extreme.&lt;/p&gt;
&lt;p&gt;What about our organization? Is the leader stepping onto the field and grabbing the players&apos; feet? Or are the players standing around in a daze, not even knowing where the ball is? A winning team moves organically without the coach&apos;s instructions. That&apos;s the power of a system.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What a PM is actually for&lt;/h2&gt;
&lt;p&gt;The PM (Product Manager) role matters here. Many organizations treat the PM as a &quot;requirements messenger&quot; or a &quot;schedule keeper.&quot; But in a winning organization, the PM has to be a &lt;strong&gt;&quot;win designer.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A PM isn&apos;t someone who lists features. A PM has to prove &quot;if we build this feature, why does it make us win?&quot; Between technical constraints, business goals, and customer needs, a PM has to find the equation for victory.&lt;/p&gt;
&lt;p&gt;I felt this in my bones when I took on the PM role. If the PM can&apos;t define what winning is, the engineers and designers end up grinding through meaningless labor. A PM isn&apos;t someone who tells the team &quot;what to build.&quot; A PM has to be someone who convinces the team &quot;why we have to win this fight.&quot; A PM&apos;s strongest weapon isn&apos;t data or a spec doc, it&apos;s the conviction that they can lead the team to a win.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The courage to give things up&lt;/h2&gt;
&lt;p&gt;One thing organizations that don&apos;t win have in common is &quot;trying to do everything.&quot; Everything matters, nothing can be cut. So resources scatter, and they don&apos;t win on any battlefield.&lt;/p&gt;
&lt;p&gt;To win, you have to know how to give things up. Focus on one goal, and you can have a clear experience of winning or losing. Mess around with several at once and fail, and you can&apos;t even tell why you failed. You just hide behind the cowardly excuse, &quot;we failed because we didn&apos;t have enough resources.&quot;&lt;/p&gt;
&lt;p&gt;One of the most painful experiences I had was this. We were running three new projects at the same time. Headcount was limited, and I judged that all three were important. To be honest, I was afraid to decide which one to give up. (I didn&apos;t know back then that postponing a decision is also a decision.) The result? All three fizzled out partway through. If we&apos;d gone all-in on one, at least one would have made it, and that was the price of being greedy. That&apos;s when I learned. You have to be able to give things up to focus, and you have to focus to win. One of the leader&apos;s most important jobs is deciding &quot;what we will not do.&quot; It&apos;s genuinely hard. But it has to be done. Giving up isn&apos;t losing. It&apos;s a strategic retreat for a bigger win.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The signs of an organization falling apart&lt;/h2&gt;
&lt;p&gt;An organization without winning collapses slowly, but with certainty. The signs show up in three ways.&lt;/p&gt;
&lt;p&gt;First comes &lt;strong&gt;talent drain&lt;/strong&gt;. Talented people have an uncanny nose for the smell of victory. In an organization where no win is in sight, they pack their bags first. The moment they leave, the skills and strategy leave with them. A talented person constantly asks themselves, &quot;Can I grow in this organization?&quot; They know instinctively that growth isn&apos;t possible without winning. Talented people don&apos;t follow money, they follow the experience of winning.&lt;/p&gt;
&lt;p&gt;Second comes &lt;strong&gt;the leader&apos;s isolation&lt;/strong&gt;. With no winning, the leader&apos;s words lose force. The team starts treating the leader&apos;s vision as an empty shout. The leader reaches for more coercive measures, which triggers more pushback, and the loop tightens.&lt;/p&gt;
&lt;p&gt;Third comes &lt;strong&gt;cultural decay&lt;/strong&gt;. In the empty space left by a shared goal called winning, politics and cynicism move in. The mindset that &quot;it won&apos;t work anyway, just do it casually&quot; takes over. Cynicism is like a cancer cell eating away at the organization.&lt;/p&gt;
&lt;p&gt;Look at outside cases. Eighty-two percent of startups fail not because they ran out of money but because of bad management and leadership. Winning organizations are different. Georgia&apos;s TBC Bank used OKRs to align a 1,200-person organization on one goal and became the best digital bank of 2024. In Korea, Coupang set the audacious goal of &quot;Rocket Delivery,&quot; measured it in real time, and seized the win. After Kakao adopted OKRs, project speed went up 1.5x, and Baemin (Korea&apos;s top food-delivery app, run by Woowa Brothers) clarified the purpose of cross-team collaboration and built the foundation for winning. They all &quot;defined&quot; winning and &quot;measured&quot; it. OKRs or anything else, the methodology doesn&apos;t matter. What matters is whether you&apos;re showing the organization the direction of victory. Or whether the organization feels it&apos;s heading in the direction of victory.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;In closing&lt;/h2&gt;
&lt;p&gt;As I close this piece, I ask myself.&lt;/p&gt;
&lt;p&gt;&quot;Am I winning right now?&quot;&lt;/p&gt;
&lt;p&gt;Or, &quot;Is the organization I belong to running toward winning?&quot;&lt;/p&gt;
&lt;p&gt;Winning doesn&apos;t arrive by accident. Winning comes at the end of brutal self-honesty, the courage to take painful feedback, and the stubborn will that says &quot;we will win, no matter what.&quot;&lt;/p&gt;
&lt;p&gt;There may be a counter-argument that the leader has to provide direction. That&apos;s right. The leader has to provide direction. The point is that &lt;strong&gt;&quot;direction is the leader&apos;s, the process belongs to the team.&quot;&lt;/strong&gt; Pointing at the goal is on the leader; how the player breaks through with what dribble belongs to the player.&lt;/p&gt;
&lt;p&gt;There&apos;s no future for an organization that can&apos;t define winning. It just repeats past failures and fades away. But if we start defining winning today, telling each other the painful but necessary words, and getting fully into one goal, the future can change. Winning is a choice. And that choice is in our hands right now.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Practices for winning, and the heart to start again&lt;/h2&gt;
&lt;p&gt;As I tried to wrap up, I figured the question &quot;so how do we actually do it?&quot; would come, so I&apos;m adding a few concrete practices. These are lessons from running a company as a CEO for five years and from four years inside a CTO seat. Not theory, the kind you learn by getting cracked open on the ground.&lt;/p&gt;
&lt;h3&gt;The power of 1-on-1s&lt;/h3&gt;
&lt;p&gt;The bigger the organization gets, the further the leader drifts from the ground. The strongest tool for this is the 1-on-1. It isn&apos;t a slot for checking task progress. It has to be the slot where you check what your teammate is worrying about, where they think the bottleneck in the organization is, and whether they&apos;re feeling a &quot;win&quot; inside this organization.&lt;/p&gt;
&lt;p&gt;I regret nothing more than how I neglected 1-on-1s in the organization I ran. I postponed them biweekly with the excuse of being busy, and they fizzled into monthly. Resentment built up among the team in that gap, and I caught it way too late. A conversation that misses its window comes back later at tens of times the cost. Conversation is the lubricant of an organization. When the lubricant runs dry, the engine burns.&lt;/p&gt;
&lt;h3&gt;Transparent information sharing&lt;/h3&gt;
&lt;p&gt;To win, everyone has to be looking at the same map. Information that only the executive team knows, context shared only among leaders, turns the team into &quot;alienated workers.&quot; Why we&apos;re doing this project, what the company&apos;s financial state actually is, what real crisis we&apos;re facing — these have to be shared transparently. Information asymmetry breeds distrust, and distrust breaks the will to win.&lt;/p&gt;
&lt;h3&gt;Retros for failure, celebration for wins&lt;/h3&gt;
&lt;p&gt;There are plenty of organizations that blame people when things fail, but few that retro them properly. We have to record and share why we failed and what we&apos;ll do differently next time. Equally, fully celebrating when we win matters. Small wins stack into a culture of bigger wins. Retros breed wisdom, celebration breeds energy.&lt;/p&gt;
&lt;h3&gt;Being obsessed with the customer&lt;/h3&gt;
&lt;p&gt;In the end, every win comes from the customer. Engineers and designers have to hear the customer&apos;s voice directly. Writing code only from the doc the PM put together is just &quot;winning by proxy.&quot; When the maker witnesses how a single line of their code solved a customer&apos;s problem, they experience the real win. The customer is our only North Star.&lt;/p&gt;
&lt;h3&gt;Psychological safety and a high bar&lt;/h3&gt;
&lt;p&gt;For ambitious attempts, you need psychological safety, a confidence that mistakes won&apos;t get you punished. At the same time, a high bar has to hold. Safe with a low bar, and the organization stagnates. High bar with no safety, and the organization burns out. Balancing the two is the leader&apos;s core capability. When you chase a high bar inside a safe environment, the best output shows up.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Ready to start over&lt;/h3&gt;
&lt;p&gt;Coming back to being someone living a private life — for what it&apos;s worth, after running a big organization, and looking back, what&apos;s left isn&apos;t a flashy tech stack or a grand architecture. What&apos;s left is just memory of &quot;people,&quot; &quot;winning,&quot; and &quot;failure.&quot; The colleagues I pulled all-nighters with to solve problems, the moments we shared a beer over the joy of a launch, all of that made me. There were genuinely happy moments, no question.&lt;/p&gt;
&lt;p&gt;Even so, all those efforts failed to convert into real business value, real customer value. Eventually, I started judging people&apos;s ability and loyalty by how long and how much they worked. Whatever value, vision, or story I tried to share, my words no longer earned their respect. The memory of that &quot;failure&quot; still cuts deep.&lt;/p&gt;
&lt;p&gt;Back then I had a lot of urge to defend myself, a lot of bitterness, but now it&apos;s time to move forward again.&lt;/p&gt;
&lt;p&gt;I&apos;m preparing a new beginning now. With the failures and wins of the past as compost, I&apos;m dreaming of a &quot;winning organization&quot; once more. The person reading this is probably the same. We&apos;re all people hungering for victory in our own arenas.&lt;/p&gt;
&lt;p&gt;For the time being I&apos;ll be focused on a two-person team with Ellie, but if I ever take responsibility again as a middle manager inside another company, I want to be responsible for an organization where autonomy in the process is guaranteed and only the result is accountable, where the direction of victory is communicated clearly to everyone, so that everyone moves toward the goal on their own.&lt;/p&gt;
&lt;p&gt;I sincerely hope your organization, your team, and you yourself win today. As for me, I&apos;m just going to keep showing up tomorrow and trying to define one more thing worth winning.&lt;/p&gt;
&lt;p&gt;In the end, winning belongs to those who don&apos;t give up.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Winning solves everything.&quot;&lt;/p&gt;
&lt;p&gt;— Tiger Woods&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;I&apos;m using this piece as my 2025 retrospective. For me, 2025 was a time of recovery. Maybe close to a sabbatical. There was a piece I&apos;d written long ago and put aside. Too negative, too full of blame, the kind I couldn&apos;t bring myself to publish. From where I stand now, I polished and re-polished it, and I&apos;m publishing it as a piece that helps me move forward. I hope it heals you the way it healed me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&apos;t have a religion, but if there&apos;s a god, I&apos;d want to pray always: &quot;Take from me my anger toward others, let me embrace and understand them, let me face my own interior, and give me the courage to take one more step forward.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>essay</category><category>leadership</category><category>organizational-culture</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>MVP in the AI Era: Product Lessons from Linear</title><link>https://flowkater.io/en/posts/2026-01-20-ai-mvp-linear-lessons/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-01-20-ai-mvp-linear-lessons/</guid><description>I read through Linear founder Tuomas Artman&apos;s MVP playbook and tried to figure out what actually matters when AI has stripped product development down to almost nothing.</description><pubDate>Tue, 20 Jan 2026 05:30:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;Half-baked products die. AI has driven the cost of building down to almost nothing, which means anyone can ship fast, which means &lt;strong&gt;what&lt;/strong&gt; you build is now everything. Product Market Fit has to mean a product that sells without marketing. Is that the level our MVP is at?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/linear-app.png&quot; alt=&quot;linear.app&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Truth is, when I scroll Threads I keep seeing solo developers drowning in marketing. There&apos;s an argument going around that &quot;AI handles the build, so marketing is everything,&quot; and I sympathize to a point. But lumping it all under &quot;marketing&quot; is a cop-out. The word marketing covers content, performance, sales, and yes, the customer development I&apos;m writing about here.&lt;/p&gt;
&lt;p&gt;I learned a lot from studying Linear while I was deep in customer development and MVP work. The lessons are practical enough for early SaaS that I wanted to write them down. The interesting thing is how much of what I&apos;m reading now in &lt;em&gt;Solving Product&lt;/em&gt;, plus Linear founder Tuomas Artman&apos;s writing, kept overlapping.&lt;/p&gt;
&lt;h2&gt;The modern MVP is a different animal&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Building something valuable is no longer about validating a novel idea as fast as possible. Instead, the modern MVP exercise is about building a version of an idea that is different from and better than what exists today.&quot;&lt;/p&gt;
&lt;p&gt;— Tuomas Artman, Linear&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Linear&apos;s founder is direct about it. The MVP is no longer &quot;validating an idea fast and cheap.&quot;&lt;/p&gt;
&lt;p&gt;The MVP that Eric Ries defined in &lt;em&gt;The Lean Startup&lt;/em&gt; in 2011 was &quot;the version that gets you the most validated learning for the least effort.&quot; Back then Airbnb had to validate &quot;would anyone sleep at a stranger&apos;s house?&quot; and Lyft had to test &quot;does ride-sharing actually work?&quot; The ideas themselves were brand-new categories.&lt;/p&gt;
&lt;p&gt;What about now? Most categories are already saturated. Someone has built it. Someone has built it better. So a new product survives by proving it&apos;s better than what&apos;s already out there, not by validating that the idea exists.&lt;/p&gt;
&lt;p&gt;The gap is enormous. In a validation phase, a rough prototype is fine. When you&apos;re competing (and users already know the alternatives), your product has to be substantially better.&lt;/p&gt;
&lt;p&gt;&quot;Just ship fast&quot; doesn&apos;t cut it anymore. As Linear learned, today&apos;s MVP has to be a competitive product, sharpened over time. And to get there, you have to be clear from day one about what you&apos;re actually building.&lt;/p&gt;
&lt;h2&gt;The power of narrowing the target&lt;/h2&gt;
&lt;p&gt;Linear&apos;s strategy was simple.&lt;/p&gt;
&lt;p&gt;The company&apos;s vision was to &quot;become the standard for how software is built.&quot; That&apos;s enormous ambition. But if Linear had targeted every developer and every team at the MVP stage, they would have failed. Resources would have been spread thin and feedback would have been all over the place.&lt;/p&gt;
&lt;p&gt;So Linear narrowed the target to an extreme. &lt;strong&gt;&quot;Individual Contributors at small startups.&quot;&lt;/strong&gt; More specifically: &quot;engineers at small teams who were struggling with issue tracking.&quot;&lt;/p&gt;
&lt;p&gt;And they focused on three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast&lt;/strong&gt;: local storage, no page reloads, works offline&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modern&lt;/strong&gt;: keyboard shortcuts, command menu, context menus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiplayer&lt;/strong&gt;: real-time sync, teammate presence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The interesting part is that Linear&apos;s founders were exactly the ideal customer. Their strategy was &quot;let&apos;s build it for ourselves.&quot;&lt;/p&gt;
&lt;p&gt;I had a similar struggle when I first started a startup. I genuinely did design the early product around a target customer, and we hit decent enough metrics to raise a round. But after the funding came in, growth flatlined, and instead of staying loyal to that core customer, I kept tacking on features that users requested in order to expand the surface. I&apos;d pull all-nighters on a feature and then sigh through the morning. The metrics never moved. The customers didn&apos;t actually want it.&lt;/p&gt;
&lt;p&gt;Looking back, the first thing I should have done was define &quot;who are the customers we genuinely love?&quot;&lt;/p&gt;
&lt;p&gt;There&apos;s a catch worth flagging here. Linear&apos;s &quot;ICs at small startups&quot; wasn&apos;t just a narrow slice. It was a group with &lt;strong&gt;strong motivation and high expectations&lt;/strong&gt;. Translated: people who knew they had a problem and were already looking for a solution.&lt;/p&gt;
&lt;p&gt;That&apos;s the central lesson in &lt;em&gt;Solving Product&lt;/em&gt; too. Find the &lt;strong&gt;High-Expectation Customer&lt;/strong&gt;. The customer for whom your product feels less like an option and more like a lifeline. The kind of customer who, like a patient who can&apos;t function without a specific medication, feels &quot;if this disappears, I have a real problem.&quot;&lt;/p&gt;
&lt;h2&gt;Feedback loops and how to use a waitlist&lt;/h2&gt;
&lt;p&gt;Linear&apos;s second lesson was how to use a waitlist.&lt;/p&gt;
&lt;p&gt;A lot of startups treat the waitlist as a &quot;marketing channel&quot; or a way to inflate the user count. Linear thought differently. The waitlist was &lt;strong&gt;the whetstone for the product&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Concretely, Linear:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Asked specific questions at signup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What&apos;s the size of your company?&lt;/li&gt;
&lt;li&gt;What&apos;s your role?&lt;/li&gt;
&lt;li&gt;What are you using right now?&lt;/li&gt;
&lt;li&gt;What&apos;s frustrating about your current tool?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Invited the people who could actually give feedback first. Linear only integrated with GitHub, so they started with founders of small startups who used GitHub.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Listened to the feedback and iterated. They kept polishing the existing features until &quot;new feature requests&quot; tapered off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once things stabilized, they invited the next segment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Why does this matter? Because &lt;strong&gt;feedback from the wrong customer breaks your product&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Solving Product&lt;/em&gt; warns about this directly. &quot;The average of all feedback leads to a terrible product.&quot; That&apos;s not a value judgment, it&apos;s math. Try to converge a hundred different needs and you end up with the average product. The bland one.&lt;/p&gt;
&lt;p&gt;Go the other way and listen only to a tiny, eccentric feedback group? Then you build &quot;a product for very strange people.&quot; That&apos;s why balance matters.&lt;/p&gt;
&lt;p&gt;The most effective approach ends up being:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Selecting early customers with clear criteria&lt;/strong&gt; (is our target unambiguous?)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Going deep with that group&lt;/strong&gt; (a lot of people vs. a few you understand intimately)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Acting only on patterns in the feedback&lt;/strong&gt; (recurring issues, not one-off requests)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Defining and segmenting customers properly is genuinely critical. Like a sculptor chipping away the unnecessary marble to reveal what&apos;s essential, even inside a segment you have to keep what&apos;s core and ruthlessly remove the rest.&lt;/p&gt;
&lt;h2&gt;How to find high-expectation customers&lt;/h2&gt;
&lt;p&gt;So who counts as a &quot;high-expectation customer&quot;?&lt;/p&gt;
&lt;p&gt;Tuomas at Linear asked customers directly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;What would happen if Linear didn&apos;t exist?&quot;&lt;/li&gt;
&lt;li&gt;&quot;What&apos;s the biggest help Linear gives you?&quot;&lt;/li&gt;
&lt;li&gt;&quot;How could it get better?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &quot;I&apos;d genuinely miss it&quot; customers were the early group.&lt;/p&gt;
&lt;p&gt;Flip that around: a customer who used the product because it &quot;seemed convenient&quot; can be dropped from the waitlist. They didn&apos;t really commit, and they&apos;ll bolt the moment a better alternative shows up. At the PMF stage you need customers who &lt;em&gt;love&lt;/em&gt; the product. Not customers who like it.&lt;/p&gt;
&lt;p&gt;The obvious question lands here: &quot;If we don&apos;t even have a product yet, how do we find customers like that ahead of time?&quot;&lt;/p&gt;
&lt;p&gt;The trick is to start from &lt;strong&gt;the opportunity&lt;/strong&gt;, not the product. The product is, in the end, a solution to a customer&apos;s problem or desire. Which means even before the product exists, the people who feel that problem urgently are already out there. Find them first.&lt;/p&gt;
&lt;p&gt;The flow looks like this. Define the opportunity you&apos;re trying to solve. Go find the customers who are actually living through it. Talk to them, understand their context. Then put the MVP in their hands, and that&apos;s the moment you find out whether they&apos;re really high-expectation customers. Customer comes before product, and opportunity comes before customer.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Solving Product&lt;/em&gt; spells it out further. A high-expectation customer is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Someone who recognizes your product&apos;s core advantage&lt;/li&gt;
&lt;li&gt;Someone with strong motivation to solve their own problem&lt;/li&gt;
&lt;li&gt;Someone with high expectations of the product&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Put plainly, &quot;someone for whom this isn&apos;t one of several solutions, it&apos;s their only hope.&quot;&lt;/p&gt;
&lt;p&gt;My own experience matched this. The customers who actually paid and stuck around in the early days were almost all the ones saying &quot;if this disappears, I have a real problem.&quot; The ones who used it because it &quot;seemed convenient&quot; left the moment a better option showed up.&lt;/p&gt;
&lt;p&gt;So the early playbook is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find five high-expectation customers&lt;/li&gt;
&lt;li&gt;Make those five genuinely happy&lt;/li&gt;
&lt;li&gt;Ignore what the other hundred want (early on, only)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That sounds harsh, but it&apos;s the only way to raise the odds of success.&lt;/p&gt;
&lt;p&gt;I once worked at a company that mostly did B2B SaaS. The CEO was selling to &quot;potential customers,&quot; and &quot;potential customers&quot; said they&apos;d buy if &quot;this one feature&quot; existed. We&apos;d burn three weeks of team time building a brand-new feature for a $10/month enterprise customer. At the time I thought that was the right call. MRR impact: 0%. The feature only ever served that one company, and the next sales opportunity never came.&lt;/p&gt;
&lt;p&gt;Watching B2B SaaS companies in Korea, the pattern I kept seeing was startups that started out with conviction in their product, then slowly turned into outsourcing shops after raising a round. Chasing (potential) customer needs cost them their identity. Yes, the domestic market is small and the core customer pool is genuinely tiny, but the path to success is to refuse the easy substitutes and push head-on toward satisfying only the customers who actually love your product.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Solving Product&lt;/em&gt; hammers the same point. A &quot;potential customer&quot; is not a customer. The customer is the person paying out of their own pocket and using your product. Worth asking sometimes whether we&apos;re being yanked around by too many &quot;potential customer&quot; voices. (That includes friends and family if they&apos;re not the target.)&lt;/p&gt;
&lt;h2&gt;What the modern MVP boils down to&lt;/h2&gt;
&lt;p&gt;Pulling Linear&apos;s case together with &lt;em&gt;Solving Product&lt;/em&gt;&apos;s lessons, here&apos;s what the modern MVP looks like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Building a competitive product, not validating an idea.&lt;/strong&gt; Sharpening, not just shipping fast.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Narrowing the target to an extreme.&lt;/strong&gt; Giving up on &quot;for everyone.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managing the feedback loop strategically.&lt;/strong&gt; Finding patterns, not collecting opinions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Centering high-expectation customers.&lt;/strong&gt; A few who &lt;em&gt;love&lt;/em&gt; it beats many who &lt;em&gt;like&lt;/em&gt; it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built to a level that sells without marketing.&lt;/strong&gt; PMF is the product as evidence, not the campaign.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The final criterion is the cleanest. If your product genuinely has PMF, &lt;strong&gt;word of mouth happens without marketing.&lt;/strong&gt; The state where high-expectation customers can&apos;t stop telling people around them.&lt;/p&gt;
&lt;h2&gt;The AI era, and the question that&apos;s left&lt;/h2&gt;
&lt;p&gt;The faster development gets, the more &lt;strong&gt;what you build&lt;/strong&gt; matters. Thanks to AI, anyone with a decent idea can ship quickly. Which means the competitive edge is no longer execution speed. It&apos;s a sharper target, deeper customer understanding, and the courage to delete fifty percent.&lt;/p&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;Honestly, the word &quot;MVP&quot; used to frustrate me. The &quot;minimum&quot; part. But looking back at the last few years, that &quot;minimum&quot; was actually the most aggressive choice you could make.&lt;/p&gt;
&lt;p&gt;Following Linear&apos;s story, this is what hit me: &lt;strong&gt;you have to build a product that sells without marketing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;How is that even possible? The answer is in everything I covered above.&lt;/p&gt;
&lt;p&gt;First, abandon the fantasy of &quot;a product for everyone.&quot; Instead, &lt;strong&gt;find high-expectation customers through extremely narrow targeting.&lt;/strong&gt; Not trying to clothe everyone, but tailoring a bespoke suit for one person. Picture three to five specific people, get clear on what they actually need. The moment you change the question from &quot;for everyone&quot; to &quot;for this person,&quot; your product gets a direction.&lt;/p&gt;
&lt;p&gt;The next part is courage. When the feedback floods in, you have to choose. Tune out family and friends. Listen only to actual customers. And only act when the same problem shows up three times or more. One person&apos;s request is unique, but a pattern is universal. Holding direction matters more than absorbing every piece of feedback.&lt;/p&gt;
&lt;p&gt;The core is this. &lt;strong&gt;Find the customers who&apos;d be genuinely disappointed to lose your product, and pour everything into satisfying them perfectly.&lt;/strong&gt; Other customers come later. In the early days, all your energy goes to those five high-expectation customers. When they say &quot;I&apos;d really miss it,&quot; you&apos;ve found PMF.&lt;/p&gt;
&lt;p&gt;The discipline through all of this is choice and focus. You have to be able to ask &quot;what gets cut if we removed it and the core value still lands?&quot; and then delete fifty percent of the features. Like chipping marble away to reveal the statue, the essence emerges as the unnecessary parts get removed. Linear probably wanted to pack in tons of features at first. They removed the ones they didn&apos;t need. That became the competitive edge.&lt;/p&gt;
&lt;p&gt;The faster AI makes development, the more critical this kind of choice and focus becomes. The technical difficulty is already solved.&lt;/p&gt;
&lt;p&gt;In an era where AI is making development cheap, only one thing is left.&lt;/p&gt;
&lt;p&gt;&quot;Who are you building this product for?&quot;&lt;/p&gt;
&lt;p&gt;It isn&apos;t marketing. It isn&apos;t scale. What we have to wrestle with is who we&apos;re really building this for.&lt;/p&gt;
&lt;p&gt;The work in front of you is clear:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Core principle&lt;/th&gt;
&lt;th&gt;How to do it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built to sell without marketing&lt;/td&gt;
&lt;td&gt;Sharpen the product into its own evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extremely narrow targeting&lt;/td&gt;
&lt;td&gt;Define three to five specific customers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-expectation-customer focus&lt;/td&gt;
&lt;td&gt;Make only the customers who love it perfectly happy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strategic feedback&lt;/td&gt;
&lt;td&gt;Act only on recurring patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Courage to delete fifty percent&lt;/td&gt;
&lt;td&gt;If it doesn&apos;t carry the core value, cut it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The smallest team with the strongest clarity will always beat the largest team with the most confusion.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Books worth reading alongside&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Solving Product&lt;/strong&gt;&lt;/em&gt; (Ravi Mehta, translated by Lee Yong-bin). A concrete unpack of high-expectation customers and opportunity-driven thinking. Half of this post came from here.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Continuous Discovery Habits&lt;/strong&gt;&lt;/em&gt; (Teresa Torres). A framework for turning ongoing customer conversations into a habit. Read it if you want to systematize the feedback loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://linear.app/now/rethinking-the-startup-mvp-building-a-competitive-product#the-mvp-is-a-journey-not-one-moment-in-time&quot;&gt;Rethinking the Startup MVP: Building a Competitive Product - Linear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.yes24.com/product/goods/123430681&quot;&gt;Solving Product - Ravi Mehta, translated by Lee Yong-bin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2019-12-lean-customer-questions/&quot;&gt;Lean Startup - customer questions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2025-03-continuous-discovery-notes/&quot;&gt;Continuous Discovery Habits notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ellie&apos;s reading notes&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks to Ellie. This piece was inspired by the reading notes Ellie prepared for our &lt;em&gt;Solving Product&lt;/em&gt; study group.
&amp;lt;/content&amp;gt;
&amp;lt;/invoke&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>product</category><category>discovery</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>F1 Leadership: What Did James Vowles Actually Do? An Engineer&apos;s Take</title><link>https://flowkater.io/en/posts/2026-01-09-f1-leadership-james-vowles/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-01-09-f1-leadership-james-vowles/</guid><description>I broke down how James Vowles revived Williams, the perennial last-place team. How he changed a team that managed 20,000 parts in Excel, why a no-blame culture and a long-term view matter, and how he convinced Carlos Sainz. Behind the results (a confirmed 5th in the 2025 Constructors&apos; standings and two podiums), there&apos;s a kind of leadership worth pulling apart.</description><pubDate>Fri, 09 Jan 2026 11:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Where this came from&lt;/h2&gt;
&lt;p&gt;Last year I watched F1 live, week after week, and it was a year I cried, laughed, and found pure joy.&lt;/p&gt;
&lt;p&gt;My wife Ellie and I were Williams fans, Carlos Sainz fans more specifically. The handsome face, the kind of warmth everyone responded to, plus the absolutely stunning driving he showed across the 2025 season. It made for a very happy stretch of weekends.&lt;/p&gt;
&lt;p&gt;Up through 2024 I was watching &lt;em&gt;Drive to Survive&lt;/em&gt; every season without fail. After Williams was sold and James Vowles came in as team principal, I got curious about him. Vowles first showed up on the documentary with the nickname &quot;Data Guy&quot;, and I can&apos;t forget the interview where Christian Horner, Red Bull&apos;s now-fired team principal, sneered that &quot;only rookies talk like that.&quot;&lt;/p&gt;
&lt;p&gt;Vowles is a veteran of this world. He worked under Toto Wolff at Mercedes for a long stretch (twelve years). After what Williams pulled off in the 2025 season, I started as a Sainz fan and ended the year as a Vowles fan. (I didn&apos;t know fan loyalty could shift this fast.)&lt;/p&gt;
&lt;p&gt;In 2025 Williams went from the bottom of the midfield to a confirmed P5, and Sainz climbed onto the podium twice. Ellie and I both screamed out loud, live, when Carlos crossed the line in third. I never really cared about sports my whole life, and here I was, fully sucked in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/sainz-podium-2025.webp&quot; alt=&quot;Carlos Sainz on the podium during the 2025 season with Williams&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So I got curious about how Williams Racing, and James Vowles&apos; leadership specifically, actually worked from the inside. I&apos;ve spent five-plus years as a startup founder and four years leading an R&amp;amp;D division from zero to one. Along the way I&apos;ve made just about every mistake there is to make, and watching Vowles I kept thinking, &lt;em&gt;&quot;Yeah, I should have done it more like that.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you take out the racing, an F1 team&apos;s structure is genuinely close to an IT startup&apos;s. There&apos;s a team principal, there&apos;s a CTO (in Williams&apos; case). What did James Vowles actually do to this perennial last-place team, even in a season he openly called a write-off, to land where they did? I went looking. This is what I pulled together from the articles, posts, and videos about him.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&quot;A car built in Excel&quot;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/james-vowles-interview.webp&quot; alt=&quot;Williams team principal James Vowles in interview&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The state of Williams the year Vowles took over was genuinely shocking.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The 2024 build process at Williams, including initial work, was managed in Microsoft Excel, with a list of around 20,000 individual parts and components.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(The Race, &quot;The shocking details behind an F1 team&apos;s painful revolution&quot;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An F1 car is engineering compressed to its limit. Aerodynamics, automotive engineering, data analytics, all of it. The front wing alone has about 400 distinct parts. And tens of thousands of those parts were being &lt;strong&gt;tracked in Excel&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Excel list was a joke. You couldn&apos;t search it, you couldn&apos;t update it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There was no data on part cost, build time, or queue depth. Vowles compared the situation to &quot;the Ming dynasty.&quot; The investment that should have happened over the past twenty years simply hadn&apos;t.&lt;/p&gt;
&lt;p&gt;Reading this, I felt it in my bones. That blank-feeling moment when you walk into a legacy system or an undefined process. Anyone in this industry has been there at least once.&lt;/p&gt;
&lt;p&gt;The absence of a system isn&apos;t just inefficiency. It becomes a ceiling on growth. Next time I take on a new team, the first thing I want to do is ask, &lt;strong&gt;&quot;What&apos;s the Excel in our team?&quot;&lt;/strong&gt; The bottleneck that looks fine from the outside but quietly blocks scale. Finding it and turning it into a real system is job one.&lt;/p&gt;
&lt;p&gt;[Source: &lt;a href=&quot;https://www.the-race.com/formula-1/shocking-details-behind-painful-williams-f1-revolution/&quot;&gt;The Race, &quot;The shocking details behind an F1 team&apos;s painful revolution&quot;&lt;/a&gt;]&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Choosing the painful version of change&lt;/h2&gt;
&lt;p&gt;Vowles decided to do two things at once. Move from the Excel spreadsheet to a digital system, and at the same time substantially change the car&apos;s &quot;technical baseline.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our chassis went from a few hundred pieces to a few thousand pieces. And that&apos;s just one part of the car.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As you&apos;d expect, doing both at the same time was a nightmare. Workers were pulling all-nighters at the factory, and Vowles recalls that even in January the car &quot;still looked like a big bag of parts.&quot;&lt;/p&gt;
&lt;p&gt;But Vowles says this pain was the &lt;strong&gt;necessary&lt;/strong&gt; kind.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I wanted to push the system to its absolute limit so I could see, in one go, where and how it breaks. This winter is the only winter we&apos;ll have to do that.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Motorsport.com, &quot;Vowles on what Williams F1 has done wrong&quot;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You&apos;re running a legacy system, you decide &quot;this can&apos;t continue,&quot; and you commit to a major refactor. In the short term, dev velocity drops and bugs go up, but you have to take that pain to grow long-term. It&apos;s the same dilemma in tech.&lt;/p&gt;
&lt;p&gt;It&apos;s much harder than greenfield work because something is already running. People are used to it, and changing it doesn&apos;t auto-install new habits in their heads. It&apos;s not unusual to see a team adopt a new system and then roll it back out of pure pushback. That said, &quot;running&quot; doesn&apos;t mean &quot;right.&quot; It takes courage to change it, and the kind of leadership that can pull support from above and below. Burning two whole seasons for 2026? Not many people are going to make that call.&lt;/p&gt;
&lt;p&gt;The longer you defer change, the higher the bill. When something big is on the table, I want to ask myself, &lt;strong&gt;&quot;Is this the only window to do this?&quot;&lt;/strong&gt; And if the answer is yes, then push the system to its limits and find out where it breaks before it breaks on you. That beats finding out in production.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We&apos;re trying so much in setup and on track. Sometimes we go backwards, but that ends up showing me which direction not to go, and pushes me forward.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Carlos Sainz, 2025 Saudi Arabian GP)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[Source: &lt;a href=&quot;https://www.motorsport.com/f1/news/vowles-on-what-williams-f1-has-done-wrong-too-much-change/10689141/&quot;&gt;Motorsport.com, &quot;Vowles on what Williams F1 has done wrong&quot;&lt;/a&gt;]&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;No Blame Culture&lt;/h2&gt;
&lt;p&gt;Changing systems alone doesn&apos;t change a team. What Vowles centered on was &lt;strong&gt;culture&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you work for me, I never want you to hold back on pushing the boundary or developing or innovating because you&apos;re afraid of making a mistake or losing your job.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(GPBlog interview)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vowles brought in a &quot;No Blame Culture.&quot; It&apos;s the same thing he was known for at Mercedes. Don&apos;t hide mistakes, talk about them in the open, learn from them.&lt;/p&gt;
&lt;p&gt;A culture of fear creates two specific problems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One, people only choose what&apos;s safe.&lt;/strong&gt; Instead of pushing outward, they only push to where they feel comfortable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two, when something goes wrong, people hide it.&lt;/strong&gt; They don&apos;t come out and say, &quot;I got this wrong, let me explain why I got it wrong.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The number of times I&apos;ve failed in my career is enormous. But every one of those failures, when I talked about them openly and handled them properly, made me much stronger. Success doesn&apos;t actually make you stronger. It just sits there saying, &apos;Nice job.&apos;&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Building a no-blame culture is much harder than it sounds. I tried something similar early on, and as the team grew and got busier it got harder and harder to maintain. But reading Vowles, I felt it again. This isn&apos;t optional. It&apos;s non-negotiable. The team needs an environment where every failure and every mistake becomes a learning loop, and at times I let things slide and at other times I came down too hard. If the team is aligned on a shared goal and that&apos;s how you win, then every mistake along the way is just a means of getting to the win.&lt;/p&gt;
&lt;p&gt;What this story made me realize is that the organizational setup, the kind that makes it possible for everyone to focus on the goal and the outcome, has to come first. Paradoxically, that&apos;s what makes a culture like this stick.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Share your own failures first.&lt;/strong&gt; The leader has to talk about their own mistakes openly before the team will.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus on &quot;how do we prevent this next time&quot; instead of &quot;why did this happen.&quot;&lt;/strong&gt; In retros, point at the system, not the person.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Care about the culture more, not less, when things get busy.&lt;/strong&gt; Pressure is when culture cracks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[Source: &lt;a href=&quot;https://www.gpblog.com/en/exclusive-news/vowles-team-boss-williams-f1-interview-culture-albon.html&quot;&gt;GPBlog, &quot;Vowles takes Williams by the hand&quot;&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/williams-podium-celebration.webp&quot; alt=&quot;Williams team celebrating on the podium&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1-on-1s, in the end this is the answer&lt;/h2&gt;
&lt;p&gt;The part of Vowles&apos; leadership that resonated with me most is his emphasis on communication.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I send an email to the entire factory three times a week, and we have a team meeting after every race. Walking the factory floor in person matters too.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Monocle, &quot;10 Leadership Lessons from James Vowles&quot;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He sends three all-hands emails a week, runs a team meeting after every race, and walks every corner of the factory. It sounds small, but if you&apos;ve actually tried it, it&apos;s brutal. Especially as the team grows.&lt;/p&gt;
&lt;p&gt;Looking back, this is the part I regret most. Early on I did 1-on-1s often and feedback flowed both ways, but as the team scaled it got patchier. Vowles convinced me of what I already half-knew: &lt;strong&gt;the best thing you can do is keep showing up for 1-on-1s.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Care about people genuinely. I feel real gratitude that people give me their time. They could be home with family in that hour, and instead they&apos;re with me.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This one stuck. F1 team or IT team, in the end, what&apos;s happening is people are spending their time with you. Don&apos;t forget to be grateful for that.&lt;/p&gt;
&lt;p&gt;Bottom-up feedback is hard to give. It feels harder in Korean org culture specifically. Leaders ask for it, and then look surprised when they actually get it. I think we need to build more systematic ways to make this feedback happen. It&apos;s non-negotiable, not optional.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Action items:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;A 1-on-1 schedule that&apos;s actually fixed.&lt;/strong&gt; If you push it because you&apos;re busy, you&apos;ll never do it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prepare feedback in advance.&lt;/strong&gt; At minimum one improvement point per person, prepped before you walk in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diversify communication channels.&lt;/strong&gt; Weekly all-hands email, informal chats, formal meetings, all of them.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;The long game&lt;/h2&gt;
&lt;p&gt;The part of Vowles&apos; leadership that left the strongest impression on me is the &lt;strong&gt;long-term view&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&apos;t believe in any short-termism. I won&apos;t move short-term because it doesn&apos;t fit Williams and its future.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Monocle, &quot;10 Leadership Lessons from James Vowles&quot;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He said from the start that 2024 and 2025 would be &quot;sacrificed.&quot; It was the investment needed to rebuild the team for the new technical regulations in 2026. He picked future competitiveness over present rank.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&apos;t want seventh, eighth, ninth. I want 2026 to be good. Meanwhile, others up and down the pit lane are focused on 2024 and 2025.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Motorsport.com, &quot;Why Vowles believes Williams culture will survive short-term pain&quot;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This decision had the full backing of Dorilton Capital, the team&apos;s owner. &quot;Quick fixes look impressive on the surface, but they collapse fast.&quot;&lt;/p&gt;
&lt;p&gt;Holding a long-term view is genuinely hard. Pressure for present-quarter results, stakeholder expectations, the team&apos;s own motivation. Every force in the system pushes you toward the short-term call. But watching Vowles, I came back to this: holding a long-term view requires &lt;strong&gt;a clear goal, and shared understanding of that goal.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This team is on the way up, and that flow can never be stopped.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Carlos Sainz, after the 2025 season finale)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I had full control at the org level, there were times I didn&apos;t articulate the long-term view of the company well enough, and as a middle manager there were times I deferred the responsibility upward. There were definitely places I could have done more. When the long roadmap got broken or interfered with from the outside, I wish I&apos;d been more flexible about resetting and re-controlling it.&lt;/p&gt;
&lt;p&gt;[Source: &lt;a href=&quot;https://monocle.com/business/james-vowles-leadership-lessons/&quot;&gt;Monocle, &quot;10 Leadership Lessons from James Vowles&quot;&lt;/a&gt; / &lt;a href=&quot;https://www.motorsport.com/f1/news/exclusive-vowles-williams-culture-survive-short-term-pain/10642667/&quot;&gt;Motorsport.com, &quot;Why Vowles believes Williams culture will survive short-term pain&quot;&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Action items:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Define &quot;what&apos;s our goal.&quot;&lt;/strong&gt; A clear long-term goal you won&apos;t get knocked off by short-term results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share that goal with the whole team.&lt;/strong&gt; Everyone has to know why we&apos;re absorbing this pain right now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sell the long-term vision to stakeholders too.&lt;/strong&gt; Without support from above, no long-term strategy survives.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;How he convinced Carlos Sainz&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/sainz-vowles-together.webp&quot; alt=&quot;Carlos Sainz with James Vowles&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The clearest case study of Vowles&apos; leadership is the Sainz signing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vowles spent six months in continuous communication with Carlos Sainz, openly sharing even the bad parts of Williams. He laid out the investment plan and future vision transparently, and Sainz confirmed it wasn&apos;t a fiction.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Pit Debrief, &quot;James Vowles on Williams F1 progress&quot;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s six months of consistent communication, honestly sharing the bad, laying out the investment plan and future vision openly. None of that is easy. (Actually, all of it is extremely hard.)&lt;/p&gt;
&lt;p&gt;Sainz didn&apos;t pick Williams just because he needed a seat. He understood what it would take to turn Williams into a championship team, and he wanted to be at the center of that transformation. Vowles&apos; vision landed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the project of my life. Helping put Williams back where they can win, that&apos;s why I&apos;m here.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Carlos Sainz, after the 2025 Baku Grand Prix (the Azerbaijan race), Sky Sports interview)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This kind of transparency in hiring matters more than people give it credit for. There&apos;s always a temptation to show only the good parts, but anyone you hired by hiding the bad parts leaves quickly.&lt;/p&gt;
&lt;p&gt;I&apos;ve done a lot of hiring, and a lot of faces come to mind. There were times I sold only the good parts, and times I wasn&apos;t honest enough. As the conclusion above suggests, it didn&apos;t end well. State clearly what you want, and be honest about the current state and the goal. That&apos;s the attitude.&lt;/p&gt;
&lt;p&gt;[Source: &lt;a href=&quot;https://www.pitdebrief.com/post/james-vowles-on-williams-f1-team-progress/&quot;&gt;Pit Debrief, &quot;James Vowles on Williams F1 progress&quot;&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Action items:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Share the bad parts honestly when hiring.&lt;/strong&gt; Don&apos;t hide current difficulties or unsolved problems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lay out the vision clearly.&lt;/strong&gt; &quot;It&apos;s like this now, but our goal is this,&quot; concrete and specific.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spend time building the relationship.&lt;/strong&gt; The Vowles kind of patience: six months of steady communication.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Hire people smarter than you&lt;/h2&gt;
&lt;p&gt;Of the ten leadership lessons Vowles shared, this is the one that hit me hardest.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&apos;m not the smartest person at Williams. I don&apos;t need to be. My job is to gather world-class talent, give them authority, and know when to step aside.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s easy to say and hard to live. Especially if the leader came up as a developer. You hire someone technically excellent, and at some point the thought arrives: &lt;em&gt;&quot;I could probably just do this myself.&quot;&lt;/em&gt; (It&apos;s instinct.) Holding that back and delegating is the leader&apos;s job.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Direction is often more important than the answers you give. Indecision is worse than a wrong decision. The answer might not be perfect, but we&apos;ll move forward together.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This one I feel painfully. You have to step back fast and check whether you can actually make this call, and if you can, decide quickly. If not, gather the right people fast and make them decide. Indecision is the biggest enemy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Action items:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Switch the question from &quot;can I do this?&quot; to &quot;who can do this best?&quot;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&apos;t defer decisions.&lt;/strong&gt; Decide at 70% information and adjust the rest in flight.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;After delegating, don&apos;t interfere.&lt;/strong&gt; Review the result, but don&apos;t micromanage the process.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;How an engineering team and an F1 team rhyme&lt;/h2&gt;
&lt;p&gt;While writing this, it struck me that running an F1 team and running a dev team (an IT startup) overlap more than you&apos;d expect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coordinating a complex system.&lt;/strong&gt; An F1 car is tens of thousands of parts meshing together precisely. A dev system is the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data-driven decisions.&lt;/strong&gt; F1 reads car data, tire wear, weather in real time and builds strategy from it. A dev team (IT startup) makes decisions based on metrics, logs, and user behavior data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fast failure and learning.&lt;/strong&gt; F1 takes feedback every race and improves before the next one. A dev team (IT startup) runs retros and improves every sprint. The &quot;no-blame culture&quot; Vowles talks about is exactly the same concept as Psychological Safety in agile.&lt;/p&gt;
&lt;p&gt;What Vowles said at Cambridge Judge Business School (Cambridge&apos;s MBA program) lands here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The exposure our business gets is obviously very high, and I have to explain results that get a lot of attention every week, but the problems other people in this room face and the problems we face are the same.&quot;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Cambridge Judge Business School)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;F1 or IT startup, the problem of leading an org is essentially the same.&lt;/p&gt;
&lt;p&gt;[Source: &lt;a href=&quot;https://www.jbs.cam.ac.uk/insight/2024/leadership-in-formula-one/&quot;&gt;Cambridge Judge Business School, &quot;Leadership in Formula One&quot;&lt;/a&gt;]&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/williams-team-2025.webp&quot; alt=&quot;Williams Racing team&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The thing that stuck with me most about Vowles&apos; leadership is &lt;strong&gt;authenticity&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You have to believe in what you&apos;re doing with your whole heart. Ultimately, the thing that pushes you forward every day in hard moments is that belief. And that&apos;s when your real character shows. If you&apos;re just wearing a mask, eventually it cracks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even in the Sainz signing, he didn&apos;t show only the good side of Williams. He shared the bad parts openly. That honesty is what built the trust.&lt;/p&gt;
&lt;p&gt;I know from experience exactly when I&apos;ve been honest and authentic and when I haven&apos;t. And how each ended. If there&apos;s one thing I learned as a startup founder and CTO, it&apos;s that what matters in the end is whether you have your own answer to &lt;strong&gt;&quot;what kind of team am I building?&quot;&lt;/strong&gt; And whether you&apos;re moving consistently toward that answer.&lt;/p&gt;
&lt;p&gt;Putting James Vowles&apos; story in order, here&apos;s what I want to apply going forward.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What I learned&lt;/th&gt;
&lt;th&gt;Action item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No system, no growth&lt;/td&gt;
&lt;td&gt;Find &quot;the Excel in our team&quot; and systemize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Painful change is sometimes needed&lt;/td&gt;
&lt;td&gt;Ask: &quot;Is this the only window?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No-blame culture&lt;/td&gt;
&lt;td&gt;Leader shares failures first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1-on-1s are the answer&lt;/td&gt;
&lt;td&gt;Lock the schedule, prep feedback in advance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long-term view&lt;/td&gt;
&lt;td&gt;Define and share a clear goal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Honest hiring&lt;/td&gt;
&lt;td&gt;Bad parts honest, vision clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The craft of delegation&lt;/td&gt;
&lt;td&gt;Ask &quot;who can do this best?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;Honestly, I can&apos;t put into words how happy I am, how good this feels. This is even better than my first podium. We&apos;ve fought hard all year, and today, when we finally had the speed (and we&apos;ve had it all year), when everything came together, it proved that we can do amazing things together.
Today we executed the race perfectly. Not a single mistake, and we beat a lot of cars we didn&apos;t expect to beat yesterday. I&apos;m extremely proud of everyone at Williams for pushing through such a hard year. We&apos;ve proven to everyone that we&apos;ve made huge progress versus last year. We&apos;re on the rise, on the right path.
Unfortunately for me there&apos;s been a lot of bad luck, a lot of incidents, and it&apos;s been very hard to turn all that pace into results. But today everything came together. The race execution was perfect, the team calls were perfect, the tire management was perfect, the start, every defense and management move was perfect. So we got an unexpected podium. I couldn&apos;t be prouder.
What other people do isn&apos;t my business. What I care about is that the first time a podium opportunity came with Williams, we took it and scored. That&apos;s all there is.&quot;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Carlos Sainz Jr., after his first P3 podium at the Baku GP)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;/assets/sainz-thumbsup.webp&quot; alt=&quot;Carlos Sainz&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Speaking with results — I think that&apos;s what real leadership comes down to.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.the-race.com/formula-1/shocking-details-behind-painful-williams-f1-revolution/&quot;&gt;The Race - The shocking details behind an F1 team&apos;s painful revolution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.motorsport.com/f1/news/vowles-on-what-williams-f1-has-done-wrong-too-much-change/10689141/&quot;&gt;Motorsport.com - Vowles on what Williams F1 has done wrong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.motorsport.com/f1/news/exclusive-vowles-williams-culture-survive-short-term-pain/10642667/&quot;&gt;Motorsport.com - Why Vowles believes Williams culture will survive short-term pain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gpblog.com/en/exclusive-news/vowles-team-boss-williams-f1-interview-culture-albon.html&quot;&gt;GPBlog - Vowles takes Williams by the hand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://monocle.com/business/james-vowles-leadership-lessons/&quot;&gt;Monocle - 10 Leadership Lessons from James Vowles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pitdebrief.com/post/james-vowles-on-williams-f1-team-progress/&quot;&gt;Pit Debrief - James Vowles on Williams F1 progress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jbs.cam.ac.uk/insight/2024/leadership-in-formula-one/&quot;&gt;Cambridge Judge Business School - Leadership in Formula One&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>essay</category><category>leadership</category><category>F1</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>How a 15-Year CTO Vibe Codes</title><link>https://flowkater.io/en/posts/2026-01-09-15-year-cto-vibe-coding/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2026-01-09-15-year-cto-vibe-coding/</guid><description>Finding the balance between productivity and joy in the vibe coding era. Inspired by Kent Beck&apos;s Augmented Coding philosophy, I built tdd-go-loop, a workflow orchestrator on top of Claude Code. A TDD cycle where the human keeps control even when the AI writes the code. While videos of apps appearing from a few prompts flood the feed, I wanted to keep developing in a way where I actually understand the code.</description><pubDate>Fri, 09 Jan 2026 07:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Added 2026-02-08&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/tdd:go&lt;/code&gt; walks through your work step by step. If you want something more automated, see this follow-up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2026-02-08-superpowers-introduction/&quot;&gt;Give Claude Code Wings: Introducing Superpowers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Opening&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Sorry for the bait. I&apos;m not a 15-year CTO. (I have been writing code for 15 years, that part is true.) I&apos;m also not a current CTO. (I left last year.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The OpenCode (+oh-my-opencode) wave came and went. Lately OpenCode has been on fire over ToS issues and a few other things. As of today it&apos;s blocked, and I do have a personal workaround, but the work I have left should be fine on Claude Code alone, so I&apos;ve decided to stick with Claude Code for a while.&lt;/p&gt;
&lt;p&gt;AI coding tools are popping up everywhere lately. Cursor, Windsurf, Copilot, Claude Code. There are countless posts comparing which one is better, and people are constantly sharing their own workflows. Everyone is shouting &quot;vibe coding,&quot; and YouTube and Twitter are full of videos where an app pops out of a few prompts. &quot;I finished a month of work in three hours!&quot; type stories show up every day.&lt;/p&gt;
&lt;p&gt;But I kept feeling a strange unease in the middle of all this. Productivity was up, sure, but something felt missing. The code worked, but did I actually understand it? Could I really call it &quot;developing&quot; if I was just copy-pasting whatever the AI generated? Questions like that kept circling. And the worst part was that even when I tried to ignore the unease, my flow broke and my productivity dropped anyway. It just stopped being fun, so I stopped wanting to do it.&lt;/p&gt;
&lt;p&gt;While I was sitting with this, I came across Kent Beck&apos;s writing, and that gave me the spark for my own workflow. What I want to share here isn&apos;t the usual technical &quot;which tool to use&quot; or &quot;how to structure your sub-agents&quot; piece. There are plenty of those already. What I want to talk about is &lt;strong&gt;tdd-go-loop&lt;/strong&gt;, a &lt;strong&gt;workflow orchestrator&lt;/strong&gt;. This goes beyond running a single command. It&apos;s a system where multiple sub-agents collaborate to automate the TDD cycle and run code reviews along the way.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Kent Beck&apos;s Augmented Coding&lt;/h2&gt;
&lt;p&gt;This workflow was inspired by &lt;a href=&quot;https://tidyfirst.substack.com/p/augmented-coding-beyond-the-vibes&quot;&gt;Kent Beck&apos;s Augmented Coding&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are plenty of Korean translations out there, so search around if you want a read. A piece written six months ago feels almost ancient in AI-coding time, but the workflow I&apos;m using daily right now started here.&lt;/p&gt;
&lt;p&gt;The core of Kent Beck&apos;s argument is simple. &lt;strong&gt;Even when the AI writes the code, the human has to stay in control.&lt;/strong&gt; Not just throwing prompts and accepting outputs, but slicing the work small, verifying as you go, understanding what you&apos;re building. TDD (Test-Driven Development) is the tool for that.&lt;/p&gt;
&lt;p&gt;When most developers hear TDD, they think &quot;ah, write the tests first, right?&quot; That&apos;s right. But TDD in the AI era is a bit different. In classic TDD, I wrote the tests and I wrote the implementation. In augmented coding, &lt;strong&gt;I design the tests, and the AI writes the implementation&lt;/strong&gt;. That&apos;s the key. Designing the test first means clearly defining what I want, and the AI generates code that matches that definition. Test passes, the implementation is correct. Test fails, it&apos;s wrong. Simple but powerful.&lt;/p&gt;
&lt;p&gt;The important part here is &quot;small unit.&quot; You don&apos;t throw &quot;build me a sign-up feature&quot; at the AI. You break it down to &quot;write the failure-case test for the email validation logic.&quot; You watch the test fail, write the minimum code to pass it, and review it yourself. That&apos;s the cycle. Like stacking Lego blocks, you stack small verified pieces.&lt;/p&gt;
&lt;p&gt;The concept itself is very simple. Like everyone knows, write a PRD first, then turn that PRD into a &lt;code&gt;plan.md&lt;/code&gt; file structured as Phases and checklists. There&apos;s a tool called Spec-kit, but in my experience it tends to over-formalize and grow the work, so I built my own planning skill. Since the unit is TDD, you have to slice as small as possible, and the key is making sure work-by-Phase progress stays visible.&lt;/p&gt;
&lt;p&gt;Then I use a command called &lt;code&gt;/tdd:go&lt;/code&gt; to run things one at a time, by Phase or by sub-checklist, and review each one myself.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;It&apos;s Not Particularly Vibe-y&lt;/h2&gt;
&lt;p&gt;If you&apos;ve followed along this far, you can already tell this isn&apos;t very vibe-y.&lt;/p&gt;
&lt;p&gt;I run every checklist one by one, check the code, and give feedback if I see something off, something to improve, or something that should be extended. If there&apos;s no issue, I move to the next checklist. I&apos;m not the one typing the code, but it&apos;s almost the same thing.&lt;/p&gt;
&lt;p&gt;It&apos;s a kind of &lt;strong&gt;pair programming&lt;/strong&gt;. The AI is at the keyboard, I&apos;m next to it saying &quot;hey, that&apos;s not right&quot; and steering the direction. The AI is the driver, I&apos;m the navigator. The one difference from regular pair programming: the AI doesn&apos;t get tired, doesn&apos;t complain, and fixes things the moment I give feedback. (Though when it makes the same mistake repeatedly, I do get frustrated.)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
    A[Write PRD] --&amp;gt; B[Generate plan.md]
    B --&amp;gt; C[&quot;Run tdd:go&quot;]
    C --&amp;gt; D[Write Test]
    D --&amp;gt; E[Confirm Test Fails]
    E --&amp;gt; F[Write Implementation]
    F --&amp;gt; G[Test Passes]
    G --&amp;gt; H{Code Review}
    H --&amp;gt;|Needs Feedback| C
    H --&amp;gt;|Pass| I[Next Checklist]
    I --&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When I actually work this way, one cycle takes about 5 to 10 minutes. Write a test, confirm the failure, write the minimum code, watch the test pass, review it. Repeat. Vibe? None. But every line of code is something I understand as it goes in.&lt;/p&gt;
&lt;p&gt;Honestly, I know this approach isn&apos;t &quot;hip.&quot; The current trend is to hand everything to the AI and just check the output. The point is finding what works for you.&lt;/p&gt;
&lt;p&gt;If you&apos;re a junior developer who wants to learn the code more deeply, I strongly recommend this approach. Especially when I have to keep the codebase in my head for a project, or when I&apos;m starting from scratch, I go through it step by step. Copy-pasting AI-generated code and stacking up code I understood while reviewing are completely different experiences. The first leaves you with &quot;the code exists.&quot; The second gives you the feeling that &quot;this is my code.&quot; The gap is huge.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;A Spec Alone Wasn&apos;t Enough&lt;/h2&gt;
&lt;p&gt;At first, I thought a good spec was all I needed. Tidy up design patterns, DDD, clean architecture, and Claude Code (or Codex) would handle the rest. For simple CRUD apps, that actually worked. But reality wasn&apos;t that simple.&lt;/p&gt;
&lt;p&gt;If you&apos;ve worked with juniors, you know what I mean. Unless the requirements are genuinely simple, there are always moments while writing the code where architectural judgment shifts. How to split a function. Which layer the adapter and protocol live on, and in what shape. How far to reuse an object or a service, and where to draw the scope boundary.&lt;/p&gt;
&lt;p&gt;No matter how good the spec is, you hit &quot;wait, this isn&apos;t right&quot; moments while writing the actual code. Can the AI make the right call alone in those moments? In my experience, no. The AI works hard at writing the code that the spec describes, but it doesn&apos;t fully grasp the context. &quot;This function is likely to extend later, so let&apos;s pull it out as an interface now.&quot; &quot;This part is simple today, but the domain will get complex, so let&apos;s split it into a separate service.&quot; Calls like these still belong to humans.&lt;/p&gt;
&lt;p&gt;Migrating an enterprise-scale SaaS off legacy and running it for a year and a half taught me one thing. The moment you take your hands off the code, no matter how much conceptual guidance you wrote, the actual code always hits moments where the writer&apos;s judgment is needed. Especially when the initial design collides with messy real-world requirements (which keep changing) and starts deforming bit by bit. Handing that to the AI completely is still too early.&lt;/p&gt;
&lt;p&gt;Of course, in the vibe coding era you don&apos;t need to follow up on every line of code. Knowing the important parts can be enough. That&apos;s a personal call. If you&apos;re not a developer or you just want to ship a product without touching code, you don&apos;t have to look at the code. I&apos;m rooting for the people who vibe-code without knowing code. There&apos;s a company that already raised a Series B with a 3,000-line API file of raw SQL crammed into a single controller. Customer value is the goal, code is the means. I look at code because I&apos;m a developer. That&apos;s the only reason.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Anxiety of Vibe Coding&lt;/h2&gt;
&lt;p&gt;Anyway, putting that aside, the real reason I settled on this approach is something else.&lt;/p&gt;
&lt;p&gt;I was running so far from the actual code that I stopped feeling like I was managing the project properly. Handing it to the AI and resting feels weird, but watching the spinner break my focus while I drift into Threads is probably not just my problem.&lt;/p&gt;
&lt;p&gt;You&apos;ve all had this. The awkward stretch of time where the AI is busily generating code and you don&apos;t know what to do with yourself. Doing other work feels off because the result is right around the corner. Just waiting feels wasteful. So you end up on Threads or YouTube, and by the time the result lands, your focus is on the floor. You&apos;re supposed to check the output and give feedback, but your head is already somewhere else. Repeat that, and your sense of the whole project slowly fades.&lt;/p&gt;
&lt;p&gt;There&apos;s a psychological story here too. Humans get anxious when they don&apos;t feel in control. Especially in their own area of expertise. A developer not knowing the code is a bit like a driver who isn&apos;t holding the wheel. The car might be going fine, but it&apos;s unsettling. You can&apos;t even be sure it&apos;s heading the right place. No matter how good autonomous driving gets, fully letting go of the wheel feels off, and AI coding is the same way.&lt;/p&gt;
&lt;p&gt;What an AI agent really does is automate the time-consuming parts of human work. The catch: handing everything over makes debugging harder. The growing sense that &quot;I don&apos;t know this code&quot; actually dropped my productivity. The blank feeling when you can&apos;t answer &quot;what is this code doing, where?&quot; That&apos;s why I eventually settled on keeping a certain amount under my control.&lt;/p&gt;
&lt;p&gt;And more than anything, this is about &lt;strong&gt;flow&lt;/strong&gt;. The Flow state Mihaly Csikszentmihalyi wrote about (it&apos;s where my handle &lt;em&gt;Flow&lt;/em&gt;kater comes from). When something is moderately hard, moderately easy, and the feedback is immediate, humans drop into flow. Vibe coding doesn&apos;t meet those conditions. Throw a prompt, wait, check the result, throw another prompt. Flow is hard to find inside that loop. The TDD approach of clearing checklists one by one hits the conditions exactly. The work is small enough that it isn&apos;t intimidating, the test result is instant feedback. So it&apos;s fun.&lt;/p&gt;
&lt;p&gt;But there&apos;s a big downside. It&apos;s slow.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;So I Built My Own Method&lt;/h2&gt;
&lt;p&gt;I wanted to ease the anxiety I described above without giving up the productivity of the AI era. So I found a middle point. I borrowed Kent Beck&apos;s augmented coding concept and customized it to my situation. The result is &lt;strong&gt;tdd-go-loop&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a single command. It&apos;s a &lt;strong&gt;workflow orchestrator&lt;/strong&gt;. More than just running &lt;code&gt;/tdd:go&lt;/code&gt; repeatedly. It coordinates &lt;strong&gt;multiple sub-agents&lt;/strong&gt; like spec-review, codex-review, sql-review, apply-feedback while managing the entire TDD cycle. Like an orchestra conductor, it defines when each instrument (agent) plays which part.&lt;/p&gt;
&lt;p&gt;For the core engine code I need to understand, the API code that holds the actual logic, or when I&apos;m laying out a project structure for the first time, I always go through &lt;code&gt;/tdd:go&lt;/code&gt;. Once you do this enough, you notice something. The AI, just like a human, often misreads or guesses wrong about the initial guidelines and writes the wrong code. After you catch those issues and build the foundation yourself, what comes next is mostly developing similar APIs in repetition, or extending logic.&lt;/p&gt;
&lt;p&gt;Because Kent Beck&apos;s augmented coding enforces TDD as the development style, once you have a code structure in place (whatever architecture it is), the AI builds on that base, which makes whole-codebase review easier too. For example, when I first build out a Usecase in Go, I sketch the outline with mock tests, then in the Usecase layer I implement the logic by composing domain models, functions, and Repository interfaces. If I tell it to define mutations at the top of the function and keep private functions as pure as possible, the generated code becomes highly readable, which makes review comfortable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;APIs that match a pattern and structure I&apos;ve already built once with tdd:go&lt;/strong&gt; can move quickly. I only walk through unfamiliar patterns or complex business logic carefully. The rest, I trust.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;My Actual Setup&lt;/h2&gt;
&lt;p&gt;In Claude Code, you define commands and skills as markdown files inside the &lt;code&gt;.claude/&lt;/code&gt; folder. My project structure looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.claude/
├── commands/                      # Single-execution commands
│   ├── tdd/
│   │   ├── go.md                 # /tdd:go - run one checklist
│   │   ├── batch.md              # /tdd:batch - batch by Tier
│   │   ├── fast.md               # /tdd:fast - full automation
│   │   └── status.md             # /tdd:status - check progress
│   ├── tdd-go-loop.md            # Workflow orchestrator (the core!)
│   ├── spec-review.md            # Spec review
│   ├── codex-review.md           # Code review
│   ├── sql-review.md             # SQL review
│   └── final-test.md             # Final test
│
├── skills/                        # Composite skills (with agents)
│   ├── go-gin-ddd-bun/           # Go project architecture guide
│   │   ├── SKILL.md
│   │   ├── ARCHITECTURE.md
│   │   └── TESTING.md
│   └── api-final-review/         # Final review skill (4 parallel agents)
│       ├── SKILL.md              # 6-stage review workflow definition
│       ├── AGENTS.md             # Detailed setup for the 4 parallel agents
│       └── templates/
│           └── test_script_template.sh
│
├── templates/                     # Document templates
│   ├── plan-template-v2.md       # plan.md template
│   └── api-review-guide.md       # Code review guide
│
└── agents/                        # Sub-agent definitions
    ├── codex-review.md           # Codex review agent
    ├── sql-review.md             # SQL review agent
    └── apply-feedback.md         # Feedback-application agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two things matter here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;tdd-go-loop.md&lt;/strong&gt;: Not a plain command, but a &lt;strong&gt;workflow orchestrator&lt;/strong&gt;. It coordinates multiple sub-agents (codex-review, sql-review, apply-feedback, etc.) and automates the entire TDD cycle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;api-final-review/&lt;/strong&gt;: A skill that runs the final review after API development is done. Four specialist agents run reviews &lt;strong&gt;in parallel&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;/tdd:go Command Example&lt;/h2&gt;
&lt;p&gt;Here&apos;s what the actual &lt;code&gt;/tdd:go&lt;/code&gt; command looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# TDD: Go (run the next test)

Read plan.md and find the first test marked with `[ ]` (not yet implemented).

## Execution Steps

1. **Identify**: Find the first `[ ]` test in plan.md
2. **Announce**: Tell me which test you&apos;re about to implement
3. **Red Phase**:
   - Create or update `*_test.go` file
   - Write a failing test for that specific behavior
   - Run `go test -v ./...` to confirm the test fails
4. **Green Phase**:
   - Write the minimum code to make the test pass
   - Run `go test -v ./...` to confirm ALL tests pass
5. **Update**: Mark the test as `[x]` in plan.md
6. **Report**: Summarize what was done

## Critical Rules

- Write ONLY enough code to pass the current test
- Do NOT implement features for future tests
- Always run `go fmt` on new files
- If tests fail unexpectedly, STOP and report before proceeding
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&apos;s simple. Find one checklist marked &lt;code&gt;[ ]&lt;/code&gt; in plan.md, run the Red-Green cycle, and check it off as &lt;code&gt;[x]&lt;/code&gt; when done. That&apos;s all there is.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;A Real plan.md Example&lt;/h2&gt;
&lt;p&gt;A snippet from the plan.md I used to implement the Plan creation API (&lt;code&gt;POST /plans&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Test Plan: Plan Creation API (POST /plans)

**Dependency**: plan_00_common.md (Domain layer complete)

---

## Phase 1: Application Layer - Input Struct &amp;lt;!-- T1:auto --&amp;gt;

File: `api/internal/application/plan/create.go`

### [x] 1.1 Define CreatePlanInput

- CreatePlanInput struct contains all required fields
- ScheduleInput struct contains Type and Days fields
- CreateItemInput struct contains Name and Quantity fields

### [x] 1.2 Input conversion methods

- ScheduleInput.ToWeeklySchedule() converts valid input to WeeklySchedule
- ScheduleInput.ToWeeklySchedule() returns ErrNoActiveDays when no active days

---

## Phase 5: UseCase Layer - Create Service &amp;lt;!-- T2:deep --&amp;gt;

File: `api/internal/application/plan/create.go`

### [x] 5.1 Service struct

- createService struct depends on Logger, TransactionManager, PlanWriter
- NewCreateService() constructor injects dependencies

### [x] 5.2 Create - validation logic

- Create() creates a Plan from valid input
- Create() returns ErrInvalidTemplate for unsupported TemplateID
- Create() returns ErrInvalidDateRange when StartDate &amp;gt;= EndDate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each Phase has a Tier marker like &lt;code&gt;&amp;lt;!-- T1:auto --&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;!-- T2:deep --&amp;gt;&lt;/code&gt;. This matters. Review depth differs per Tier:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Execution&lt;/th&gt;
&lt;th&gt;Review Depth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;td&gt;Scaffold (structure)&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Light&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T2&lt;/td&gt;
&lt;td&gt;Core (business logic)&lt;/td&gt;
&lt;td&gt;Detailed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deep&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T3&lt;/td&gt;
&lt;td&gt;Integration (Repository)&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T4&lt;/td&gt;
&lt;td&gt;Surface (Handler/E2E)&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Light&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I only do Deep Review on T2 (business logic) and let the rest go through automatically. Reviewing every line at the same depth is inefficient. Focus on the core logic, trust the rest if the tests pass.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;tdd-go-loop Workflow Orchestrator&lt;/h2&gt;
&lt;p&gt;The full flow of tdd-go-loop. Notice that this is not just &lt;code&gt;/tdd:go&lt;/code&gt; on repeat. It&apos;s a &lt;strong&gt;workflow orchestrator coordinating multiple sub-agents&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    start([Start])
    spec_review[&quot;spec-review agent&quot;]
    user_confirm{User Confirm?}
    find_next[Find Next Test]
    has_next{Found Next?}
    tdd_execute[&quot;TDD Cycle&quot;]
    update_plan[Mark Complete]
    codex_review[&quot;codex-review agent&quot;]
    has_critical{Critical Issues?}
    apply_feedback[&quot;apply-feedback agent&quot;]
    commit_ask{Commit Tier?}
    is_t3{T3 Integration?}
    sql_review[&quot;sql-review agent&quot;]
    plan_done{All Done?}
    final_test[&quot;final-test&quot;]
    finish([End])

    start --&amp;gt; spec_review
    spec_review --&amp;gt; user_confirm
    user_confirm --&amp;gt;|No| spec_review
    user_confirm --&amp;gt;|Yes| find_next
    find_next --&amp;gt; has_next
    has_next --&amp;gt;|Yes| tdd_execute
    has_next --&amp;gt;|No| codex_review
    tdd_execute --&amp;gt; update_plan
    update_plan --&amp;gt; find_next
    codex_review --&amp;gt; has_critical
    has_critical --&amp;gt;|Yes| apply_feedback
    has_critical --&amp;gt;|No| commit_ask
    apply_feedback --&amp;gt; codex_review
    commit_ask --&amp;gt; is_t3
    is_t3 --&amp;gt;|Yes| sql_review
    is_t3 --&amp;gt;|No| plan_done
    sql_review --&amp;gt; plan_done
    plan_done --&amp;gt;|No| find_next
    plan_done --&amp;gt;|Yes| final_test
    final_test --&amp;gt; finish
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key part: &lt;strong&gt;every time a Tier ends, the codex-review agent kicks in automatically&lt;/strong&gt;. If Codex finds a Critical or Major issue, the apply-feedback agent applies the feedback automatically; Minor issues are just logged. If review repeats more than three times, it forces a move to the next step (no infinite loops).&lt;/p&gt;
&lt;p&gt;At the T3 (Integration) stage, the sql-review agent runs additionally to catch performance issues like N+1 queries or missing indexes.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;api-final-review: Four Parallel Agents&lt;/h2&gt;
&lt;p&gt;When API development wraps up, the final review workflow runs. Four specialist agents perform reviews &lt;strong&gt;in parallel&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    api-final-review                          │
└─────────────────────────────────────────────────────────────┘
                              │
          ┌───────────────────┼───────────────────┐
          │                   │                   │
          ▼                   ▼                   ▼
┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
│ 1. Checklist    │  │ 2. Shell/Fixture│  │ 3. Codex Agent  │
│    Agent        │  │    Agent        │  │                 │
└─────────────────┘  └─────────────────┘  └─────────────────┘
                              │
                              ▼
                    ┌─────────────────┐
                    │ 4. SQL Agent    │
                    └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Actual setup from AGENTS.md&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Parallel Agent Setup

The four specialist agents used in the API final review.

## 1. Checklist Agent

Verifies the checkbox-completion state of the plan document.

Output format:

- Completion rate: X/Y (Z%)
- Incomplete items: (list, if any)
- Verdict: ✅ Complete / ❌ Incomplete items remain

## 2. Shell/Fixture Agent

Checks that the scripts and fixture files needed for integration tests exist.

Paths checked:
tests/
├── scripts/{feature}/test\_{api_name}.sh
└── fixtures/{feature}/{api_name}/
├── valid_request.json
└── invalid_request.json

## 3. Codex Agent

Tier-based review:
| Tier | Target | Review Depth |
|------|--------|--------------|
| T1 | Domain Entity | Strictest |
| T2 | Application Service | Strict |
| T3 | Infrastructure | Standard |
| T4 | Handler | Standard |

## 4. SQL Agent

Reviews database query performance and optimization.

| Item              | Description                              |
| ----------------- | ---------------------------------------- |
| N+1 query         | Per-row queries inside a loop            |
| Missing index     | Indexes needed for WHERE, JOIN clauses   |
| Over-fetching     | SELECT \*, unnecessary columns           |
| Transaction scope | Right boundaries set                     |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because these four run &lt;strong&gt;in parallel&lt;/strong&gt;, total time drops a lot. Sequential runs that take 10 minutes finish in 3 minutes when parallel.&lt;/p&gt;
&lt;h3&gt;Deployment-decision criteria&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critical&lt;/th&gt;
&lt;th&gt;Major&lt;/th&gt;
&lt;th&gt;Minor&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0-2&lt;/td&gt;
&lt;td&gt;✅ OK to deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3+&lt;/td&gt;
&lt;td&gt;⚠️ Recommend Minor cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌ Major fixes required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;❌ Critical fixes mandatory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Code Review Guide&lt;/h2&gt;
&lt;p&gt;Sometimes the code review itself is the hard part, so I wrote a guideline for the order to read code in and what to focus on.&lt;/p&gt;
&lt;p&gt;The T2 (Core) review checklist I actually use:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## T2 (Core) Review Checklist

### UseCase Implementation

| Check                  | Question                                     |
| ---------------------- | -------------------------------------------- |
| Pure Functions         | Are helper functions pure (no side effects)? |
| Explicit Mutations     | Are all mutations visible in main method?    |
| Error Wrapping         | Are errors wrapped with context?             |
| No Business in Helpers | Is business logic in Execute, not helpers?   |

### Pure Function Verification

// GOOD: Pure function (data in, data out)
func buildListOptions(input \*ListPlansInput) plan.ListOptions {
return plan.ListOptions{
Limit: input.Limit,
Status: input.Status,
}
}

// BAD: Impure (modifies input)
func buildListOptions(input *ListPlansInput, opts *plan.ListOptions) {
opts.Limit = input.Limit // mutates!
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With a guide like this, Claude reviews against the same criteria, and I also know exactly where to focus when I look at the code.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;How to Get Started&lt;/h2&gt;
&lt;p&gt;People keep talking about how they configure Claude Code, how they set up sub-agents, who follows whom, who asks what. Don&apos;t let that FOMO push you around. &lt;strong&gt;Just install Claude Code right now and ask it directly&lt;/strong&gt;. What can it do. Then ask it about the things you want to do, and build your own system from there. That process itself is what&apos;ll give you survival skills in this fast-moving AI era.&lt;/p&gt;
&lt;p&gt;Here&apos;s how I&apos;d start:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make a &lt;code&gt;.claude/&lt;/code&gt; folder.&lt;/strong&gt; Just one folder at the project root.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a simple command in &lt;code&gt;commands/&lt;/code&gt;.&lt;/strong&gt; One markdown file is one command.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run it as &lt;code&gt;/command-name&lt;/code&gt;.&lt;/strong&gt; Claude Code runs it directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extend as needed.&lt;/strong&gt; Agents, skills, templates — grow it from there.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also just ask Claude Code to do all of the above for you.&lt;/p&gt;
&lt;p&gt;Most of the workflows, commands, and agents I&apos;ve built were made by asking Claude Code while I used it. Don&apos;t try to build a perfect system from day one. Start small and add as you need. Even this blog post went through a multi-agent workflow that takes the rough draft I dumped out and polishes it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;One thing I learned during my CTO years. &lt;strong&gt;Delegate but own quality. Hold the whole picture but trust the details.&lt;/strong&gt; I couldn&apos;t read every line of code, so I focused on the important parts and trusted teammates with the rest. The same thing applies when working with the AI now. Treat the AI like a capable junior developer. Give clear instructions, review the output, give feedback when needed, hand off the next task when it does well.&lt;/p&gt;
&lt;p&gt;Looking back, this is a leadership skill. Organize complex requirements before passing them on, focus on the key decisions, delegate the execution. In the AI era, I think we&apos;re all going to work this way. Whether I type the code myself or hand it to the AI, in the end &lt;strong&gt;I&apos;m the one who defines what to build and owns the quality&lt;/strong&gt;. Picking up that sense might be the most important skill right now.&lt;/p&gt;
&lt;p&gt;If I&apos;m being honest, I could only run experiments like this because I left the company last year and started a personal project. At work, between meetings, planning sync, and reviewing teammates&apos; code, I had no room to dig into this kind of thing. Working alone, with no one to second-guess, I could try things freely. OpenCode being blocked is a small bummer, but I&apos;m more excited than worried about how AI evolves through 2026.&lt;/p&gt;
&lt;p&gt;What matters in the end is &lt;strong&gt;finding your own approach&lt;/strong&gt;. Vibe coding, augmented coding, whatever style. As long as you don&apos;t lose &lt;strong&gt;the joy&lt;/strong&gt; along the way. If chasing productivity costs you the fun of coding, that&apos;s the real loss. As long as making things with code still feels good to me, I&apos;ll adapt to whatever tool comes next.&lt;/p&gt;
</content:encoded><category>tech</category><category>vibe-coding</category><category>AI-coding</category><category>development</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Gophercon Korea 2025: A Review</title><link>https://flowkater.io/en/posts/2025-12-11-2025-gophercon-korea-review/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-12-11-2025-gophercon-korea-review/</guid><description>Notes from Gophercon Korea 2025 at Magok COEX. Talk reviews on real-time interpretation in Go, Effect-ive Go, and Test Reality Not Mocks, plus the realization that talks live on YouTube but the real value of a conference is in the hallway. Conversations with engineers thinking about hiring and startups preparing to scale up.</description><pubDate>Thu, 11 Dec 2025 07:27:07 GMT</pubDate><content:encoded>&lt;p&gt;https://gophercon.kr/&lt;/p&gt;
&lt;p&gt;I figured if I waited until after this year ended, I&apos;d never write this up at all, so here&apos;s a quick review of Gophercon Korea, which I went to last month on the 9th at Magok COEX.&lt;/p&gt;
&lt;h2&gt;Going in&lt;/h2&gt;
&lt;p&gt;Back in my SW Maestro (let&apos;s call it SoMa) days, and during the early years of running my own startup, there were a lot of events like Naver DEVIEW (Naver&apos;s annual dev conference), and I went to plenty of them. Once you started showing up, it was kind of like a class reunion. You&apos;d run into everyone you knew, exchange greetings, and drift between sessions together. During SoMa I think it was JCO (a Java developer conference) where the whole team went and even gave a talk. That was already ten years ago in calendar terms. After that, while running the company, I cared more about business and operations than about hands-on engineering, and even though I kept coding, I more or less lost track of dev conferences. After COVID I forgot they even existed.&lt;/p&gt;
&lt;p&gt;At my last company, every now and then a teammate would ask if they could go to one of these on a weekday, and I&apos;d approve and send them. Once COVID hit, most of these talks went straight to YouTube (either live or right after), so my pattern became: skip the event, then look up a topic I cared about whenever I felt like it.&lt;/p&gt;
&lt;p&gt;After I left the company, I started writing the occasional thread on Threads. Someone read &lt;a href=&quot;https://flowkater.io/posts/2025-09-scrumble-tech-retro-backend/&quot;&gt;my recent backend post&lt;/a&gt; and a thread of mine on running test code, then reached out by DM: &quot;Are you going to Gophercon this week? If you are, I&apos;d love to grab a quick coffee chat.&quot; Truth is, I knew Gophercon existed but had no idea it was happening that very week (November 9), and the idea of attending myself hadn&apos;t even crossed my mind, so I was caught off guard. But I also wanted to talk shop with engineers and get back to events, and give George (who got into Go because I&apos;d put him on a Go backend) a taste of the gopher world (?). So I bought tickets right there: a sponsor ticket for me, a regular ticket for George. To the backend engineer who DM&apos;d me I replied, &quot;Of course I&apos;m going. Want to meet up briefly that day?&quot; Maybe I just didn&apos;t want to admit on Threads, where I cosplay as a Go engineer of sorts, that I had no clue. (Of course I confessed all of this when I actually met him on the day. Told him: thanks to you, I ended up going.)&lt;/p&gt;
&lt;h2&gt;The talks&lt;/h2&gt;
&lt;p&gt;I caught almost everything except for one or two slots I skipped for coffee chats, but I&apos;ll only write up the talks I actually understood well enough to comment on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gophercon.kr/program/sessions/session-2&quot;&gt;Building a real-time interpreter in Go (real-time AI inference, WebRTC)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I forget the company name, but it was an edtech outfit, and given the domain I paid close attention. The premise was that the most important thing in education is the &quot;classroom&quot; as a space, and the talk focused on how to recreate that classroom experience online. They walked through how they used Go&apos;s concurrency to build real-time behavior, then expanded that into a global classroom, eventually layering in real-time translation with LiveKit. The step-by-step way they tackled each challenge was genuinely impressive.&lt;/li&gt;
&lt;li&gt;This is one I&apos;d like to rewatch when the recording goes up on YouTube.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gophercon.kr/program/sessions/session-4&quot;&gt;Effect-ive Go: Truly Go-flavored functional programming&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;One of the biggest things I let go of when I moved to Go was functional programming. I still pull in samber/lo occasionally, but the core of FP (immutability, monads, tight abstractions) isn&apos;t easy to bring into Go straight, and twisting the language that hard doesn&apos;t really feel &quot;Go-like&quot; either. There was a stretch where I went deep into FP, but these days I think it&apos;s better to find the middle path that fits the language and the problem. So I was curious how the Effect pattern implements &quot;Go-style functional&quot; in Go.&lt;/li&gt;
&lt;li&gt;To boil down the Effect pattern from this talk in one line: in your domain and business logic, you only declare side effects as &quot;effect messages,&quot; and the actual side-effect execution (DB calls, external APIs, logging, concurrency) gets delegated to separate effect handlers. The point is to maximize purity, testability, and reusability through a Go-style Effect Handler architecture.&lt;/li&gt;
&lt;li&gt;I went through &lt;a href=&quot;https://github.com/on-the-ground/effect_ive_go&quot;&gt;the repo&lt;/a&gt;, typed out the code samples, and tried mapping it onto my own codebase (a fairly large backend on DDD / clean architecture). At least for the use cases I have right now, the existing layer structure already gives me domain purity and infra separation, so adding a separate effect layer would inflate conceptual and implementation complexity more than it&apos;d give back. It&apos;s closer to a &quot;more cost than benefit&quot; pattern in my situation.&lt;/li&gt;
&lt;li&gt;That said, the spot this library is aiming at is real. Go often gets used in multi-module / multi-runtime setups in production (HTTP, gRPC, batch, workers, etc.), where the same domain logic has to run across different infrastructure combinations, or you need to &quot;interpret&quot; the same domain logic differently across handler combinations for testing, simulation, or replay (think CQRS, event sourcing, heavily functional architectures). In those contexts, modeling logging, transactions, retries, circuit breakers, and concurrency control as explicit effects, and controlling when and how they get composed at the handler level, becomes a real advantage. That&apos;s where experimenting with something like effect_ive_go is worth the investment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gophercon.kr/program/sessions/session-5&quot;&gt;Test Reality Not Mocks: Reliable Go Tests in the AI Era&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This lined up exactly with &lt;a href=&quot;https://www.threads.com/@flowkater/post/DQcMlWEDxY8?xmt=AQF03CPxixjiZq1qWOLFqqKfXzBrmtPLQ0lDH6PFgL96wA&quot;&gt;my own post arguing against DB mocking&lt;/a&gt;. It pushed further by showing real handler-based tests, and broadened the scope to TDD and how to write better tests in Go projects in general. When I wrote that post I said I don&apos;t do TDD, but I&apos;m now actually doing TDD-style coding alongside Claude Code, so this talk genuinely helped me out.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gophercon.kr/program/sessions/session-6&quot;&gt;Dev in Go way (the Go-ness of Go)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;The most quintessentially Gophercon talk of the day. Grounded in the language itself, it walked through why patterns common to Java or other OOP languages (builder pattern and friends) don&apos;t really fit Go, and what makes good code &quot;good code&quot; by Go&apos;s spirit, by Go idiomatic standards. The speaker came across as a real veteran, but the talk itself was the easiest to follow, and I think every attendee got something out of it.&lt;/li&gt;
&lt;li&gt;Small Interface is something I&apos;m already trying out in my current backend. My repository interfaces in particular have been swelling up to the point where the code is hard to follow. Splitting both the interfaces and the files apart turned out to make the code easier to read and also reduced collisions when working on it concurrently with Claude Code, more than I expected.&lt;/li&gt;
&lt;li&gt;Accept interfaces, return structs is basically unavoidable once you build clean architecture in Go. And the recommendation to use the Options pattern instead of the builder pattern (the builder pattern doesn&apos;t fit Go cleanly because of multi-return errors) looks promising for my domain structs, especially when there are lots of constructor option values, so I&apos;m trying that out too.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Overall&lt;/h3&gt;
&lt;p&gt;About 80% of my coding over the last six months has been Go, so directly or indirectly, all of these talks were useful. The content itself was solid. I&apos;d like to give a talk myself sometime, from the perspective of running a service in production. Funny enough, the reason I started Go five years ago was &lt;a href=&quot;https://youtu.be/mLIthm96u2Q?si=cq6OqaKrxh4YG2bz&quot;&gt;this video: Daangn&apos;s engineering team adopts Go, on Daangn Tech&lt;/a&gt;. The speaker, Byun Gyu-hyun, seems to still be at Daangn, and gave talks at Gophercon last year and the year before. He didn&apos;t speak this year, which left me a little disappointed.&lt;/p&gt;
&lt;h2&gt;Networking&lt;/h2&gt;
&lt;p&gt;The two main groups I ended up talking to: the engineer who DM&apos;d me first (let&apos;s call him A) and another person who&apos;d spotted my posts on Threads (B). A is a backend engineer who came with his Canadian CEO (C). They&apos;re building &lt;a href=&quot;https://humanlog.io/&quot;&gt;humanlog.io&lt;/a&gt;, an observability service. We talked Go, and also observability experience (in my case, a lot of Datadog), Clickhouse, and so on. C joked that since I knew Go, had observability experience, and had used Clickhouse, maybe I should join them. I laughed and played along. (Pretended I didn&apos;t catch the English.) The interesting thing is, A and C also met at last year&apos;s Gophercon, so it was clear that, unlike A, C had come with the explicit goal of scouting talent.&lt;/p&gt;
&lt;p&gt;B came with a Go engineer (D) he works with full time. They run a business serving small business owners and the self-employed (Korea&apos;s SMB segment), collecting a massive amount of data using Go. Because D is the Go person, Go ended up being the main language of the business, and now that they want to seriously scale up they&apos;re trying to hire more Go engineers, and since there are barely any around, they were attending the conference partly hoping to meet people. There was something about them that reminded me of the energy I had when I was first starting my own company. A good team. I told them honestly that finding a Go engineer right away would be hard, and that they might be better off hiring a junior who can hustle and training them up. But I left wanting them to win.&lt;/p&gt;
&lt;h2&gt;What conferences are actually for = networking&lt;/h2&gt;
&lt;p&gt;If you only count the talks, honestly, conferences like this don&apos;t pencil out on a time-spent basis. You sit through a fixed track on a fixed schedule, and even when tracks are split by backend, frontend, data, the range inside each track is too wide. When the track is bound by a single language like Golang, the gap gets even wider. This year&apos;s lineup ranged from vibe coding to blockchain. There were topics every Go user could relate to, and topics that, at least for me right now, I couldn&apos;t follow or didn&apos;t care about. That said, the parts about the language itself and goroutine concurrency are the kind of thing everyone could take something home from.&lt;/p&gt;
&lt;p&gt;But once you fold in networking, it&apos;s a different story. I skipped about two talks (one in the middle, one near the end) and used that time to talk with people I happened to connect with at the venue, and the common thread among them was hiring. Or some version of &quot;this is how I&apos;m doing Go, how are you doing it?&quot;&lt;/p&gt;
&lt;p&gt;When you give a talk, the best you can do per unit of time is meet one speaker. But if a talk is something you can already watch online, what brings people out in person is, I think, the networking. If conferences set aside more space and time for people to find others who share their goals or want to talk about the same things, you&apos;d come away with something more meaningful than just sitting through sessions.&lt;/p&gt;
&lt;p&gt;I got lucky and ended up meeting good engineers by chance. If there had been more structured opportunities, I would&apos;ve liked to know and talk with a wider mix of people. The &quot;opportunities&quot; we hope for tend to come out of small talk, coffee chats, the weak ties of networking. They accumulate slowly and then suddenly turn into something. That&apos;s been one of the bigger lessons of the past few years for me.&lt;/p&gt;
&lt;p&gt;Gophercon in particular is a relatively small group in Korea, but it occupies a unique position (backed by sizable companies like Devcat, Daangn, and Line), so if this kind of networking grew more active, the contribution to the broader Korean Go ecosystem would expand much further.&lt;/p&gt;
&lt;h2&gt;Photos&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/gophercon-nametag.jpeg&quot; alt=&quot;GopherCon Korea 2025 nametag&quot; /&gt;
&lt;em&gt;My nametag from the venue. Google, Daangn, and DEVSISTERS were among the sponsors.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/gophercon-sag.jpeg&quot; alt=&quot;Gopher in hanbok eco-bag&quot; /&gt;
&lt;em&gt;An eco-bag with a gopher in hanbok holding a taegeuk fan. A uniquely Korean Gophercon touch.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/gophercon-goods.jpeg&quot; alt=&quot;Gophercon swag&quot; /&gt;
&lt;em&gt;The swag that came with the sponsor ticket: a hand-knit gopher doll, stickers, keychains. A pretty generous lineup.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Heading out&lt;/h2&gt;
&lt;p&gt;It was a good outing back into a dev event after a long time, and George said he picked up a lot too, so it turned into a good day. Somewhere along the way I&apos;d grown skeptical about events like this (the worry that you&apos;re just chasing trends, or going because everyone else is going), but listening to talks and talking with people turned out to be a worthwhile experience.&lt;/p&gt;
&lt;p&gt;I went to show George the gopher world, and ended up bringing something home myself. Just like five years ago when Byun Gyu-hyun&apos;s talk got me into Go, next time I&apos;d like to be the one giving a talk at Gophercon.&lt;/p&gt;
&lt;p&gt;I&apos;ll leave it at that — hoping the Korean Go ecosystem keeps getting livelier.&lt;/p&gt;
</content:encoded><category>review</category><category>conference</category><category>golang</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>What Should Junior Developers Learn in the AI Era?</title><link>https://flowkater.io/en/posts/2025-12-06-what-should-junior-developers-learn-in-the-ai-era/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-12-06-what-should-junior-developers-learn-in-the-ai-era/</guid><description>What should junior developers learn in the AI era? The hiring market has frozen and companies only want mid-level engineers who can ship on day one. AI is a double-edged sword for juniors. Hand everything to an agent like Claude Code and you lose the chance to learn. Literacy (reading and writing), real projects with even ten users, coding tests trained as problem-solving rather than memorization. A survival guide for junior developers, drawn from my mentoring experience.</description><pubDate>Sat, 06 Dec 2025 11:40:16 GMT</pubDate><content:encoded>&lt;h2&gt;The Junior&apos;s Dilemma in the AI Era&lt;/h2&gt;
&lt;p&gt;I left my company and have been coding alone for more than six months. The past six months were the fastest stretch of change I&apos;ve ever lived through. Coding, especially, took the full impact of that change. If I had stayed at the company, I probably wouldn&apos;t feel it as sharply yet. Building products with my own hands, hitting wall after wall, I came to feel the speed of AI&apos;s progress in development exactly as it is.&lt;/p&gt;
&lt;p&gt;People around me include mid-level engineers, but a fair number of juniors too. I used to mentor some of them, I still mentor some now, and once in a while one of them brings a resume and I give feedback. Their worries became mine. I kept turning the same questions over.
In this brutal market, what should they do to land a job? In this AI era, can they actually get hired the old way, by prepping a portfolio, doing a bootcamp project, and blogging? How are they supposed to grow at all?&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Cold Reality of the Hiring Market&lt;/h2&gt;
&lt;h3&gt;Why Junior Hiring Shrunk&lt;/h3&gt;
&lt;p&gt;In a stretch where tech moves this fast, the market froze just as fast and hiring collapsed. Junior hiring, especially, has all but dried up. Unlike three or four years ago, the IT industry has lived through layoffs, voluntary retirements, bankruptcies, failed pivots, and the companies that survived learned that if you don&apos;t keep your wits about you, you go under. Even when the market loosens up and money starts flowing again, that lesson means they won&apos;t go on a hiring spree the way they did three or four years ago.&lt;/p&gt;
&lt;p&gt;The claim that AI is killing developers is, for now, a false statement. We can&apos;t push back against the macroeconomic tide, and the job crunch is a global issue, not just a Korean one. Companies have tightened their belts, and on top of that, they barely pay anything for hires they have to grow and teach, which means people who can&apos;t be put to work right away. You design a future when you can see tomorrow. When you&apos;re just trying to survive today, all of that feels like waste. But cause and effect are real here: a global economic crunch is producing a job crunch, and AI is accelerating it.&lt;/p&gt;
&lt;h3&gt;Who Companies Actually Want&lt;/h3&gt;
&lt;p&gt;The roles posted most heavily right now are mid-level, roughly four to six years of experience. I often see people who slipped into the so-called developer boom three or four years ago hopping jobs relatively easily, even in this rough market. But people who are just starting to study development or who just took their first job, juniors and entry-level engineers, either can&apos;t get hired and switch jobs at all, or they luck into a position and get no real chance to learn.&lt;/p&gt;
&lt;p&gt;When companies hire heavily at the mid-level, they&apos;re hiring people who can plug into the current project on day one. As a junior, you have basically zero experience building or running a real production project. So if a junior wants to be competitive in today&apos;s hiring market, they need experience collaborating on a team project, deploying it to an environment with actual users, and operating it. It&apos;s not easy for one developer to build something, ship it, and run it while also taking care of marketing and operations. It&apos;s hard. And yet that&apos;s the kind of person companies are hiring right now.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;AI Is a Double-Edged Sword for Juniors&lt;/h2&gt;
&lt;p&gt;AI is a double-edged sword for juniors. It&apos;s a tired metaphor, but it&apos;s the kind of sword where the more you swing it, the more you cut yourself. Some people say that with AI you can ask anything, study anything, do anything easily, and that traditional education is over and anyone can do anything. In the development areas I know &quot;well,&quot; I can study that way too, and I do. I can&apos;t even remember the last time I went to the developer book section of a bookstore. I used to drop by Kyobo Mungo and check what was new every time I was nearby. These days I almost never go.&lt;/p&gt;
&lt;h3&gt;How Do You Ask When You Don&apos;t Know What You Don&apos;t Know?&lt;/h3&gt;
&lt;p&gt;But if I want to study a brand new field, can I just lean on AI right away?&lt;/p&gt;
&lt;p&gt;Recently I wanted to study Japanese, and I tried using AI to look up sentences and various things, and I ended up buying a textbook and a course. A complete beginner doesn&apos;t even know what to ask. To borrow a machine-learning analogy, without some pre-training on a dataset, you can&apos;t do anything.&lt;/p&gt;
&lt;p&gt;So when I mentor juniors, I tell them to use AI agents like Claude Code as little as possible. Some people will hear that and call it obsolete advice. Fair enough. But when you don&apos;t even know what you don&apos;t know and you hand most of your work to an AI coding agent, you lose every chance to learn and grow. Thanks to AI, everyone can build something. Because of AI, no one is learning. That&apos;s the era we&apos;re in.&lt;/p&gt;
&lt;h3&gt;The Difference Between an AI Agent and Searching or Asking&lt;/h3&gt;
&lt;p&gt;The advice here isn&apos;t aimed at non-developers building products through vibe coding (founders, basically). This is for people who want to grow into professional developers, and it isn&apos;t only true for development. In any field where you want real expertise, handing everything to AI makes it hard to find the chance to grow properly. Searching and asking when you don&apos;t know something, using AI for that, I recommend it. (What I&apos;m saying not to use is the AI coding agent that does it all for you.)&lt;/p&gt;
&lt;p&gt;Even back when AI didn&apos;t exist, copying and pasting working code from Stack Overflow without understanding the cause was constant. The difference is whether I&apos;m asking the AI directly about my own problem or not. And it matters more than you&apos;d expect where the agency sits. If it sits with me, the learning from solving the problem stays with me. If it sits with the AI, that learning gets thrown out with the AI.&lt;/p&gt;
&lt;h3&gt;So How Should You Use AI?&lt;/h3&gt;
&lt;p&gt;Let me get specific. The standard a junior should hold to when using AI is this: did I try first?
When an error happens, read the message first. Then form a hypothesis about why it&apos;s happening. Then ask the AI. Not &quot;how do I fix this error?&quot; but &quot;I think this error is happening because of A, is that right?&quot; The difference is huge.
Same when you write code. Type it yourself first. When you get stuck, figure out exactly where you got stuck and ask only about that part. Not &quot;build me a login feature,&quot; but &quot;the session isn&apos;t holding, is the logic in this part wrong?&quot;&lt;/p&gt;
&lt;p&gt;To sum it up:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do this:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read the error message, form a hypothesis, then ask AI to verify&lt;/li&gt;
&lt;li&gt;Ask for feedback on code you wrote yourself&lt;/li&gt;
&lt;li&gt;Ask for explanations when a concept confuses you&lt;/li&gt;
&lt;li&gt;After you finish solving a problem, ask about other approaches&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Avoid this:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Throwing requirements at AI and asking for the whole thing&lt;/li&gt;
&lt;li&gt;Pasting an error without even reading it&lt;/li&gt;
&lt;li&gt;Only asking &quot;why isn&apos;t this working?&quot;&lt;/li&gt;
&lt;li&gt;Copying AI&apos;s code without understanding it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the end, the agency has to sit with you. AI is a tool that helps you learn, not a thing that learns in your place.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What Juniors Should Be Building Now&lt;/h2&gt;
&lt;p&gt;I&apos;m about to talk about literacy, real projects, and coding tests, and I can already hear the question, &quot;so what should I do first?&quot; Honestly, it depends on your situation. If you push me to rank them, here&apos;s how:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If you have an interview lined up:&lt;/strong&gt; Coding tests and tidying up your projects come first. Literacy doesn&apos;t go up overnight.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you have three months or more:&lt;/strong&gt; Read and write in parallel while starting a real project. One coding test problem a day, steadily.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you&apos;re prepping over six months or more:&lt;/strong&gt; Build literacy first. It ends up setting the speed of every other kind of learning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key is that all three of these aren&apos;t &quot;things to do,&quot; they have to become &quot;habits.&quot; This isn&apos;t something you flash through during job-prep season and drop. Reading books, running projects, training problem-solving, those are things you keep doing the entire time you work as a developer. Starting now is fast.&lt;/p&gt;
&lt;h3&gt;Literacy: Reading and Writing&lt;/h3&gt;
&lt;p&gt;Looking back at the mentoring I&apos;ve done recently, the biggest issue is literacy. In this AI era, the ability to read and write may have become more important than code. AI models these days dump enormous answers in response to a single question, and being able to actually read it, understand it, digest it, and apply the right solution to your case, that&apos;s literacy too. Asking AI a good question is the same. Beyond communicating with AI, once you join an organization you&apos;ll be communicating with people, and grasping the core of what someone is saying, digesting it, organizing your opinion, and speaking it, those are all abilities that grow out of literacy.&lt;/p&gt;
&lt;p&gt;When someone preparing to land a developer job asks me what they should prepare, I tell them: read more books than you do projects or algorithms. Then take what you read, organize your thoughts about it, talk about it with other people, and write about it. That&apos;s the fastest way to raise your literacy in the short run. In an era where every piece of content is short-form, the one edge you can take over everyone else is reading and writing. With that as a foundation, whether you&apos;re aiming at being a developer or studying any other field, you&apos;ll grow much faster.&lt;/p&gt;
&lt;p&gt;People who read a lot don&apos;t automatically succeed. But every successful founder I&apos;ve watched was a heavy reader. The people who can step back and check their own thinking, read the current situation, learn, and pull action items quickly, they were all heavy readers too. Sometimes when I&apos;d talk with them about books I&apos;d read before, almost every one of them had read the same ones. The people whose growth stalled and who kept making the same mistakes were mostly the ones who had stopped reading.&lt;/p&gt;
&lt;p&gt;When I tell people to read more, the next question is &quot;what should I read?&quot; If you really feel cut off from books, read anything. A shallow self-help book is fine. Whether it&apos;s shallow is for you to decide after you read it. That said, if you want to raise your literacy quickly, read books you can write about. Read a novel and write your impressions, read a business book and organize your thoughts, read books that let you share your thinking with others. That&apos;s what accelerates your growth. And if you read two or three books for self-improvement, it&apos;s worth squeezing in one novel that someone recommends to you. Novels help you step back and check your own thinking, and they grow your empathy without you noticing.&lt;/p&gt;
&lt;h3&gt;Project Experience That&apos;s Close to the Real Thing&lt;/h3&gt;
&lt;p&gt;No matter how deep your specialized knowledge gets, studying alone has limits. The throwaway one or two-month projects from a bootcamp or an academy don&apos;t move the needle for companies. People who face the reality of what the market demands today, think hard about what counts as a project close to the real thing, and pile up that kind of experience are the ones who&apos;ll stand out. Developers can at least lean on AI; in other fields, that kind of pre-employment experience is even rarer, so paradoxically, you should value it more.&lt;/p&gt;
&lt;p&gt;Close to the real thing means you deployed even a small feature yourself, recruited users, took feedback from those users, and improved the feature. Most junior portfolios end at toy projects, so just having shipped to production and improved something already gives you a real edge, and on top of that, fixing bugs and working through user feedback is something to keep building on. Whatever stage you&apos;re at, getting hired in this market takes patience, and instead of burning that time only on studying, scout for projects where you can build real-world experience, plan them, run them. Building something that even ten people use versus building a throwaway project will give you completely different growth opportunities.&lt;/p&gt;
&lt;h3&gt;Coding Tests: Training Problem-Solving, Not Memorization&lt;/h3&gt;
&lt;p&gt;Junior developers ask me a lot whether it still makes sense, in an era when AI does it all, to study coding tests. And in the actual workplace, people say algorithm coding tests were useless to begin with and now even more so.&lt;/p&gt;
&lt;p&gt;There&apos;s a part of this that&apos;s true and a part that isn&apos;t. If you ask whether algorithms are useful in themselves, well, while building APIs or implementing UI, we almost never use dynamic programming. (For typical SaaS or B2C services.) Reading lots of books, as I said above, has more direct relevance. (Meetings, documentation.) That said, if you treat dynamic programming as domain knowledge, the practice of figuring out how to solve the problem in front of you is, I think, an essential learning process for a developer.&lt;/p&gt;
&lt;p&gt;In other words, prepping for coding tests by memorizing data structures and algorithm theory and solutions is no help at all. We can run into new customers and new requirements at any company, in any domain, in any project, so what we need isn&apos;t algorithm theory as explicit knowledge but the tacit knowledge you pick up in the process of solving the problem. A problem is given, you organize how to solve it, you turn it into code. That&apos;s why I think Big Tech still values algorithm interviews. It&apos;s hard, in a portfolio project, to analyze and implement ten different customer requirements, but with algorithm problems, every problem lets you practice the problem-solving process in a fresh setting with fresh information. As long as you bring deliberate practice to it, algorithm coding tests can be a serious help. And if, after you finish your own solution, you ask AI for feedback to expand your knowledge and experience from different angles, even better.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing: Why People Are Still Needed&lt;/h2&gt;
&lt;p&gt;Someday, all our jobs may be replaced by AI. But for now, a person still has to drive. The market shrunk and hiring shrunk with it; that doesn&apos;t mean hiring is gone. Even with tech moving this fast, companies are still hiring and still need people. When you&apos;ve run an organization, you see that more often than the code itself, people are the opportunity and people are the problem. Other fields are probably the same.&lt;/p&gt;
&lt;p&gt;If I were the hiring lead or the owner, who would I want to work with? Compared to that bar, what am I missing? Think it through and the things to prepare are clearer than you&apos;d guess. A company invests 10 in its people and tries to get back 11, 20, or 100. Even after you get hired, you have to keep asking yourself whether you&apos;re someone who can contribute to the whole organization&apos;s growth.&lt;/p&gt;
&lt;p&gt;The market is rough. At times like this, you walk your own path: do your utmost and leave the rest to heaven — what Koreans call jinin-sadaecheonmyeong (盡人事待天命). Instead of dropping a line about how AI is doing whatever, instead of staring at endless shorts, read a book and put your thoughts in order. Even if you&apos;re not good at it, please keep at it. And don&apos;t try to study; run projects the way you&apos;d run work. And don&apos;t try to memorize; practice coding tests the way you&apos;d train a process.&lt;/p&gt;
&lt;p&gt;You can&apos;t fight the times. The individual human is fragile. People are easily swept up by their environment. When good results come, it&apos;s usually because the environment cooperated. It feels like you got hired because you were good, but it might have been a good market (or good timing), and your results inside an organization usually rest on the organization&apos;s systems. Anyone who&apos;s done real work will agree.
So you shouldn&apos;t get smug when things go well, and you don&apos;t need to spiral when things go badly. You can&apos;t beat the times, but you can beat today. Look honestly at yourself and you already know what to do in this moment.&lt;/p&gt;
&lt;p&gt;I roughly organized the thoughts that came up while mentoring junior developers. I hope this lands for someone trying to make it through.&lt;/p&gt;
</content:encoded><category>essay</category><category>career</category><category>AI</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Scrumble Tech Retro - 2. The Frontend, with a Side of Vibe Coding</title><link>https://flowkater.io/en/posts/2025-10-03-scrumble-tech-retro-frontend-with-vibe-coding/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-10-03-scrumble-tech-retro-frontend-with-vibe-coding/</guid><description>A retro on Scrumble&apos;s Next.js frontend architecture, the realtime sync layer, the HEIC converter, and what I learned about Claude-driven vibe coding the hard way.</description><pubDate>Fri, 03 Oct 2025 12:24:55 GMT</pubDate><content:encoded>&lt;h1&gt;What the Scrumble frontend had to do&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;It&apos;s an SNS at the core, so people post, react with emoji, drop comments, and attach images to content. All of that is non-negotiable.&lt;/li&gt;
&lt;li&gt;After user auth, members re-authenticate inside a workspace, so the whole product runs on member-level identity rather than just user-level identity.&lt;/li&gt;
&lt;li&gt;As I covered on the backend side, realtime mattered everywhere. Notifications, emoji, comments all needed to update live.&lt;/li&gt;
&lt;li&gt;The to-do list had to feel as smooth as we could make it, which meant mapping keyboard shortcuts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Tech stack&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Framework&lt;/strong&gt;: Next.js 15.1.8 (App Router) + React 19, dev server on Turbopack&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language&lt;/strong&gt;: TypeScript 5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS 3.4, tailwind-merge, class-variance-authority, Pretendard font, PostCSS/Autoprefixer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State and data&lt;/strong&gt;: Zustand 5 for client state, TanStack Query 5 + Axios 1.9 for server communication&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Realtime&lt;/strong&gt;: &lt;code&gt;centrifuge&lt;/code&gt; client talking to Centrifugo (auto-reconnect, channel persistence)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Files and media&lt;/strong&gt;: Cloudflare R2 presigned upload, HEIC-to-web-format conversion utilities (&lt;code&gt;heic2any&lt;/code&gt;, &lt;code&gt;libheif-js&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI/UX&lt;/strong&gt;: Framer Motion 12, Emoji Mart, Lucide and Remix icon sets, React Day Picker, React Window virtualization&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PWA&lt;/strong&gt;: next-pwa 5.6.0 service worker plus manifest&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Architecture&lt;/h1&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Next.js 15 App Router owns routing, layouts, and the boundary between server and client components. Global providers all sit in one file, &lt;code&gt;src/app/providers.tsx&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Page components only handle rendering and interaction. Reads, writes, and realtime sync are pulled out into dedicated hooks so the page itself stays thin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Product features live inside &lt;code&gt;src/features/*&lt;/code&gt; as a vertical slice (UI, hooks, services, and a local Zustand store all bundled together by domain).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anything shared (UI, contexts, services, utils) goes into &lt;code&gt;src/shared&lt;/code&gt;, so each domain module can stay focused on its core logic.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Application shell (&lt;code&gt;src/app&lt;/code&gt;)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The App Router directory (&lt;code&gt;page.tsx&lt;/code&gt;, &lt;code&gt;layout.tsx&lt;/code&gt;, &lt;code&gt;loading.tsx&lt;/code&gt;, etc.) defines route surface, lazy loading, and metadata.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;providers.tsx&lt;/code&gt; wraps &lt;code&gt;QueryClientProvider&lt;/code&gt; together with auth, timezone, and the global loading context. The point is to make sure every global hook reads from the same query client.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Route groups like &lt;code&gt;spaces&lt;/code&gt;, &lt;code&gt;auth&lt;/code&gt;, and the dynamic segment &lt;code&gt;[spaceSlug]&lt;/code&gt; map one-to-one with feature domains. Leaf pages usually just call into an entry point under &lt;code&gt;src/features/**/pages&lt;/code&gt; and delegate the logic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API routes under &lt;code&gt;src/app/api/*&lt;/code&gt; only act as a server-side bridge to the backend when we actually need one.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feature modules (&lt;code&gt;src/features/*&lt;/code&gt;)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Each feature follows a vertical slice layout: &lt;code&gt;components&lt;/code&gt;, &lt;code&gt;pages&lt;/code&gt;, &lt;code&gt;hooks&lt;/code&gt;, &lt;code&gt;services&lt;/code&gt;, &lt;code&gt;stores&lt;/code&gt;, &lt;code&gt;types&lt;/code&gt;, &lt;code&gt;utils&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt; all in one folder. Domain UI and logic stay in one place.&lt;/li&gt;
&lt;li&gt;A feature page is just a thin wrapper that composes shared layouts with domain components.&lt;/li&gt;
&lt;li&gt;Hooks wrap the read/write logic and side effects, pulling in TanStack Query helpers from &lt;code&gt;src/shared/hooks/queries&lt;/code&gt; and the domain services.&lt;/li&gt;
&lt;li&gt;Local Zustand stores (&lt;code&gt;stores&lt;/code&gt;) only hold transient UI state that shouldn&apos;t leak outside the feature.&lt;/li&gt;
&lt;li&gt;Feature services use the shared API client to implement domain-specific formatting, optimistic updates, and derived models.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Shared layer (&lt;code&gt;src/shared&lt;/code&gt;)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;components&lt;/code&gt;: design system components built on Tailwind + class-variance-authority (feedback, navigation, inputs, and so on).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;hooks&lt;/code&gt;: reusable query hooks (&lt;code&gt;queries/*&lt;/code&gt;), auth helpers, and realtime subscription hooks. These hide data fetching and state orchestration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;services&lt;/code&gt;: infrastructure services like &lt;code&gt;centrifugo.service.ts&lt;/code&gt;, plus file upload helpers and an analytics logger.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;contexts&lt;/code&gt;: the auth, timezone, and global loading contexts that the app shell consumes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;stores&lt;/code&gt;: global Zustand stores for auth state, toasts, time utilities, and so on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;lib&lt;/code&gt;: low-level integrations (Axios API clients per resource, the token manager, fonts, and API helpers).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;types&lt;/code&gt; and &lt;code&gt;schemas&lt;/code&gt;: type definitions and validation schema fragments shared across feature and API layers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;utils&lt;/code&gt;: formatting, error handling, and general-purpose helpers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Data and state flow&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Axios clients live in &lt;code&gt;src/shared/lib/api/*.ts&lt;/code&gt;, which centralizes base URLs, interceptors, and the token refresh logic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Query and mutation hooks under &lt;code&gt;src/shared/hooks/queries&lt;/code&gt; standardize TanStack Query keys and caching policies, so feature modules can compose them safely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Global state goes into the lightweight Zustand stores under &lt;code&gt;shared/stores&lt;/code&gt;. Feature-specific state stays in a local store inside that feature folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Forms mostly use React Hook Form + Zod, with a shared resolver utility on hand when we need it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Realtime sync&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CentrifugoService&lt;/code&gt; keeps a single Centrifuge client alive and handles reconnects, channel persistence, and event dispatch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Realtime hooks don&apos;t open new sockets. They extend the central Centrifugo layer, so every feature reuses the same connection and event bus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When an event arrives, the hook patches the TanStack Query cache or the local store directly, so the UI updates without an extra refetch.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;UI composition and styling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tailwind CSS + PostCSS is the styling base. We compose variant classes safely with class-variance-authority and tailwind-merge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Animations and micro-interactions go through Framer Motion. Icons and emoji come from shared libraries like Lucide, Remix Icons, and Emoji Mart.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Responsive behavior and virtualized scrolling (React Window) are factored out into reusable components, so page code stays declarative.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Testing and developer experience&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;We test hooks and components with Jest + React Testing Library, and run E2E regression scenarios with Playwright.&lt;/li&gt;
&lt;li&gt;TypeScript strict mode, ESLint, and &lt;code&gt;npm run build&lt;/code&gt; (Next.js with SWC/Turbopack) keep types, lint, and build stability honest before commits.&lt;/li&gt;
&lt;li&gt;Shared tooling like &lt;code&gt;shared/utils/debug&lt;/code&gt; and the token manager keeps debugging and storage strategies consistent across environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;High-level module interaction&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;
graph TD

subgraph &quot;App Router (src/app)&quot;

app_pages[&quot;Pages &amp;amp; Layouts&quot;]

app_providers[&quot;Global Providers&quot;]

end



subgraph &quot;Feature Modules (src/features/*)&quot;

feature_pages[&quot;Feature Pages&quot;]

feature_components[&quot;Feature Components&quot;]

feature_hooks[&quot;Feature Hooks&quot;]

feature_services[&quot;Feature Services&quot;]

feature_stores[&quot;Local Zustand Stores&quot;]

end



subgraph &quot;Shared Layer (src/shared)&quot;

shared_components[&quot;Shared UI Components&quot;]

shared_hooks[&quot;Shared Hooks&quot;]

shared_contexts[&quot;Shared Contexts&quot;]

shared_services[&quot;Infrastructure Services&quot;]

shared_stores[&quot;Shared Stores&quot;]

shared_lib[&quot;API &amp;amp; Token Library&quot;]

end



subgraph &quot;Infrastructure&quot;

tanstack[&quot;TanStack Query Client&quot;]

axios_client[&quot;Axios Resource Clients&quot;]

centrifugo_service[&quot;Centrifugo Service&quot;]

backend[(&quot;REST API Backend&quot;)]

centrifugo[(&quot;Centrifugo Hub&quot;)]

end



app_pages --&amp;gt; feature_pages

app_providers --&amp;gt; tanstack

app_providers --&amp;gt; shared_contexts



feature_pages --&amp;gt; feature_components

feature_pages --&amp;gt; feature_hooks



feature_components --&amp;gt; shared_components

feature_hooks --&amp;gt; shared_hooks

feature_hooks --&amp;gt; feature_services

feature_hooks --&amp;gt; feature_stores

feature_services --&amp;gt; shared_services



shared_hooks --&amp;gt; tanstack

shared_services --&amp;gt; axios_client

shared_services --&amp;gt; centrifugo_service

shared_stores --&amp;gt; feature_components



tanstack --&amp;gt; axios_client

axios_client --&amp;gt; backend

centrifugo_service --&amp;gt; centrifugo

shared_hooks --&amp;gt; centrifugo_service

feature_hooks --&amp;gt; tanstack

feature_hooks --&amp;gt; centrifugo_service

&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Implementation retro&lt;/h1&gt;
&lt;h2&gt;Styling&lt;/h2&gt;
&lt;p&gt;We mostly used Tailwind CSS, and I leaned on Claude Code so heavily that I barely wrote styling by hand. Most vibe coding videos out there don&apos;t actually start from a designer&apos;s spec. They pull tips from sites the author wants to benchmark. From where I sit (working with an actual product designer, Ellie), those tips just weren&apos;t useful.&lt;/p&gt;
&lt;h3&gt;CSS Vibe&lt;/h3&gt;
&lt;p&gt;Around April and May, MCP exploded into a trend. Figma MCP especially got hyped as if hooking it up to Cursor or Claude Code would auto-implement everything. In practice, that&apos;s not how it goes. AI does have some image recognition, but accuracy drops fast. Even when Figma MCP pulls data, it&apos;s reading the properties of Figma image objects under the hood, and because the LLM is text-based, it can&apos;t get to a 100% implementation. It flounders a lot.&lt;/p&gt;
&lt;p&gt;You could ask the designer to make the Figma file pristine (naming, layout, all of it). But realistically, having the designer hand-craft every detail is less efficient than me grabbing the rough style values one at a time and pasting them into a prompt. So MCP got a few uses early on and then I dropped it. I&apos;ll get into this more when I write about how I code with AI, but as of now I don&apos;t use Playwright MCP, Context7, or any of those.&lt;/p&gt;
&lt;p&gt;People talk about MCP a lot less these days too. &quot;It connects&quot; and &quot;it actually works&quot; are different things. Plenty of early write-ups about &quot;it connects,&quot; but I&apos;ve seen almost nothing about MCP actually working well at production scale or in a real team setting (as opposed to toy projects, MVPs, and prototypes).
Could be I&apos;m just ignorant about it. But I decided that the time I&apos;d spend researching MCP was better spent being a little more diligent myself.&lt;/p&gt;
&lt;p&gt;Back to the implementation. What I ended up doing was grabbing the style values straight out of Figma Dev Mode as text, and implementing each component that way. The first pass is a bit of a slog, but it gets you to roughly 90%, and you only need a light touch after that. With MCP I&apos;d hit 30% and then wrestle with prompts forever, so this is the workflow that keeps me moving right now.&lt;/p&gt;
&lt;p&gt;A side note. I tried doing a few screens with no design at all, just whatever Claude proposed visually, but Claude&apos;s own design taste is rough, and I&apos;d have to put serious effort into the prompt without any clear sense of what &quot;done&quot; looked like. I gave up. My setup assumes I have a strong product designer as a partner. For people building solo or without design resources, MCP and benchmark-driven vibe coding will probably still be valid. Just always carry a clear definition of &quot;done&quot; with you.&lt;/p&gt;
&lt;h2&gt;State management&lt;/h2&gt;
&lt;p&gt;We use Zustand for some global UI state (saving the last selected date, that kind of thing), but most of state lives in TanStack Query (a.k.a. react-query).&lt;/p&gt;
&lt;h3&gt;React-query&lt;/h3&gt;
&lt;p&gt;React-query gives you caching plus a bunch of UI-state primitives, and the early learning curve is real. The painful case is when you layer auth middleware on top of plain API calls. You need automatic refresh logic when the access token expires, something I&apos;ve been doing for over ten years. Mixing that into the react-query and Axios layer caused confusion. The actual cause was Claude Code generating duplicate code that I missed. Early on, expired access tokens triggered an infinite redirect loop, and I had to go back and review every line of the react-query code Claude had written, one by one, to fix it. If I&apos;d just read the code, it would have been a five-minute fix. I tried to one-click my way out of reading the react-query code and burned over an hour instead.&lt;/p&gt;
&lt;p&gt;That was the first time I felt how brittle the software gets when you go pure vibe coding outside of MVP territory, and I felt it a lot more after that. If you can read the code, read it. It&apos;s faster. (For now.)&lt;/p&gt;
&lt;p&gt;React-query manages its own cache. I had similar experience with caching in gql-apollo, but react-query&apos;s surface is broader and more feature-rich. Once the server adds caching too (Redis), things get genuinely tricky. Right now I&apos;m doing full-stack so it&apos;s fine (I know every policy in my head), but in a setup where backend and frontend are split, applying caching with the wrong policy can produce bug-shaped behavior that isn&apos;t really a bug. The backend has an interface layer in its architecture, and the API is shaped around client use cases, so this kind of thing has to be designed carefully. Caching done right cuts UX latency and load. Done wrong, it shows the user values they didn&apos;t expect.&lt;/p&gt;
&lt;h3&gt;Optimistic UI&lt;/h3&gt;
&lt;p&gt;As I mentioned on the backend side, the early infra region delay made API latency painfully long. (The feed screen took 2+ seconds.) Without changing the infra (we wanted to squeeze what we had first), the first thing I reached for was Optimistic UI.&lt;/p&gt;
&lt;p&gt;The idea behind Optimistic UI is straightforward. You patch react-query&apos;s internal state first so the UI reflects the change immediately and the user sees no delay. The actual API request runs in the background, and if the response comes back with a different state or an error, you roll the UI state back.&lt;/p&gt;
&lt;p&gt;The first version had small UI glitches. The most obvious one: the UI updated, then the response came back and re-updated, causing a flicker. That&apos;s because we were re-applying the server response to the UI. It guaranteed the freshest server state, but the flicker hurt UX. I changed it so that when the response comes back without issues, we skip the redundant update.&lt;/p&gt;
&lt;h3&gt;Realtime&lt;/h3&gt;
&lt;p&gt;When someone reacts with an emoji to a check-in or check-out, or drops a comment, it updates in realtime. Anyone in the same space should see those feedback actions live. We had Go and Centrifugo (Redis) wiring up the WebSocket nicely, but realtime updates kept getting dropped early on, and I struggled with it. I first suspected a server-side WebSocket issue, but if Centrifugo were the problem, the ClickUp realtime trigger we had wired up next to it would have broken too. That one worked perfectly, which pointed at the client.&lt;/p&gt;
&lt;p&gt;To make the WebSocket channels efficient and spread the load, the feed has multiple posts and we subscribed to each one by post ID as its own channel. As you scroll and a post leaves or re-enters the viewport, the handler resubscribes to that post&apos;s channel.&lt;/p&gt;
&lt;p&gt;I thought this was efficient because we weren&apos;t holding subscriptions to every post ID at all times.
The catch: deciding handler connection state from the UI meant connections occasionally got lost, so comments wouldn&apos;t arrive in realtime now and then. I spent a fair amount of time fixing it, but honestly, just keying the channel on space + date and subscribing to the whole feed would have been simpler. If the event volume or feed size were huge, sure, you&apos;d want optimization. But this was a case of trying to be too clever upfront and burning time on trial-and-error.&lt;/p&gt;
&lt;h2&gt;File storage&lt;/h2&gt;
&lt;p&gt;One thing I like about Next.js is that you get your own server. We didn&apos;t implement file storage in the Go server. We did it directly in Next.js, and only sent the file metadata and the file address to the backend.&lt;/p&gt;
&lt;h3&gt;R2&lt;/h3&gt;
&lt;p&gt;As part of going off AWS, we used R2 for storage. R2 is basically Cloudflare&apos;s S3. It&apos;s just as simple to use as S3. Connect the address, register the auth keys as a Vercel or local secret, and you can upload right away.
If you need file storage for something you&apos;re building, I&apos;d recommend R2. Below is a comparison of the current Free Tiers for S3 and R2. The most attractive piece is the unlimited egress. If your images get embedded across a lot of websites, R2 is worth a serious look on top of just upload cost.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;AWS S3 Free Tier (first 12 months)&lt;/th&gt;
&lt;th&gt;Cloudflare R2 Free Tier (permanent)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 GB&lt;/td&gt;
&lt;td&gt;10 GB-month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Class A ops&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2,000 PUT/COPY/POST/LIST requests&lt;/td&gt;
&lt;td&gt;1 million requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Class B ops&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20,000 GET/SELECT requests&lt;/td&gt;
&lt;td&gt;10 million requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Egress&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 GB&lt;/td&gt;
&lt;td&gt;Free (unlimited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Other&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$100 credit on new accounts (30+ services)&lt;/td&gt;
&lt;td&gt;Permanently free, per account&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The bigger lift wasn&apos;t the upload itself. It was the drag-and-drop UI for dropping files in directly, plus the upload progress indicator. We also did a small client-side resize instead of always uploading the original. The feature came out of how I&apos;d use it personally, occasionally attaching a photo to a check-in or comment. Down the road, if we extend to a tiptap implementation, we can embed images inside tiptap, so we debated this in the planning phase. We landed on a separate photo upload to fit the check-in/check-out purpose.&lt;/p&gt;
&lt;h3&gt;HEIC Converter&lt;/h3&gt;
&lt;p&gt;Most image upload features don&apos;t actually support this, but Ellie and I are both iPhone users, so most of our iPhone images come out as HEIC. The usual upload flow accepts jpg, png, gif, and just refuses HEIC. We wanted the experience of opening Photos on a Mac and dragging straight in, so we built a converter to make HEIC uploads work. I assumed dropping in a single library would handle it. It wasn&apos;t that simple.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fallback logic&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inspect the actual byte signature. If a file is already converted to JPEG, just rename it to .jpg and return it as-is.&lt;/li&gt;
&lt;li&gt;Run through the five strategies defined in the conversionMethods array in order. Return immediately on success. Log success/failure and stats for each attempt.&lt;/li&gt;
&lt;li&gt;If every method fails, summarize the accumulated error list to the log, then return the original file instead of throwing, so the upload flow doesn&apos;t break.&lt;/li&gt;
&lt;li&gt;Expose &lt;code&gt;getHeicConversionInfo&lt;/code&gt; and &lt;code&gt;debugHeicFile&lt;/code&gt; for support and debugging. They show the strategies available in the current environment, the file header, the ftyp brand, and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Conversion methods and libraries&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;heic2any: the default strategy. Tries three output options in sequence (JPEG 90%, PNG, JPEG 100%). Treats an empty Blob as a failure.&lt;/li&gt;
&lt;li&gt;heic-decode: decodes the HEIF bitstream directly with heic-decode, normalizes the various data structures (Uint8Array, object form, etc.) into ImageData, draws to a canvas, then serializes to JPEG.&lt;/li&gt;
&lt;li&gt;FileReader: reads a Base64 URL with no external library, loads it into an img tag, draws to canvas, and produces a JPEG Blob using only browser-native APIs as the fallback.&lt;/li&gt;
&lt;li&gt;heic-convert: dynamically imports the Node-based heic-convert module into the browser bundle and tries Buffer to JPEG conversion. Treats an empty output buffer as an error.&lt;/li&gt;
&lt;li&gt;Browser-native: as a last resort, uses only URL.createObjectURL and a canvas tag to redraw the image and produce a JPEG Blob.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I leaned on Claude Code a lot, but the result ended up being a fairly gnarly converter. With this many fallbacks, every HEIC image converts without exception.&lt;/p&gt;
&lt;p&gt;The side effect: I now happily dig up any old photo and throw it in.&lt;/p&gt;
&lt;h1&gt;Wrapping up&lt;/h1&gt;
&lt;h2&gt;Vibe coding!?&lt;/h2&gt;
&lt;p&gt;After the backend, I went through the frontend at the same fairly minimal level. The frontend leaned on Claude Code far more, and ironically, the higher my dependence on AI got, the lower my productivity went. Especially when I had to debug or fix an issue without much grasp of the code, Claude Code would either fail to find the simple cause of the issue or look at it through too narrow a lens and fall into an infinite loop. Most of the time, when I read the code myself and put my hands on it, the fix turned out to be simple.&lt;/p&gt;
&lt;p&gt;AI writes code fast, sure, but in real situations the context drifts constantly because of policy changes and other issues. Trusting AI alone often left me stuck.&lt;/p&gt;
&lt;p&gt;Writing an SDD or PRD doc, defining the spec up front, is the closest thing to a real alternative. Once requirements get complex and implementation gets complex, though, you often only know things &quot;after building.&quot; A lot of people treat coding like math, where you plug in a formula and get one correct answer. Reality isn&apos;t that. In a working environment where requirements shift hour by hour, and even when you&apos;re coding solo, context gets lost all the time.&lt;/p&gt;
&lt;p&gt;These days I only use Codex, with a flow of: requirements doc, then implementation steps doc, then development broken up by step. That&apos;s been my method, and it&apos;s been much more efficient than before. Once the project I&apos;m on now wraps up roughly, I&apos;ll write a broader piece on what I&apos;ve learned about vibe coding overall.&lt;/p&gt;
&lt;h2&gt;Wrapping the project&lt;/h2&gt;
&lt;p&gt;It&apos;s already been over a month since the first release. Using it internally for our own work makes the things I want to improve very visible. We didn&apos;t build this to open it externally, but I&apos;d love to ship even a beta in the near future. The frontend has piled up a lot of bad code, courtesy of Claude. After the project I&apos;m currently working on releases, the goal is to clean those up bit by bit while continuing feature development.&lt;/p&gt;
&lt;p&gt;At my previous company I rarely coded the frontend hands-on, so this was the chance to deep-dive properly, study, and actually implement. The reason frontend feels hard isn&apos;t really the frontend itself. It&apos;s that it touches the user directly. When I touch what I built and catch a whiff of how bad it smells, I keep fixing and fixing until hours have disappeared. Even so, watching the UI come to life and run is its own kind of dopamine, different from the backend in a way I can&apos;t quite name.&lt;/p&gt;
&lt;p&gt;Same as with the backend, going through this project gave me a clear picture of how I&apos;d run the frontend on the next one.&lt;/p&gt;
&lt;p&gt;I finally wrapped up the long-postponed frontend chapter. That&apos;s the front-end side. Backend post next.&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;Scrumble-related posts
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-09-scrumble-project-retro&quot;&gt;Scrumble Project Retro (June–August 2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-09-25-scrumble-project-team-interview&quot;&gt;Scrumble Team First-Release Interview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-09-scrumble-tech-retro-intro&quot;&gt;Scrumble Tech Retro - 0. Intro (Why Golang?)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-09-scrumble-tech-retro-backend&quot;&gt;Scrumble Tech Retro - 1. Backend (Golang, DDD, Entgo, Event, Centrifugo)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-10-03-scrumble-tech-retro-frontend-with-vibe-coding&quot;&gt;Scrumble Tech Retro - 2. The Frontend, with a Side of Vibe Coding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>project</category><category>frontend</category><category>vibe coding</category><category>scrumble</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Scrumble Team: First-Release Interview</title><link>https://flowkater.io/en/posts/2025-09-25-scrumble-project-team-interview/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-09-25-scrumble-project-team-interview/</guid><description>Right after Scrumble&apos;s first release, Tony, Ellie, and George talk about how they joined the project, what tripped them up, the workshop afterward, and what they want to build next.</description><pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import InterviewCard from &quot;@/components/InterviewCard.astro&quot;;&lt;/p&gt;
&lt;p&gt;Right after wrapping the first release of Scrumble, Tony, Ellie, and George sat down to talk honestly about everything from how they joined the project to what happened behind the scenes at the workshop. If you want the full arc of the project itself, that&apos;s covered in the &lt;a href=&quot;/posts/2025-09-scrumble-project-retro/&quot;&gt;Scrumble Project Retrospective (June–August 2025)&lt;/a&gt;. This post is the interview record: each person&apos;s view, in their own voice.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Q1. How did you join, and what were you hoping for?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;tony&quot; name=&quot;Tony&quot; avatar=&quot;/assets/Tony.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
I&apos;d been away from hands-on engineering work for a long time, so I needed a
project that would relight the fire. And ideally, something I&apos;d actually use
every day and could keep improving over the long haul.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
The idea came from the daily meeting notes I used to keep at my old company.
Check in, check out, share what you&apos;re working on. When you come into the
office every day and see each other for hours, even a quick check-in becomes
the lubricant for team communication. I wanted to build something that
contributed to teamwork through daily check-outs and work updates.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
My goal was to develop the BE/FE stack end to end and get my chops back,
while also actually shipping a complete project.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;ellie&quot; name=&quot;Ellie&quot; avatar=&quot;/assets/Ellie.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
Like Tony, I&apos;d been away from design work for a long stretch and was
thinking, &quot;I should be doing &lt;em&gt;something&lt;/em&gt;...&quot; The timing happened to line up,
and that&apos;s how I ended up working on Scrumble.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
Personally, my own experience with daily meetings had been pretty positive.
I&apos;m someone who values &quot;soft touch.&quot; That said, I&apos;d never seriously
thought hard about how much that process actually contributes to work
efficiency or output, from a manager&apos;s seat. So when Tony told me he was feeling
that exact gap, I got really curious: &quot;What if we dig into users with this
kind of need and shape the product around that direction?&quot;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
As always... we started with the noble intention of &quot;let&apos;s focus on the
MVP,&quot; and somehow drifted into thinking about B2B sales (...) before we knew
it. (We were literally just starting initial product planning.) Thankfully,
we caught ourselves and reset our expectations to match the original intent!
Hehe.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
At some point on this service&apos;s journey, I think we&apos;ll hit a fork between
being a messenger and being a social network. It&apos;s a sensitive topic
these days, so I&apos;m being careful, but when that moment comes I hope we make
a wise, confident call. Personally, I&apos;m hoping we can land on a balanced
kind of communication, one that holds onto the warmth of social connection
without all the unavoidable stress that comes with it. Ultimately, it&apos;s
a small wish, or maybe a big expectation, that we can make it all feel
seamless. Hehe.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;george&quot; name=&quot;George&quot; avatar=&quot;/assets/George.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
I&apos;d been studying through bootcamps and study groups, but I always felt
there was a big gap between that and actual industry work. In the middle of
that, I joined a company.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
It was different from the bootcamp days, but it still wasn&apos;t quite what I&apos;d
pictured as real work. I spent a little over a year there and felt like I
wasn&apos;t really gaining anything. (My premise was wrong from the start.
Building actual experience is what makes future job changes possible.) The
pattern of just reading the room at work, killing time when nothing was
going on... that&apos;s not the life I want. I want to actually know how to do
this and do it well, so when I was given a chance to join the team, I took
it.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I want to finally start building real on-the-job know-how and actual
communication skills with teammates.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q2. What was the hardest moment along the way?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;tony&quot; name=&quot;Tony&quot; avatar=&quot;/assets/Tony.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
The hardest stretches were the wrap-up phase and the time I spent on the
tiptap editor. Toward the end, we had a design issue that meant migrating
every API, and along with that, a mountain of unfinished release tasks
piled up. I just couldn&apos;t get any momentum and kept pushing the project
back.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
The Jeju workation at the end of July helped me reset, but my biggest
feeling is: I wish I&apos;d pulled myself together a little sooner.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
And tiptap. I tried it early on, decided the feature surface was overkill,
and rolled it back. That&apos;s the moment I most want to undo. Later, there
were way more entangled features and way more accumulated data, so adding
it back was much harder. I burned a ton of time on it and never finished.
If I&apos;d just done it from the start, things would&apos;ve moved faster. That&apos;s
the moment that sticks with me, haha.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;ellie&quot; name=&quot;Ellie&quot; avatar=&quot;/assets/Ellie.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
I&apos;d mostly done mobile design before, so when I tried to work on web
views... the canvas felt like open ocean. That&apos;s where I lost a lot of
time. And I let my planning ideas run wild, daydreaming about a rosy future
without permission, so I wasted a lot of the time I should&apos;ve spent on the
actual core work. My heart got way ahead of me (sob), and things got
pretty tangled up. Hehe!
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
A moment I&apos;d take back? Pushing component-ization way too aggressively
before the design was even fixed (which ended with me ripping it all out
and starting over). Charging in with color choices first. I should have
set the weight aside and focused on the truly core features and value, but
I wasn&apos;t confident there, so I buried myself in interaction details
instead. Skipping hand sketches because they felt like a waste of time and
just sitting in front of the monitor flailing. Where do I even start?
(sob sob) If I could undo all of it now... could I actually do it well?
Hehehehe.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
The root of all of this is probably some unholy mix of perfectionism +
arrogance + laziness + bottling it all up. Lesson I keep relearning: when
you&apos;re setting direction, discuss fast, focus fast, execute fast.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;george&quot; name=&quot;George&quot; avatar=&quot;/assets/George.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
At my company, when a particular task ends and they don&apos;t give me the next
one (because there&apos;s nothing to do), I sit there killing time. That stretch
is brutal. Scrumble was the opposite. It wasn&apos;t that there was nothing to
do, it was that I had so much to do, in my own way, that I didn&apos;t know how
to start chipping away at it. Too much on the plate. That was its own kind
of hard.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
Like Tony said, you just have to put in the raw hours and start with the
small things, the things you actually can do. But because I had so much
and kept putting it off, it snowballed and I&apos;d end up just sitting there
blank for long stretches.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
Because of that, there were periods during the project where I&apos;d hit
sudden, deep exhaustion. I haven&apos;t fully fixed the habit yet, but if I
could go back to those moments now, I think I&apos;d just start with the small
things instead of overthinking it.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q3. Tony, how did it feel to work as an engineer again instead of a manager?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;tony&quot; name=&quot;Tony&quot; avatar=&quot;/assets/Tony.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
I wrote about this in my retrospective too. It was genuinely happy and
genuinely painful. And one thing became really clear: no matter how much
AI boosts productivity, my mental model and memory have hard limits. To
finish a thing all the way down to the last detail, I can only really
work within the scope I can hold in my own head.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
Without Claude, this would&apos;ve taken much longer and full-stack development
would&apos;ve been even harder. But there are still a lot of pieces I have to
work through myself.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
Even while doing engineering work, the manager skills helped me sometimes
(using AI well, making decisions). But the things I was actually good at
as a manager (communication, prioritization) got dropped while I was
head-down coding. That cost was real. This project was about going back
to engineer Tony, not team-manager Tony, and from that angle I&apos;d say it
was a success.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q4. What&apos;s the next goal you want to focus on, Tony?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;tony&quot; name=&quot;Tony&quot; avatar=&quot;/assets/Tony.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
For solopreneurs and small teams, what really matters isn&apos;t which tech
stack you use. It&apos;s whether you actually build a product customers want.
I&apos;ve spent a long time on the product-management and team-management side,
so now I think it&apos;s time to run with growth as the focus.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I&apos;ve done plenty of &quot;talking&quot; through this project. There&apos;s a recent talk
I watched that said the whole point of a product leader, the final goal,
is leading the team to victory. I shared this at the workshop too: I want to give everything I have to getting those wins.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q5. Ellie, how did it feel to be back in product-designer mode?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;ellie&quot; name=&quot;Ellie&quot; avatar=&quot;/assets/Ellie.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
I felt my limits, hard. First, I had to admit, objectively, that I&apos;d gotten
pretty lazy. This was actually my first time using AI seriously. Once you taste what AI can do, you really do get lazy.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I used to sketch by hand, thinking through technical constraints and
development direction in my head, organizing UI and UX together... but this
time I worked far more with my eyes than my hands. That said, for the kind
of documentation work where the time investment usually outweighs the
impact, AI made things much smoother. I saved a lot of time. The proudest
moment was when I clearly mapped out the edge-case users for the service.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
It&apos;s a project that got me back into work mode after a long time, so just
that part feels good. But I only managed to handle the open-ocean (...) of
the web view, so I&apos;m not super satisfied with what I made. Honestly, I
want to rip it all out and start over. The desire is there, anyway, hehe.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q6. Any conflicts with Tony you remember?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;ellie&quot; name=&quot;Ellie&quot; avatar=&quot;/assets/Ellie.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
Truth is, I can&apos;t even remember what we were fighting about that hard
anymore. (Looking away.) When you collaborate, it&apos;s all just differences in
perspective, and everyone&apos;s saying something reasonable, and then you start
going &quot;no &lt;em&gt;you&apos;re&lt;/em&gt; the right one, no &lt;em&gt;I&apos;m&lt;/em&gt; the right one,&quot; and voices get
raised. That&apos;s just how it goes, right? Hahaha! And thankfully, somehow,
Tony and I always seem to find our way through and let it out, for better
or worse. Hahaha!
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I think conflict and raised voices in a discussion are part of the process
of reaching a result, so I expect we&apos;ll keep fighting plenty. -But the
emotional toll inside that process, I can&apos;t ignore that either. (And
these days, the emotional toll turns into a physical one too...
apparently...?) So going forward, I think we need to set the focus of a
discussion clearly. Not just the topic, but the limits (time, scope,
feature boundaries) agreed on in advance. That should cut down a lot of
the emotional drain.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q7. George, what did you get out of investing your evenings and weekends?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;george&quot; name=&quot;George&quot; avatar=&quot;/assets/George.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
I didn&apos;t have a clear technical target from the start. My goal was more
about engaging with the work more actively than I had during my previous
baseball-app side project and study groups, and to actually try to
communicate well.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
At first I was overdoing the communication a bit, and as the project went
on I dialed it back. But I came to realize that everyday chat isn&apos;t the
whole of communication. The real thing is sharing, on a work level, where
you and the other person are in your understanding and what you&apos;re each
working on. I want to apply that actively in the next project.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
As the project went on, I half-joked that I wanted to become an &quot;API
factory boss.&quot; But I still find it hard to write design documents and
requirements documents, so I&apos;m going to keep writing them, getting
feedback, and revising.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q8. Going forward, how do you want to contribute as a teammate?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;george&quot; name=&quot;George&quot; avatar=&quot;/assets/George.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
For now I&apos;m part-time and handling small pieces. But even those small
pieces are tough to do alone without Tony&apos;s help. Full-time is out of the
question right now. I want to become a teammate that Ellie and Tony can
hand the parts I currently work on to without worrying.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q9. The first-release workshop: what was the best part?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;george&quot; name=&quot;George&quot; avatar=&quot;/assets/George.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
It was the first workshop I&apos;d ever attended in my life. Both of you put so
much into preparing it, and I wanted to match that effort and engage
properly.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I really listened to Ellie and Tony&apos;s presentations, and I got a lot from
the materials too. So &lt;em&gt;that&apos;s&lt;/em&gt; how you give a presentation, &lt;em&gt;that&apos;s&lt;/em&gt; how
you build the deck. I&apos;d been worrying out loud beforehand (I don&apos;t know
how to do this, building presentation materials is hard), but when I
finished, you both told me you&apos;d actually been worried too and thanked me
for delivering. That meant a lot.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
Outside the workshop itself, the Seoul itinerary (the full course!) and
being able to stay overnight in Seoul were so satisfying. So grateful.
Honestly, the whole thing made me think: so &lt;em&gt;this&lt;/em&gt; is what a startup feels
like?
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;ellie&quot; name=&quot;Ellie&quot; avatar=&quot;/assets/Ellie.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
For me, the main target audience for this first-release workshop was
actually George. So I admit I put a little extra into the venue and the
activities! If the workshop had just been about sharing deliverables, we
could&apos;ve done it remotely without losing much. But I wanted the atmosphere
to match the purpose of our Scrumble service, and I think we landed it
well at this event.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I poured myself into the presentation deck. That&apos;s the magic of a
workshop, the something that makes you look forward to the next one.
Smooooth
operator~~~~~~
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;tony&quot; name=&quot;Tony&quot; avatar=&quot;/assets/Tony.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
I sometimes come across as the &quot;I do fine on my own&quot; type, but the truth
is I really love working as a team. I love people. So even though this was
a much smaller team than what I&apos;m used to, it was a blast. I wanted to
show George, who hasn&apos;t worked at an IT startup before, what that culture
looks like, and I also wanted to send the message that even though we work
remotely, we&apos;re working as one team. Each person&apos;s presentation was great,
and I think we genuinely listened to each other. This time it was a
workshop celebrating wrapping the project, but next time I hope we can
throw a real results-celebration party. The workshop did a lot to motivate
everyone.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q10. What&apos;s the next goal you want to hit with Scrumble?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;ellie&quot; name=&quot;Ellie&quot; avatar=&quot;/assets/Ellie.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
On the design side, it&apos;s the mobile view and branding. Because the design
was patched together, I find myself side-eyeing my own work, hehe. I&apos;m
still figuring out exactly how to approach it, but I really want to fix it.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
At the workshop I shared &quot;Insights on the G-type user, UX improvement
points,&quot; and I want to keep stacking small UX optimizations like that. I
believe small details add up to a big difference in experience over time.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
And (small confession here) when I documented and proudly shared what
I called an &quot;edge case&quot; a while back, the more time passes the more I
realize that &quot;edge case&quot; might just be... me, hehehe. So in that sense,
Tony was my first customer at the start, but now I think I&apos;m also a
target user. Ultimately, I want to grow this into a service I&apos;d be
satisfied with myself.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;george&quot; name=&quot;George&quot; avatar=&quot;/assets/George.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
Through Scrumble I got to read both of your daily lives and work updates,
which built a sense of closeness (hobbies and all). And writing my own
daily and work updates gave me a chance to get closer to both of you. We
don&apos;t have all of Scrumble&apos;s features yet, so I want to keep showing up
for the development work and help build it into a product everyone on the
team is happy with.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;tony&quot; name=&quot;Tony&quot; avatar=&quot;/assets/Tony.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
We don&apos;t have any sales lines yet, and I didn&apos;t build this as something I
necessarily wanted to make public. But in the end, the real bar is opening
the tool up and getting customers who pay actual money for it, right? I&apos;m
on a different project right now, but I keep slipping in small updates
when I don&apos;t feel like working, so I hope we can get to a public beta
soon.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q11. What were you most grateful for in working as a team?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;tony&quot; name=&quot;Tony&quot; avatar=&quot;/assets/Tony.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To Ellie&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
We spend so much time working in the same space. Without Ellie, I don&apos;t
think I would&apos;ve had the courage to start this project at all.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
On my own I tend to give up easily, so I lean on Ellie a lot, and I&apos;m
always expecting beautiful copy and design from her. The whole three months
of Scrumble is time spent with Ellie, so honestly, thank you for every
single thing from start to finish.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To George&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
Thank you for not giving up and following us all the way here.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I believe the result, whatever it ends up being, only comes to people who
don&apos;t quit. As your mentor I showed plenty of my own gaps too, and I&apos;m
really grateful for how well you stuck with it. You&apos;ve clearly grown
compared to where you started, and I hope you keep that growth momentum
going and even pick up speed.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;ellie&quot; name=&quot;Ellie&quot; avatar=&quot;/assets/Ellie.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To Tony&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
Aside from hospital visits (!), Tony shares the same space and time with
me. Without Tony&apos;s decisiveness and that easy, lighthearted attitude, we
probably wouldn&apos;t have made it this far. So please, get even more
lighthearted! Don&apos;t lose the humor! Crank it up even higher, that&apos;s what
I&apos;m saying!
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
There will be plenty more rounds of debate and argument and bruises and
repair ahead, but let&apos;s keep working through them wisely and pushing toward
something even more meaningful! Always grateful!
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To George&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
I know coming into this team and going through it all with us probably
wasn&apos;t easy. I see a lot of my own tendencies in you, which is why I
sometimes find Tony a little (?!) frustrating, hahaha. Even so, thank you
for staying all the way through without dropping out. You&apos;ll definitely
feel that you&apos;ve been growing, bit by bit, through this experience. And I
believe that growth will be the strength that carries you forward!
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;george&quot; name=&quot;George&quot; avatar=&quot;/assets/George.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To Tony&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
Tony, thank you so much for not giving up on me and pulling me along.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
You shared so much good information and so many guides with me, and that
was a huge help. And above all, thank you for giving me the chance to
work on a team like this.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To Ellie&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
I had relatively fewer chances to talk with you compared to Tony, but
whenever I presented or did a retrospective, you listened so closely and
reacted so warmly. That meant a lot.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
Hearing that you&apos;d been cleaning and organizing before our Seoul trip,
I felt bad. I knew you must&apos;ve put in a lot of effort during the trip
too. It was a really satisfying workshop and outing! From now on, I&apos;m
going to try harder to ask directly about things I don&apos;t know.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;h2&gt;Q12. Anything you want from each other going forward?&lt;/h2&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;tony&quot; name=&quot;Tony&quot; avatar=&quot;/assets/Tony.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To Ellie&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
Let&apos;s talk more often and fight more honestly! Hehe. For the sake of
product growth, for the sake of the win, let&apos;s pick back up the unfinished
wish (?) we left somewhere five years ago and see it through this time.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
And let&apos;s run a little more for our individual growth too! And let&apos;s talk
more often and more deeply with each other!
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To George&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
Don&apos;t give up. Go all the way. Forget about how &lt;em&gt;you&lt;/em&gt; are, how AI is, how
the market is, all of that for now. Take pride in your work, find some
enjoyment in it, and keep moving forward step by step, even if it&apos;s slow.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I&apos;ll help where I can. Don&apos;t put a ceiling on your own ability and don&apos;t
let fear stop you. Push harder.
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;ellie&quot; name=&quot;Ellie&quot; avatar=&quot;/assets/Ellie.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To Tony&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
The unfinished wish~ just thinking about it~ Soy lago...😶‍🌫️ I hope the
time we spend running toward our goal together becomes deeper and more
meaningful! And so~ this is how it ended up! May we be able to land on a
conclusion like that. Let&apos;s keep going! Talk more often! Argue more
honestly! Resolve things more wisely!
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To George&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
Please don&apos;t see yourself as small or downplay your work! I do that pretty
often myself, hehehe. But it always trips me up and ends up burning
moments I could&apos;ve used to push further. There&apos;s no shortcut to believing
in yourself and moving forward, so. Anyway, let&apos;s be the ones moving
forward!
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;InterviewCard variant=&quot;george&quot; name=&quot;George&quot; avatar=&quot;/assets/George.png&quot;&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To Tony&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
I&apos;m someone who shifts a lot depending on my environment and the people
around me, so I want to get even closer with Tony. For that to happen, I
need to be the kind of person who actually picks up on what&apos;s being said
and acts on it.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
I want to keep growing so we can share both work talk and casual talk and
just be on better terms. I know mentoring me is hard and busy work for you,
but I want to keep up well and not let you down, and show you good
process and good results.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
&amp;lt;strong&amp;gt;To Ellie&amp;lt;/strong&amp;gt;
&amp;lt;br /&amp;gt;
Tony&apos;s been hearing my nonsense since we were young, so he&apos;s built up some
immunity. But I could tell Ellie was finding it a bit heavy, hahaha. I&apos;ll
try to dial it down a notch.
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
Then I think I&apos;ll be able to get closer with Ellie too. I&apos;m starting to
practice asking you things directly now, so even if it&apos;s frustrating,
please bear with me!
&amp;lt;/p&amp;gt;
&amp;lt;/InterviewCard&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Workshop, in pictures&lt;/h3&gt;
&lt;p&gt;&amp;lt;section className=&quot;workshop-gallery&quot;&amp;gt;
&amp;lt;figure className=&quot;workshop-gallery__hero&quot;&amp;gt;
&amp;lt;img src=&quot;/assets/retro_space.jpeg&quot; alt=&quot;The workshop venue&quot; loading=&quot;lazy&quot; /&amp;gt;
&amp;lt;figcaption&amp;gt;The workshop venue!&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div className=&quot;workshop-gallery__row&quot;&amp;gt;
&amp;lt;figure className=&quot;workshop-gallery__item&quot;&amp;gt;
&amp;lt;img
src=&quot;/assets/cutie_ellie_pt.jpeg&quot;
alt=&quot;Ellie preparing her presentation deck&quot;
loading=&quot;lazy&quot;
/&amp;gt;
&amp;lt;figcaption&amp;gt;Master presenter Ellie&apos;s PT show&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;figure className=&quot;workshop-gallery__item&quot;&amp;gt;
&amp;lt;img src=&quot;/assets/pt_end.jpeg&quot; alt=&quot;Ellie after finishing her talk&quot; loading=&quot;lazy&quot; /&amp;gt;
&amp;lt;figcaption&amp;gt;The cute final slide of Ellie&apos;s deck&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;figure className=&quot;workshop-gallery__item&quot;&amp;gt;
&amp;lt;img
src=&quot;/assets/OST_pt.png&quot;
alt=&quot;A slide from the workshop presentation&quot;
loading=&quot;lazy&quot;
/&amp;gt;
&amp;lt;figcaption&amp;gt;Ellie didn&apos;t bring a deck; she brought a game&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;figure className=&quot;workshop-gallery__hero&quot;&amp;gt;
&amp;lt;img
src=&quot;/assets/workshop_meal.png&quot;
alt=&quot;Grilled meat after the workshop&quot;
loading=&quot;lazy&quot;
/&amp;gt;
&amp;lt;figcaption&amp;gt;After a workshop, gotta be grilled meat!&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;p className=&quot;workshop-gallery__cta&quot;&amp;gt;A great workshop. Let&apos;s do it again!&amp;lt;/p&amp;gt;
&amp;lt;/section&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The Scrumble team&apos;s first release wasn&apos;t just the moment we finished a feature set. It was the process of matching each other&apos;s pace and body temperature. What kind of growth curve we&apos;ll trace next season, and whether this interview becomes the starting point for another record, is what I&apos;m looking forward to.&lt;/p&gt;
</content:encoded><category>project</category><category>interview</category><category>team-culture</category><category>scrumble</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Migrating from Obsidian Publish to an Astro Blog</title><link>https://flowkater.io/en/posts/2025-09-24-obsidian-publish-migrate-to-astro/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-09-24-obsidian-publish-migrate-to-astro/</guid><description>After about a year and a half on Obsidian Publish, I moved my blog to Astro. Obsidian itself is great, but Publish still falls short as a blogging tool. Plus, Astro is free.</description><pubDate>Wed, 24 Sep 2025 05:18:38 GMT</pubDate><content:encoded>&lt;p&gt;Obsidian is a genuinely strong tool for personal wikis and writing, and if you care about Zettelkasten or documentation, it&apos;s the editor most people recommend these days. I never warmed up to Notion, and Roam Research always felt a bit unwieldy to me. As Obsidian started turning into the de facto standard in this space, I made the jump and committed hard. I even paid for Obsidian Publish and migrated my whole blog over from gatsbyjs, which had been working fine.&lt;/p&gt;
&lt;p&gt;Deployment was fast, the site design was decent, and writing was comfortable. I switched over around 2023 and managed to ship a few retrospectives along the way, so it earned its keep. But using Obsidian Publish as a blogging platform turned out to be rough in a lot of small ways. The biggest issue was SEO. My old gatsbyjs blog had a steady stream of organic traffic, and after I moved to Obsidian Publish that traffic basically evaporated. If I wanted someone to read a post, the best option was to send them the link directly. Even for a blog I write mostly to scratch my own itch, having readers and not having readers are very different things.&lt;/p&gt;
&lt;p&gt;It&apos;s file-based and doesn&apos;t enforce frontmatter. Once you add Obsidian sync and Publish, the price climbs. Custom things like Google AdSense and event tracking aren&apos;t supported; you&apos;re stuck with whatever Obsidian itself ships (like GA). And the biggest pain point is the lack of a comment feature. Not that anyone was lining up to comment, but I do have at least a small soft spot for a bit of back-and-forth, and the silence wore on me.&lt;/p&gt;
&lt;p&gt;Even so, I wasn&apos;t writing that often, and Obsidian was comfortable enough that I kept using it. But now that I&apos;m a free agent, what&apos;s left is the record I leave behind, and the record is the writing itself. I wanted to take it more seriously, so I moved again — this time to an Astro-based blog platform.&lt;/p&gt;
&lt;p&gt;That makes &lt;a href=&quot;/posts/2019-11-restart-blogging&quot;&gt;Restarting Blogging&lt;/a&gt; date back to November 2019, and &lt;a href=&quot;/posts/2023-12-blog-migration-obsidian&quot;&gt;Blog Migration (Gatsbyjs to Obsidian Publish)&lt;/a&gt; to late December 2023. Looking at that first post, my real blogging history goes back to Octopress, then Jekyll, Gatsbyjs, Obsidian Publish, and now Astro. Five platforms in.&lt;/p&gt;
&lt;p&gt;(I&apos;m the kind of person who buys a notebook and pen before studying, or researches gear before working out, so my way of expressing intent is always pretty noisy.)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; bills itself as a web framework for content-driven sites, and it seems to power not just blogs but e-commerce and other kinds of sites too. Rendering is fast, SEO is configurable, SSR works, and a lot of upsides surfaced when I evaluated it. I&apos;m using a theme right now, but I figured I could customize it myself down the line, so I picked it. The other candidate I looked at was &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt;, built on Golang. I judged Astro to be more extensible, so Astro it was.&lt;/p&gt;
&lt;p&gt;The thing that gave me the most trouble during the move was converting Obsidian&apos;s folder-tree markdown files into a flat structure. I wrote a few automation scripts with Codex and ran the migration that way. And surprisingly, since Obsidian doesn&apos;t carry frontmatter (the post metadata), I had to look up the creation date of each old file and rewrite the format one by one. That was probably the hardest part. Thankfully — if you can call it that — there weren&apos;t that many posts, so it went quickly enough...&lt;/p&gt;
&lt;p&gt;Since leaving the company, I&apos;ve been on a &quot;leave AWS behind&quot; kick for a while and started using CloudFlare. CloudFlare Pages even supports Astro-specific deploys, so the deploy itself took maybe five minutes, and I added a few more conveniences with scripts.&lt;/p&gt;
&lt;h4&gt;Stack&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;CloudFlare Pages&lt;/li&gt;
&lt;li&gt;Github (with giscus comments)&lt;/li&gt;
&lt;li&gt;Decap CMS (not yet. Would the headless CMS editing experience even be good? Wouldn&apos;t it be easier to just write in a markdown editor and convert?)&lt;/li&gt;
&lt;li&gt;Google Analytics / Posthog (always wanted to try it, so why not now)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ve been posting to Threads here and there too. I want to keep jotting down the non-retrospective stuff, the thoughts that drift through my head.&lt;/p&gt;
&lt;p&gt;Let&apos;s go (or so I tell myself).&lt;/p&gt;
</content:encoded><category>log</category><category>blog</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Scrumble Tech Retro - 1. Backend (Golang, DDD, Entgo, Event, Centrifugo)</title><link>https://flowkater.io/en/posts/2025-09-scrumble-tech-retro-backend/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-09-scrumble-tech-retro-backend/</guid><description>A technical retrospective on building Scrumble&apos;s backend with Go, Fiber, Entgo, and Centrifugo, covering domain modeling, real-time feed infrastructure, caching strategy, and the test and deploy pipeline.</description><pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Scrumble Backend Tech Retrospective&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Bring back the human connection we&apos;re losing in the AI era, into the way we work.
&lt;strong&gt;Scrumble&lt;/strong&gt; is a daily-scrum-based team communication platform built around emotional bonds and mutual support between teammates.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was the early direction of the project. For non-technical details, you can read &lt;a href=&quot;/posts/2025-09-scrumble-project-retro&quot;&gt;Scrumble Project Retrospective (June–August 2025)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There were a lot of requirements, but the core features ended up looking like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workspace and member management (creation, invites, etc.)&lt;/li&gt;
&lt;li&gt;Check-in / check-out posts (the daily scrum)&lt;/li&gt;
&lt;li&gt;Feed list&lt;/li&gt;
&lt;li&gt;Real-time post comments and reaction emojis&lt;/li&gt;
&lt;li&gt;To-do list&lt;/li&gt;
&lt;li&gt;Notification system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stats and reports, third-party integrations, and bot connections are still WIP, so the implemented list is what&apos;s above. My current team uses this every day at the start and end of work, with active check-in scores, check-in posts, and comments flowing through it.&lt;/p&gt;
&lt;p&gt;Looking inside the domain requirements, a few technical agendas stand out from the backend angle. The main three:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Domain and schema relationships across workspace, member, post, comment, reaction, and to-do&lt;/li&gt;
&lt;li&gt;Feed list&lt;/li&gt;
&lt;li&gt;Real-time updates (seamless UX)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s a fairly typical SNS-plus-SaaS-platform setup.&lt;/p&gt;
&lt;p&gt;Looking at my own list, it doesn&apos;t look like much... but below I&apos;ll share what I wrestled with while building each of these.&lt;/p&gt;
&lt;h2&gt;Tech Retro&lt;/h2&gt;
&lt;h3&gt;Project Tech Stack&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Language&lt;/strong&gt;: Go 1.23+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web framework&lt;/strong&gt;: Fiber v2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL 15&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ORM&lt;/strong&gt;: EntGo + Atlas migrations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache&lt;/strong&gt;: Redis 7 (real-time state management)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auth&lt;/strong&gt;: JWT + Google OAuth (Goth)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebSocket&lt;/strong&gt;: Centrifugo (real-time reactions/comments)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency injection&lt;/strong&gt;: Wire (Google)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logging&lt;/strong&gt;: Zap (structured logging)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev tool&lt;/strong&gt;: Air (hot reload)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph TD
  subgraph Browser[&quot;Next.js&quot;]
    UI[&quot;App Router / TanStack Query&quot;]
    WS[&quot;WS Client (Centrifugo)&quot;]
  end

  subgraph API[&quot;Scrumble API (Go Fiber)&quot;]
    H[&quot;HTTP Handlers&quot;]
    S[&quot;Application Services&quot;]
    D[&quot;Domain&quot;]
    R[&quot;Repositories&quot;]
  end

  subgraph RT[&quot;Real-time&quot;]
    CF[&quot;Centrifugo&quot;]
  end

  subgraph Data[&quot;Data Stores&quot;]
    PG[(PostgreSQL)]
    REDIS[(Redis)]
  end

  UI --&amp;gt; H
  H --&amp;gt; S --&amp;gt; D
  S --&amp;gt; R
  R --&amp;gt; PG
  S --&amp;gt; REDIS
  S --&amp;gt; CF
  WS --&amp;gt; CF
  CF --&amp;gt; REDIS
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Fiber&lt;/h4&gt;
&lt;p&gt;The most common Go web framework is probably Gin, and I&apos;ve been working with Echo before this, but I&apos;ll be sticking with Fiber for a while. The biggest difference: Gin and Echo are built on net/http, so they follow Go&apos;s server standard, while Fiber is built on fasthttp and isn&apos;t standard. It also has a smaller set of standardized core libraries compared to Gin. Still, the essentials are all there, and since it&apos;s Express-inspired, the initial setup is simple. People advertise it as faster, but once you attach a DB it depends on the situation and environment, and Gin/Echo are both plenty fast, so that&apos;s not the reason. (I haven&apos;t built anything serving the kind of traffic where it would actually matter.) Because it&apos;s fasthttp, the libraries for things like real-time differ a bit from the standard ones, but rolling your own isn&apos;t hard, and I&apos;m using Centrifugo anyway, so it doesn&apos;t really come up.&lt;/p&gt;
&lt;p&gt;If you&apos;re picking up Go for the first time, I&apos;d usually recommend Gin. But if you&apos;ve enjoyed working with Express in Node.js/TS, Fiber is a fine choice too.&lt;/p&gt;
&lt;p&gt;In Go, what the web framework does sits on the outer edge anyway, so as long as you&apos;ve cleanly separated the handler layer, swapping frameworks isn&apos;t a huge job. Honestly, going non-mainstream is just my taste, so take that with a pinch of salt.&lt;/p&gt;
&lt;h4&gt;Entgo + Atlas migrations&lt;/h4&gt;
&lt;p&gt;To be precise, the stack is Entgo + SQLC. About halfway through the project, I realized Entgo doesn&apos;t issue JOIN queries, and that it leans more toward being a type-safe query builder than a real ORM. Given that my architecture already separated domain entities from Entgo schema entities, Entgo became more of a headache the deeper I got into the project. I&apos;d been using gorm before that, but Entgo felt like it might be the new standard, so I introduced it without much thought. The result was a mess. The pain points piled up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No JOINs
&lt;ul&gt;
&lt;li&gt;The default behavior is the N+1 query pattern. If you write &lt;code&gt;client.User.Query().withPosts()&lt;/code&gt; in code, instead of joining, it SELECTs from users, then takes those IDs and runs a second SELECT against posts.&lt;/li&gt;
&lt;li&gt;There are reasons for this. Turns out Entgo plays well with GraphQL (which I keep doing wrong, apparently), and it&apos;s designed so you build queries in a graph style. That design has its upsides: cleaner entity mapping, easier control over lazy/eager loading. But you end up firing N queries when one would have done the job, and that&apos;s a real performance hit. While trying to express it in Entgo&apos;s syntax, I kept thinking, why am I doing this when raw SQL would be one line? Eventually I went with CQRS and switched the Query repository to SQLC.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Code-first schema migration
&lt;ul&gt;
&lt;li&gt;Code-first means you control DB tables from code. The problem is that PostgreSQL has a huge feature surface, and there are times when you have to wire those features up by hand in code. And while you&apos;re managing migration files, you&apos;d like to keep a record of what changed. But because it&apos;s code-first, when Atlas reads my code to generate migrations and syncs the schema, the SQL migration files I&apos;d written by hand get wiped.&lt;/li&gt;
&lt;li&gt;For things like creating GIN indexes on JSON columns, I had to dig through the latest library code to figure out how Entgo supports it. Claude didn&apos;t have current info either, so it kept generating the wrong schema definitions, and I burned a lot of time on what I&apos;ll politely call grunt work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mountains of generated boilerplate
&lt;ul&gt;
&lt;li&gt;Because it&apos;s type-safe and code-first, defining an Entgo schema and running generate produces a vast number of default files. I prefer not to have my searches turn up code I didn&apos;t write, so the constant hits on code that was, in a sense, someone else&apos;s, got under my skin.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unless your ORM ships a lot of conveniences, like JPA, ActiveRecord, or Django ORM, or it&apos;s the de facto standard, the whole point of using one is to make the object-mapped schema slightly easier to handle in code. For that level of value, Entgo had too many drawbacks for me. And in an early-stage project that doesn&apos;t really need the complexity of CQRS, the basic query-performance issue alone forced me into it.&lt;/p&gt;
&lt;p&gt;If I were running a tiny microservice with very simple entities, paired with GraphQL, no complex layering, sure, Entgo might be worth a look. But for that kind of simple server, do you even need it? Anyway, I picked it from day one and I&apos;m seeing this project through with it, but I wouldn&apos;t choose it again. Given my preferences, future Go projects will use schema-first SQL migrations and an ORM that runs JOIN queries by default. I don&apos;t want to split things into Command Repository and Query Repository early on. (For reference, my current project uses Bun ORM and golang-migrate.)&lt;/p&gt;
&lt;h4&gt;Other pieces&lt;/h4&gt;
&lt;p&gt;I&apos;ve stuck with PostgreSQL as the standard database. For real-time and caching, Redis (more on that below). Social auth is Goth. It&apos;s not at Supabase&apos;s level, but it&apos;s pretty simple, just hook up the API and the keys. For DI I went with Wire, which works at compile time. That&apos;s the standard pick in Go DI, nothing fancy. Logging is Zap, also a standard pick, and it does structured logging well. For the dev server I used Air. Considering Go is a compiled language, the experience of having it auto-compile and hot-reload on every code change feels almost like developing a server in a scripting language. When I worked in Spring, the slow startup was painful since I&apos;d been spoiled by Ruby and Python server boot times, and it was hard to keep development flow going. (Maybe it&apos;s faster now? I haven&apos;t touched Spring in a while.) Go&apos;s lightweight, fast feedback loop is genuinely great.&lt;/p&gt;
&lt;h3&gt;Architecture (DDD / Clean Architecture layering)&lt;/h3&gt;
&lt;p&gt;Scrumble is essentially a workspace-based SNS, so I needed an architecture that could grow. I aimed for one that pays off more in the middle of the project than at the very start, and I refactored the early implementation more than once.&lt;/p&gt;
&lt;p&gt;The architecture follows Domain-Driven Design with the layering Interface (handler) &amp;lt;- Application &amp;lt;- Domain &amp;lt;- Infrastructure (repository+).&lt;/p&gt;
&lt;p&gt;Interface handler functions and Application service functions are 1:1, and the business logic lives in Application, where I compose Domain entities and functions. I avoid building services as separate Domain structs (what would be classes in OOP). Leaning into Go&apos;s package-oriented nature, I use package-level global functions instead. Repositories are also defined as interfaces in the Domain layer, so in practice Application does all the work via Domain entities + Domain package functions + Repository functions (interfaces).&lt;/p&gt;
&lt;p&gt;Since the project leans into DDD, design always begins with Domain entities and value objects, then Repository interface definitions and use-case implementations (Application). The Infrastructure schema (Entgo schema structs) is built separately to mirror those, and the Repository implementation loads those schema structs and converts them into domain structs before handing them up to Application.&lt;/p&gt;
&lt;p&gt;Early on I used to return domain objects from Application too, but partway through I redid the structure. On top of Handler request and response types, I introduced separate DTOs in Application as well, decoupling the layers as much as I could.&lt;/p&gt;
&lt;p&gt;For a really simple microservice, I think it&apos;s fine to write queries directly in handlers. The mapping code between layers is genuinely a pain (especially when handling slices in Go), but the samber/lo package cut a lot of that down.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph LR
  H[Interface / Handlers] --&amp;gt; A[Application Services]
  A --&amp;gt; D[Domain - Entities, VOs, Policies]
  A --&amp;gt; IRepo[Repository Interfaces]
  subgraph Infrastructure
    DBRepo[DB Repo - Ent / SQLC]
    CacheRepo[Cache Repo - Redis]
    EventPub[Event Publisher - Centrifugo]
  end
  IRepo -.implemented by.-&amp;gt; DBRepo
  IRepo -.implemented by.-&amp;gt; CacheRepo
  D &amp;lt;--&amp;gt; DE[Domain Events]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;h4&gt;Test code&lt;/h4&gt;
&lt;p&gt;I write tests in BDD style with ginkgo/gomega. Having learned TDD in RSpec, the default Go testing style isn&apos;t very intuitive to me. My TDD philosophy is: for anything that touches the DB (repositories, application services), run integration tests against a test DB. Mocking is reserved for the truly external things like OAuth, or these days an API like GPT. In the era of Docker-based development, mocking the DB itself feels like a real waste of time to me.&lt;/p&gt;
&lt;p&gt;Domain layers are pure functions, so unit tests are easy. For repositories I don&apos;t test everything, but for complex queries or specific business rules I run integration tests against a real DB. Application business logic is the same, integration tests against a test DB.&lt;/p&gt;
&lt;p&gt;That said, there was one time I told Claude Code to fill in missing test coverage without thinking it through, and it ignored what I&apos;d specified and dumped a pile of mocked-DB tests. So a chunk of the current test suite is mocked-DB tests, which makes adding new repositories really annoying. I need to clean that up but haven&apos;t gotten to it.&lt;/p&gt;
&lt;h4&gt;Apidog&lt;/h4&gt;
&lt;p&gt;For API testing I use Apidog. I cycled through Postman, Insomnia, and Bruno, and Apidog covers most of Postman&apos;s core features while doing automated documentation and scenario tests really well at the tool level. Even the free tier is generous enough that solo work is comfortable on it. You can have AI auto-generate Swagger, sync it straight into Apidog, and immediately fire test requests, with request/response schema validation included. Highly recommended.&lt;/p&gt;
&lt;p&gt;(Why not Postman: too many features, too heavy. The UI also doesn&apos;t feel clean to me, so I preferred Insomnia. But Insomnia&apos;s updates went weird, so I tried the open-source Bruno, which was too feature-poor. I was looking around and found Apidog.)&lt;/p&gt;
&lt;h4&gt;Performance testing&lt;/h4&gt;
&lt;p&gt;I didn&apos;t run a proper load test. I did do performance comparisons between the original repository and the optimized query-side repository. The catch was that adopting the query-side version would have required changing the entire client structure, so I didn&apos;t roll it out. I ended up further optimizing the legacy repository queries instead, and that test is now deprecated.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
  U[Unit: Domain - Ginkgo/Gomega] --&amp;gt; I[Integration: Repo+App - Test DB]
  I --&amp;gt; E[E2E: API scenarios - Apidog]
  E --&amp;gt; P[Perf: optional load metrics]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Real-time&lt;/h3&gt;
&lt;p&gt;In Scrumble, after writing a check-in or check-out post, you can leave reactions and comments like on a regular SNS. But beyond just commenting, I wanted the room to feel alive, with emojis and comments landing in real time and a seamless UX. Real-time was a baseline requirement.&lt;/p&gt;
&lt;p&gt;So at first I built a WebSocket server directly on top of Go Fiber. Then I found &lt;a href=&quot;https://centrifugal.dev/&quot;&gt;https://centrifugal.dev/&lt;/a&gt;, which is genuinely impressive. I threw out my code and migrated everything over.&lt;/p&gt;
&lt;p&gt;If you build the WebSocket server yourself, you have to handle all of this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Message loss and reconnection&lt;/li&gt;
&lt;li&gt;Horizontal scaling later&lt;/li&gt;
&lt;li&gt;Online presence, permissions, namespace management&lt;/li&gt;
&lt;li&gt;Server-side communication protocol&lt;/li&gt;
&lt;li&gt;Operational visibility&lt;/li&gt;
&lt;li&gt;And more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a quick prototype, doing it yourself is fine. But once you start thinking about production-grade real-time, the cost of building all of it adds up fast. Centrifugo provides the &lt;strong&gt;genuinely hard parts of real-time systems (lossless recovery, large-scale fanout, presence and permissions, observability, multi-node scaling)&lt;/strong&gt; at the &lt;strong&gt;framework level&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You spin up a Centrifugo server, hook up Redis, implement handlers in your real server, focus on the logic, and that&apos;s it. With how good the future scaling story and developer ergonomics are, there&apos;s no reason not to use Centrifugo.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram

  participant C as Client (Next.js)

  participant API as Fiber API

  participant PG as PostgreSQL

  participant OB as Outbox (TX)

  participant PUB as Publisher

  participant CF as Centrifugo

  participant O as Other Clients



  C-&amp;gt;&amp;gt;API: POST /posts/:id/reactions

  API-&amp;gt;&amp;gt;PG: INSERT reaction (in TX)

  API-&amp;gt;&amp;gt;PG: INSERT outbox_event (same TX)

  PG--&amp;gt;&amp;gt;API: COMMIT OK

  API-&amp;gt;&amp;gt;PUB: notify new outbox_event

  PUB-&amp;gt;&amp;gt;CF: publish reaction.added

  CF--&amp;gt;&amp;gt;O: push event

  C--&amp;gt;&amp;gt;C: optimistic UI (optional)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;The catch&lt;/h4&gt;
&lt;p&gt;I figured Centrifugo would make my real-time worries disappear, but there was one big issue. Some of Centrifugo&apos;s recent features are only available on Redis v7, v7.2, and v7.4. In particular, presence, history, and TTL all live in v7. The channel-history feature (for message persistence and recovery, the one I praised above as built-in) sits there too. Our deploy infra, Upstash Redis, only supports up to v6.2. I didn&apos;t know I needed to set those configs to 0 and disable recover, so I shipped with default settings, the real-time features didn&apos;t work in production at all, and I burned a fair bit of time digging through it. Upstash is very economical, so even with those features off it&apos;s not a real problem, but it is a shame.&lt;/p&gt;
&lt;p&gt;Even so, since adopting Centrifugo, the real-time server itself hasn&apos;t broken in production once. The only real-time issues we&apos;ve seen have been frontend handler subscription and reconnection logic dropping connections.&lt;/p&gt;
&lt;h4&gt;Event-driven&lt;/h4&gt;
&lt;p&gt;With Centrifugo and Redis as the backend, I built domain-based event-driven patterns on top. Event messages are mostly defined in each domain layer, and event emission happens inside the business logic in the application layer. You could put it in the domain layer instead, but I went with application-layer code for the directness of the code flow, the fact that early-project events are almost all 1:1, and easier debugging. In the interface layer, alongside HTTP, I added an &quot;events&quot; interface and built handlers there too. These handlers are registered to handle domain events, and like HTTP handlers, they call into application-layer functions.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
  CMD[Command - API] --&amp;gt; TX[DB TX]
  TX --&amp;gt; W[Write Domain Data]
  TX --&amp;gt; OBOX[Insert Outbox Event]
  OBOX --&amp;gt; COMMIT[Commit]
  COMMIT --&amp;gt; WKR[Outbox Worker]
  WKR --&amp;gt; PUB[Publish to Centrifugo]
  PUB --&amp;gt; CLIENTS[Subscribed Clients]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Other&lt;/h3&gt;
&lt;h4&gt;Caching&lt;/h4&gt;
&lt;p&gt;Everything else gets basic caching with Redis: feed summaries, my own writing state, the spaces I&apos;ve joined. These are calculated queries that can hold a long TTL. The default is cache-aside, with invalidation policy implemented per event handler when other events fire. It&apos;s intuitive, but registering invalidation handlers one by one for every mutation event is a bit of a chore.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
  RQ[Client reads Feed] --&amp;gt; GET[Redis GET]
  GET --&amp;gt;|miss| DB[SQLC Query]
  DB --&amp;gt; DTO[Shape DTO]
  DTO --&amp;gt; SET[Redis SET - TTL]
  SET --&amp;gt; RESP[Response]
  GET --&amp;gt;|hit| RESP

  subgraph Invalidation
    EVT[reaction/comment created]
    EVT --&amp;gt; DEL[DEL ws:id:feed:*]
    EVT --&amp;gt; PUB[Publish feed.invalidate]
  end
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;CQRS (Query Repository / SQLC)&lt;/h4&gt;
&lt;p&gt;When I say CQRS I don&apos;t mean splitting the Query DB out fully. Because of Entgo&apos;s query-performance issues mentioned above, I introduced SQLC, which is closer to raw SQL, and split off a Query Repository. The Query Repository skips the domain interface and acts as read-only. Application calls it directly and gets back Application-layer structs.&lt;/p&gt;
&lt;p&gt;Personally I think DDD fits Command well. For most of the values an endpoint or a screen needs, instead of routing through the structured shape of domain structs, it&apos;s more natural and more performant to fire a DB query and return what the screen wants directly. That fits a Query interface better, in my view.&lt;/p&gt;
&lt;p&gt;I introduced this because of Entgo, of course, and you might say there&apos;s no reason for early-stage projects to reach for CQRS. But to honor the spirit of the project laid out in &lt;a href=&quot;/posts/2025-09-scrumble-project-retro&quot;&gt;Scrumble Project Retrospective (June–August 2025)&lt;/a&gt;, I went in with the attitude of &quot;let&apos;s just try everything I want to try, the dumb way.&quot;&lt;/p&gt;
&lt;p&gt;We use SNS daily, so we tend to assume it&apos;s easy to build. But these services come with more performance concerns than you&apos;d expect, so building API endpoints intuitively to fit each screen wasn&apos;t a bad call. What used to be many round-trips through Entgo became a clean JOIN in raw SQL via SQLC, and queries got a lot faster.&lt;/p&gt;
&lt;p&gt;You can write raw SQL with Entgo too, but joining several tables (posts, reactions, comments, mediafiles) and doing it in a type-safe way with proper object mapping was harder than I expected. With SQLC, you write a SQL file and generate a Go file that maps types safely, so I got the performance and type safety together.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
  CMD[Command] --&amp;gt; AC[App - Command]
  QRY[Query] --&amp;gt; AQ[App - Query]
  AC --&amp;gt; RC[Repo - Ent]
  AQ --&amp;gt; RQ[Repo - SQLC]
  RC --&amp;gt; PG[PostgreSQL]
  RQ --&amp;gt; PG
  AC --&amp;gt; EV[Domain Events] --&amp;gt; CF[Centrifugo]
  AQ --&amp;gt; C[Redis Cache] --&amp;gt; AQ
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Deploy infrastructure&lt;/h4&gt;
&lt;p&gt;For final deployment I&apos;m using fly.io for both DB and server, with Upstash Redis. Both the backend server and the Centrifugo server run on fly.io. It&apos;s only used internally right now, so infra cost is basically zero.&lt;/p&gt;
&lt;p&gt;If you&apos;ve read this far you might be thinking the optimization (caching, queries) feels excessive for an early-stage service. The reason: my initial DB infra was Neon. I&apos;d heard &quot;serverless&quot; and pulled it in, but Neon has a few quirks, and on top of that my fly.io server was in NRT (Tokyo) while Neon&apos;s only Asia region is Singapore. The server-to-DB latency was substantial. (Average 200ms+, so feeds with lots of posts and comments could take 2 seconds to load.) That pushed me hard into Optimistic UI on React Query and aggressive query optimization and caching on the server side, just to make this infra work.&lt;/p&gt;
&lt;p&gt;Eventually, after seeing the cost on Neon, I migrated to fly.io and unified everything in NRT. The optimizations stayed, so the service runs much smoother now.&lt;/p&gt;
&lt;p&gt;The open question is whether I&apos;ll stick with fly.io for an actual public release. Deploys are easy, the experience is intuitive, and the early cost is low. But the status page is yellow disturbingly often, and individual regions go down. The service stays up, but the web console server goes down and the page won&apos;t load. Things that wouldn&apos;t happen on AWS happen often here. At some point I&apos;ll need to rebuild on more reliable server infra.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
  DEV[Local Dev - Air] --&amp;gt; CI[CI Build &amp;amp; Test]
  CI --&amp;gt; REG[Container Registry]
  REG --&amp;gt; API[Fly.io Scrumble API - NRT]
  REG --&amp;gt; CF[Fly.io Centrifugo - NRT]

  subgraph Data
    FPG[Fly.io Postgres]
    UREDIS[Upstash Redis]
  end

  API -- SQL --&amp;gt; FPG
  API -- cache --&amp;gt; UREDIS
  API -- publish --&amp;gt; CF
  USERS[Users] --&amp;gt; API
  USERS -- WS --&amp;gt; CF
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Vibe coding on the backend?&lt;/h3&gt;
&lt;h4&gt;User → Member migration&lt;/h4&gt;
&lt;p&gt;Early on, to move quickly, I designed most entities around the User schema. For a workspace-based SaaS like Slack (where each workspace has its own profile and you log in per workspace), I needed to migrate most of the domain/schema entities and the auth structure to a Member entity (a user-to-workspace relation schema) instead of a User entity. I knew partway through that I had to switch, but I kept pushing it back to keep adding features. By the end of the project, the migration was tangled with multiple domains and the dependency cost had grown.&lt;/p&gt;
&lt;p&gt;Migrating top-level entity relationships isn&apos;t actually hard. It&apos;s mechanical and repetitive. So I documented the spec and plan in Kiro, which had just launched, and handed it to Claude Code. Claude Code went on a wild detour: ignoring the existing architecture, ignoring existing code, generating duplicate domains and code. I ended up redoing about three days of work by hand. So for the backend, there isn&apos;t much to say about vibe coding. Later on I only used it to automate trivial scaffolding for simple API setups, and most of the work I did myself. The frontend, on the other hand, leaned heavily on Claude Code, so I&apos;ll cover more there.&lt;/p&gt;
&lt;h2&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;One of the original goals of the project was &quot;get the chops back&quot;, and that goal was met. Now, with production release in sight, I&apos;m building on a cleaner, clearer architecture in the current project. To summarize:&lt;/p&gt;
&lt;h3&gt;Keep&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DDD/Clean Architecture, plus CQRS and event-driven. The key is putting ports at every layer and enforcing real separation. Separation gives the domain implementation room to breathe. (And reference the domain everywhere.)
&lt;ul&gt;
&lt;li&gt;There&apos;s a tradeoff with duplicated code, of course&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Centrifugo&lt;/li&gt;
&lt;li&gt;Working with Redis caching&lt;/li&gt;
&lt;li&gt;A clearer test strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Problem&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Picking an ORM (Entgo) without enough evaluation. The resulting design got more complex (CQRS, SQLC)&lt;/li&gt;
&lt;li&gt;Code-first migrations via Entgo&lt;/li&gt;
&lt;li&gt;Region split at deploy time (Neon SG ↔ Fly NRT). Neon ate a lot of my time&lt;/li&gt;
&lt;li&gt;Didn&apos;t clean up code generated badly through vibe coding&lt;/li&gt;
&lt;li&gt;Insufficient research at the dev stage when adopting Centrifugo and similar tools (the version issue surfaced at production-release time, after development was done, costing real time)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Try&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Schema-first migrations instead of code-first&lt;/li&gt;
&lt;li&gt;Long term, I need to swap the production deploy infra&lt;/li&gt;
&lt;li&gt;Get operational visibility in place&lt;/li&gt;
&lt;li&gt;Remove the mocked-DB tests and clean up the badly generated code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s about the size of it.&lt;/p&gt;
&lt;p&gt;If you&apos;ve read all of this, you&apos;ll see the core of this design isn&apos;t tied to Go. It applies in any language, any framework.&lt;/p&gt;
&lt;p&gt;One thing I miss while working in Go is functional programming. The style I enjoy in Java lambdas, Kotlin, and JS/TS feels less fun in Go. samber/lo helps, but as a language that got generics late, the code doesn&apos;t feel that intuitive. (lo does make it much cleaner, to be fair.)&lt;/p&gt;
&lt;p&gt;If I do Spring next, it&apos;ll probably be because of Kotlin. That said, Go&apos;s directness pays off. Once you put in the small upfront cost, it&apos;s easy to collaborate on and easy to operate. It&apos;ll stay my primary choice for products I lead. I hope more developers in Korea pick up Go.&lt;/p&gt;
&lt;p&gt;I&apos;ll keep going in the frontend post...&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;Previous post
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-09-scrumble-tech-retro-intro&quot;&gt;Scrumble Tech Retrospective (subtitle: Full-stack development and the failure of vibe coding. Golang and Next.js) - 0. Intro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Next post
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-10-03-scrumble-tech-retro-frontend-with-vibe-coding&quot;&gt;Scrumble Tech Retrospective - 2. Frontend, with a side of vibe coding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>project</category><category>golang</category><category>backend</category><category>scrumble</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Scrumble Tech Retro - 0. Intro (Why Golang?)</title><link>https://flowkater.io/en/posts/2025-09-scrumble-tech-retro-intro/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-09-scrumble-tech-retro-intro/</guid><description>Opening post of the Scrumble tech retrospective series. I lay out why I picked Golang and Next.js, where vibe coding helped and where it broke, and the roadmap for the backend, frontend, and LLM chapters that follow.</description><pubDate>Sun, 21 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Intro&lt;/h1&gt;
&lt;h2&gt;Why Golang&lt;/h2&gt;
&lt;p&gt;Everyone has a primary language, and mine is Golang. It doesn&apos;t carry that image in the Korean dev scene, but overseas it&apos;s known as a fairly boring language. There&apos;s a reason for that: the language really is simple. Most Korean backend developers have Java as their primary, and next to Java, Golang is stripped to the bone.&lt;/p&gt;
&lt;p&gt;That&apos;s why Golang has no &quot;canonical&quot; full-stack web framework (think Spring Boot, Rails, Django) and no &quot;canonical&quot; ORM (think JPA, Active Record, Django ORM). It&apos;s not unusual to find shops that skip the web framework entirely and code straight against &lt;code&gt;net/http&lt;/code&gt;. The language is simple enough that it ends up being handy for small microservices. On the language-feature side, there&apos;s no constant immutability the way functional languages have it (you can&apos;t declare a &quot;reference-immutable&quot; variable like TS &lt;code&gt;const&lt;/code&gt; or Kotlin &lt;code&gt;val&lt;/code&gt;. Go&apos;s &lt;code&gt;const&lt;/code&gt; is a compile-time constant only, so most code uses regular &lt;code&gt;var&lt;/code&gt;). And error handling has no try/catch; you return the error explicitly alongside the result, usually as a tuple.&lt;/p&gt;
&lt;p&gt;I&apos;ve made this sound complicated, but if you followed along you can see the point: it really is that simple... So I get why people overseas call it boring. It isn&apos;t a fun language to write, exactly.&lt;/p&gt;
&lt;p&gt;For fast bootstrapping there&apos;s a whole field of solid scripting languages (Node.js, Python, Ruby), and for performance and stability Korea is basically the so-called Republic of Java (Korea is dominated by Java in enterprise development), so most teams reach for Java. Still, Golang has a nice middle ground: you can code as lightly as a script, you get static typing from a compiled language, performance is genuinely good, and the goroutine-driven concurrency story makes real-time work and live-service operations a lot easier downstream. Even in Korea you see it picked up by larger, traffic-heavy companies in cloud-native, data infra, microservices, and DevOps tooling. Sure, a team like Daangn (Karrot) running ten-million-plus chat messages a day (Daangn is Korea&apos;s largest local marketplace app) on Go isn&apos;t exactly relatable for shops like ours. But I still think it&apos;s a great language for a solo dev. It&apos;s light, it&apos;s nice to live with.&lt;/p&gt;
&lt;p&gt;(I actually got into Golang in early 2021 after this video sold me on it: &lt;a href=&quot;https://www.youtube.com/watch?v=mLIthm96u2Q&quot;&gt;Daangn Engineering Adopts Go | Daangn Tech&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;I went Rails (Ruby) → Django (Python) → Golang, then spent my last job in Node.js (TS), and when I started over I came right back to Golang as if it were obvious. There&apos;s more I could say about why it&apos;s good for a team and so on, but this is getting long, so I&apos;ll move on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rust is my aspirational language, but I&apos;ve never used it on a real project.&lt;/li&gt;
&lt;li&gt;There&apos;s also a piece called &lt;a href=&quot;https://sinwoobang.notion.site/Vibe-Coding-Go-2656746440e2809baa8ceb5f326cfb37&quot;&gt;Why Go is Comfortable for Vibe Coding&lt;/a&gt; that&apos;s worth a look.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next.js&lt;/h2&gt;
&lt;p&gt;The frontend was the comfort-food pick, the opposite of the backend. I went with Next.js (TS), Tailwind CSS (which always saves me because I&apos;m bad at CSS), and TanStack Query (a.k.a. React Query). I once chased GraphQL as my aspirational stack, but my last job made it painfully clear how shaky my GraphQL fluency actually was, so I bailed. At my last job we had a frontend lead who was a GraphQL master, but going solo I just picked what was easy for me to use and reason about. And, as I&apos;ll get to later, leaning on React Query the way I did turned out to be a real mistake.&lt;/p&gt;
&lt;p&gt;Since it&apos;s the default, there&apos;s no real &quot;why&quot;. I&apos;d done React before, it was the obvious choice for full-stack work in older projects like &lt;a href=&quot;/posts/2020-03-datacolon-retro-intro&quot;&gt;&amp;lt;DataColon Dev Retro&amp;gt; - 1. Intro&lt;/a&gt;, and nobody is going to push back on it. The thing is, in the era of AI vibe coding I spent a lot of this stretch wondering whether React and Hooks are really the right call beyond &quot;the docs and the community are huge.&quot;&lt;/p&gt;
&lt;h2&gt;Order&lt;/h2&gt;
&lt;p&gt;Here&apos;s how the series will run. I&apos;m going to dig into the actual stack across the domains I built, and along the way I&apos;ll write down the decisions I made and the things I wrestled with. As it happens, the order I built things in lines up almost exactly with the calendar.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-09-scrumble-tech-retro-backend&quot;&gt;Scrumble Tech Retro (subtitle: Full-stack Dev and the Failure of Vibe Coding. Golang and Next.js) - 1. Backend&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Base tech stack&lt;/li&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;Real-time processing&lt;/li&gt;
&lt;li&gt;Misc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Frontend (continued in part 2)
&lt;ul&gt;
&lt;li&gt;Base tech stack&lt;/li&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;Real-time processing&lt;/li&gt;
&lt;li&gt;Misc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
</content:encoded><category>project</category><category>golang</category><category>scrumble</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Scrumble Project Retrospective (June–August 2025)</title><link>https://flowkater.io/en/posts/2025-09-scrumble-project-retro/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-09-scrumble-project-retro/</guid><description>A monthly look at the Scrumble side project: setting up home-office collaboration, the delays caused by spec creep and missing deadlines, and the LLM and third-party integration roadmap from a partnership retro.</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;I left my last job in mid-April and spent about a month traveling Italy with Ellie. By the end of the trip I came home a little tired, but a few months later I find myself wishing we&apos;d stayed two more weeks. It was the first long trip of my life taken after quitting a job, and since I wasn&apos;t returning to a company anyway, maybe in some sense the trip never really ended. Or maybe I&apos;d circled back to that moment five years ago, the one where Ellie and I were running my own business right up to the bitter end.&lt;/p&gt;
&lt;p&gt;Setting that aside, if I wanted to start working for myself again, I needed to build something with my own hands. I&apos;d been away from code for a long stretch, so I figured the right move was to pick a small project and use it as a re-entry point. That&apos;s what I came home with: a plan to do one side project during the gap before the real business prep, and Ellie and I started in earnest at the end of May.&lt;/p&gt;
&lt;p&gt;I&apos;m splitting this retro into two parts: a general project retro (this one) and a tech retro covering full-stack development and working with an LLM (next one).&lt;/p&gt;
&lt;h2&gt;What Scrumble Was Trying to Be&lt;/h2&gt;
&lt;p&gt;Scrumble grew out of the daily-scrum meetings I&apos;d been running since my Todait days and at every company after that. I&apos;d actually wanted to build it last year while still employed. At that company we used Confluence for our daily meeting notes, and as the team grew and split, the format got painful in specific ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whoever wrote, kept writing. Whoever didn&apos;t, never did.&lt;/li&gt;
&lt;li&gt;Past entries were almost impossible to scan. (Confluence supports a DataTable, but the UX is rough; it feels like typing values into a database or a spreadsheet.)&lt;/li&gt;
&lt;li&gt;We had over 30 people stuffed into a single note, and you couldn&apos;t take any of it in at a glance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem with that note, as I came to see it, wasn&apos;t unique to Confluence. Whether the team is small or large, whether you&apos;re using old-school Evernote, Dropbox Paper, Notion, or Confluence, the moment the note loses its tight connection to the actual work, its usefulness drops off a cliff. Eventually the casual condition-check and daily-life sharing stops working too, and the note&apos;s role as a team communication channel withers.&lt;/p&gt;
&lt;p&gt;For team members, the goal is to keep team communication alive without forcing constant coffee chats or meetings. But I felt that pure check-in scores or vibe scores weren&apos;t enough on their own to justify the habit. So one of our targets was to make it easy to write the day&apos;s work to-dos in the same place.&lt;/p&gt;
&lt;p&gt;We weren&apos;t trying to replace Slack-style chat tools or Jira/Asana-style PM tools. The product wasn&apos;t positioned that way. The plan was to integrate with those tools as much as possible.&lt;/p&gt;
&lt;p&gt;To restate the project goals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Main: build a daily-scrum service we&apos;d actually use ourselves (MVP)&lt;/li&gt;
&lt;li&gt;Sub: give the team enough time to adapt and practice (work skills, collaboration) before the real development project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Yb9swxk.png&quot; alt=&quot;Yb9swxk.png&quot; /&gt;
&lt;em&gt;(The very first PRD draft)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Project Setup&lt;/h2&gt;
&lt;h3&gt;Where We Worked&lt;/h3&gt;
&lt;p&gt;I trust systems more than enthusiasm, and environment more than talent. (That&apos;s relative; I&apos;m not saying talent and enthusiasm don&apos;t matter.) When I take on any kind of work, I care a lot about making the work &lt;em&gt;able to happen&lt;/em&gt;: getting every stakeholder&apos;s economy aligned, keeping the cost and time low. Doing all of that from home created a different set of constraints, and I&apos;m still figuring out how to handle them.&lt;/p&gt;
&lt;p&gt;Most of the work happened at home.&lt;/p&gt;
&lt;h4&gt;Home&lt;/h4&gt;
&lt;p&gt;From a system-and-environment angle, home isn&apos;t optimal. Our place doesn&apos;t have a ton of rooms either. But Ellie still remembers the years of writing checks for several hundred thousand won every month for an office that sat mostly empty when we ran our previous company. So in cost terms, home was the obvious choice for now.&lt;/p&gt;
&lt;p&gt;Two monitors and an M4 Max. The kind of place where you can also cook your own meals.&lt;/p&gt;
&lt;p&gt;That said, after three months of working this way, I think we&apos;ll need to lock in some revenue and get an actual office in the longer run.&lt;/p&gt;
&lt;h4&gt;Daily Life&lt;/h4&gt;
&lt;p&gt;It&apos;s a side project, but a full-time side project, which meant the risk of staying inside the apartment all day. So we built a strict daily schedule. I started treating the gym trip with Ellie as our morning commute and built the work cycle around it. The first month, I mostly held to it. By the second month, as we entered the late stage of the project, the cycle broke and I was working at random hours. To make this concrete:&lt;/p&gt;
&lt;p&gt;When the routine held: 10 p.m. bedtime, 5:30 a.m. wake-up, morning workout, then &quot;into the office.&quot; Almost a model life — if you can call it that.
At the end of the project: 4 a.m. bedtime, noon wake-up, lunch, then starting work around 2 p.m. That kind of damage.&lt;/p&gt;
&lt;p&gt;By the end, both of us were worn down enough that we took a workation just to wrap things up.&lt;/p&gt;
&lt;p&gt;I barely worked from home during COVID, so I didn&apos;t really know what working from home was like. I&apos;m learning now, in my body.&lt;/p&gt;
&lt;h3&gt;Communication&lt;/h3&gt;
&lt;p&gt;It&apos;s been just Ellie and me on side projects (even when I had a day job), but this time we also had a remote team member: George, a backend intern. And even with two people, you can&apos;t keep all the records offline. Slack, Notion, Jira, Confluence, plus tools I&apos;d used before like Linear and Asana. There are a lot of options.&lt;/p&gt;
&lt;p&gt;We had to keep costs down, and small teams that touch a bit of everything end up locked into massive subscription stacks. I&apos;d actually settled on Slack + Notion + Linear despite all that, until Ellie brought a super-app called ClickUp into the mix and we picked it.&lt;/p&gt;
&lt;p&gt;ClickUp is, literally, Slack + Notion + Linear. Channel chat for communication, Markdown docs, project management: three categories of tool for the price of one SaaS subscription.&lt;/p&gt;
&lt;p&gt;When I looked it up, it seems Koreans don&apos;t really use it. Given how much Korean teams love all-in-one products, the lack of marketing here is honestly surprising.&lt;/p&gt;
&lt;p&gt;After using it, you can see clearly that each of its three pieces is about 10% behind Slack, Notion, and Linear individually. But when those three pieces are integrated tightly inside one tool, the value adds up to a lot. We&apos;ve been getting a lot of mileage out of it. Flip the framing and it&apos;s kind of impressive: each function works at maybe 90% of the standalone, and anyone who&apos;s built software knows how hard it is to make all of it actually function together.&lt;/p&gt;
&lt;p&gt;Anyway, communication tooling: solved cleanly with ClickUp.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$30/seat down to $10/seat&lt;/li&gt;
&lt;li&gt;Slack-style channel chat and Notion-style docs both supported well
&lt;ul&gt;
&lt;li&gt;The 10% gap I mentioned shows up only when you go deep on each one. Day to day, it&apos;s fine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Project management gives you the intuitive subset of features you actually need&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;First MVP Feature Goals&lt;/h2&gt;
&lt;p&gt;The first MVP target was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Space management&lt;/li&gt;
&lt;li&gt;Check-in / check-out writing&lt;/li&gt;
&lt;li&gt;To-do list writing&lt;/li&gt;
&lt;li&gt;Feed page&lt;/li&gt;
&lt;li&gt;Real-time comments and reactions&lt;/li&gt;
&lt;li&gt;Real-time notification page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We pretty much hit those. But midway through, we decided this wasn&apos;t enough and we needed to add more, and that decision cost us about a week.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An MVP that should&apos;ve shipped in 8 weeks ended up taking 12.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking back, the first feature set did get fully built, and the original goals of the project were roughly met:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Main: build a daily-scrum service we&apos;d actually use ourselves (MVP)&lt;/li&gt;
&lt;li&gt;Sub: give the team enough time to adapt and practice (work skills, collaboration) before the real development project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, if you subtract the bad decisions, the dead-end detours, and the days I just didn&apos;t work, you&apos;d probably knock about three weeks off the total.&lt;/p&gt;
&lt;p&gt;The detail comes in the retro below.&lt;/p&gt;
&lt;h2&gt;Retro&lt;/h2&gt;
&lt;h3&gt;Keep&lt;/h3&gt;
&lt;h4&gt;Daily Dog Fooding&lt;/h4&gt;
&lt;p&gt;Daily dog fooding will probably be a core principle in future projects too. Because we were building something we&apos;d actually use, I wasn&apos;t just trying to get it done; I kept thinking about how to make it better. At my last company, the makers couldn&apos;t really be the users, which capped how far we could push that. Using the product every day surfaced everything from simple bugs to improvement ideas to the next pieces I needed to build. When you don&apos;t have customers yet, dog fooding is the best instrument a maker has.&lt;/p&gt;
&lt;h4&gt;Hands-On From Scratch&lt;/h4&gt;
&lt;p&gt;I&apos;ll go deeper in the tech retro, but: Golang (Fiber + Entgo) + Redis + PostgreSQL on the backend, Next.js on the frontend, full-stack, end to end, all by hand. I broke a sweat getting my hands back on the code I&apos;d let go cold for years, but with $200/month and my friend Claude Code, I got to a place where I can do hands-on project development on my own.&lt;/p&gt;
&lt;h4&gt;Joy&lt;/h4&gt;
&lt;p&gt;It&apos;s been hard to remember when, at my last company, I last felt joy in &lt;em&gt;making&lt;/em&gt; something on a project. Set aside whether I use the product. I just enjoyed coding every day. From the time we adopted DDD at that company, I&apos;d basically taken my hands off the code, but on this project I got to do everything I wanted, from initial DDD/Clean Architecture layer design to CQRS to event-driven patterns. Frontend isn&apos;t my main turf, but tweaking styles one by one and watching the thing come together, I felt both the joy and the pain of that. It wasn&apos;t quite Linus Torvalds&apos;s &lt;em&gt;Just for Fun&lt;/em&gt;, but rediscovering the joy of building something with my own hands, in this stretch, mattered a lot.&lt;/p&gt;
&lt;h4&gt;Mentoring&lt;/h4&gt;
&lt;p&gt;I love teaching, but back when I was wrestling with what &lt;em&gt;good&lt;/em&gt; teaching even meant, I quit both the lecturing and the mentoring. That&apos;s the hard part of education: not teaching, but teaching well. I wanted to help George keep going as a developer, and that&apos;s why I brought him into the project. He&apos;s still pretty much an entry-level backend developer, but he can now build a basic API on his own. There were moments along the way when I got short with him or showed how impatient I could be. Every time, my own bottom shows through and I&apos;m embarrassed by it. But George stuck with this all the way through while holding a part-time job, and that effort is exactly why I wanted to teach him as much as I could.&lt;/p&gt;
&lt;p&gt;Mentoring is still hard. Each person&apos;s level is different, and what they need to hear is different. The thing is, dev skills and the rest are just tools. What trips most people up is &lt;em&gt;how&lt;/em&gt; to work, how to work &lt;em&gt;with&lt;/em&gt; others, how to talk about it. To get real S-tier (highest-caliber) teamwork, good mentoring is less about praising what was done well and more about pulling out the harder, less comfortable conversations.&lt;/p&gt;
&lt;p&gt;Obviously, when I get emotional, I help nothing. People talk easily about how AI will replace teachers because AI is improving. But AI is a tool. To get a good answer, you need a good question. Beginners can&apos;t ask good questions yet. They don&apos;t yet have a high tolerance for failure. Helping someone surface those gaps and push past them is, for me as a mentor, genuinely hard work, and I want to keep studying it, including the playing-coach skills of running alongside them.&lt;/p&gt;
&lt;h3&gt;Problem&lt;/h3&gt;
&lt;h4&gt;Lack of Communication&lt;/h4&gt;
&lt;p&gt;This is the biggest problem I felt running a duo project. Ellie&apos;s direction as product designer and my direction as product manager (before I&apos;m a developer) didn&apos;t always line up, but even though we sat next to each other every day, we didn&apos;t hold regular check-ins or talk enough. We were each so deep in our own deliverables that we&apos;d sit in the same room for ten-plus hours without exchanging a word, me coding, Ellie designing. And because I could implement everything myself, I&apos;d also just push small things through, or change the spec on my own judgment without enough back-and-forth before implementing. We did a real retro afterward and put a daily meeting on the calendar, but the biggest problem of running the Scrumble project was that we weren&apos;t doing Scrumble.&lt;/p&gt;
&lt;h4&gt;Spec Creep&lt;/h4&gt;
&lt;p&gt;The first MVP was, frankly, the bare minimum that worked, missing the differentiating integrations we&apos;d talked about (the LLM-driven report, the third-party hookups). Each of us had features we wanted to add, and without a clear conversation about whether to push those into the MVP, the schedule started ballooning. The root cause of an MVP that could&apos;ve shipped in two months stretching to nearly three was that we never had a real conversation about that bar, and just went heads-down on our own pieces.&lt;/p&gt;
&lt;h4&gt;No Real Deadline&lt;/h4&gt;
&lt;p&gt;It wasn&apos;t that there was no deadline at all. But this isn&apos;t a public-launch project, and definitely not one we started for commercial reasons, so the two problems above piled on. &lt;em&gt;Just one more week. One more week.&lt;/em&gt; And the schedule slowly drifted. Most failed side projects probably look like this. Most teams get the project to 90%, but the last 10% (the launch prep, the must-have features you kept pushing) actually takes as much energy as the previous 90%. It isn&apos;t fun work. So in retrospect, that&apos;s probably part of why I kept arguing for adding more features.&lt;/p&gt;
&lt;h4&gt;Pain Equal to the Joy&lt;/h4&gt;
&lt;p&gt;Tools like Claude Code and Cursor, riding the vibe-coding wave, are sold like &lt;em&gt;one click and you can build software without knowing how to code.&lt;/em&gt; But unless your service is trivial, code still has to be touched by a human. As the feature surface grows, fixing A breaks B all the time. AI that misreads context creates duplicate logic, ignores the architecture layers, or invents its own pattern. Plenty of failure modes.&lt;/p&gt;
&lt;p&gt;Backend I&apos;d kept partially current, but frontend I hadn&apos;t touched in ages, and every piece was a slog. Layout and styling issues, real-time handling, plenty of stuff Claude Code couldn&apos;t one-shot. After feeding it more context and pushing it for a while, I&apos;d often end up fixing the code by hand and resolving the issue immediately. So the joy of writing code came with a matching weight of frustration. The same was true for the simple-but-tedious setup work I was avoiding, like adopting tiptap and a few other must-have features I still haven&apos;t built.&lt;/p&gt;
&lt;h4&gt;Bad Calls, Not Enough Thought&lt;/h4&gt;
&lt;p&gt;Because we have the structure of a SaaS that creates a workspace by default, there&apos;s a split between user-level auth (logging into the service) and member-level auth (being a member inside a workspace). To move fast early on, I skipped that detail and just used user-auth the way I always had. As the service was nearly wrapping up, I realized how badly that choice had aged. We migrated the entire API design and auth scheme to be member-based, and that work alone, including verification and testing, took maybe three or four days. If you add the days I avoided it because I didn&apos;t want to do it, it was over a week.&lt;/p&gt;
&lt;p&gt;I&apos;d also planned to bring in tiptap from the start but stopped because it felt like overkill at the time. Early in the project, complexity was low and the migration would have been quick. Trying to do it now feels daunting.&lt;/p&gt;
&lt;p&gt;I picked Entgo as the Golang ORM mostly out of habit, but a lot of its advantages get neutralized when you have a clean architecture layer with clear boundaries. (More on this in the tech retro.)&lt;/p&gt;
&lt;p&gt;Honestly, even if I&apos;d been off the keyboard for a while, I made a fair number of calls that suggest my instincts had dulled, and I&apos;m getting cheerfully beaten up for them at release time. It hurts.&lt;/p&gt;
&lt;h4&gt;Routine Issues&lt;/h4&gt;
&lt;p&gt;As I mentioned in the daily-life section, the routine I&apos;d tried to hold broke down, and at one point both of us hit a wall, physically and mentally. As an emergency move we picked a workation, which turned out to be the right call. We came back somewhat reset, but I haven&apos;t yet returned to the discipline I had at the start, and I need to reset again. Late in the project, the daily Scrumble entries and weekly retro reports were 80% complaints about how hard it was to hold the routine.&lt;/p&gt;
&lt;p&gt;The courage to start again is harder than the courage to start the first time. &lt;em&gt;Model life,&lt;/em&gt; take two. Let&apos;s begin.&lt;/p&gt;
&lt;h3&gt;Try&lt;/h3&gt;
&lt;h4&gt;Communication&lt;/h4&gt;
&lt;p&gt;A lot of these problems actually got solved when Ellie and I went for a walk and talked them through. So regular check-ins matter, and so does just talking more, period. Ellie&apos;s reshaping the space we work in (our living room) to be more conducive to talking, and I&apos;m setting up daily and weekly meetings so the next project never gets the note &quot;communication was lacking.&quot; Better too much than too little.&lt;/p&gt;
&lt;h4&gt;If You&apos;re Not Embarrassed, You Shipped Too Late&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are not embarrassed by the first version of your product, you&apos;ve launched too late.
&lt;em&gt;Reid Hoffman (LinkedIn co-founder)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At some point, trying not to be embarrassed, I drifted off the original MVP and started arguing for an over-spec&apos;d technical scope. It&apos;s a thing I&apos;m building for myself. I can keep refining it after it ships. In one of our retros Ellie said something that mattered: &lt;em&gt;We were burning time trying to design for an unknown audience, and the moment I started thinking of &quot;Tony as customer #1,&quot; the work moved fast.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So we decided to release at this level and wrap up, to clear the deck for serious business prep and the next project. The next one will wrap much faster.&lt;/p&gt;
&lt;h4&gt;Immersion&lt;/h4&gt;
&lt;p&gt;A routine is one tool for immersion. But what I mean here isn&apos;t only about working hours. There are very few times in life when time itself has been this abundant for me, and now that it is, I&apos;m a little careless with it. By careless I mean not fully present, not fully immersed in the hour I&apos;m in. If I keep wasting days like that, all that&apos;s left is regret. Every day, I try to snap back. When I&apos;m playing, I want to be fully in the play. I don&apos;t want most of the day spent doing other work (company work) while my mind chases happiness elsewhere. I want to be in the present hour the way I originally meant to be. It&apos;s a skill that needs practice. I&apos;ll work harder at it. &lt;em&gt;Work when you work, rest when you rest.&lt;/em&gt; That gets especially hard in this kind of setup, where I work at home and time is mine.&lt;/p&gt;
&lt;h3&gt;Lessons Learned&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A perfect MVP is a contradiction.&lt;/strong&gt; Ship early, even if it&apos;s embarrassing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duo project = over-communicate.&lt;/strong&gt; Even ten hours together, talking is non-negotiable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If it breaks, try again.&lt;/strong&gt; A broken routine isn&apos;t a reason to quit; just stand back up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI is not magic.&lt;/strong&gt; In the end, a human has to understand the code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dog fooding is the answer.&lt;/strong&gt; Be customer #1 yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;It was a side project, but full-time. Some days I sat for 20 hours straight coding. Some days I didn&apos;t touch the keyboard for three days running. For years I&apos;d spent every summer commuting in early to a building, working through to a late commute home, and this summer (already an unusually hot one) I worked from home and felt the full weight of it.&lt;/p&gt;
&lt;p&gt;I&apos;d wanted to build Scrumble for years at the last company, and I love that I&apos;m using it every single day now. We&apos;re a long way from the feature milestone we set, but I&apos;ll keep updating it gradually as we move on to other product work.&lt;/p&gt;
&lt;p&gt;Three months in, the truth is that committing my own hours to building made all my bad habits and weak spots visible. I could see clearly how much, at the last company, I&apos;d been borrowing other people&apos;s hands to solve things. The flip side: I&apos;ve been thrown into an environment where I have to handle all of it myself, which is also where the fastest growth happens. The company was comfortable, but growth needs the courage to face everything yourself.&lt;/p&gt;
&lt;p&gt;There are good days and bad days, and one regret is that I kept putting off writing or organizing notes until I was getting around to it like this. I logged the project daily, but I wonder if writing even a regular journal would have helped. Record more often. Look back more often.&lt;/p&gt;
&lt;p&gt;I started this side project while preparing to start a company, and at some point it became the main thing. Hands loose, warm-up done. Time to apply what this project taught me to the next one, and not repeat the same mistakes.&lt;/p&gt;
&lt;p&gt;Process matters and outcomes matter, but if you don&apos;t actually finish, none of it adds up to value. Beyond the action items I wrote in the Try section, I&apos;m going to keep facing myself head-on. And I&apos;ll work harder so I don&apos;t lose the joy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;A warrior does not give up what he loves, he finds the love in what he does.&quot;
&quot;A warrior is not about perfection or victory or invulnerability. He&apos;s about absolute vulnerability.&quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Peaceful Warrior&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/3JD9L2y.jpeg&quot; alt=&quot;workation|400&quot; /&gt;
&lt;em&gt;(My desk during the workation)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/X9dSzHL.jpeg&quot; alt=&quot;scrumble-checkout|400&quot; /&gt;
&lt;em&gt;(A check-out note inside Scrumble during the workation)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To be continued in the tech retro&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;Previous retro
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://flowkater.io/posts/2025-04-ihfb-four-year-retro&quot;&gt;Four-year IHFB retrospective&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Next retro
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-09-scrumble-tech-retro-intro&quot;&gt;Scrumble Tech Retrospective (subtitle: the failure of full-stack development and vibe coding. Golang and Next.js): 0. Opening&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>retrospective</category><category>project-retro</category><category>scrumble</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>Four Years at IHFB: A Retrospective</title><link>https://flowkater.io/en/posts/2025-04-ihfb-four-year-retro/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-04-ihfb-four-year-retro/</guid><description>From part-time contractor to a 30-person R&amp;D division: a four-year retrospective on hiring, tech stack, and culture experiments at IHFB, with the unfinished work and the advice I&apos;d pass to the next leader.</description><pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;I served as CTO from April 2021 to April 2025 — joining a three-engineer team, growing it into a 30-plus-person R&amp;amp;D division, and finally closing out a long campaign. I&apos;m not sure my writing is up to the task of fitting four years into one post, but I want to get it down before too much time passes.&lt;/p&gt;
&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;h3&gt;April–May 2021. Starting Part-Time&lt;/h3&gt;
&lt;p&gt;I joined on a short-term, part-time contract. I was building my own service at the time, and to keep cash flow going I spent my days on my own business, then went into the company at night. The engineering team had three engineers total, and two of them and I worked together every night from 7pm to 11pm, sometimes past midnight.&lt;/p&gt;
&lt;p&gt;I worked on a few things at the time. The first was a single controller file with over 7,000 lines of code. I tried to clean it up by applying a layered architecture (at least), cutting repeated code, separating raw queries into a repository pattern, removing recursive functions, and applying a functional style. It was a Node.js / Express.js setup, a node server with no framework, running a single instance with PM2. Inside the controller, instead of calling other functions, the code was hitting its own server&apos;s API endpoints, which during peak hours caused repeated network overhead and response delays. Most of my time went into fixing that.&lt;/p&gt;
&lt;p&gt;Push notifications and other heavy work weren&apos;t being moved to background jobs either, which was hitting the server hard, so another big task was pulling that into Kafka and handling it as events. Most of the work in this period was on the legacy service, especially the backend: fixing problems, refactoring, performance, server stability. Alongside that I was studying Kafka, applying it to events, studying k8s.&lt;/p&gt;
&lt;h3&gt;June–December 2021. Six-Month Contract CTO&lt;/h3&gt;
&lt;p&gt;While I was doing all this, the engineering team&apos;s main projects somehow became directly tied to me, and in May they offered me the CTO role. The previous CTO wanted to move to the service experience innovation team (an operations group), and since I needed cash anyway, I took the offer without much hesitation, thinking &lt;em&gt;six more months, why not?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;From June, while continuing to work on the legacy service, the CEO proposed throwing out the legacy operating service entirely and replacing it with a brand new one. Internally we called the project SA service development. Replacing a service from a Series-C company with over 100 people felt like a tall order, honestly. I initially proposed improving the existing legacy as much as possible, but after firm persuasion from the CEO, we committed to building the new SA service from scratch.&lt;/p&gt;
&lt;p&gt;Our stack was Node.js-only at the time, so the blueprint was straightforward: TypeScript + NestJS, MySQL, deployed on k8s. For the first three months and change, almost all of the time went into thinking through what was wrong with the legacy and how to design a system extensible enough to hold whatever content we&apos;d want to put in later. We prototyped fast.&lt;/p&gt;
&lt;p&gt;In parallel I was working on the CMS, the content editor. The legacy service offered only a bare-bones editor, and the content team had been storing things like multiple-choice option numbers and special characters in macros or notepads on the side. They&apos;d even elevated buggy behavior into what we treated as a workflow feature, as part of how they got things done. I called these people content ninjas.&lt;/p&gt;
&lt;p&gt;To solve the content production problem, I started planning and building a new CMS. This was probably the first time at IHFB that we actually listened to users, did the content production work ourselves, empathized with their problems, and kept the customer in the room. I remember testing every single keyboard shortcut, and running rough user tests with intermediate builds as we went. Content is the heart of an education business, but the perception was &lt;em&gt;just hire more people&lt;/em&gt;, so this team had been getting zero technical support. I had a strong urge to fix it for them.&lt;/p&gt;
&lt;p&gt;Anyway, during this period we were also hiring aggressively to build a real engineering team. The company had successfully closed Series C and was deploying that capital into all the scale-up moves: a record-setting TV ad campaign, large-scale hiring. By December 2021 the engineering team had grown from 3 in April to 13. And my contract was nearing its end.&lt;/p&gt;
&lt;h3&gt;2022. Toward the SA Service Launch&lt;/h3&gt;
&lt;p&gt;I&apos;d started it, so I wanted to finish it. We&apos;d come this far, so I wanted to see it through. I signed two more contracts in 2022 and started running toward the SA service launch. The company moved from Mapo to Yeouido Park One (Seoul districts). We hired aggressively across the board, not just our team. The actor Lee Byung-hun was on TV promoting the service, and marketing was firing on all cylinders.&lt;/p&gt;
&lt;p&gt;Everything that ran on the legacy had to keep running, and structurally the new service had to be better. The legacy service had years of features layered on top of one another, and somehow each of them was being used somewhere. Missing even the smallest one would break the service, so as the dev timeline kept stretching, we kept checking and re-checking that we hadn&apos;t missed anything from the legacy.&lt;/p&gt;
&lt;p&gt;The first cut of the service was done in August. We pre-launched to a low-impact, low-sensitivity user group (1st-year middle schoolers and 3rd-year high schoolers, who don&apos;t take in-school exams). Through September, October, November we kept it in pre-launch. In the last week of December all users were migrated to the new service. January through July, a full seven months of dev. August through December, all the non-dev work (operations team training, content migration) to actually put it into production.&lt;/p&gt;
&lt;p&gt;We kept hiring, and the team passed twenty people. Around summer, what people call &quot;Naver/Kakao/Coupang/Line/Baemin&quot;-tier team leads (the Korean big-tech equivalents) joined, and the team finally felt like a real team as we pushed through dev and launch. For the final content migration we were at the office until 4am with the team. I can still vividly remember the hours leading up to that night. The full release took over a year, and honestly there were moments I wondered if it would ever actually end.&lt;/p&gt;
&lt;p&gt;By that point we weren&apos;t just an engineering team anymore. We were the R&amp;amp;D Division, with our own organizational culture, moving as one team. Team leads had come in. The service had launched after all the back-and-forth. The wrap-up moment was finally close.&lt;/p&gt;
&lt;h3&gt;January–August 2023. Going Full-Time, Then Iteration&lt;/h3&gt;
&lt;p&gt;Ironically, when we finally launched at the end of 2022, the company offered me a full-time role and gave me a short window to think it over. We&apos;d launched, sure, but there was still a mountain of work: stabilizing the service, dealing with the issues that come up in real operations. After putting more than a year into the service, though, I wanted to stay and watch it find its feet and grow.&lt;/p&gt;
&lt;p&gt;So in this period I bought a small amount of stock and became a shareholder, and for the first time I started working at the company full-time. I changed my mindset too. Up until then I&apos;d always felt like an outsider, and I&apos;d been working from that posture. Now I was going to commit a little more sincerely. No more excuses. Do my best with what I can do. That was the resolution.&lt;/p&gt;
&lt;p&gt;The new build was good, but compared to before, both the architecture and infrastructure had gotten more complex, and incident response and various solutions were genuinely hard. The three-team-lead structure that came together around then (backend, frontend, PM) controlled the feature teams well, and despite all the issues, we were building out work processes in an almost ideal way. QA was set up around then too. By that point we were already over 25 people.&lt;/p&gt;
&lt;p&gt;We launched a more premium product on top of the existing one, which came with a lot of additional feature requirements, and the product itself started handling many more content types and packing in many more features.&lt;/p&gt;
&lt;h3&gt;September–December 2023. B2G? B2B?&lt;/h3&gt;
&lt;p&gt;Things started getting hard around then. This was probably when I entered a completely new phase. The PM team lead I had real chemistry with left to start her own business, and I took over as acting PM lead. From that point, I was doing more PM work than CTO work. The company was also expanding from B2C (which it had focused on) into B2B and B2G, building on the platform we&apos;d made, and I was barely keeping up with the business requirements.&lt;/p&gt;
&lt;p&gt;In September, then again in January 2024, the company planned and ran large external events (expos) it had never done before. To prep demos and features for those, this stretch was almost entirely B2B and B2G product dev rather than B2C. B2B/B2G is genuinely much harder than B2C. I couldn&apos;t tell what to base feature decisions on, what to actually build, and instead of customer voices, feature priorities kept getting shoved around by self-proclaimed experts: internal executives, outside expert groups, departments outside the engineering team.&lt;/p&gt;
&lt;p&gt;This was when things got truly hard. Not because the difficulty was high, but because B2B/B2G product-building isn&apos;t a domain I&apos;d built up over ten-plus years, so I honestly felt no joy or interest in it. Every feature implementation felt like homework. Having said in 2023 that I was going to commit fully, though, I kept moving forward.&lt;/p&gt;
&lt;h3&gt;January–August 2024. B2G&lt;/h3&gt;
&lt;p&gt;I never thought I&apos;d be making a textbook in this lifetime, but the policy review guidelines for the government textbook certification were handed down, and from the January expo to the August submission deadline I burned everything I had. By the end I was barely going home, working weekends and holidays. It wasn&apos;t only dev. There were training programs, demos, every kind of business requirement coming in along the way, on schedules tighter than what we&apos;d planned. I just kept rebalancing priorities and pulling resources together to get it done.&lt;/p&gt;
&lt;p&gt;I was running more like a PMO function or PM than a CTO, and the PMs working with me at the time recognized me as a PM. I learned the hard way that PM isn&apos;t a fit for me. Engineer ego aside, I gave everything to finishing the work. We took the existing service, kept only the skeleton, and built a new platform in a short window. The summer passed without me noticing the heat.&lt;/p&gt;
&lt;h3&gt;And Up to Now&lt;/h3&gt;
&lt;p&gt;From September 2024 to now, I&apos;ve covered enough in earlier writing. If you&apos;re curious, see below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-04-last-seven-months&quot;&gt;The Last Seven Months: A Stream of Thoughts (records from September 2024 to March 2025)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;To Sum Up&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Early days&lt;/strong&gt;: legacy platform refactoring and stabilization (3 → 13 people)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase 1&lt;/strong&gt;: launching the new SA platform (13 → 20 people)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase 2&lt;/strong&gt;: platform iteration (~25 people)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase 3&lt;/strong&gt;: building the B2G platform (~35 people)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I had to pick the most fun stretch, it was from February 2023 (when the three-team-lead structure clicked into place) through June 2023, when we were just focused on iterating the service. Funny — writing it all out, it doesn&apos;t feel like much got done. And when I really chew over those years, no period was easy. The time when I was still writing code was honestly more fun, and people were closer.&lt;/p&gt;
&lt;p&gt;As someone else once said, those memories belong only to me. Everyone else has already forgotten, and only the recent memories stick with them. That long period when we were sometimes happy together and sometimes really tight as people, there&apos;s no way to find traces of it in each other anymore. That&apos;s sad. I&apos;m not saying we should be chained to the past. As someone wrapping up and leaving, I just want to be remembered well. What can you do? Coming this far was my decision. I could have stopped at any of those moments along the way, but I kept going. That was my choice. If I&apos;d wanted to walk out to applause, I shouldn&apos;t have come here in the first place. Anyway, I&apos;ve laid out what I did in rough chronological order, just as it came to me. Now let&apos;s go through it piece by piece.&lt;/p&gt;
&lt;h2&gt;Outcome (Org and Product)&lt;/h2&gt;
&lt;h3&gt;Data Team&lt;/h3&gt;
&lt;p&gt;The data team was properly built when the two people currently there joined in August 2022. We started from basic data engineering with Airflow, did a stats study group together (we even rewrote Andy Field&apos;s whole book in Python), built out a data warehouse, set up analytics pipelines, and worked together on the data products that became core to running the service.&lt;/p&gt;
&lt;p&gt;Both were juniors when they joined, so for the first year we ran weekly study sessions and did design work together. They both put in their personal time too, and partly because of that, they grew really fast. One of them finished grad school over the past two years on top of the busy work schedule. People joke that she&apos;s a robot, but as someone who&apos;s actually tried doing school and work in parallel, I have nothing but respect for her.&lt;/p&gt;
&lt;p&gt;I could have done more focused work on the data team, but unfortunately, from the second half of 2023 when I took over as acting design team lead, I ended up neglecting the team more than I should have. Coming from a data engineering role at my previous company, there&apos;s regret that I didn&apos;t execute more of the roadmap I&apos;d planned. The saving grace is that both of them are people who run themselves well, so at this wrap-up moment they&apos;re the team members I trust most and I&apos;m most grateful to. They&apos;re also (from my side) the easiest people to be around, and the team where I most wish I&apos;d looked after them more. They&apos;re working on the company&apos;s main initiative right now, the AI Agent project. They&apos;ve finally landed on the &lt;em&gt;something AI engineering&lt;/em&gt; they&apos;d been wanting, and I really hope they get the result.&lt;/p&gt;
&lt;h3&gt;Design Team&lt;/h3&gt;
&lt;p&gt;When I took over the design team, I thought it was a blessing in disguise at the time. The previous lead had left, and while we were hiring a new PM, I stepped in as acting lead. It pulled me back into the planning details. The one thing I regret is not making enough of the opportunity, because we hired a new PM not long after. The new PM was a junior, so I stayed on as acting lead, and the biggest mistake was demanding from this new PM most of what the previous PM lead had been doing. (PM stuff, I&apos;ll save for the PM section.)&lt;/p&gt;
&lt;p&gt;The reason an engineer-background lead could land any real hits in the design team was that the planning skills I&apos;d picked up from running my own business held it up. We were also pursuing product design (owning policy details all the way down, not just UX/UI), and that gave me room to play several roles. On the aesthetic and form side, my feedback was close to zero. The best I could do was feeling out the room with &lt;em&gt;I don&apos;t really like this color&lt;/em&gt;. I can&apos;t make it, but I can tell good-looking from ugly.&lt;/p&gt;
&lt;p&gt;What I liked about leading the design team was the time spent one-on-one with each person, going back and forth on product direction and feedback. Designers and developers are makers, and makers can&apos;t help over-investing in their own solution. Someone has to keep pulling them out of it from the outside, and when leading the project, I think I did that part well. Especially when many initiatives were running in parallel, the product was still one and the customers were still defined, so giving useful feedback wasn&apos;t hard, and the designers took it in well. When something didn&apos;t make sense, we kept trying to convince each other. You could say &lt;em&gt;that&apos;s just how you see it&lt;/em&gt;, but when requirements come down so top-down, my position as a middle manager forced me to keep asking &lt;em&gt;why&lt;/em&gt; and to keep building motivation just to set priorities. The persuasion may not have been enough for some people, but I can promise I never skipped the persuasion process.&lt;/p&gt;
&lt;p&gt;That said, recently (at the end), with so many products, so many squads, so many kinds of customers, the useful range of my feedback shrank to mostly implementation-scope. If I hadn&apos;t quit this year and had kept going, my plan from the start of the year was to delegate the design lead role and return to being CTO.&lt;/p&gt;
&lt;h3&gt;QA Team&lt;/h3&gt;
&lt;p&gt;We set up the initial QA staffing with the original PM lead, and built out the QA process together. The QA team, truth is, didn&apos;t grow much after the initial setup. This is the team I have the biggest regret about. While also leading the data team and the design team, I didn&apos;t have the experience or the capacity to give QA proper direction and lead it as a specialized function. Late in the period, I tried giving the QA team more authority and a sense of ownership to push them to do better, but unfortunately, during the time I was there, we put almost no time into proper test-case reviews or building QA automation. My experience there is limited, but the team has people who&apos;ve worked with strong QA orgs. I hope the team itself can push toward becoming a more specialized function that contributes more to the org going forward.&lt;/p&gt;
&lt;h3&gt;Engineering Team (FE/BE)&lt;/h3&gt;
&lt;p&gt;For the first year I was almost always with the engineering team, looking at code, writing code myself, spending most of my time on code review. I delegated FE to the FE lead who was there from the start, and concentrated mostly on backend. Legacy, layered, functional, DDD, clean: I came in with all these design agendas. The one thing I regret from that period is that no design methodology is 100%, and I set the criteria too vaguely for the gray areas. We just kept developing. A lot of that is still in production code. Even if my methodology becomes a new kind of legacy by today&apos;s standards, I should have set stricter criteria and done more rigorous code review on the ambiguous parts. I was lacking a lot back then.&lt;/p&gt;
&lt;p&gt;When the BE lead came in, I naturally delegated code ownership. For about half a year I spent more time pairing with a junior FE engineer once a week to untangle a heavily coupled component. Most of my actual coding was on the data engineering side. Since this was the company&apos;s core engineering team, I always followed up on key design and decisions and actively joined design reviews on new projects. From that point on, instead of code reviews, it was mostly design reviews and tech doc reviews. From this distance, I should have stayed on top of code reviews more consistently. I wasn&apos;t completely absent from the code, but it was nowhere near enough. Whether the implementation actually matched the design has to be verified through the code itself. Because I was so weighted toward design reviews early in projects, I kept finding out late that the agendas I&apos;d brought in originally and the actual code implementation had drifted apart in important ways.&lt;/p&gt;
&lt;p&gt;Even as I&apos;m wrapping up now, I keep asking myself &lt;em&gt;if I could go back to point X in time, what would I pick differently?&lt;/em&gt; From tech stack to design direction. The biggest one is that during the B2G phase, when there was a window to partially rebuild the platform, I didn&apos;t go far enough in breaking the existing structure. I compromised to hit a tight schedule, what amounted to honoring the old while building the new, and looking back from here, that was the wrong call. I really hope my successor and the engineers staying behind, plus the strong people coming in, can fix the structural problems at the root and turn it into software that&apos;s resilient to change, a service where you can focus on the core logic.&lt;/p&gt;
&lt;h3&gt;PM&lt;/h3&gt;
&lt;p&gt;Honestly, just regret. In 2024 I was a PM, not a CTO, and as a PM I failed badly. I didn&apos;t make use of the strengths and weaknesses of the PMs we&apos;d hired. I didn&apos;t delegate properly. We didn&apos;t communicate or share well. The team and people I spent the most time with. And yet I just couldn&apos;t pull it off. I owe the PMs I worked with an apology, and that failure left me unsettled for a while.&lt;/p&gt;
&lt;p&gt;There were a few causes. The biggest one is that I was the PM lead and I was the PM role model. But no matter how much I set down the dev work to be a PM, the ability to review and plan a product based on technical understanding and design is mine alone. That&apos;s something I do well. The big mistake was forcing that role on others early on. The thing is, the moment a PM hears a requirement, they have to step back and check their own thinking: &lt;em&gt;can I make this call or not?&lt;/em&gt; If they can, decide fast. If they can&apos;t, get the right stakeholders into a room fast so the work doesn&apos;t stall. The moment a PM thinks they can decide something they can&apos;t and burns time on it, the timing slips and everyone working on it ends up unhappy. And in an in-house product, the PM&apos;s job is to deliver the customer&apos;s voice faster, judge the essence of the problem, and work with the makers to land on customer satisfaction. The timing was bad too: the B2G product I worked on for a year was a project where you basically couldn&apos;t do any of that. The role was mostly &lt;em&gt;take a given task and shrink its scope to the bare minimum that still meets the conditions&lt;/em&gt;. Or write business proposal documents.&lt;/p&gt;
&lt;p&gt;Still, I think I could have done better. And in spite of everything, they should have been working in a better product environment. At least when it comes to PM, I&apos;m not A-tier, so if I&apos;d met these people in a B2C or B2B in-house product, I might have done better, might have delegated more. In this kind of environment, PMs honestly just get pushed around and bled dry.&lt;/p&gt;
&lt;p&gt;I never praised that team properly, only nagged them. I&apos;m sorry. I hope both of you find environments where you can work more like yourselves.&lt;/p&gt;
&lt;h3&gt;Org Structure Changes&lt;/h3&gt;
&lt;p&gt;We started with feature teams, and ended up (clumsily) with mission-based teams, a squad system. I think that&apos;s a good thing. I didn&apos;t drive the change proactively, though. Buffeted by changing external business needs, our single big division kept doing wildly different work in feature-team units sprint to sprint, and to get some continuity and focus people, we ended up in what I&apos;d call survival-mode squads. But there weren&apos;t enough PMs, the size of the businesses was wildly imbalanced, the contexts were different (different businesses, different customers), yet we kept the same platform strategy (same codebase, same branch). Every release blew up. To fix it, you&apos;d have to either drop a business, or if you can&apos;t, split codebases by business unit and make everything independent so the squads can move faster. On this one, my view differs from the executive team, so I won&apos;t comment further.&lt;/p&gt;
&lt;p&gt;If we&apos;d separated codebases per squad, put a senior engineer on each squad, had a dedicated PM per squad (especially for B2G, where stakeholders are so tangled, I think you need at least two PMs), and split the org structure clean along squad lines, could we have run a more agile system regardless of headcount? Saying &lt;em&gt;we&apos;d have done well if we had more resources we didn&apos;t have&lt;/em&gt; is a cheap thing to put in a retro. What I really wanted from the squad model was &lt;em&gt;back to the basics&lt;/em&gt;. The way I built culture and led nimbly with three engineers when I first joined, I wanted to recreate that in small squads. But honestly, looking at where things stand, I can&apos;t say that worked out. Was it because we&apos;d gotten too used to feature teams over the years? Or just because last year&apos;s B2G project drained everyone?&lt;/p&gt;
&lt;p&gt;Still, the one really important thing I should have done is: more 1-on-1s with people, more often. When I scrambled to talk to people in January, the timing already felt too late. If anyone asks me, &lt;em&gt;I&apos;m a manager and I don&apos;t know what to do&lt;/em&gt;, I&apos;ll tell them: do 1-on-1s diligently with your people. That&apos;s the best move.&lt;/p&gt;
&lt;p&gt;Also, the absence of a clear reporting structure (both up and down) was one of the biggest problems. Setting aside the squad structure, I should have set up direct, organized reporting from team leads, PMs, and seniors much earlier. In &lt;em&gt;startup&lt;/em&gt; organizations where everyone is moving on their own, I&apos;d treated &lt;em&gt;reporting&lt;/em&gt; as almost a forbidden word. But in a bigger company, reporting structures and rank structures matter, and so does delegating well to the people you can delegate to. Coming to that realization too late was another problem.&lt;/p&gt;
&lt;p&gt;Leadership goes downward, but it also goes upward. Just changing org structure doesn&apos;t make work happen. Org structure functions properly only when the upstream business structure and the downstream team culture both back it up.&lt;/p&gt;
&lt;h3&gt;Org Culture&lt;/h3&gt;
&lt;p&gt;Up until the org grew toward the first 20 people was probably when my influence was strongest. Check-in meetings, random lunch-mate matchups, sprint retros, those mechanisms worked. I wrote the onboarding doc myself. The two things I value most in org culture (humor and curiosity about each other) were running through small mechanisms that actually worked.&lt;/p&gt;
&lt;p&gt;Then last year, with the B2G project, people lost motivation, the company stopped communicating, and it all collapsed. As I started letting the small details go one by one, even the mechanisms that had been working just fell apart at the end. I decided we couldn&apos;t keep going like this and brought in the company&apos;s EX (employee experience) team. Now that the company has to move forward again, this might be the moment to reset the team&apos;s identity and culture entirely. If the culture I built doesn&apos;t work anymore, I hope they peel it off without hesitation and set up something new.&lt;/p&gt;
&lt;h3&gt;People Ops&lt;/h3&gt;
&lt;p&gt;Because the company&apos;s HR and people ops were mostly absorbed in the education and teacher operations side, almost all org-level people ops landed on me. The thing that took the most energy: the comp negotiation season at the start of every year. When I was alone, I had to evaluate all team members myself. When team leads were in place, I delegated to them but did the final evaluation myself. We brought in peer review for people who&apos;d worked together, and used it more for reference than as an evaluation. A month on team evaluations alone, almost two months on comp negotiations with the executive team. For 2023 and 2024, the first quarter of the year was almost entirely poured into people ops. The executive team was reluctant to raise compensation much, and team members wanted bigger raises, so I had to do max-tension tug-of-war within the cap I was given. Negotiating someone else&apos;s salary, not your own, isn&apos;t an easy process. To make evaluations more transparent, I introduced 1-on-1s, quarterly retros, peer reviews, all of it.&lt;/p&gt;
&lt;p&gt;The flip side: with that much authority comes that much responsibility, and since every execution went through my hands, the moment I got busy or lost focus, I&apos;d drop something. There was no framework or system to back it up, and the org had no real HR function, so I spent a lot of time fighting alone.&lt;/p&gt;
&lt;p&gt;Looking back, when the team was under 10, I had enough capacity even without HR support to give frequent feedback and run growth-oriented conversations. In 1-on-1s we&apos;d set goals together for the next month or three months, look back at what got better and what was missing, and during that time at least, I gave honest feedback (positive or negative, no holding back). I made a point of preparing at least one piece of negative feedback per person, where &lt;em&gt;negative&lt;/em&gt; meant something they could turn into an action item.&lt;/p&gt;
&lt;p&gt;As the team got bigger, the system was still nothing, and the company had less slack, it got harder to keep evaluations and reviews consistent. Building a system was a stretch when the company still had so much growing to do, and without a system you can&apos;t promise anyone even a baseline of growth. Pay eventually fades into background noise once you&apos;ve been receiving it for a while. There&apos;s a limit to how far you can convince or commit someone with money. It&apos;s just one of many ways to express what you think they&apos;re worth. What matters is whether the leader pulls growth out of people with sincerity while still giving objective evaluations. And on that front, I&apos;d think I was doing fine, then think it was impossibly hard. It was a brutal stretch.&lt;/p&gt;
&lt;p&gt;Team members and the company both talk about money in comp conversations, and only money. The company says &lt;em&gt;we paid this much, so deliver this much&lt;/em&gt;. The team members say &lt;em&gt;if you want this much, pay this much&lt;/em&gt;. A team member who works at a 6 out of 10 doesn&apos;t suddenly become an 8 because you raise their comp by 10 million won. (Truth is, you&apos;d be lucky if they don&apos;t drop below 6.) The company shouldn&apos;t expect that, and the team member&apos;s promise of it isn&apos;t worth much. Comp negotiation is one lever for carrying value and growth forward. Trying to solve everything with it, without context, is just not knowing people.&lt;/p&gt;
&lt;p&gt;I always emphasized individual growth, but in the end, you can only talk about individual growth if you keep pulling team growth, and beyond that, team wins. In a startup, team wins have to connect to the company&apos;s business goals. The team has to drive those goals and turn them into wins. In an org where you don&apos;t even know what winning is, no matter how much a leader talks about individual growth, it&apos;s hollow. Individual growth sits on top of team wins. It might be sacrificed for one. But it can&apos;t exist without one.&lt;/p&gt;
&lt;p&gt;The executive team wanted us to build the product they had in mind, and they ran the business and engineering as separate orgs. Every metric and every requirement&apos;s backstory came only through the executive team. Right or wrong, that&apos;s a structure where it&apos;s really hard to define what &lt;em&gt;team winning&lt;/em&gt; means. The hardest moment was when the B2G project finished and the team had been crunching for three or four months. We hit our final goal (passing the review), but that wasn&apos;t a win. Not users, not revenue. Just earning the right to sell. With no business outcome reached, the team had worked plenty hard, and wanting some additional reward was completely reasonable.&lt;/p&gt;
&lt;p&gt;Of course there was no extra reward. From that point on, the company started struggling, and even the things you&apos;d taken for granted started disappearing. We spent enormous amounts on B2G with no clear business goal definition and no return. Forget headcount cost and time, we did everything money could do. But the executive team didn&apos;t explain (and when I asked for an explanation, all I got was &lt;em&gt;we have to save money now&lt;/em&gt;). I had to manufacture a company message in the middle, talk about vision... but I wasn&apos;t the final decision-maker, so my words couldn&apos;t carry weight. I myself was deeply skeptical about doing business through B2G product. It was because the company, in the end, didn&apos;t fully respect the CTO. Whatever the intent or reason.&lt;/p&gt;
&lt;p&gt;The story of finding out, the day before the holidays, that the Chuseok and Lunar New Year gifts that always go out hadn&apos;t gone out (finding out as Division Head by asking the other directors), and then scrambling to buy the team&apos;s holiday gifts on my own dime: you couldn&apos;t make it up. I&apos;m not bragging about paying out of pocket. With the judgment I have now, I&apos;d never use my own money. But moments like that pushed my leadership in running a 30+ person division beyond its natural range, and probably drained a lot of my patience.&lt;/p&gt;
&lt;p&gt;Even so, thanks to all this, I got to experience how to run an org, manage it, hire, all of it. These aren&apos;t lessons I read in a book — they were carved into me the hard way, and they&apos;ll stay. I won&apos;t be running a big team for a while, but I&apos;m not giving up on thinking about it. Because I really do love working as a team.&lt;/p&gt;
&lt;h3&gt;Product&lt;/h3&gt;
&lt;p&gt;When we built product, I always planned around structure, design, solutions. Sometimes thinking that way helped (extensibility, structural thinking), but the thing I regret most is the actual ways people would use this, which I didn&apos;t see.&lt;/p&gt;
&lt;p&gt;A concrete example: the curriculum part of the current content system was designed on the assumption that a curriculum gets written &lt;em&gt;after&lt;/em&gt; it&apos;s complete. But in the actual service, most curricula are written and updated as they go, and that&apos;s exactly the case customers are paying for. In the first year I was so focused on catching up to the legacy and on my (self-proclaimed) structural completeness that, no matter how much &lt;em&gt;extensibility&lt;/em&gt; I thought about, we ended up with a structure that&apos;s painfully fragile to change. Because the product design itself was broken from the start, the more use cases and edge cases surfaced, the more dev cost grew exponentially.&lt;/p&gt;
&lt;p&gt;It&apos;s like building getters and setters in an OOP class, thinking &lt;em&gt;now we can generalize these everywhere&lt;/em&gt;, then watching feature requests pile up and the getters and setters get crusted with &lt;code&gt;if&lt;/code&gt; statements, and one wrong touch sends side effects into every other area. Unlike DDD or recent design trends, I held the foundational model design too strict, and that fixed structure became a kind of immutable law. After that, every change had to either avoid touching it or work through it, which inevitably meant ballooning dev cost.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You were CTO, couldn&apos;t you have just done better?&lt;/em&gt; Ha, fair. That&apos;s why I wrote &lt;em&gt;I regret this&lt;/em&gt;. Early on I should have interviewed the operating teams much more deeply about exactly what they did and how they ran the service, even done the actual work myself, and understood it. But because I had to focus on the new platform that would replace the legacy, and because I was stuck in what I&apos;d convinced myself (that &lt;em&gt;the new platform is obviously better in features and design&lt;/em&gt;), I developed in isolation, without looking deeply at the use cases on the customer side. One reason I didn&apos;t quit after the 2022 launch was that I had a strong urge to make up for this, to develop from inside the customer use case.&lt;/p&gt;
&lt;p&gt;Honestly, more than the question of which dev stack to pick, this is the part I regret most all the way to the end. For a developer to write good code, they have to know the customer. If you write code based only on what the PM or the designer or someone else tells you, before long you&apos;re looking at your own code and blaming yourself for it. If it&apos;s just a code issue, you can refactor. But once the DB schema, the production data already sitting there, the relational table structures are in place, turning all that around, migrating it, redeveloping, once the service is in motion and chasing the next business requirement, that&apos;s almost impossible. You&apos;re carrying a giant lump forever. The trap engineers with &lt;em&gt;tech, tech, tech&lt;/em&gt; ego need to avoid: our value only shines when it connects to delivering value for the customer. If I&apos;m getting paid and what I&apos;m building doesn&apos;t connect to customer value, I think honestly I&apos;m a developer on borrowed time.&lt;/p&gt;
&lt;p&gt;Which brings me back to the same point: the customer. In the end, we&apos;re building products people use. Don&apos;t forget that. Don&apos;t ever forget it.&lt;/p&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;What I built, in the end, was an org and a product. If I had to pick a single action item from the org side, it&apos;d be: do more 1-on-1s. The things I most regret, the things that stung most in the end, were the &lt;em&gt;if I had just done it back then, it might have been different&lt;/em&gt; kind.&lt;/p&gt;
&lt;p&gt;On the product side, like I just said: put the customer first. Forget structure, forget design. What actually matters? The customer has to come first. Don&apos;t get confused. I&apos;m absolutely not saying &lt;em&gt;just take what customers say at face value&lt;/em&gt;. The real skill is catching the requirements, needs, and opportunities hidden underneath. (And being the kind of developer who can carry that into code.)&lt;/p&gt;
&lt;p&gt;Like my other posts, this is a brief (?) look back at four years of work. I wrote (or rather, dumped onto the page) whatever came to mind, so it&apos;s all over the place. Really, a stream of thought transferred straight to the page. While writing it, part of me wanted to clear it all out for a fresh start, and another part of me wanted to bury the past here and not be tied to it. The memories will fade. I&apos;ll read this and think, &lt;em&gt;ah, right, that&apos;s how it was&lt;/em&gt;. There&apos;s plenty I&apos;m still unhappy about (the company, other things), but this is a public space, so I focused on my own record and on things I can actually act on. Those frustrations will fade too. Some other version of honest thoughts I might write down, well past now, if I still have the will and the memory.&lt;/p&gt;
&lt;p&gt;Most of my twenties I spent building my own business, so for a 13-year career, I&apos;ve never been at a company this long as a regular employee. And not just an employee, a middle manager with the title of CTO. I spent my twenties and into my thirties being called &lt;em&gt;CEO&lt;/em&gt;, and only lately have I gotten used to being called &lt;em&gt;Director&lt;/em&gt; (a middle-management rank below the &lt;em&gt;CEO&lt;/em&gt; title I&apos;d held until then). Time scares me a little.&lt;/p&gt;
&lt;p&gt;Watching the company grow rapidly and watching it struggle, I always ran a mental simulation: &lt;em&gt;if I were the operator, what call would I make here?&lt;/em&gt; Not &lt;em&gt;I&apos;m better than anyone&lt;/em&gt;, but &lt;em&gt;I have my own style, so what&apos;s the best version of my approach?&lt;/em&gt; And I tried to understand the operator&apos;s position from the inside while doing it. Going from 3 to 30 in R&amp;amp;D while the company went from 100 to 500 was a high-difficulty problem.&lt;/p&gt;
&lt;p&gt;I trash-talked my boss behind their back and ate good food on the company card. I learned what a paycheck means. I learned a lot of things I didn&apos;t know when I was only an operator. I became more of a realist. As a middle manager I tried to live up to the responsibility, but it was harder than I expected. To my team I held two opposing sentences in my chest, &lt;em&gt;I&apos;m in the same boat as you&lt;/em&gt; and &lt;em&gt;I&apos;ll take responsibility and decide&lt;/em&gt;, and there were moments I disliked everyone, above and below, and moments I felt nothing but gratitude for everyone. Right here at the very end, what&apos;s biggest is regret. But over this time I felt and learned and gained a lot.&lt;/p&gt;
&lt;p&gt;At some point work got so heavy and the stress got so bad (I can&apos;t remember what it was about) that I sobbed in my wife&apos;s arms (we weren&apos;t married yet). At some point I had insomnia (I&apos;m someone who falls asleep the moment I lie down, anywhere) and was swearing in my sleep, and there were nights I&apos;d wake up at 3am over work and stay up until morning. I was more stressed than when I ran my own business. I only let it show to people at the very end. For someone who likes to wear his heart on his sleeve, I held a poker face and made it this far. Think too deeply and everything ends up a regret.&lt;/p&gt;
&lt;p&gt;Now I&apos;ll bury these four intense years here, hold onto the good memories and the lessons, and start something new.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What we call the beginning is often the end.
And to make an end is to make a beginning.
The end is where we start from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;― T.S. Eliot&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;To everyone who stayed with me to the last line, thank you for reading all the way through these messy, scrambled four years. I&apos;ll rest for a while and come back with new stories.&lt;/p&gt;
</content:encoded><category>retrospective</category><category>project-retrospective</category><category>CTO</category><author>Tony Cho (https://flowkater.io)</author></item><item><title>The Last Seven Months: Scattered Thoughts (September 2024 to March 2025)</title><link>https://flowkater.io/en/posts/2025-04-last-seven-months/</link><guid isPermaLink="true">https://flowkater.io/en/posts/2025-04-last-seven-months/</guid><description>A seven-month retrospective on how a B2G (business-to-government) project and the early days of marriage wrecked my mental state, and how travel, therapy, and work adjustments slowly pulled me back. Notes on the emotional swings, daily-routine repairs, and the kind of conversations it takes to hold a relationship together.</description><pubDate>Tue, 01 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening&lt;/h2&gt;
&lt;p&gt;I haven&apos;t written a single retrospective since August. Between September and March, more than half a year slipped past with my body and mind both out of shape. No goals, no retros, and I can say with some confidence it was the worst stretch I&apos;ve had in years. The health I&apos;d built up over the summer fell apart, and my head wasn&apos;t in a great place either. Now that I&apos;ve finally decided to reset the problems that were chewing away at my life, I figured it was time to write something about what I&apos;ve been through. Calling it a retrospective feels like a stretch, and it doesn&apos;t live up to the monthly records I used to keep, but compared to an annual review the cadence is still short, so I&apos;ll take that as consolation and just set down whatever comes out, in no particular order.&lt;/p&gt;
&lt;h3&gt;Married Life&lt;/h3&gt;
&lt;p&gt;September was when the B2G project at work finally wrapped up for the season. Looking back, I worked through the summer without even noticing it was hot. At the time all I wanted was a short break to enjoy the relief of being done. Over Chuseok, my wife and I got what passed for a blessing from both sets of parents and flew off to Switzerland and France, hoping the trip would repair the long stretch I&apos;d burned through at the company. But by then we&apos;d already been newlyweds for the first half of 2024 (half a year during which work was pretty much all my life was), and each of us had been holding on in our own separate ways. That time wasn&apos;t something a single European trip could undo. Truthfully, that was the moment I should have come to my senses, but back then I was just full of resentment. I think the only thing running in my head was &lt;em&gt;I was just trying my best, and look where it got me.&lt;/em&gt; In the end, recovering took another six full months. The saving grace is that we&apos;re at least moving in the direction of recovery, and that&apos;s entirely thanks to my wife&apos;s resolve, her patience, and her effort. The process was brutal for both of us, of course.&lt;/p&gt;
&lt;h3&gt;Work&lt;/h3&gt;
&lt;p&gt;No matter how much meaning I tried to layer onto it, the B2G project was, to me, just outsourced work. The government had put out a pass-or-fail guideline, and that guideline was vague enough that the whole game became: interpret it however you can and squeeze out extra points. There was no customer in the room, no end user. Just the government trying to ram a half-baked policy through in a hurry, and the incumbents in the market angling to clear the bar. For us to play the game at all, we had no choice but to partner with those incumbents, and we finished the product through a tug-of-war with fuzzy guidelines and requirements from partners that made no sense. The real push started in May 2024, but we&apos;d been pouring resources into it since September 2023. As of April 2025, the team and I had spent nearly a year and a half on it.&lt;/p&gt;
&lt;p&gt;&quot;Startups shouldn&apos;t do outsourced work&quot;? I&apos;m not trying to chase that kind of idealism. Business is business. Startup or not, it doesn&apos;t matter. When your in-house product is going through a slump, turning to outsourced work is the natural move for a startup that&apos;s running out of cash. Years ago, at a dinner with Song Jae-kyung, then CEO of XL Games (I think he&apos;s since left), he told stories about the early days at Nexon building &lt;em&gt;The Kingdom of the Winds&lt;/em&gt;, and he mentioned that everyone on the team except him was doing homepage contracting on the side.&lt;/p&gt;
&lt;p&gt;Anyway, I&apos;m drifting. The point is that to move forward, sometimes you have to do work you don&apos;t want to do. That&apos;s what running a business is. But that&apos;s not what I&apos;m getting at either. If this had been straight contract work, we&apos;d have gotten a down payment when the project kicked off and a final payment when it wrapped, as fast as possible. If it had been in-house product work, we could&apos;ve given up short-term revenue and aimed for something bigger. But when a project is really just a handful of stakeholders&apos; requirements dressed up as something more, the right move for a startup with its own product is to knock it out fast, collect, and get out.&lt;/p&gt;
&lt;p&gt;We spent a year and a half on it. Because it was B2G, it was meaningfully harder than ordinary outsourcing, but we met every requirement and delivered a good result. No down payment. No final payment. Passing the B2G review just gave us the right to enter the market and try to sell the product. The thing is, the pass criteria didn&apos;t reflect what the market actually wanted. To actually sell, we&apos;d have a mountain of real development still ahead of us. And to make matters worse, the December 2024 South Korean martial-law declaration kicked in, and public sentiment around policy, already shaky, got even worse. The sliver of return we&apos;d been hoping for in 2025 vanished entirely.&lt;/p&gt;
&lt;p&gt;The thing about startups is that you can&apos;t really run a Plan B. You stare at Plan A and throw yourself at it like a lunatic, and when the slim odds of success do arrive, you&apos;re the one who can move faster and bigger than anyone else. So it&apos;s very easy, after the fact, to talk about these kinds of outcomes with hindsight. In the moment, you can&apos;t know anything. When a crisis comes, you cut and cut and hold on until the next chance shows up. From a startup point of view, that call is completely natural.&lt;/p&gt;
&lt;p&gt;But the people going through it with you have a rough time. Decisions you believed were the best turn out wrong, and wrong decisions hit every part of an employee&apos;s life, financially and mentally and everything else. If you don&apos;t want to go through that process with the company, leaving quickly is the right answer. No one will blame you for it. No one has the standing to. That said, since these aren&apos;t collective decisions, the company has to clearly share how things got here and where things stand right now. That&apos;s what communication means.&lt;/p&gt;
&lt;p&gt;And honestly, from where management sits, that&apos;s about all you can do. You give the information, and then you give people the room to make their own calls. Stay or go. That&apos;s the best thing for everyone. The ones leaving get well-wishes for the road ahead, and the ones staying lock in together and try to turn the crisis into something. The company has to be able to ask for that.&lt;/p&gt;
&lt;p&gt;But the absence of communication strips all of that away. From both sides. The hardest spot of all is the middle manager with no information, no authority, and no answers for a team that&apos;s waiting for one. Powerless. Useless. You try to hold yourself together and do what you can, but eventually you break. What more could I have done? Honestly, I don&apos;t know.&lt;/p&gt;
&lt;p&gt;Back then, I hated it all: the teammates who didn&apos;t know what I was dealing with, and the executives too. The moment I caught wind of things said behind my back, in their own little circles, something in me bruised. There was nothing I could do about any of it, and maybe the comments weren&apos;t even aimed at me, but they all sounded like accusations. I was treating the company&apos;s problems and the company&apos;s responsibilities as if they were mine to absorb. I think that&apos;s what being a leader is, though. Whatever the situation, you stay on the hook until the end.&lt;/p&gt;
&lt;p&gt;But after long enough with no information and no authority, I hit the wall. Every business decision was being made upstream, we were getting dragged along, building only what was handed to us. The same pattern, again. There was no &quot;here&apos;s how we&apos;re going to improve things,&quot; no &quot;let&apos;s communicate better.&quot; Just the same old way, heading somewhere I couldn&apos;t see, forward for the sake of forward.&lt;/p&gt;
&lt;p&gt;At first I thought maybe it was just my department, that I wasn&apos;t doing a good enough job and that&apos;s why we were the isolated island. But when I looked around, every department was an isolated island. If anything, the information I had was coming in a little faster than elsewhere. The moment I realized this wasn&apos;t going to improve, and the moment I realized the people with me had stopped expecting anything from the company (and from me, by then), I decided to stop.&lt;/p&gt;
&lt;h3&gt;Month-by-Month Work Summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;September&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Project submitted. At that point the company was saying we&apos;d refocus on the in-house product, so I started setting up an objective-based squad structure and cleared the B2G product off my plate, tired of it as I was.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;October&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;We were suddenly told a global-business project was starting, but I tuned it out and focused on the B2G product&apos;s post-review corrections. I think I just wanted it to be over.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;November&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;The B2G product passed review. Since scoring was per content item rather than platform-level, some items failed, but more than half passed.&lt;/li&gt;
&lt;li&gt;Around this time we reorganized quickly into an in-house product squad and began planning and building new tasks.&lt;/li&gt;
&lt;li&gt;The period wasn&apos;t easy, but because we were centered on in-house product work, it was at least fun.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;December&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Back to the B2G product. We were told in November there&apos;d be a resubmission schedule for the items that failed, and there were new partners involved. Every time it&apos;s the same story: we&apos;re told there won&apos;t be any additional development, and every time, once you open it up, the spec dump is just as heavy as the previous half-year&apos;s. In the end, as the first round of in-house squad work wrapped, I had to pull the B2G product back in.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;January&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;The squads were nominally set up around the in-house product, but we were clearly going to have to do the B2G work no matter what, and that needed a plan. Running retros with the team leads, I realized how much we&apos;d been letting slide under the cover of &quot;we&apos;re busy.&quot; We reorganized the squads by business line (global, B2G, new in-house) and gave team members formal titles. I think I was trying to carry the thing on personal effort, whatever the company was doing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;February&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I thought the new squad structure would let us move sharply, but in the end none of it was really clicking. The underlying problem was the same. Three squads whose contexts barely overlapped, and I couldn&apos;t properly delegate any of them, so I ended up not really knowing any of them well enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;March&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I sat with the question of how to spend the time ahead, what I was actually hoping to get out of this place, and once I weighed everything I realized the person who should have left was me. The right moment would have been the moment people here stopped expecting anything from me, and even that window had already closed. I&apos;d come this far on a shabby sense of duty, but once I accounted for every opportunity cost, leaving (even now) was the right call. At this point I&apos;m sure of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s as far as I&apos;ll go on work. I&apos;ll put the full company retrospective in a separate post. A rough six months doesn&apos;t mean every memory from it was bad, not even close.&lt;/p&gt;
&lt;h3&gt;Personal (Health, Reading, Other)&lt;/h3&gt;
&lt;p&gt;With my head in a dark place, my routines fell apart, and the times I tried to burn off the bad mood with overly hard workouts, injury caught up with me. The injury made it harder to go to the gym, and I&apos;m still in recovery mode. When my mental state is off and I can&apos;t exercise, stress relief slides back into food, and body and mind both kept deteriorating for a while. It&apos;s only recently that I&apos;ve been seeing a doctor consistently and keeping up rehab.&lt;/p&gt;
&lt;p&gt;The symptom I&apos;m most worried about is reading. For six months I basically stopped. Even in the busiest stretches I&apos;d never put books down like that, but this time I just stopped. Without input, you burn out. I guess that&apos;s what was happening to me, quietly.&lt;/p&gt;
&lt;p&gt;As I mentioned, my wife and I had a rough stretch, and one of the things we tried was traveling. France and Switzerland, but also Cebu, Osaka, Kyoto. Whenever the schedule allowed, we tried to get as far away as possible and spend some good time together. There were hard days, since we were in the middle of fighting a lot, but in the end I think they were trips worth taking. They helped more than I expected. What I remember most isn&apos;t the famous tourist spots. It&apos;s the two of us walking down ordinary streets, talking about nothing in particular.&lt;/p&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;This isn&apos;t a retrospective, and it isn&apos;t really a record of that stretch of time either. Too scattered to be a retro. Too scattered to be a record.&lt;/p&gt;
&lt;p&gt;My difficulty might be nothing to someone else. I&apos;m not writing this to get public agreement that what I went through was hard. I&apos;m writing it because, in the middle of these tangled, unresolved thoughts, I somehow made the next choice (the kind of choice that probably needed a good bit of courage) and stumbled into something new by backing away. This is a record of how I was backing away.&lt;/p&gt;
&lt;p&gt;Life keeps handing you an easy choice and a hard choice and forcing you to pick one. That&apos;s the cruel part. And the answer has always been the harder one. I chose the harder path because it was the harder one. Whatever mess the company is in, staying there is the easier call for me. I&apos;d regret it if I backed down, so since I was already stepping backward, I figured I&apos;d step onto a new road instead. I&apos;m not trying to push the harder path on anyone else. Everyone has their own best answer.&lt;/p&gt;
&lt;p&gt;I&apos;ll leave the concrete plans for what comes next, and the four-year retro on my time at the company, for other posts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All that is gold does not glitter
Not all those who wander are lost
The old that is strong does not wither
Deep roots are not reached by the frost
From the ashes a fire shall be woken
A light from the shadows shall spring
Renewed shall be blade that was broken
The crownless again shall be king&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;⁃ J.R.R. Tolkien, &lt;em&gt;The Lord of the Rings&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;Previous retrospective
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2024-09-blood-sweat-melancholy&quot;&gt;Blood, Sweat, and Melancholy (July &amp;amp; August 2024)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Next retrospective
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/2025-04-ihfb-four-year-retro&quot;&gt;Four-Year Retrospective at IHFB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>retrospective</category><category>period-retro</category><author>Tony Cho (https://flowkater.io)</author></item></channel></rss>