<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Field notes by Hovhannes</title><description>Practical notes on making product decisions before more code gets written.</description><link>https://hovhannes.io</link><language>en</language><item><title>A backlog is not a build plan</title><link>https://hovhannes.io/a-backlog-is-not-a-build-plan</link><guid isPermaLink="true">https://hovhannes.io/a-backlog-is-not-a-build-plan</guid><description>A practical way to turn a growing product backlog into a focused, evidence-based weekly build plan.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p class=&quot;article-lead&quot;&gt;Most backlogs begin as a sensible place to avoid losing ideas. Then customer requests, bugs, experiments, technical debt, and half-formed features collect in the same list. &lt;strong&gt;The list gets longer, but the next decision does not get easier.&lt;/strong&gt;&lt;/p&gt;

          &lt;section id=&quot;inventory&quot;&gt;
            &lt;h2&gt;The backlog is inventory, not direction&lt;/h2&gt;
            &lt;p&gt;A backlog answers “what might matter?” A build plan has to answer a harder question: “what are we willing to finish now, and what are we deliberately leaving untouched?” Treating those as the same thing creates three familiar problems.&lt;/p&gt;
            &lt;ul class=&quot;article-list&quot;&gt;
              &lt;li&gt;The oldest item looks important because it has survived for months.&lt;/li&gt;
              &lt;li&gt;The most detailed item looks ready because someone already wrote acceptance criteria.&lt;/li&gt;
              &lt;li&gt;The loudest request jumps to the top even when it points away from the product’s main promise.&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;None of those signals proves that the work belongs in the next build. &lt;strong&gt;Age&lt;/strong&gt; measures waiting. &lt;strong&gt;Detail&lt;/strong&gt; measures preparation. &lt;strong&gt;Volume&lt;/strong&gt; measures attention. A plan needs evidence of value, a clear dependency boundary, and enough capacity to complete the outcome.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/backlog-filter.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/backlog-filter-480.webp 480w, https://hovhannes.io/assets/responsive/article/backlog-filter-960.webp 960w, https://hovhannes.io/assets/responsive/article/backlog-filter-1440.webp 1440w, https://hovhannes.io/assets/article/backlog-filter.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Many paper idea cards passing through a narrow decision gate into three selected steps&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Decision gate&lt;/b&gt; / Keep the idea inventory broad, but let only a few connected pieces enter the active plan.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;blockquote&gt;
              &lt;p&gt;If everything in the backlog is a candidate for this week, the backlog is quietly making the decision for you.&lt;/p&gt;
            &lt;/blockquote&gt;
          &lt;/section&gt;

          &lt;section id=&quot;real-plan&quot;&gt;
            &lt;h2&gt;A build plan needs five explicit parts&lt;/h2&gt;
            &lt;h3&gt;1. One promised outcome 🎯&lt;/h3&gt;
            &lt;p&gt;Name the change the user should be able to experience when the work is done. “Improve onboarding” is a theme. “A new user can reach a useful first result without help” is an outcome you can test — the same kind of promise a good &lt;a href=&quot;https://hovhannes.io/mvp-first-what-actually-deserves-to-ship&quot;&gt;MVP&lt;/a&gt; is built to protect.&lt;/p&gt;
            &lt;h3&gt;2. Evidence for acting now 🔍&lt;/h3&gt;
            &lt;p&gt;Use something stronger than general enthusiasm: repeated support friction, a broken completion path, an observed workaround, failed activation, or a risky assumption that blocks the next decision.&lt;/p&gt;
            &lt;h3&gt;3. A dependency boundary 🧩&lt;/h3&gt;
            &lt;p&gt;Write down which data, states, interfaces, emails, analytics, permissions, and operational steps the change touches. This is how a three-day card stops becoming an invisible three-week project.&lt;/p&gt;
            &lt;h3&gt;4. Honest capacity ⏳&lt;/h3&gt;
            &lt;p&gt;Plan with the time that remains after support, maintenance, interruptions, and review. Capacity is not the number of empty hours on a calendar. It is the amount of focused work the system can actually absorb.&lt;/p&gt;
            &lt;h3&gt;5. A stop rule 🛑&lt;/h3&gt;
            &lt;p&gt;Define what “done enough to learn” means before building. Otherwise polish keeps expanding until the next important question is delayed again.&lt;/p&gt;

            &lt;div class=&quot;article-callout&quot;&gt;
              &lt;p class=&quot;article-callout-label&quot;&gt;Planning rule&lt;/p&gt;
              &lt;strong&gt;Commit to an outcome and a boundary, not a pile of individually reasonable tickets.&lt;/strong&gt;
              &lt;p&gt;The tickets are implementation detail. The complete result is the commitment.&lt;/p&gt;
            &lt;/div&gt;
          &lt;/section&gt;

          &lt;section id=&quot;selection-filter&quot;&gt;
            &lt;h2&gt;Filter before you estimate&lt;/h2&gt;
            &lt;p&gt;Estimation asks how long an item may take. Selection asks whether the item belongs in the active plan at all. I use the second question first.&lt;/p&gt;

            &lt;div class=&quot;article-table-wrap&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Build plan selection filter&quot;&gt;
              &lt;table class=&quot;article-table&quot;&gt;
                &lt;thead&gt;
                  &lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;A strong answer sounds like&lt;/th&gt;&lt;/tr&gt;
                &lt;/thead&gt;
                &lt;tbody&gt;
                  &lt;tr&gt;&lt;td&gt;Which user outcome changes?&lt;/td&gt;&lt;td&gt;One observable result for one current user group.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;Why now?&lt;/td&gt;&lt;td&gt;Fresh evidence, a blocked decision, or a current product risk.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;What must ship together?&lt;/td&gt;&lt;td&gt;The smallest connected set that leaves no broken bridge.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;What stays out?&lt;/td&gt;&lt;td&gt;Named adjacent work that is deliberately deferred.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;How will we know?&lt;/td&gt;&lt;td&gt;A specific behavior, test, metric, or reviewed artifact.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;What does this unlock?&lt;/td&gt;&lt;td&gt;The next product decision, not merely the next feature.&lt;/td&gt;&lt;/tr&gt;
                &lt;/tbody&gt;
              &lt;/table&gt;
            &lt;/div&gt;

            &lt;p&gt;If an item has no strong “why now,” return it to inventory. If it cannot name what ships with it, map the dependencies. If it cannot name what stays out, the boundary is not ready.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;one-week&quot;&gt;
            &lt;h2&gt;Turn the outcome into one believable week&lt;/h2&gt;
            &lt;p&gt;Imagine a founder building a product clarity tool. The backlog includes team workspaces, PDF export, templates, progress charts, a better empty state, and a guided first plan. The current evidence says new users understand the promise but freeze on the blank first screen.&lt;/p&gt;

            &lt;div class=&quot;article-example&quot;&gt;
              &lt;p class=&quot;article-example-label&quot;&gt;A focused weekly plan&lt;/p&gt;
              &lt;ol&gt;
                &lt;li&gt;&lt;strong&gt;Outcome:&lt;/strong&gt; a new user completes and understands a first plan without outside help.&lt;/li&gt;
                &lt;li&gt;&lt;strong&gt;Active work:&lt;/strong&gt; one prefilled example, a shorter input path, clear review states, and completion analytics.&lt;/li&gt;
                &lt;li&gt;&lt;strong&gt;Outside the boundary:&lt;/strong&gt; team roles, export customization, template browsing, and dashboard charts.&lt;/li&gt;
                &lt;li&gt;&lt;strong&gt;Acceptance evidence:&lt;/strong&gt; five observed first runs and a reviewed event trail from start to completion.&lt;/li&gt;
              &lt;/ol&gt;
            &lt;/div&gt;

            &lt;p&gt;The deferred ideas may still be valuable. They simply do not answer the current question. Keeping them outside the plan protects enough time to finish the complete first-use loop and &lt;a href=&quot;https://hovhannes.io/build-logs-beat-perfect-roadmaps&quot;&gt;watch what users actually do&lt;/a&gt;.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/backlog-weekly-plan.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/backlog-weekly-plan-480.webp 480w, https://hovhannes.io/assets/responsive/article/backlog-weekly-plan-960.webp 960w, https://hovhannes.io/assets/responsive/article/backlog-weekly-plan-1440.webp 1440w, https://hovhannes.io/assets/article/backlog-weekly-plan.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Paper evidence, selected work, and capacity lanes converging on one orange outcome&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Believable capacity&lt;/b&gt; / Evidence, selected work, and available attention must converge on the same outcome.&lt;/figcaption&gt;
            &lt;/figure&gt;
          &lt;/section&gt;

          &lt;section id=&quot;two-artifacts&quot;&gt;
            &lt;h2&gt;Keep the backlog and the plan as two artifacts&lt;/h2&gt;
            &lt;p&gt;The simplest fix is not a better status column. It is separating possibility from commitment.&lt;/p&gt;
            &lt;ul class=&quot;article-checklist&quot;&gt;
              &lt;li&gt;&lt;strong&gt;Let the backlog stay broad.&lt;/strong&gt;&lt;span&gt;Store ideas, requests, risks, observations, and open questions without pretending they are scheduled.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Keep the active plan small.&lt;/strong&gt;&lt;span&gt;Include only work tied to the current outcome, boundary, and acceptance evidence.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Move evidence with the idea.&lt;/strong&gt;&lt;span&gt;When an item leaves the backlog, bring its source, assumptions, and dependencies into the plan.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Return unfinished ideas honestly.&lt;/strong&gt;&lt;span&gt;If the outcome changes, put unrelated work back into inventory instead of carrying it forward by inertia.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Review the decision weekly.&lt;/strong&gt;&lt;span&gt;Ask whether the evidence is still fresh and whether the active work still forms one complete result.&lt;/span&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;A backlog is useful because it &lt;strong&gt;remembers&lt;/strong&gt;. A plan is useful because it &lt;strong&gt;excludes&lt;/strong&gt;. Product progress gets clearer when each artifact is allowed to do its own job.&lt;/p&gt;
          &lt;/section&gt;</content:encoded><category>Product thinking</category></item><item><title>When an AI agent should stop and ask</title><link>https://hovhannes.io/when-an-ai-agent-should-stop-and-ask</link><guid isPermaLink="true">https://hovhannes.io/when-an-ai-agent-should-stop-and-ask</guid><description>A practical decision boundary for knowing when an AI coding agent should continue, pause, or ask for human direction.</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p class=&quot;article-lead&quot;&gt;An agent that asks about every detail is exhausting. An agent that never asks is dangerous. The goal is not more or less autonomy. It is &lt;strong&gt;a visible boundary between implementation choices and product decisions&lt;/strong&gt;.&lt;/p&gt;

          &lt;section id=&quot;wrong-kind&quot;&gt;
            &lt;h2&gt;“Use your best judgement” is not a boundary&lt;/h2&gt;
            &lt;p&gt;That instruction sounds empowering, but it gives the agent no way to distinguish a reversible code choice from a decision about billing, permissions, or user data.&lt;/p&gt;
            &lt;p&gt;The model may be capable of proposing an answer. That does not mean it has &lt;strong&gt;the authority or missing context to choose it&lt;/strong&gt;.&lt;/p&gt;
            &lt;p&gt;Imagine a request to hide cancelled subscriptions from the dashboard. The interface change is easy. Whether those records should disappear from invoices, exports, support tools, and retention reports is &lt;a href=&quot;https://hovhannes.io/see-what-breaks-before-you-build&quot;&gt;a product and compliance decision&lt;/a&gt;. A confident implementation cannot replace that missing authority.&lt;/p&gt;
            &lt;blockquote&gt;&lt;p&gt;Confidence is not evidence that the decision belongs to the agent.&lt;/p&gt;&lt;/blockquote&gt;
          &lt;/section&gt;

          &lt;section id=&quot;three-zones&quot;&gt;
            &lt;h2&gt;Divide the work into three zones&lt;/h2&gt;
            &lt;ol class=&quot;article-steps&quot;&gt;
              &lt;li&gt;&lt;span&gt;01&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Continue. ▶️&lt;/strong&gt;&lt;p&gt;Local, reversible implementation choices that follow an existing pattern and contract.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;02&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Verify. 🔍&lt;/strong&gt;&lt;p&gt;Choices that can be resolved by checking the schema, tests, documentation, or current interface.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;03&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Ask. 🛑&lt;/strong&gt;&lt;p&gt;Choices that change product meaning, public behaviour, security, cost, or irreversible state.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
            &lt;/ol&gt;
            &lt;p&gt;This keeps the agent moving through ordinary work while protecting the moments where guessing is expensive.&lt;/p&gt;
            &lt;p&gt;The zones should be written in terms of consequences, not file types. Editing CSS may still require an answer if the change hides a legal disclosure. Updating a database can be safe when it is a reversible local fixture. Risk comes from &lt;strong&gt;what the action means, not where the code lives&lt;/strong&gt;.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;stop-signals&quot;&gt;
            &lt;h2&gt;Five signals that should stop the build&lt;/h2&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/agent-decision-zones.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/agent-decision-zones-480.webp 480w, https://hovhannes.io/assets/responsive/article/agent-decision-zones-960.webp 960w, https://hovhannes.io/assets/responsive/article/agent-decision-zones-1440.webp 1440w, https://hovhannes.io/assets/article/agent-decision-zones.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Abstract AI agent path moving through continue, verify, and human-decision zones&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Decision zones&lt;/b&gt; / Keep ordinary implementation moving, verify discoverable facts, and stop where authority changes.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;ul class=&quot;article-checklist&quot;&gt;
              &lt;li&gt;&lt;strong&gt;The public contract is unclear.&lt;/strong&gt;&lt;span&gt;The change affects an API, integration, URL, or behaviour other people may rely on.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;The action is hard to reverse.&lt;/strong&gt;&lt;span&gt;Data deletion, migrations, access changes, and external writes need explicit direction.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Two sources disagree.&lt;/strong&gt;&lt;span&gt;Code, docs, tests, and product language do not describe the same behaviour.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Security changes meaning.&lt;/strong&gt;&lt;span&gt;The task alters who can see, create, edit, or delete something.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;The user outcome is ambiguous.&lt;/strong&gt;&lt;span&gt;Several implementations are valid, but each creates a different product.&lt;/span&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;One signal is enough to pause the affected branch, not necessarily the whole task. The agent can still finish safe discovery, identify the exact contract, run read-only checks, and leave the repository in a clean state. A good stop preserves momentum without crossing the boundary.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;good-question&quot;&gt;
            &lt;h2&gt;A good escalation brings the decision closer&lt;/h2&gt;
            &lt;p&gt;“What should I do?” gives the whole problem back to the human. A useful escalation explains the discovery, the options, and the consequence of each.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/agent-escalation.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/agent-escalation-480.webp 480w, https://hovhannes.io/assets/responsive/article/agent-escalation-960.webp 960w, https://hovhannes.io/assets/responsive/article/agent-escalation-1440.webp 1440w, https://hovhannes.io/assets/article/agent-escalation.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Human hand reviewing option cards at a paused AI-agent checkpoint&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Useful escalation&lt;/b&gt; / Bring the evidence, realistic options, and a safe checkpoint to the human decision.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;div class=&quot;context-template&quot;&gt;
              &lt;p&gt;&lt;strong&gt;Discovery&lt;/strong&gt;&lt;span&gt;What did the agent find that was not covered by the task?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;span&gt;Which contracts, users, or data could be affected?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Options&lt;/strong&gt;&lt;span&gt;Which two or three realistic paths are available?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;&lt;span&gt;Which path best fits the current evidence, and why?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Safe state&lt;/strong&gt;&lt;span&gt;What has been completed without crossing the decision boundary?&lt;/span&gt;&lt;/p&gt;
            &lt;/div&gt;
            &lt;p&gt;A concrete question is easier to answer: “The API stores \`draft\`, while the interface now says \`exploring\`. I can change only the label with no migration, or rename the stored value and update exports. The first option preserves every public contract. Should I keep the stored value?”&lt;/p&gt;
            &lt;p&gt;That question exposes the real choice, offers a recommendation, and gives the human enough information to answer without reopening the whole investigation.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;resume&quot;&gt;
            &lt;h2&gt;Make the answer easy to resume from&lt;/h2&gt;
            &lt;p&gt;After the human chooses, the decision should become durable context. Record it in the relevant document, test, contract, or &lt;a href=&quot;https://hovhannes.io/build-logs-beat-perfect-roadmaps&quot;&gt;build log&lt;/a&gt; before implementation continues.&lt;/p&gt;
            &lt;p&gt;Otherwise the next agent will reach the same fork with the same missing information.&lt;/p&gt;
            &lt;p&gt;A useful checkpoint records four things: the decision, the evidence behind it, the parts of the system it affects, and the next safe action. It should also name what was deliberately left unchanged. That prevents a narrow approval from being interpreted as permission to redesign the surrounding product.&lt;/p&gt;
            &lt;p&gt;When work resumes, the agent should restate the chosen boundary, recheck any state that may have changed, and continue from the saved checkpoint. The pause is complete only when the implementation and its acceptance evidence agree with the human decision.&lt;/p&gt;
            &lt;div class=&quot;article-callout&quot;&gt;&lt;p class=&quot;article-callout-label&quot;&gt;Checkpoint rule&lt;/p&gt;&lt;strong&gt;A resolved escalation is not finished until the product has a place where that decision can be found again.&lt;/strong&gt;&lt;/div&gt;
          &lt;/section&gt;</content:encoded><category>AI development</category></item><item><title>What my dog taught me about building consistently</title><link>https://hovhannes.io/what-my-dog-taught-me-about-building-consistently</link><guid isPermaLink="true">https://hovhannes.io/what-my-dog-taught-me-about-building-consistently</guid><description>A personal note on consistency, creative resets, and the small routines that keep a solo product moving.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p class=&quot;article-lead&quot;&gt;When you work alone, there is no team rhythm to borrow. No stand-up starts the day. No colleague tells you that a decision has been open for too long. It is easy to alternate between &lt;strong&gt;overworking and losing the thread completely&lt;/strong&gt;.&lt;/p&gt;

          &lt;section id=&quot;solo-rhythm&quot;&gt;
            &lt;h2&gt;The hard part is returning to the work&lt;/h2&gt;
            &lt;p&gt;I used to think consistency meant producing the same amount every day. That is impossible when one day is product strategy, the next is debugging, and the next disappears into customer calls.&lt;/p&gt;
            &lt;p&gt;The useful definition is simpler: can I return to the work without spending half the day reconstructing what I was doing?&lt;/p&gt;
            &lt;p&gt;That changes what a routine is for. It does not have to guarantee a perfect output. It only has to make starting familiar and leave enough context that tomorrow’s version of me can enter the work without a long negotiation.&lt;/p&gt;
            &lt;p&gt;I keep the anchor stable and let the effort vary. The same desk, the same short planning note, and roughly the same stopping boundary can support a long build session or twenty careful minutes. The repeatable part is &lt;strong&gt;the return, not the volume&lt;/strong&gt;.&lt;/p&gt;
            &lt;blockquote&gt;&lt;p&gt;A good routine protects the return, not the streak.&lt;/p&gt;&lt;/blockquote&gt;
          &lt;/section&gt;

          &lt;section id=&quot;walk&quot;&gt;
            &lt;h2&gt;The walk creates a clean break&lt;/h2&gt;
            &lt;p&gt;My husky does not care whether the deployment worked. At roughly the same time, we go outside. 🐕 That boundary stops me from dragging one frustrating task through the rest of the day.&lt;/p&gt;
            &lt;p&gt;Walking also changes the kind of thinking available. I stop staring at the implementation and start noticing the decision underneath it. Quite often, the problem is not the code I was fighting. It is a product choice I had not made clearly.&lt;/p&gt;
            &lt;p&gt;The walk works because it is ordinary. I do not need to earn it by finishing the task, and I do not treat it as another optimization technique. It is simply a reliable change of context. That is often enough for the noise of the last hour to settle.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/dog-daily-walk.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/dog-daily-walk-480.webp 480w, https://hovhannes.io/assets/responsive/article/dog-daily-walk-960.webp 960w, https://hovhannes.io/assets/responsive/article/dog-daily-walk-1440.webp 1440w, https://hovhannes.io/assets/article/dog-daily-walk.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Solo founder walking a white Siberian Husky on a quiet morning path&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Reliable boundary&lt;/b&gt; / The daily walk changes the context even when the work refuses to cooperate.&lt;/figcaption&gt;
            &lt;/figure&gt;
          &lt;/section&gt;

          &lt;section id=&quot;small-loop&quot;&gt;
            &lt;h2&gt;A small loop keeps the day honest&lt;/h2&gt;
            &lt;p&gt;Before I begin, I choose &lt;a href=&quot;https://hovhannes.io/mvp-first-what-actually-deserves-to-ship&quot;&gt;an outcome small enough to recognise when it is complete&lt;/a&gt;. “Work on onboarding” invites endless motion. “A new user can save the first decision and recover from an invalid input” gives the day a finish line.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/dog-restart-loop.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/dog-restart-loop-480.webp 480w, https://hovhannes.io/assets/responsive/article/dog-restart-loop-960.webp 960w, https://hovhannes.io/assets/responsive/article/dog-restart-loop-1440.webp 1440w, https://hovhannes.io/assets/article/dog-restart-loop.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Focused founder workspace with a restart note and a white husky resting nearby&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Easy restart&lt;/b&gt; / Finish with one clear outcome, one open decision, and a visible first move for tomorrow.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;ol class=&quot;article-steps&quot;&gt;
              &lt;li&gt;&lt;span&gt;01&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Name one outcome. 🎯&lt;/strong&gt;&lt;p&gt;Write the one thing that should be more true by the end of the work block.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;02&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Work until the next decision. ✂️&lt;/strong&gt;&lt;p&gt;Do not invent extra scope just because there is time left.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;03&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Leave a restart note. 📝&lt;/strong&gt;&lt;p&gt;Record what changed, what is open, and the first useful action for tomorrow.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;04&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Step away properly. 🚶&lt;/strong&gt;&lt;p&gt;A real break makes returning easier than half-working all evening.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
            &lt;/ol&gt;
            &lt;p&gt;The &lt;a href=&quot;https://hovhannes.io/build-logs-beat-perfect-roadmaps&quot;&gt;restart note&lt;/a&gt; is the smallest part and the most valuable. I write the current state, the unresolved question, and the first action that would produce evidence. That note removes the need to trust memory after sleep, interruptions, or an unexpectedly busy morning.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;bad-days&quot;&gt;
            &lt;h2&gt;Reduce the scope, keep the connection&lt;/h2&gt;
            &lt;p&gt;Some days will not support deep work. On those days I shrink the loop instead of pretending I can force a perfect session.&lt;/p&gt;
            &lt;ul class=&quot;article-checklist&quot;&gt;
              &lt;li&gt;&lt;strong&gt;Review one open decision.&lt;/strong&gt;&lt;span&gt;Clarity still moves the product forward even when code does not.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Fix one small source of friction.&lt;/strong&gt;&lt;span&gt;A better name, note, or test can make tomorrow easier.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Write down the blockage.&lt;/strong&gt;&lt;span&gt;An explicit obstacle is less expensive than a vague feeling of being stuck.&lt;/span&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;The point is not to protect a productivity score. It is to keep &lt;strong&gt;a live connection with the product&lt;/strong&gt;.&lt;/p&gt;
            &lt;p&gt;On a bad day, the minimum version may be reading yesterday’s note and making one decision explicit. That still reduces the cost of tomorrow. Consistency becomes resilient when the routine has a smaller mode instead of an all-or-nothing rule.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;weekly-reset&quot;&gt;
            &lt;h2&gt;The five questions I use each week&lt;/h2&gt;
            &lt;div class=&quot;context-template&quot;&gt;
              &lt;p&gt;&lt;strong&gt;Progress&lt;/strong&gt;&lt;span&gt;What became clearer or more useful this week?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Drag&lt;/strong&gt;&lt;span&gt;Which task kept returning without a decision?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Evidence&lt;/strong&gt;&lt;span&gt;What did a real user, test, or build teach me?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;span&gt;What can leave the plan without hurting the main outcome?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Restart&lt;/strong&gt;&lt;span&gt;What is the first meaningful move for Monday?&lt;/span&gt;&lt;/p&gt;
            &lt;/div&gt;
            &lt;p&gt;This is not a complicated operating system. That is why it survives busy weeks. Focus, build, leave a clear trail, and come back.&lt;/p&gt;
            &lt;p&gt;I end the review by removing one obligation that no longer serves the main outcome. A useful weekly reset should create space, not turn unfinished work into a larger pile of guilt.&lt;/p&gt;
          &lt;/section&gt;</content:encoded><category>Building in public</category></item><item><title>See what breaks before you build</title><link>https://hovhannes.io/see-what-breaks-before-you-build</link><guid isPermaLink="true">https://hovhannes.io/see-what-breaks-before-you-build</guid><description>A dependency-first method for giving AI coding agents enough product context to make safer, more coherent changes.</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p class=&quot;article-lead&quot;&gt;“Add an archive button to projects” sounds contained. One button, one field, done. Then archived projects keep appearing in search, count toward billing limits, trigger reminders, and leak into exports. &lt;strong&gt;The small ticket was never really small.&lt;/strong&gt;&lt;/p&gt;

          &lt;section id=&quot;execution-gap&quot;&gt;
            &lt;h2&gt;The gap between a clear task and a clear product&lt;/h2&gt;
            &lt;p&gt;An AI coding agent can inspect code, follow instructions, and run tests. What it cannot inspect is a decision that only exists in your head. If the prompt describes the new UI and nothing around it, the agent has to &lt;a href=&quot;https://hovhannes.io/when-an-ai-agent-should-stop-and-ask&quot;&gt;fill in the gaps&lt;/a&gt;.&lt;/p&gt;
            &lt;p&gt;That is how a change becomes &lt;strong&gt;locally correct and wrong everywhere else&lt;/strong&gt;. The button renders. The endpoint returns 200. The test passes. “Recent work” still shows archived projects.&lt;/p&gt;
            &lt;blockquote&gt;
              &lt;p&gt;An agent can only protect the product decisions it can see.&lt;/p&gt;
            &lt;/blockquote&gt;
            &lt;p&gt;OpenAI and Anthropic both make the same practical point in their guidance: a capable model is not enough. Agents need clear instructions, the right tools, boundaries, and a way to check the result. Speed does not replace &lt;a href=&quot;https://hovhannes.io/build-logs-beat-perfect-roadmaps&quot;&gt;product knowledge&lt;/a&gt;. It makes missing knowledge more expensive.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;six-context-layers&quot;&gt;
            &lt;h2&gt;Give the agent the context that changes the answer&lt;/h2&gt;
            &lt;ol class=&quot;article-steps&quot;&gt;
              &lt;li&gt;&lt;span&gt;01&lt;/span&gt;&lt;div&gt;&lt;strong&gt;User outcome 🎯&lt;/strong&gt;&lt;p&gt;Who needs the change, what situation triggers it, and what should become easier or possible?&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;02&lt;/span&gt;&lt;div&gt;&lt;strong&gt;State transition 🔄&lt;/strong&gt;&lt;p&gt;What state exists before the action, what state exists after it, and can the action be reversed?&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;03&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Source of truth 📍&lt;/strong&gt;&lt;p&gt;Which model, service, document, or API owns the meaning of this concept?&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;04&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Dependency map 🕸️&lt;/strong&gt;&lt;p&gt;Which contracts, consumers, flows, permissions, and operational processes rely on the current behavior?&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;05&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Invariants and guardrails 🛡️&lt;/strong&gt;&lt;p&gt;Which conditions must remain true, including security, privacy, billing, and data-integrity rules?&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;06&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Acceptance evidence ✅&lt;/strong&gt;&lt;p&gt;Which observable scenarios prove the user outcome works and adjacent behavior remains intact?&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
            &lt;/ol&gt;
            &lt;p&gt;This does not need to become a giant specification. A short brief that names the real contracts is more useful than five pages describing how the screen should look.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;failure-cascade&quot;&gt;
            &lt;h2&gt;A small change can create a large failure cascade&lt;/h2&gt;
            &lt;p&gt;Suppose you ask an agent to rename the plan status “Draft” to “Exploring.” A text replacement is obviously risky, but even a careful enum migration may be too much.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/dependency-cascade.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/dependency-cascade-480.webp 480w, https://hovhannes.io/assets/responsive/article/dependency-cascade-960.webp 960w, https://hovhannes.io/assets/responsive/article/dependency-cascade-1440.webp 1440w, https://hovhannes.io/assets/article/dependency-cascade.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Central product change connected to data, interface, security, analytics, and communication layers&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Failure cascade&lt;/b&gt; / One local change can ripple through every contract that depends on its meaning.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;div class=&quot;dependency-map&quot; aria-label=&quot;Dependency cascade for a plan status change&quot;&gt;
              &lt;div&gt;&lt;strong&gt;Product language&lt;/strong&gt;&lt;span&gt;Labels, help text, onboarding&lt;/span&gt;&lt;/div&gt;
              &lt;i aria-hidden=&quot;true&quot;&gt;→&lt;/i&gt;
              &lt;div&gt;&lt;strong&gt;Data contract&lt;/strong&gt;&lt;span&gt;Enum, validation, migration&lt;/span&gt;&lt;/div&gt;
              &lt;i aria-hidden=&quot;true&quot;&gt;→&lt;/i&gt;
              &lt;div&gt;&lt;strong&gt;Behavior&lt;/strong&gt;&lt;span&gt;Filters, permissions, automation&lt;/span&gt;&lt;/div&gt;
              &lt;i aria-hidden=&quot;true&quot;&gt;→&lt;/i&gt;
              &lt;div&gt;&lt;strong&gt;Consumers&lt;/strong&gt;&lt;span&gt;API, analytics, exports, emails&lt;/span&gt;&lt;/div&gt;
            &lt;/div&gt;

            &lt;p&gt;The safest answer might be to change the label and keep the stored value. Or the change might require a migration and a versioned API. Code search cannot choose between those options because the answer depends on product intent.&lt;/p&gt;
            &lt;p&gt;Search the whole repository, yes, but remember what it cannot show: customer expectations, support routines, analytics definitions, integrations, and promises already made in public.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;dependency-review&quot;&gt;
            &lt;h2&gt;Run a dependency review before implementation&lt;/h2&gt;
            &lt;p&gt;The review has to be short enough that you will actually do it. This is the version I use:&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/dependency-review.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/dependency-review-480.webp 480w, https://hovhannes.io/assets/responsive/article/dependency-review-960.webp 960w, https://hovhannes.io/assets/responsive/article/dependency-review-1440.webp 1440w, https://hovhannes.io/assets/article/dependency-review.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Magnifying glass reviewing connected schema, API, interface, security, and communication cards&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Boundary review&lt;/b&gt; / Inspect the connected layers and preserve a safe pause before implementation begins.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;ol class=&quot;article-timeline&quot;&gt;
              &lt;li&gt;&lt;strong&gt;1. Write the change as a state transition.&lt;/strong&gt;&lt;p&gt;Describe what becomes true after the change, not only which component will be edited.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;2. Inventory the touchpoints.&lt;/strong&gt;&lt;p&gt;Map schema, API, application state, UI, authentication, analytics, notifications, documentation, and external consumers.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;3. Trace contracts in both directions.&lt;/strong&gt;&lt;p&gt;Identify what the changed element depends on and what depends on it.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;4. Mark risk and reversibility.&lt;/strong&gt;&lt;p&gt;Separate read-only from write actions, local from public contracts, and reversible from destructive transitions.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;5. Define synchronized changes.&lt;/strong&gt;&lt;p&gt;List the files, services, types, migrations, tests, and communication that must land together.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;6. Trace failure boundaries.&lt;/strong&gt;&lt;p&gt;Cover the main path, permissions, partial failure, stale data, retries, cancellation, and rollback.&lt;/p&gt;&lt;/li&gt;
            &lt;/ol&gt;

            &lt;div class=&quot;article-callout&quot;&gt;
              &lt;p class=&quot;article-callout-label&quot;&gt;Stop condition&lt;/p&gt;
              &lt;strong&gt;Pause when the agent finds an undocumented public contract, an irreversible migration, or a security decision that was never agreed.&lt;/strong&gt;
            &lt;/div&gt;
          &lt;/section&gt;

          &lt;section id=&quot;context-packet&quot;&gt;
            &lt;h2&gt;A compact product-context packet for an AI agent&lt;/h2&gt;
            &lt;p&gt;Before handing over a change that touches several parts of the product, fill in this small packet. It is deliberately shorter than a requirements document and more useful than a bare ticket.&lt;/p&gt;

            &lt;div class=&quot;context-template&quot;&gt;
              &lt;p&gt;&lt;strong&gt;Outcome&lt;/strong&gt;&lt;span&gt;What user progress should this change create?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Current behavior&lt;/strong&gt;&lt;span&gt;What happens now, including known constraints and workarounds?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Target transition&lt;/strong&gt;&lt;span&gt;What changes, for whom, and under which conditions?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Non-goals&lt;/strong&gt;&lt;span&gt;Which nearby capabilities are deliberately outside scope?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Source of truth&lt;/strong&gt;&lt;span&gt;Where is the concept defined and who owns each contract?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;&lt;span&gt;Schema → API → state → UI → auth → analytics → communication.&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Invariants&lt;/strong&gt;&lt;span&gt;What must remain true for security, data integrity, billing, and trust?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Acceptance scenarios&lt;/strong&gt;&lt;span&gt;Which user-visible examples prove the change and its boundaries?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Escalation rules&lt;/strong&gt;&lt;span&gt;Which discoveries require a pause instead of an assumption?&lt;/span&gt;&lt;/p&gt;
            &lt;/div&gt;

            &lt;p&gt;Link to real schemas, interfaces, and source files when you can. Give the agent evidence it can check. Do not copy implementation details into the brief when the code already says them better.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;definition-of-done&quot;&gt;
            &lt;h2&gt;Redefine “done” for agentic development&lt;/h2&gt;
            &lt;p&gt;A pull request is not done because the requested component exists. It is done when the user action, stored state, permissions, and visible result all agree.&lt;/p&gt;
            &lt;ul class=&quot;article-checklist&quot;&gt;
              &lt;li&gt;&lt;strong&gt;The user outcome works.&lt;/strong&gt;&lt;span&gt;The primary scenario is verified in the real interface, not inferred from code.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Every contract agrees.&lt;/strong&gt;&lt;span&gt;Schema, API, types, state, UI, and documentation use the same meaning.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Permissions are enforced server-side.&lt;/strong&gt;&lt;span&gt;Hidden controls are not treated as authorization.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Failure is designed.&lt;/strong&gt;&lt;span&gt;Partial success, retries, cancellation, and recovery have explicit behavior.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Adjacent flows remain correct.&lt;/strong&gt;&lt;span&gt;Regression checks cover the consumers identified in the dependency review.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Unknowns are visible.&lt;/strong&gt;&lt;span&gt;Assumptions, manual operations, and deferred risks are documented for the next decision.&lt;/span&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;AI agents let us make more changes in less time. That only helps if those changes keep moving the same product forward. The real advantage is not more code. It is &lt;strong&gt;a product model clear enough to keep fast work pointed in one direction&lt;/strong&gt;.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section class=&quot;article-sources&quot; aria-labelledby=&quot;sources-title&quot;&gt;
            &lt;p class=&quot;section-index&quot;&gt;Further reading&lt;/p&gt;
            &lt;h2 id=&quot;sources-title&quot;&gt;Primary sources behind this note&lt;/h2&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;https://openai.com/business/guides-and-resources/a-practical-guide-to-building-ai-agents/&quot;&gt;&lt;strong&gt;OpenAI: A practical guide to building agents&lt;/strong&gt;&lt;span&gt;Instructions, tools, orchestration, guardrails, and human intervention.&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/research/claude-code-expertise?hl=en-US&quot;&gt;&lt;strong&gt;Anthropic: Agentic coding and persistent returns to expertise&lt;/strong&gt;&lt;span&gt;2026 research on planning, domain knowledge, and coding-agent outcomes.&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents&quot;&gt;&lt;strong&gt;Anthropic: Demystifying evals for AI agents&lt;/strong&gt;&lt;span&gt;Evaluation strategies for multi-step agent workflows.&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/section&gt;</content:encoded><category>AI development</category></item><item><title>Build logs beat perfect roadmaps</title><link>https://hovhannes.io/build-logs-beat-perfect-roadmaps</link><guid isPermaLink="true">https://hovhannes.io/build-logs-beat-perfect-roadmaps</guid><description>Why a short build log gives solo founders better product evidence than a roadmap polished in isolation.</description><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p class=&quot;article-lead&quot;&gt;Roadmaps are useful until they become theatre. A tidy sequence can make uncertain work look settled, so we keep polishing the sequence instead of updating it with &lt;strong&gt;what the build is teaching us&lt;/strong&gt;.&lt;/p&gt;

          &lt;section id=&quot;roadmap-gap&quot;&gt;
            &lt;h2&gt;The roadmap forgets how a decision was made&lt;/h2&gt;
            &lt;p&gt;A card moves from “planned” to “done,” but the useful context disappears: the assumption that failed, the shortcut that became permanent, the user reaction that changed the scope.&lt;/p&gt;
            &lt;p&gt;Three weeks later, you see the final decision without the path that produced it. That makes old ideas look newly attractive and settled questions easy to reopen.&lt;/p&gt;
            &lt;p&gt;A polished roadmap also compresses uncertainty. Two items can look equally settled even when one is backed by user evidence and the other is still a founder’s guess. A build log preserves that difference, so the next decision starts from the evidence you actually have.&lt;/p&gt;
            &lt;blockquote&gt;&lt;p&gt;The roadmap says where you want to go. The log explains why the route changed.&lt;/p&gt;&lt;/blockquote&gt;
          &lt;/section&gt;

          &lt;section id=&quot;what-to-log&quot;&gt;
            &lt;h2&gt;Log decisions, not activity&lt;/h2&gt;
            &lt;p&gt;A useful build log is not a diary of every commit. It captures the pieces of work that should influence the next product decision.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/build-log-daily.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/build-log-daily-480.webp 480w, https://hovhannes.io/assets/responsive/article/build-log-daily-960.webp 960w, https://hovhannes.io/assets/responsive/article/build-log-daily-1440.webp 1440w, https://hovhannes.io/assets/article/build-log-daily.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Solo founder recording a daily build log beside a laptop&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Decision trail&lt;/b&gt; / Capture the change, the evidence, and the open question while the work is still fresh.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;ul class=&quot;article-checklist&quot;&gt;
              &lt;li&gt;&lt;strong&gt;What changed?&lt;/strong&gt;&lt;span&gt;Name the user-visible or system-level difference, not the files edited.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Why now?&lt;/strong&gt;&lt;span&gt;Link the change to a problem, risk, or piece of evidence.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;What surprised you?&lt;/strong&gt;&lt;span&gt;Record the assumption that did not survive contact with the build.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;What remains open?&lt;/strong&gt;&lt;span&gt;Leave the next decision visible instead of burying it in a task list.&lt;/span&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;The distinction between &lt;strong&gt;an event&lt;/strong&gt; and &lt;strong&gt;a decision&lt;/strong&gt; matters. “Deployed search” is an event. “Kept exact matching because fuzzy results hid the user’s own project names” is context that can guide the next iteration.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;small-template&quot;&gt;
            &lt;h2&gt;The five-minute build-log template&lt;/h2&gt;
            &lt;div class=&quot;context-template&quot;&gt;
              &lt;p&gt;&lt;strong&gt;Shipped 🚀&lt;/strong&gt;&lt;span&gt;What can a user or the system do now that it could not do before?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Decision ✅&lt;/strong&gt;&lt;span&gt;Which choice did this work settle?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Evidence 🔍&lt;/strong&gt;&lt;span&gt;Which test, conversation, or observation supports that choice?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Debt ⚠️&lt;/strong&gt;&lt;span&gt;Which shortcut or limitation must remain visible?&lt;/span&gt;&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Next ➡️&lt;/strong&gt;&lt;span&gt;What is the next useful decision, not merely the next task?&lt;/span&gt;&lt;/p&gt;
            &lt;/div&gt;
            &lt;p&gt;If an entry takes more than five minutes, the format is probably asking for too much. The log has to survive the busiest week.&lt;/p&gt;
            &lt;p&gt;For example, a useful entry might say that onboarding now accepts an imported brief, that three test files exposed inconsistent headings, and that automatic cleanup was deliberately postponed. That is enough to explain the current state without recreating the entire work session.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;weekly-review&quot;&gt;
            &lt;h2&gt;Let the log edit the roadmap&lt;/h2&gt;
            &lt;p&gt;Once a week, I compare the last few entries with &lt;a href=&quot;https://hovhannes.io/a-backlog-is-not-a-build-plan&quot;&gt;the plan&lt;/a&gt;. This is where the roadmap earns the right to change.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/build-log-review.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/build-log-review-480.webp 480w, https://hovhannes.io/assets/responsive/article/build-log-review-960.webp 960w, https://hovhannes.io/assets/responsive/article/build-log-review-1440.webp 1440w, https://hovhannes.io/assets/article/build-log-review.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Paper build-log entries feeding into a revised product roadmap&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Weekly review&lt;/b&gt; / Let repeated evidence reshape the plan instead of protecting an outdated sequence.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;ol class=&quot;article-timeline&quot;&gt;
              &lt;li&gt;&lt;strong&gt;Remove work whose assumption failed.&lt;/strong&gt;&lt;p&gt;Do not preserve scope just because it once looked sensible.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Promote repeated friction.&lt;/strong&gt;&lt;p&gt;A problem that appears in several entries deserves attention.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Expose permanent shortcuts.&lt;/strong&gt;&lt;p&gt;Manual work is fine until everyone silently assumes it is automated.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Rewrite the next milestone.&lt;/strong&gt;&lt;p&gt;Use what you now know, not what the old roadmap predicted.&lt;/p&gt;&lt;/li&gt;
            &lt;/ol&gt;
            &lt;p&gt;I also look for repetition. One awkward workaround may be acceptable. The same workaround appearing in four entries is evidence that the product is asking for a real solution. Frequency turns isolated frustration into a prioritisation signal.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;agent-context&quot;&gt;
            &lt;h2&gt;A build log gives AI agents a better past&lt;/h2&gt;
            &lt;p&gt;Code tells an agent what exists. A roadmap tells it what might exist. The build log explains why the current product ended up this way.&lt;/p&gt;
            &lt;p&gt;That context is especially useful when a new task appears to contradict an earlier choice. The agent can &lt;a href=&quot;https://hovhannes.io/when-an-ai-agent-should-stop-and-ask&quot;&gt;surface the conflict&lt;/a&gt; instead of confidently undoing a decision it could not see.&lt;/p&gt;
            &lt;p&gt;The log should still be selective. Give the agent entries connected to the current contract, plus the newest decision that supersedes them. A complete archive without relevance creates a different problem: more context, less signal.&lt;/p&gt;
            &lt;div class=&quot;article-callout&quot;&gt;&lt;p class=&quot;article-callout-label&quot;&gt;Useful handoff&lt;/p&gt;&lt;strong&gt;Give the agent the relevant log entries, current contracts, and the decision it is allowed to make. Keep the rest out.&lt;/strong&gt;&lt;/div&gt;
          &lt;/section&gt;</content:encoded><category>Building in public</category></item><item><title>MVP first: what actually deserves to ship</title><link>https://hovhannes.io/mvp-first-what-actually-deserves-to-ship</link><guid isPermaLink="true">https://hovhannes.io/mvp-first-what-actually-deserves-to-ship</guid><description>A practical method for defining an MVP as the smallest complete user outcome, not a pile of unfinished features.</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p class=&quot;article-lead&quot;&gt;“Minimum viable product” often gets interpreted as a preview of the full roadmap. A little onboarding, a little dashboard, a little automation. The result has plenty of surface area but &lt;strong&gt;no moment where the user can say, “That solved it.”&lt;/strong&gt;&lt;/p&gt;

          &lt;section id=&quot;smallest-loop&quot;&gt;
            &lt;h2&gt;Start with the smallest complete loop&lt;/h2&gt;
            &lt;p&gt;A useful MVP takes one specific person from a problem they recognise to a result they care about. The path can be narrow. You can handle some work manually. The interface can offer very few choices. The important part is that &lt;strong&gt;the loop closes&lt;/strong&gt;.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/mvp-complete-loop.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/mvp-complete-loop-480.webp 480w, https://hovhannes.io/assets/responsive/article/mvp-complete-loop-960.webp 960w, https://hovhannes.io/assets/responsive/article/mvp-complete-loop-1440.webp 1440w, https://hovhannes.io/assets/article/mvp-complete-loop.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Three paper prototype screens forming one complete MVP user loop&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Complete loop&lt;/b&gt; / A narrow path can still take the user from a real problem to a visible result.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;div class=&quot;article-callout&quot;&gt;
              &lt;p class=&quot;article-callout-label&quot;&gt;MVP definition&lt;/p&gt;
              &lt;strong&gt;The smallest product that delivers the core outcome and gives you real evidence about the next decision.&lt;/strong&gt;
            &lt;/div&gt;
            &lt;p&gt;Both halves matter. The user needs value now, and the founder needs to learn from what happens. A prototype can test whether an idea makes sense. An MVP has to work for someone who does not care that you call it an experiment. Y Combinator makes the same practical point: customers experience an MVP as a product.&lt;/p&gt;
            &lt;p&gt;&lt;a class=&quot;source-link&quot; href=&quot;https://www.ycombinator.com/blog/practical-design-mvp&quot;&gt;Read Y Combinator’s Practical Design: MVP &lt;span aria-hidden=&quot;true&quot;&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;four-layers&quot;&gt;
            &lt;h2&gt;The four layers of a complete MVP&lt;/h2&gt;
            &lt;h3&gt;1. A precise promise 🎯&lt;/h3&gt;
            &lt;p&gt;Name the person, the situation, and the progress they should make. “Plan a product” leaves too much room. “Turn a scattered idea into a first build plan” gives you something you can protect.&lt;/p&gt;
            &lt;h3&gt;2. A clear trigger ⚡&lt;/h3&gt;
            &lt;p&gt;Why would someone open the product today? Maybe the roadmap is blank, an AI handoff failed, or the MVP keeps growing. Without a real starting moment, onboarding becomes a tour of features nobody asked to see.&lt;/p&gt;
            &lt;h3&gt;3. One core action sequence 🔁&lt;/h3&gt;
            &lt;p&gt;Keep only the steps that collect essential context, make a real decision, or produce the result. Remove a step and check what changes. If the answer is “not much,” it does not belong in the core path.&lt;/p&gt;
            &lt;h3&gt;4. An observable result 👁️&lt;/h3&gt;
            &lt;p&gt;The user should be able to point to what changed. A saved document is not automatically an outcome. A build plan that makes tomorrow’s decision easier is.&lt;/p&gt;

            &lt;div class=&quot;article-example&quot;&gt;
              &lt;p class=&quot;article-example-label&quot;&gt;The complete loop&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Trigger&lt;/strong&gt; → “I do not know what belongs in v1.”&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Core action&lt;/strong&gt; → Clarify audience, problem, value, and dependencies.&lt;/p&gt;
              &lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt; → A coherent plan the founder can review and build from.&lt;/p&gt;
            &lt;/div&gt;
          &lt;/section&gt;

          &lt;section id=&quot;ship-or-later&quot;&gt;
            &lt;h2&gt;Decide what ships with evidence, not anxiety&lt;/h2&gt;
            &lt;p&gt;&lt;a href=&quot;https://hovhannes.io/why-more-features-create-less-clarity&quot;&gt;Cutting a feature&lt;/a&gt; can feel like lowering the ambition. It is usually the opposite: you are choosing which promise to take seriously first.&lt;/p&gt;

            &lt;div class=&quot;article-table-wrap&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Ship now or later decision table&quot;&gt;
              &lt;table class=&quot;article-table&quot;&gt;
                &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ship now when absence…&lt;/th&gt;&lt;th&gt;Move later when the feature…&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
                &lt;tbody&gt;
                  &lt;tr&gt;&lt;td&gt;Breaks the core outcome&lt;/td&gt;&lt;td&gt;Adds convenience after the outcome&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;Prevents a key assumption from being tested&lt;/td&gt;&lt;td&gt;Optimizes behavior that is not yet proven&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;Creates unacceptable trust or safety risk&lt;/td&gt;&lt;td&gt;Automates a manageable manual step&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;Makes the primary path impossible to understand&lt;/td&gt;&lt;td&gt;Serves a secondary persona or rare path&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;Blocks the founder from observing useful evidence&lt;/td&gt;&lt;td&gt;Improves scale before demand exists&lt;/td&gt;&lt;/tr&gt;
                &lt;/tbody&gt;
              &lt;/table&gt;
            &lt;/div&gt;

            &lt;p&gt;“Later” needs a trigger, not a hopeful date. Add collaboration when active users keep sharing exported plans. Automate recommendations when manual reviews start repeating the same pattern. Build templates when setup time is clearly the thing holding people back.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;quality-floor&quot;&gt;
            &lt;h2&gt;Minimum does not mean careless&lt;/h2&gt;
            &lt;p&gt;Small scope is not permission to be careless. The MVP can do one thing, but that one thing still has to feel safe and dependable.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/mvp-quality-floor.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/mvp-quality-floor-480.webp 480w, https://hovhannes.io/assets/responsive/article/mvp-quality-floor-960.webp 960w, https://hovhannes.io/assets/responsive/article/mvp-quality-floor-1440.webp 1440w, https://hovhannes.io/assets/article/mvp-quality-floor.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Minimal paper product model supported by a strong layered foundation&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Quality floor&lt;/b&gt; / Small scope still needs a dependable base for trust, access, and recovery.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;ul class=&quot;article-checklist&quot;&gt;
              &lt;li&gt;&lt;strong&gt;Protect user data.&lt;/strong&gt;&lt;span&gt;Authentication, authorization, backups, and deletion rules are not decorative polish.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Handle the main failure states.&lt;/strong&gt;&lt;span&gt;Empty, loading, invalid, interrupted, and retry states belong to the core path.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Make the promise understandable.&lt;/strong&gt;&lt;span&gt;Users should know what will happen before they commit time or data.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Meet the accessibility baseline.&lt;/strong&gt;&lt;span&gt;Keyboard access, focus, labels, contrast, and responsive layout are part of product quality.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Observe the loop.&lt;/strong&gt;&lt;span&gt;Capture where users start, hesitate, complete, abandon, and ask for help.&lt;/span&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;A good shortcut saves implementation work without quietly making the user pay for it. A manual review can be smart. Losing someone’s work because saving was postponed is not.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;product-clarity-example&quot;&gt;
            &lt;h2&gt;Applying the model to Product Clarity&lt;/h2&gt;
            &lt;p&gt;I have a long list for Product Clarity: research synthesis, different planning views, collaboration, agents, analytics, integrations, and impact analysis. Shipping a weak version of each would only delay the useful part.&lt;/p&gt;
            &lt;p&gt;The first complete outcome is much narrower:&lt;/p&gt;
            &lt;ol class=&quot;article-steps&quot;&gt;
              &lt;li&gt;&lt;span&gt;01&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Capture the product context.&lt;/strong&gt;&lt;p&gt;Audience, problem, desired outcome, constraints, and current assumptions.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;02&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Shape the smallest valuable release.&lt;/strong&gt;&lt;p&gt;Separate the core path from convenience, scale, and speculative scope.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;03&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Connect the plan.&lt;/strong&gt;&lt;p&gt;Map features, pages, flows, data, and dependencies into one understandable system.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
              &lt;li&gt;&lt;span&gt;04&lt;/span&gt;&lt;div&gt;&lt;strong&gt;Make the next decision visible.&lt;/strong&gt;&lt;p&gt;Show what to build, what to cut, and what will be affected by change.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
            &lt;/ol&gt;
            &lt;p&gt;If a founder completes that loop and makes a better &lt;a href=&quot;https://hovhannes.io/a-backlog-is-not-a-build-plan&quot;&gt;build decision&lt;/a&gt;, the MVP has done its job. The next feature should fix friction I can see inside that loop, not a future problem I have invented.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;scope-session&quot;&gt;
            &lt;h2&gt;A 60-minute MVP scope session&lt;/h2&gt;
            &lt;ol class=&quot;article-timeline&quot;&gt;
              &lt;li&gt;&lt;strong&gt;10 minutes: Write the promise.&lt;/strong&gt;&lt;p&gt;For one user, in one situation, define one meaningful outcome.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;15 minutes: Draw the happy path.&lt;/strong&gt;&lt;p&gt;Start at the trigger and stop when the user can see the result.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;10 minutes: Mark the quality floor.&lt;/strong&gt;&lt;p&gt;Add the trust, safety, failure, and accessibility requirements the path needs.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;15 minutes: Remove or defer.&lt;/strong&gt;&lt;p&gt;Challenge every remaining item with the ship-now/later test.&lt;/p&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;10 minutes: Define evidence.&lt;/strong&gt;&lt;p&gt;Decide what completion, failure, confusion, and repeated demand will look like.&lt;/p&gt;&lt;/li&gt;
            &lt;/ol&gt;
            &lt;p&gt;Finish with one sentence you are willing to defend: “This release works when this user reaches this outcome, and we learn this.” If you need several audiences and outcomes to complete the sentence, the scope is still doing too much.&lt;/p&gt;
          &lt;/section&gt;</content:encoded><category>MVP</category></item><item><title>Why more features create less clarity</title><link>https://hovhannes.io/why-more-features-create-less-clarity</link><guid isPermaLink="true">https://hovhannes.io/why-more-features-create-less-clarity</guid><description>A practical framework for reducing product scope without losing the user outcome that makes the product valuable.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p class=&quot;article-lead&quot;&gt;Adding a feature feels productive because the roadmap gets fuller. Then the homepage needs another sentence, onboarding needs another branch, and the product takes longer to explain. That is usually the first sign that &lt;strong&gt;the scope has stopped serving the idea&lt;/strong&gt;.&lt;/p&gt;

          &lt;section id=&quot;real-problem&quot;&gt;
            &lt;h2&gt;The real problem is not “too many features”&lt;/h2&gt;
            &lt;p&gt;Size is not the real problem. A large product can feel obvious when its parts work toward the same result. A tiny product can feel scattered when each feature points in a different direction. I use three questions to tell the difference:&lt;/p&gt;
            &lt;ul class=&quot;article-list&quot;&gt;
              &lt;li&gt;Who is this product for right now?&lt;/li&gt;
              &lt;li&gt;What meaningful progress can that person make with it?&lt;/li&gt;
              &lt;li&gt;Why does each part need to exist for that progress to happen?&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;If those answers are fuzzy, roadmap debates turn into taste. Every suggestion sounds reasonable, so nothing has a clear reason to be first.&lt;/p&gt;
            &lt;blockquote&gt;
              &lt;p&gt;A feature earns its place when it makes the main promise easier to keep for the person you are building for now.&lt;/p&gt;
            &lt;/blockquote&gt;
          &lt;/section&gt;

          &lt;section id=&quot;three-costs&quot;&gt;
            &lt;h2&gt;Every feature creates work outside the screen&lt;/h2&gt;
            &lt;h3&gt;1. The decision surface 🧭&lt;/h3&gt;
            &lt;p&gt;Before anyone writes code, you still need to decide where the feature lives, who gets it, what the default should be, and what happens when the user changes their mind. The card on the roadmap hides all of that.&lt;/p&gt;
            &lt;h3&gt;2. The dependency surface 🕸️&lt;/h3&gt;
            &lt;p&gt;Features rarely stay in one component. Add team workspaces and you have also changed permissions, billing, invitations, ownership, deletion, and support. &lt;strong&gt;The visible part may be a button. The actual change is a web.&lt;/strong&gt;&lt;/p&gt;
            &lt;h3&gt;3. The communication surface 💬&lt;/h3&gt;
            &lt;p&gt;Someone has to explain the feature on the website, reveal it at the right moment in the interface, and answer questions when it behaves unexpectedly. If you cannot say why it exists in one plain sentence, users will feel that confusion too.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/features-complexity.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/features-complexity-480.webp 480w, https://hovhannes.io/assets/responsive/article/features-complexity-960.webp 960w, https://hovhannes.io/assets/responsive/article/features-complexity-1440.webp 1440w, https://hovhannes.io/assets/article/features-complexity.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;Overlapping product interface cards connected by tangled dependency threads&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Hidden surface area&lt;/b&gt; / Every new feature adds decisions, dependencies, and communication beyond its visible screen.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;div class=&quot;article-callout&quot;&gt;
              &lt;p class=&quot;article-callout-label&quot;&gt;Working model&lt;/p&gt;
              &lt;strong&gt;More scope × more connections = more ways to get the product wrong.&lt;/strong&gt;
              &lt;p&gt;Not a formula, just a useful warning: the eighth feature usually carries more baggage than the first.&lt;/p&gt;
            &lt;/div&gt;
          &lt;/section&gt;

          &lt;section id=&quot;feature-filter&quot;&gt;
            &lt;h2&gt;Use a feature filter before a priority score&lt;/h2&gt;
            &lt;p&gt;A score can rank ideas, but it cannot tell you whether they belong in the same product. I &lt;a href=&quot;https://hovhannes.io/a-backlog-is-not-a-build-plan&quot;&gt;filter for fit first&lt;/a&gt; and worry about priority second.&lt;/p&gt;

            &lt;div class=&quot;article-table-wrap&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Feature filter table&quot;&gt;
              &lt;table class=&quot;article-table&quot;&gt;
                &lt;thead&gt;
                  &lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;Evidence to look for&lt;/th&gt;&lt;/tr&gt;
                &lt;/thead&gt;
                &lt;tbody&gt;
                  &lt;tr&gt;&lt;td&gt;Which user problem does it solve?&lt;/td&gt;&lt;td&gt;A repeated, specific obstacle, not a broad desire.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;Which outcome does it improve?&lt;/td&gt;&lt;td&gt;A visible change in speed, confidence, quality, or completion.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;At what moment is it needed?&lt;/td&gt;&lt;td&gt;A defined step in the core user journey.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;What breaks if it is absent?&lt;/td&gt;&lt;td&gt;The core promise fails, or a key assumption cannot be tested.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;What does it depend on?&lt;/td&gt;&lt;td&gt;Known data, states, permissions, flows, and operational work.&lt;/td&gt;&lt;/tr&gt;
                  &lt;tr&gt;&lt;td&gt;What can it replace?&lt;/td&gt;&lt;td&gt;An existing step, workaround, or lower-value feature.&lt;/td&gt;&lt;/tr&gt;
                &lt;/tbody&gt;
              &lt;/table&gt;
            &lt;/div&gt;

            &lt;p&gt;Vague answers mean the feature is not ready. Keep the problem, drop the proposed solution for now, and look for better evidence. A neat roadmap card is not evidence.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;example&quot;&gt;
            &lt;h2&gt;A practical example: the “complete” onboarding&lt;/h2&gt;
            &lt;p&gt;Imagine a solo founder building a planning tool. Before launch, onboarding grows to include Google sign-in, invites, templates, a tour, profile settings, sample projects, and a progress dashboard.&lt;/p&gt;
            &lt;p&gt;None of those ideas is silly. Together they distract from the only question worth answering first: can someone turn a rough product idea into a plan they would actually use?&lt;/p&gt;

            &lt;div class=&quot;article-example&quot;&gt;
              &lt;p class=&quot;article-example-label&quot;&gt;Protect the complete loop&lt;/p&gt;
              &lt;ol&gt;
                &lt;li&gt;Describe the audience and the problem.&lt;/li&gt;
                &lt;li&gt;Choose the smallest valuable outcome.&lt;/li&gt;
                &lt;li&gt;Generate a connected first plan.&lt;/li&gt;
                &lt;li&gt;Review what to build, cut, or clarify next.&lt;/li&gt;
              &lt;/ol&gt;
            &lt;/div&gt;

            &lt;p&gt;If that loop works with email login and a blank page, the product already has a reason to exist. Templates can make it faster later. Teams can open a new market later. Neither should postpone &lt;a href=&quot;https://hovhannes.io/mvp-first-what-actually-deserves-to-ship&quot;&gt;the first honest test&lt;/a&gt;.&lt;/p&gt;
          &lt;/section&gt;

          &lt;section id=&quot;cut-without-losing&quot;&gt;
            &lt;h2&gt;Cut scope without losing the product&lt;/h2&gt;
            &lt;p&gt;Bad scope cuts whatever looks easiest until the deadline fits. Good scope keeps the user’s outcome intact and finds a simpler way to deliver it.&lt;/p&gt;

            &lt;figure class=&quot;article-image-figure&quot;&gt;
              &lt;img src=&quot;https://hovhannes.io/assets/article/features-focus.webp&quot; srcset=&quot;https://hovhannes.io/assets/responsive/article/features-focus-480.webp 480w, https://hovhannes.io/assets/responsive/article/features-focus-960.webp 960w, https://hovhannes.io/assets/responsive/article/features-focus-1440.webp 1440w, https://hovhannes.io/assets/article/features-focus.webp 1672w&quot; sizes=&quot;(max-width: 820px) calc(100vw - 32px), 860px&quot; alt=&quot;One simple three-step paper product flow surrounded by deferred interface cards&quot; width=&quot;1672&quot; height=&quot;941&quot; loading=&quot;lazy&quot; /&gt;
              &lt;figcaption class=&quot;article-image-caption&quot;&gt;&lt;b&gt;Protected outcome&lt;/b&gt; / Keep one complete path active and move unrelated scope outside the first release.&lt;/figcaption&gt;
            &lt;/figure&gt;

            &lt;ul class=&quot;article-checklist&quot;&gt;
              &lt;li&gt;&lt;strong&gt;Cut breadth before continuity.&lt;/strong&gt;&lt;span&gt;Serve one user and one main path completely instead of many users partially.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Keep the problem; release the solution.&lt;/strong&gt;&lt;span&gt;Record the evidence behind an idea so a rejected implementation does not erase a real need.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Prefer reversible decisions.&lt;/strong&gt;&lt;span&gt;Manual operations and simple defaults are often safer than premature automation.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Name the cost of “later.”&lt;/strong&gt;&lt;span&gt;Deferred work needs a trigger for reconsideration, not an imaginary date.&lt;/span&gt;&lt;/li&gt;
              &lt;li&gt;&lt;strong&gt;Review connections, not only cards.&lt;/strong&gt;&lt;span&gt;A small-looking feature with five dependencies may be the largest item on the board.&lt;/span&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;The goal is not to stay small forever. It is to build something whose parts make sense together. Once the main promise is clear, the product starts telling you which feature should come next.&lt;/p&gt;
          &lt;/section&gt;</content:encoded><category>Product thinking</category></item></channel></rss>