<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ScopeShield Ops</title>
    <description>The latest articles on DEV Community by ScopeShield Ops (@scopeshieldops).</description>
    <link>https://dev.to/scopeshieldops</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4031286%2F44245994-7fee-4e30-9227-052d48eaffaa.png</url>
      <title>DEV Community: ScopeShield Ops</title>
      <link>https://dev.to/scopeshieldops</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/scopeshieldops"/>
    <language>en</language>
    <item>
      <title>Scope creep is a state machine, not a difficult-client problem</title>
      <dc:creator>ScopeShield Ops</dc:creator>
      <pubDate>Thu, 16 Jul 2026 04:04:44 +0000</pubDate>
      <link>https://dev.to/scopeshieldops/scope-creep-is-a-state-machine-not-a-difficult-client-problem-54do</link>
      <guid>https://dev.to/scopeshieldops/scope-creep-is-a-state-machine-not-a-difficult-client-problem-54do</guid>
      <description>&lt;p&gt;Scope creep is usually described as a people problem: a client asks for too much, a freelancer is too accommodating, or a stakeholder keeps changing their mind.&lt;/p&gt;

&lt;p&gt;That framing is emotionally satisfying and operationally weak. The more useful model is a small state machine. Every new request needs to move into exactly one of four states:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Included&lt;/strong&gt; — already covered by the agreed deliverables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapped&lt;/strong&gt; — replaces something of comparable effort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deferred&lt;/strong&gt; — recorded for a later phase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Added&lt;/strong&gt; — changes the fee and/or delivery date.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The expensive failure mode is not “a difficult client.” It is an unclassified request that quietly enters production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The smallest useful protocol
&lt;/h2&gt;

&lt;p&gt;You do not need a heavyweight project-management system. You need a repeatable transition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request arrives
  -&amp;gt; compare with written scope
  -&amp;gt; classify: included | swapped | deferred | added
  -&amp;gt; calculate impact
  -&amp;gt; get written approval
  -&amp;gt; begin work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The crucial rule is that work starts &lt;em&gt;after&lt;/em&gt; classification and approval, not while everyone is still deciding what the request means.&lt;/p&gt;

&lt;p&gt;A tiny TypeScript model makes the idea concrete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ChangeDecision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;included&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;swapped&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;removedDeliverable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deferred&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;targetPhase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;added&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;addedBusinessDays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The type is less important than the invariant: an extra request cannot be both “just a quick thing” and unpriced production work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price impact, not irritation
&lt;/h2&gt;

&lt;p&gt;When a request is added, the response should name two variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;added fee&lt;/strong&gt;, and&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;schedule impact&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers often price only the coding time. That misses context switching, retesting, deployment coordination, displaced capacity, and additional review exposure. Even when the implementation is small, the operational footprint may not be.&lt;/p&gt;

&lt;p&gt;A simple planning formula is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;change fee = direct effort + uncertainty reserve + displaced-capacity cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a planning aid, not universal pricing advice. The point is to make the impact visible before the work is absorbed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A calm response template
&lt;/h2&gt;

&lt;p&gt;Here is the wording I use as a starting point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Happy to add [request]. That sits outside the current agreed scope, so I can add it as a paid change for [fee] and move the delivery date by [days] business days. If that works, reply approved and I will update the scope before starting the extra work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This works because it does four things without drama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;acknowledges the request,&lt;/li&gt;
&lt;li&gt;names the boundary,&lt;/li&gt;
&lt;li&gt;offers a concrete path forward, and&lt;/li&gt;
&lt;li&gt;creates an approval checkpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No lecture. No accusation. No surprise invoice later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make “done” testable
&lt;/h2&gt;

&lt;p&gt;Change control is much easier when the original scope defines acceptance evidence. “Build the dashboard” is not a testable end state. “The authenticated user can export the filtered table as CSV, and the supplied acceptance checklist passes in Chrome and Firefox” is much closer.&lt;/p&gt;

&lt;p&gt;Before kickoff, capture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deliverables and exclusions,&lt;/li&gt;
&lt;li&gt;the decision owner,&lt;/li&gt;
&lt;li&gt;included revision rounds,&lt;/li&gt;
&lt;li&gt;acceptance evidence,&lt;/li&gt;
&lt;li&gt;payment milestones, and&lt;/li&gt;
&lt;li&gt;the change-control rule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That list is boring. Boring is good. It turns a future disagreement into a lookup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free tools
&lt;/h2&gt;

&lt;p&gt;I built two browser-based tools around this protocol:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;a href="https://scopeshield-client-ops.holomapper.chatgpt.site/#change-order" rel="noopener noreferrer"&gt;free change-order message generator&lt;/a&gt;, and&lt;/li&gt;
&lt;li&gt;a &lt;a href="https://scopeshield-client-ops.holomapper.chatgpt.site/#calculator" rel="noopener noreferrer"&gt;free fixed-quote calculator&lt;/a&gt; that includes uncertainty, revision exposure, rush priority, and a suggested deposit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also a free three-template PDF on the same page. No account is required.&lt;/p&gt;

&lt;p&gt;The practical habit is simple: classify every request, state its commercial impact, wait for written approval, then work. That small sequence protects both the project and the relationship.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I created ScopeShield. The tools and starter templates linked above are free; the site also offers an optional paid template kit and scope-review services. The templates are operational aids, not legal, tax, accounting, or financial advice.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>webdev</category>
      <category>freelance</category>
    </item>
  </channel>
</rss>
