<?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: Chad Augur</title>
    <description>The latest articles on DEV Community by Chad Augur (@augurone).</description>
    <link>https://dev.to/augurone</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%2F737393%2Fb0e1f498-9c45-43dc-bb17-16eb97d411d0.jpeg</url>
      <title>DEV Community: Chad Augur</title>
      <link>https://dev.to/augurone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/augurone"/>
    <language>en</language>
    <item>
      <title>Let's Define Undefined</title>
      <dc:creator>Chad Augur</dc:creator>
      <pubDate>Tue, 22 Sep 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/augurone/lets-define-undefined-3ej</link>
      <guid>https://dev.to/augurone/lets-define-undefined-3ej</guid>
      <description>&lt;h2&gt;
  
  
  Falsifiable Defaults and the Semantics of Undefined
&lt;/h2&gt;




&lt;p&gt;&lt;a href="https://github.com/augurone/artikulates-resilient" rel="noopener noreferrer"&gt;Artikulates Resilient GitHub repository&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/eslint-plugin-resilient" rel="noopener noreferrer"&gt;Artikulates Resilient npm package&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;There is a small habit in JavaScript that carries a surprisingly large amount of meaning: reaching for &lt;code&gt;undefined&lt;/code&gt; whenever a value is absent, empty, failed, or not yet understood.&lt;/p&gt;

&lt;p&gt;The habit is understandable. &lt;code&gt;undefined&lt;/code&gt; is available everywhere, falsy, and often harmless until a later operation needs a string, an array, a number, or a function. But using one representation for all of those states asks it to say more than it can.&lt;/p&gt;

&lt;p&gt;Resilient treats absence more narrowly. When a contract has an executable empty form, that form should remain inside the contract. &lt;code&gt;undefined&lt;/code&gt; is reserved for a different fact: no contractual value has been supplied or produced.&lt;/p&gt;

&lt;p&gt;That distinction does not make a program more certain than it is. It gives uncertainty, absence, and falsification separate places to live.&lt;/p&gt;
&lt;h2&gt;
  
  
  A default says something
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://dev.to/augurone/the-code-is-the-contract-mk1"&gt;&lt;strong&gt;The Code Is the Contract&lt;/strong&gt;&lt;/a&gt;, defaults carry executable meaning. They describe what a boundary does with absence, and that meaning has to agree with the operations that follow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;readTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default does not validate arbitrary input. &lt;code&gt;42&lt;/code&gt; is still not a string. It does establish what this function will receive when &lt;code&gt;title&lt;/code&gt; is omitted or &lt;code&gt;undefined&lt;/code&gt;: an empty string, on which &lt;code&gt;trim()&lt;/code&gt; remains an ordinary operation.&lt;/p&gt;

&lt;p&gt;That is more than a defensive convenience. The boundary has made an agreement visible. It says that absence of text is expressed here as text with no characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The default carries the agreement
&lt;/h2&gt;

&lt;p&gt;Where a falsifiable default is feasible, it is not merely one signal among many. It is the primary carrier of the agreement. In Resilient's grammatical convention of the destructured signature, the signature declares the shape a function receives and its defaults declare the usable values that stand for absence within that shape.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;renderArticle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="nx"&gt;metadata&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a prose description placed beside the boundary. It is executable evidence. &lt;code&gt;title&lt;/code&gt; begins as a string agreement, &lt;code&gt;tags&lt;/code&gt; as an array agreement, and &lt;code&gt;metadata&lt;/code&gt; as an object agreement whenever the corresponding property is absent or &lt;code&gt;undefined&lt;/code&gt;. The operations and return path can be checked against those same agreements without first widening each one into a nullish alternative.&lt;/p&gt;

&lt;p&gt;For the analyzer, this is the beginning and end of the local path: read the destructured signature, follow the agreements through their operations and guards, and require every reachable normal return to preserve the promised families. The default is therefore a compact, executable statement of both absence behavior and continuation behavior. It does not validate an arbitrary incoming value, but it gives the analyzer—and the next participant—a known agreement when absence is the case the boundary has chosen to handle.&lt;/p&gt;

&lt;p&gt;The same pattern is available across familiar value families:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each value remains usable according to its family:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each can also participate in a falsifiable observation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;             &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;           &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;             &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;hasContent&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;    &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The array and the object are themselves truthy. Their emptiness needs a more specific observation: an array's &lt;code&gt;length&lt;/code&gt;, and an object-content guard such as &lt;code&gt;hasContent&lt;/code&gt;. That small difference is important: a test should say what it is actually testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Falsifiable does not mean invalid
&lt;/h2&gt;

&lt;p&gt;A falsifiable value is still a valid member of its contract.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;0&lt;/code&gt; does not stop being a number because &lt;code&gt;!0&lt;/code&gt; is true. &lt;code&gt;false&lt;/code&gt; does not stop being a boolean. An empty string remains a string, an empty array remains an array, and &lt;code&gt;{}&lt;/code&gt; remains an object. The value family and its available operations survive the negative observation.&lt;/p&gt;

&lt;p&gt;What that observation means belongs to the participant consuming the value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the first scope, zero stops the operation. In the second, it is a useful operand. Neither reading changes the producer's numeric agreement.&lt;/p&gt;

&lt;p&gt;This is the grammar of falsifiable defaults in Resilient. Success and a falsifiable condition do not require different value families:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;string  → string
array   → array
object  → object
number  → number
boolean → boolean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The consumer may decide to stop, continue, render, calculate, filter, or assign the value. The producer has not abandoned its agreement merely because the consumer can make a negative observation about its contents.&lt;/p&gt;

&lt;p&gt;That matters to static analysis as well as runtime behavior. A producer that returns an empty array can still promise an array. Its consumer can ask the question that belongs to array content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does not first need to resolve whether the producer returned an array or withdrew from the array contract. Preserving the value family preserves the operations the next participant is entitled to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empty needs the right test
&lt;/h2&gt;

&lt;p&gt;An empty default does not make every family falsifiable through bare truthiness. JavaScript makes both &lt;code&gt;[]&lt;/code&gt; and &lt;code&gt;{}&lt;/code&gt; truthy. A contract that requires collection members or record fields needs a content test that establishes that condition directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasArrayContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[object Object]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These synthetic tests construct the observation that truthiness alone cannot provide. More importantly, they let the consuming scope ask whether the agreement it needs has been established. An empty array or object retains its family; a failed content test falsifies the content agreement where that scope requires content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;hasContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line asks whether this scope has the record content it needs. The second still receives an object-shaped value and can use the object agreement. The guard owns the consequence of the failed content test; the empty default does not itself force control flow.&lt;/p&gt;

&lt;p&gt;Falsification is therefore about agreement, not a universal verdict on a value. An object-content test does not declare every empty object invalid, and an array-length test does not validate every member. Each test establishes only the condition the present agreement asks it to establish.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is left for &lt;code&gt;undefined&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Once established contracts can express their own falsifiable states, &lt;code&gt;undefined&lt;/code&gt; no longer has to serve as the universal negative member of every contract.&lt;/p&gt;

&lt;p&gt;It can say something narrower and more useful: no contractual value has been supplied or produced.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// a Number has been established&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// a Boolean has been established&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// a String has been established&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;      &lt;span class="c1"&gt;// an Array has been established&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;     &lt;span class="c1"&gt;// an Object has been established&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;              &lt;span class="c1"&gt;// no Function has been established&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a claim that &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;, &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;[]&lt;/code&gt;, and &lt;code&gt;{}&lt;/code&gt; share one universal meaning. They do not. It is a claim that each already gives the receiver a value in the promised family, while &lt;code&gt;func&lt;/code&gt; has not yet established a callable value at all.&lt;/p&gt;

&lt;p&gt;The distinction keeps several states from collapsing into one another:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;falsifiable value ≠ undefined
undefined         ≠ contradiction
unknown           ≠ undefined
unknown           ≠ contradiction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A known zero is not unknown. A known false is not absent. An empty string has not failed its string contract. An unknown external payload should not become &lt;code&gt;undefined&lt;/code&gt; merely because the application has not yet established its contract. Each state carries different evidence, and collapsing them creates more ambiguity for both the developer and the analyzer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The edge exposed by functions
&lt;/h2&gt;

&lt;p&gt;Functions make the distinction difficult to ignore. There is no falsy callable function in JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function does nothing, but it still exists. It is callable and truthy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                     &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Supplying an empty callback therefore makes a real claim on behalf of the participants: an implementation is present. It may be a no-op implementation, but it is not the absence of one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unresolved&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here the property is present, but no callable value has been supplied. The receiver still has a decision to make. Not knowing whether an implementation exists is the condition being represented.&lt;/p&gt;

&lt;p&gt;That is the edge of falsifiable defaults. An empty string can preserve a string agreement; an empty array can preserve an array agreement. A no-op callback cannot preserve the agreement that no callback has been established.&lt;/p&gt;

&lt;h2&gt;
  
  
  The receiver owns the decision
&lt;/h2&gt;

&lt;p&gt;A function boundary may require a callable value. It may also allow its absence, provided it guards the call in its own scope.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;notify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// return here acts as a break on the side-effect&lt;/span&gt;

    &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// this is a side-effect nothing is returned from notify directly. &lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;// Isolation of side-effects will be a later blog&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The guard makes the decision visible. If the value is callable, execution proceeds. Otherwise, the function ends without producing a return value.&lt;/p&gt;

&lt;p&gt;The scope of that conclusion matters. &lt;code&gt;notify()&lt;/code&gt; also returns no value after a valid callback runs, so its result does not prove whether the callback ran. Boolean conversion alone also does not distinguish &lt;code&gt;undefined&lt;/code&gt; from every other falsy value. Test callability when the operation needs a function; test a result only when the next operation depends on that result.&lt;/p&gt;

&lt;p&gt;This is the producer-and-consumer division described throughout Resilient: the producer owns the agreement it offers, and the consumer owns the interpretation needed in its own scope. A guard knows enough to stop. It does not need to invent an implementation for one that was never supplied.&lt;/p&gt;

&lt;h2&gt;
  
  
  The language meaning of &lt;code&gt;undefined&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The ECMAScript specification defines the &lt;a href="https://262.ecma-international.org/5.1/#sec-4.3.9" rel="noopener noreferrer"&gt;&lt;strong&gt;undefined value&lt;/strong&gt;&lt;/a&gt; as the primitive value used when a variable has not been assigned a value. It defines the &lt;a href="https://262.ecma-international.org/5.1/#sec-4.3.10" rel="noopener noreferrer"&gt;&lt;strong&gt;Undefined type&lt;/strong&gt;&lt;/a&gt; as the type whose sole value is that value. &lt;a href="https://262.ecma-international.org/5.1/#sec-8.1" rel="noopener noreferrer"&gt;&lt;strong&gt;Section 8.1&lt;/strong&gt;&lt;/a&gt; reiterates the relationship: the type contains one value, and an unassigned variable has that value.&lt;/p&gt;

&lt;p&gt;That is not a side note to this argument. It is the ground on which the contractual reading stands. ECMAScript establishes the language mechanics: &lt;code&gt;undefined&lt;/code&gt; is the primitive value of an unassigned variable. Resilient does not attempt to redefine that fact. It asks what that available language expression should mean when participants use it to make agreements in an application.&lt;/p&gt;

&lt;p&gt;JavaScript permits explicit assignment of &lt;code&gt;undefined&lt;/code&gt;. A dialect still has to decide which permitted expressions belong in its grammar. For Resilient, the meaning begins with the state named by the specification: a value has not been assigned. The runtime represents that state with &lt;code&gt;undefined&lt;/code&gt;; within the dialect, it communicates something left undefined.&lt;/p&gt;

&lt;p&gt;The same restraint applies to a bare return. No return value is supplied, and the caller receives &lt;code&gt;undefined&lt;/code&gt; as the outcome. The language supplies the value; the program has still said that its path did not produce one.&lt;/p&gt;

&lt;h2&gt;
  
  
  An outcome, not a catch-all assignment
&lt;/h2&gt;

&lt;p&gt;Consider the difference in authored intent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No implementation has been supplied.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;func&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An assignment has been made. If a function existed before, a known value has been cleared, invalidated, or withdrawn. Those are actions with meanings of their own, and the resulting value does not reveal which action occurred.&lt;/p&gt;

&lt;p&gt;Resilient therefore treats &lt;code&gt;undefined&lt;/code&gt; most clearly when it arises from what was not supplied or what was not produced: an uninitialized binding, an omitted result, or a guarded path that deliberately does not continue. When an action has a known domain meaning, its contract should express that meaning rather than hiding it behind a catch-all assignment.&lt;/p&gt;

&lt;p&gt;JavaScript cannot reconstruct this history from the resulting value. The distinction belongs to the authored code and to the discipline used to read it. That is part of what makes Resilient a dialect: participants agree on how the language's available expressions will be used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's define &lt;code&gt;undefined&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The point is not to ban &lt;code&gt;undefined&lt;/code&gt;, or to make every absence look like an empty collection. It is to stop asking one value to carry incompatible facts.&lt;/p&gt;

&lt;p&gt;An empty default is not a placeholder. It is a falsifiable expression of an established agreement: &lt;code&gt;[]&lt;/code&gt; says an array is here, even when it has no members; &lt;code&gt;{}&lt;/code&gt; says an object is here, even when it has no own content; &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, and &lt;code&gt;false&lt;/code&gt; remain values in their respective families. Their consumers decide what follows when the agreement's content test fails.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;undefined&lt;/code&gt; says something prior to that agreement. No contractual value was supplied or produced. It is not the empty array, the empty object, a failed string, an unknown external payload, or a known contradiction. It is the remaining language value for something genuinely left undefined.&lt;/p&gt;

&lt;p&gt;That is the discipline Resilient needs from its defaults and its analysis. Let a destructured signature establish the agreement it can honestly carry. Let a falsifiable default preserve that agreement through its empty form. Let a guard decide whether the present scope can continue. And when no value has been established, let &lt;code&gt;undefined&lt;/code&gt; say exactly that.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let falsifiable defaults carry agreement. Let the unknown remain unknown. Let &lt;code&gt;undefined&lt;/code&gt; mean something was actually left undefined.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>software</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>The Fallacy of the “Unknown Cliff” in Modern Web Applications</title>
      <dc:creator>Chad Augur</dc:creator>
      <pubDate>Wed, 16 Sep 2026 00:11:43 +0000</pubDate>
      <link>https://dev.to/augurone/the-fallacy-of-the-unknown-cliff-in-modern-web-applications-40il</link>
      <guid>https://dev.to/augurone/the-fallacy-of-the-unknown-cliff-in-modern-web-applications-40il</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/augurone/artikulates-resilient" rel="noopener noreferrer"&gt;Artikulates Resilient GitHub repository&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/eslint-plugin-resilient" rel="noopener noreferrer"&gt;Artikulates Resilient npm package&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;
&lt;h2&gt;
  
  
  What dynamic data does—and does not—take away
&lt;/h2&gt;

&lt;p&gt;Modern web applications are built at the meeting point of two kinds of knowledge.&lt;/p&gt;

&lt;p&gt;Inside the application, the source can tell us a great deal. A function tells us what it accepts and what it returns. Defaults describe what absence means. Operations reveal what a value is expected to do. Those agreements can be followed through functions, modules, components, and transformations.&lt;/p&gt;

&lt;p&gt;Then the application meets something it does not own.&lt;/p&gt;

&lt;p&gt;An API returns a payload. A user submits a form. A database provides a record written by an earlier version of the application. A browser API, cache, feature flag, or third-party service introduces a value whose runtime contents are not established by the local source.&lt;/p&gt;

&lt;p&gt;Something important has changed.&lt;/p&gt;

&lt;p&gt;It is tempting to imagine this transition as an &lt;strong&gt;unknown cliff&lt;/strong&gt;. On one side, the program is understandable. On the other, the evidence disappears, and with it our ability to say anything useful. The external value is unknown, therefore everything that depends on it becomes unknowable.&lt;/p&gt;

&lt;p&gt;That conclusion asks uncertainty to do far more work than it deserves.&lt;/p&gt;

&lt;p&gt;Unknown data marks the point where one source of evidence ends. It does not erase the contracts surrounding that value, the operations performed upon it, or the agreements established after it enters application ownership.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Unknown is a boundary marker, not a collapse of meaning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters because modern applications live at boundaries. The interesting question is not whether those boundaries can be made statically certain.&lt;/p&gt;

&lt;p&gt;They cannot.&lt;/p&gt;

&lt;p&gt;The question is what we can still know when certainty ends.&lt;/p&gt;
&lt;h2&gt;
  
  
  The cliff is an attractive story
&lt;/h2&gt;

&lt;p&gt;Consider a fairly ordinary API path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="c1"&gt;// creates disagreement&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// even profile?.name?.trim() produces an unreliable contract while avoiding a null check.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is nothing especially reckless here.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;response.ok&lt;/code&gt; establishes that the request succeeded. &lt;code&gt;json()&lt;/code&gt; establishes that the response body could be decoded into a JavaScript value.&lt;/p&gt;

&lt;p&gt;Neither establishes that the value is a profile.&lt;/p&gt;

&lt;p&gt;The agreement may be real. The API is expected to return a profile. The application was written against that expectation. Tests, documentation, schemas, and the implementation on the other side may all reinforce it.&lt;/p&gt;

&lt;p&gt;The local source cannot establish whether that agreement is being fulfilled now.&lt;/p&gt;

&lt;p&gt;That is where the cliff becomes attractive.&lt;/p&gt;

&lt;p&gt;One response is to call the payload unknowable and stop reasoning at the network boundary. Another is to let a local description stand in for the external agreement and continue as though the value has been proven.&lt;/p&gt;

&lt;p&gt;Both claim too much.&lt;/p&gt;

&lt;p&gt;The first throws away evidence the application still has. The second invents evidence it does not.&lt;/p&gt;

&lt;p&gt;The boundary is smaller than either suggests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;external system → unknown value → owned boundary → application value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The unknown belongs exactly where the evidence ends.&lt;/p&gt;

&lt;p&gt;The application can then take responsibility for the value and establish the agreement its own code needs.&lt;/p&gt;

&lt;p&gt;But calling something a parser does not make it a boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parseProfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That establishes what absence means. It does not establish that &lt;code&gt;name&lt;/code&gt; is usable as the application expects. &lt;code&gt;42&lt;/code&gt; still becomes &lt;code&gt;{ name: 42 }&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ownership requires more than moving the value through a conveniently named function. &lt;a href="https://dev.to/augurone/the-code-is-the-contract-mk1"&gt;The boundary has to produce the contract it claims to establish.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;normalizeProfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;renderProfile&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;normalizeProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;renderProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing here proves more about the API. A successful response means the request succeeded. Decoding JSON means the body became a JavaScript value. Neither tells us that &lt;code&gt;data&lt;/code&gt; is a profile.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;normalizeProfile&lt;/code&gt; is where this application makes its own, narrower decision. For this path, a profile is something from which the application can produce a usable name, or an absent name. That is the handoff.&lt;/p&gt;

&lt;p&gt;After that handoff, &lt;code&gt;name.toUpperCase()&lt;/code&gt; is ordinary code. It is not checking the API again. It is using the limited string agreement that the boundary has already established.&lt;/p&gt;

&lt;p&gt;The remote system remains responsible for what it sends. The local boundary is responsible for the promise it makes to the rest of this application. That is where uncertainty stops being an excuse to stop reasoning and becomes a specific responsibility in the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unknown is not contradiction
&lt;/h2&gt;

&lt;p&gt;Unknown means that the available evidence has not answered a question. It does not mean that the value has failed. It means the program has reached the limit of what this source can honestly say.&lt;/p&gt;

&lt;p&gt;Contradiction is different. It is the moment the available evidence reveals that two claims cannot both hold. A contradiction gives us a path to graceful degradation; the expected shape is not available and will not continue through the stack. An unknown gives us a question that remains open.&lt;/p&gt;

&lt;p&gt;That distinction keeps uncertainty in proportion. An unresolved value does not spread outward and erase the &lt;a href="https://dev.to/augurone/software-as-an-agreement-engine-3b6a"&gt;contracts, operations, and consequences&lt;/a&gt; the rest of the application still exposes. It remains at the point where the evidence ran out.&lt;/p&gt;

&lt;p&gt;And because it remains contained, it has an owner. The boundary that receives it can reject it, interpret it, normalize it, or deliberately carry it forward. The unknown is not a cliff beyond which reasoning stops. It is a responsibility with a location.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agreement keeps moving
&lt;/h2&gt;

&lt;p&gt;The important consequence of a local boundary is not that it has made the outside world predictable. It is that the rest of the application no longer has to act as though the outside world is the only fact that matters.&lt;/p&gt;

&lt;p&gt;The profile has crossed a line. On one side is a value whose contents the application cannot establish from its own source. On the other is a small, ordinary agreement that local code can use. That agreement can be passed to a component, returned from a function, stored in state, or transformed again. Each new use has its own responsibility, but it does not begin at unpredictable shapes each time.&lt;/p&gt;

&lt;p&gt;This is what lets an application grow without making every function an integration layer. The boundary contains the question that belongs to the external system. The rest of the program can remain about the work it was written to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The integration boundary
&lt;/h2&gt;

&lt;p&gt;The boundary has another side. The normalizer can make an honest promise to the application, but it cannot establish that the remote service is continuing to keep its promise. That agreement has to be exercised where it exists: between the application and the service.&lt;/p&gt;

&lt;p&gt;This is what an integration check is for. Send the request. Inspect the status and the response. Confirm that the service still produces the behavior the application depends on. A tool such as Postman is useful here not because it makes the response statically knowable, but because it crosses the boundary and asks the system itself.&lt;/p&gt;

&lt;p&gt;That evidence belongs beside the executable agreement, not in competition with it. The local code tells us what the application will do. An integration check tells us whether the profile service is still supplying the kind of response that made that choice sensible. One follows the agreement inside the program. The other tests the agreement between programs.&lt;/p&gt;

&lt;p&gt;Together, they give a web application a more realistic kind of confidence. The code remains legible when the network is not present. The integration boundary remains testable when the network is. Neither has to pretend to do&lt;br&gt;
the other's work.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is no cliff
&lt;/h2&gt;

&lt;p&gt;The web is full of values that arrive from somewhere else. That fact does not divide an application into a small island of reason and an ocean of mystery. It gives the application edges.&lt;/p&gt;

&lt;p&gt;At an edge, source evidence ends and runtime observation begins. The boundary inside the application answers for the agreement it makes next. The integration boundary answers for whether two independently running systems are still meeting each other where they actually meet.&lt;/p&gt;

&lt;p&gt;That is not a retreat from certainty. It is a refusal to counterfeit it. The application can know what its code says, can make disagreement visible when the source reveals it, can establish a usable local agreement when an external value arrives, and can test the external promise against the system making it.&lt;/p&gt;

&lt;p&gt;That is the work. Not to eliminate the unknown, but to keep it from becoming an excuse for either fantasy or paralysis.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Preserve the known. Name the boundary. Test agreement.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>software</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>A path to more resilient software:

Agree wherever possible.
Disagree gracefully.
Allow the unknown to remain unknown.</title>
      <dc:creator>Chad Augur</dc:creator>
      <pubDate>Thu, 10 Sep 2026 23:03:23 +0000</pubDate>
      <link>https://dev.to/augurone/a-path-to-more-resilient-software-agree-wherever-possible-disagree-gracefully-allow-the-2paa</link>
      <guid>https://dev.to/augurone/a-path-to-more-resilient-software-agree-wherever-possible-disagree-gracefully-allow-the-2paa</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/augurone/software-as-an-agreement-engine-3b6a" class="crayons-story__hidden-navigation-link"&gt;Software as an "Agreement Engine"&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/augurone" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F737393%2Fb0e1f498-9c45-43dc-bb17-16eb97d411d0.jpeg" alt="augurone profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/augurone" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Chad Augur
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Chad Augur
                
                
              
              &lt;div id="story-author-preview-content-4589821" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/augurone" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F737393%2Fb0e1f498-9c45-43dc-bb17-16eb97d411d0.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Chad Augur&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/augurone/software-as-an-agreement-engine-3b6a" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 8&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/augurone/software-as-an-agreement-engine-3b6a" id="article-link-4589821"&gt;
          Software as an "Agreement Engine"
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/software"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;software&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/augurone/software-as-an-agreement-engine-3b6a#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>architecture</category>
      <category>software</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Software as an "Agreement Engine"</title>
      <dc:creator>Chad Augur</dc:creator>
      <pubDate>Tue, 08 Sep 2026 16:30:00 +0000</pubDate>
      <link>https://dev.to/augurone/software-as-an-agreement-engine-3b6a</link>
      <guid>https://dev.to/augurone/software-as-an-agreement-engine-3b6a</guid>
      <description>&lt;h2&gt;
  
  
  Innovation &amp;amp; Lineage in the Resilient JavaScript Dialect
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/augurone/artikulates-resilient" rel="noopener noreferrer"&gt;Artikulates Resilient GitHub repository&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/eslint-plugin-resilient" rel="noopener noreferrer"&gt;Artikulates Resilient npm package&lt;/a&gt;&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;Agree wherever possible.&lt;br&gt;
Disagree gracefully.&lt;br&gt;
Allow the unknown to remain unknown.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;That is the discipline at the center of Resilient JavaScript.&lt;/p&gt;

&lt;p&gt;It is also a way to think about reliable software more generally: keep what works, make disagreement visible, and do not manufacture certainty.&lt;/p&gt;

&lt;p&gt;Resilient enters an old argument about correctness, contracts, invariants, specifications, and boundaries. It is not claiming that dynamic languages are unknowable or that static types are useless. It asks three simple questions: where does knowledge come from, how far can it travel, and what should a tool do when the evidence runs out?&lt;/p&gt;
&lt;h2&gt;
  
  
  Innovation
&lt;/h2&gt;

&lt;p&gt;The move Resilient makes is simple: it changes where authority lives.&lt;/p&gt;

&lt;p&gt;Resilient is a dialect of standard JavaScript, not a new language. The grammar stays put. The discipline comes from the choices the code makes and the tooling that checks whether those choices remain coherent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For application-owned executable contracts, “the code that runs is the primary source of truth.”&lt;/p&gt;

&lt;p&gt;— &lt;a href="https://dev.to/augurone/the-code-is-the-contract-mk1"&gt;The Code Is the Contract&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The source is not merely an implementation of a design described somewhere else. It is the record of the agreements the program is actually making. The tool reads those agreements, follows them where the evidence holds, and leaves uncertainty alone where it does not.&lt;/p&gt;

&lt;p&gt;This does not make explicit models obsolete. A model earns its keep when it crosses ownership, time, or a runtime boundary: an external payload, a public package, a persisted record, or a compatibility promise. The unnecessary model is the one that repeats an executable fact and then has to stay in sync with it by hand.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Model the things that cross meaningful boundaries. Infer the things that happen inside them.&lt;/p&gt;

&lt;p&gt;— &lt;a href="https://dev.to/augurone/the-code-is-the-contract-mk1"&gt;The Code Is the Contract&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the move: ask standard JavaScript to carry more of its own meaning, and ask tooling to listen before the code is made to speak twice.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Agreement Engine paradigm
&lt;/h2&gt;

&lt;p&gt;An agreement is not a type or a promise written beside the code. It is a relationship that has to survive contact with execution.&lt;/p&gt;

&lt;p&gt;Programs are conversations between parts. One part offers something; another receives it, changes it, or passes it on. Every exchange carries an expectation. A program stays coherent when those expectations hold, when disagreement becomes visible, and when nobody pretends to know what has not been established.&lt;/p&gt;

&lt;p&gt;The Agreement Engine does not eliminate uncertainty. It gives us a way to see how a program stays trustworthy while uncertainty moves through it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agreement    → cooperation
disagreement → information
unknown      → room for evidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every application or function has two broad outcomes: the result satisfies the agreement, or it does not. The goal is to define valid clearly, preserve it through the program, and manage invalidity without making it catastrophic.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;unknown&lt;/code&gt; is not a third outcome. It is the condition to respect until the available evidence is sufficient to establish what is true.&lt;/p&gt;

&lt;p&gt;Code is where these relationships become real. It is where the program's assumptions meet the world and either hold together or change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Predicates
&lt;/h2&gt;

&lt;p&gt;An Agreement Engine rests on five axioms. Each acts as a predicate over an agreement: it asks what is true, what is promised, where does responsibility rest, what behavior matters, and where uncertainty belongs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Correctness:&lt;/strong&gt; An agreement has to survive execution. The question is not whether the code looks plausible, but what execution establishes and which claims remain valid afterward. Floyd, Hoare, and Dijkstra provide the formal lineage for reasoning about program meaning, assertions, and justified results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Robert W. Floyd — &lt;a href="https://www.lem12.uksw.edu.pl/images/1/15/AssigningMeanings1967.pdf" rel="noopener noreferrer"&gt;“Assigning Meanings to Programs”&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;C. A. R. Hoare — &lt;a href="https://doi.org/10.1145/363235.363259" rel="noopener noreferrer"&gt;“An Axiomatic Basis for Computer Programming”&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;E. W. Dijkstra — &lt;a href="https://www.cs.utexas.edu/~EWD/ewd04xx/EWD454.PDF" rel="noopener noreferrer"&gt;“Letter to Dr. H. Bekic, 8 October 1974”&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contract:&lt;/strong&gt; A component makes an offer to its caller, then has to deliver on it. The contract gives the agreement a shape. The contract tradition runs through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bertrand Meyer — &lt;a href="https://www.eiffel.org/doc/solutions/Design_by_Contract_and_Assertions" rel="noopener noreferrer"&gt;“Design by Contract and Assertions”&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Blame:&lt;/strong&gt; When an agreement breaks, locate the break. Responsibility should not be smeared across every component that happened to carry the value. Findler and Felleisen give this problem a name and a strategy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Robert Bruce Findler and Matthias Felleisen — &lt;a href="https://dl.acm.org/doi/10.1145/581478.581484" rel="noopener noreferrer"&gt;“Contracts for Higher-Order Functions”&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Behavior:&lt;/strong&gt; An agreement is about what a value is allowed to do, not only what representation it has. If a property matters, specify the behavior that depends on it. A behavior-first account of specifications begins with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rich Hickey — &lt;a href="https://clojure.org/about/spec" rel="noopener noreferrer"&gt;“clojure.spec — Rationale and Overview”&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Boundaries:&lt;/strong&gt; Every agreement has an edge where local evidence ends. Uncertainty belongs there, where it can be isolated, interpreted, and turned into something the rest of the system can trust. Two useful treatments of where uncertainty should be handled are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gary Bernhardt — &lt;a href="https://www.destroyallsoftware.com/talks/boundaries" rel="noopener noreferrer"&gt;“Boundaries”&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Alexis King — &lt;a href="https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/" rel="noopener noreferrer"&gt;“Parse, don’t validate”&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Taken together, these predicates make an agreement actionable. They tell us what the program claims, what execution supports, where a contradiction belongs, what behavior must be preserved, and what remains unresolved. Resilient brings those questions to standard JavaScript, where the language leaves clues rather than settling every question for us. The work is to make those clues legible: to see where an agreement holds, where it breaks, and what still needs to be learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principle
&lt;/h2&gt;

&lt;p&gt;Those questions do not stop at the analyzer. They describe a broader discipline for any system that has to remain trustworthy under change. These are not instructions to be agreeable at any cost. They are a way to stay compatible where we can, be precise when something breaks, and remain humble about what we have not established.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agree wherever possible
&lt;/h3&gt;

&lt;p&gt;In software, agreement is interoperability. A boundary accommodates ordinary variation and preserves the invariant the next part of the system relies on, without pretending an invalid value is valid.&lt;/p&gt;

&lt;p&gt;In life, agreement is common ground. It is not people-pleasing or surrender; it is recognizing another person's reality where recognition is possible before asserting a different view. Connection and collaboration begin with that small act of validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disagree gracefully
&lt;/h3&gt;

&lt;p&gt;In software, a known contradiction needs an owner and a useful way out. A system can degrade, return an explicit error, or provide a fallback without silently corrupting everything around it.&lt;/p&gt;

&lt;p&gt;In life, graceful disagreement protects both truth and relationship. It separates a person from an idea, makes a boundary firm without making it hostile, and leaves a bridge for whatever comes next.&lt;/p&gt;

&lt;h3&gt;
  
  
  Allow the unknown to remain unknown
&lt;/h3&gt;

&lt;p&gt;In software, not every component needs to know how every other component works. Encapsulation and abstraction leave some implementation detail unresolved until it matters. Resilient applies the same restraint to analysis: uncertainty stays open until validation or new evidence establishes more.&lt;/p&gt;

&lt;p&gt;In life, this is humility without paralysis. We do not need a definitive answer for every mystery, future outcome, or person's motive before we move forward. Ambiguity can be bounded without being filled with a confident story.&lt;/p&gt;

&lt;p&gt;That parallel is more than a metaphor. Software and human systems become more resilient when they preserve what works, make disagreement visible without making it catastrophic, and respect uncertainty without rushing to fill it. The interesting question is what becomes possible when code is built with the same discipline: not a new language, and not a promise of certainty, but a clearer record of what the system has agreed to—and what it has not yet learned.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>javascript</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>Stop making your code explain itself twice—the code itself should be the authority—better tools can catch disagreements before they become bugs. #AST #eslint #EMCAnative #StaticAnalysis</title>
      <dc:creator>Chad Augur</dc:creator>
      <pubDate>Sun, 06 Sep 2026 15:09:20 +0000</pubDate>
      <link>https://dev.to/augurone/stop-making-your-code-explain-itself-twice-the-code-itself-should-be-the-authority-better-tools-can-3728</link>
      <guid>https://dev.to/augurone/stop-making-your-code-explain-itself-twice-the-code-itself-should-be-the-authority-better-tools-can-3728</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/augurone/the-code-is-the-contract-mk1" class="crayons-story__hidden-navigation-link"&gt;The Code Is the Contract&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/augurone" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F737393%2Fb0e1f498-9c45-43dc-bb17-16eb97d411d0.jpeg" alt="augurone profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/augurone" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Chad Augur
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Chad Augur
                
                
              
              &lt;div id="story-author-preview-content-4560785" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/augurone" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F737393%2Fb0e1f498-9c45-43dc-bb17-16eb97d411d0.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Chad Augur&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/augurone/the-code-is-the-contract-mk1" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/augurone/the-code-is-the-contract-mk1" id="article-link-4560785"&gt;
          The Code Is the Contract
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/eslint"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;eslint&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwareengineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwareengineering&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devtools"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devtools&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/augurone/the-code-is-the-contract-mk1#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>softwaredevelopment</category>
      <category>testing</category>
      <category>tools</category>
    </item>
    <item>
      <title>The Code Is the Contract</title>
      <dc:creator>Chad Augur</dc:creator>
      <pubDate>Thu, 03 Sep 2026 04:39:21 +0000</pubDate>
      <link>https://dev.to/augurone/the-code-is-the-contract-mk1</link>
      <guid>https://dev.to/augurone/the-code-is-the-contract-mk1</guid>
      <description>&lt;h2&gt;
  
  
  Native ECMA, Static Analysis
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Artikulates Resilient is an open-source static-analysis method and disciplined dialect of standard JavaScript. It reads executable boundaries—destructured defaults, return paths, operations, callbacks, and local module relationships—as evidence, then reports contradictions in the source it can resolve. The current package exposes that analysis through ESLint as an integration surface; the contract model stands on its own. The project analyzes its own source, so it is both the method and a working example of the discipline.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/augurone/artikulates-resilient" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/eslint-plugin-resilient" rel="noopener noreferrer"&gt;npm package&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is a particular kind of software maintenance that feels like inventory. Every function gets a description. Every object gets a shape. Every value gets a label. Then the descriptions multiply, drift, and become important enough that nobody wants to touch them.&lt;/p&gt;

&lt;p&gt;The code keeps moving underneath.&lt;/p&gt;

&lt;p&gt;Resilient starts somewhere else. For application-owned executable contracts, the code that runs is the primary source of truth. Its signatures, defaults, operations, control flow, callbacks, and return paths already contain the contract. That evidence belongs in a model any tool can query, not only in the diagnostics of whichever linter happens to be running. The job is to read that evidence, carry it to the places where it matters, and report contradictions before they become runtime surprises.&lt;/p&gt;

&lt;p&gt;This is not a claim that dynamic JavaScript is completely knowable. It is a decision about what to do with the part that is knowable, and about where the responsibility for handling it should sit.&lt;/p&gt;

&lt;p&gt;Report contradictions. Preserve unknowns. Keep runtime safety visible. That responsibility belongs to the tooling, not to a second syntax layered on top of the language. For Resilient, annotations that merely restate executable boundaries are an anti-pattern: they create a second description of the same fact that must remain in agreement by hand. Resilient asks the language to keep saying what it already says, and asks the tooling to get better at listening.&lt;/p&gt;

&lt;h3&gt;
  
  
  A boundary is already a declaration
&lt;/h3&gt;

&lt;p&gt;A boundary is where code hands a value to another responsibility: a function parameter, a return path, an object property, or a callback argument. Consider this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function tells us that it accepts an object-shaped boundary. The default tells us what absence means for &lt;code&gt;title&lt;/code&gt;. The operation tells us that the value must be string-like. The call supplies a known number-like value.&lt;/p&gt;

&lt;p&gt;There is no missing information that needs to be restated before the error can be understood. For this input boundary, the signature is not documentation about the contract. It is the contract.&lt;/p&gt;

&lt;p&gt;The same is true for a return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loadItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="nf"&gt;loadItems&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The return path produces an array-like value. The later operation is string-like. The contradiction belongs at the use of the returned value. A separate return declaration would repeat the evidence; it would not create it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the contract becomes visible
&lt;/h3&gt;

&lt;p&gt;A contract becomes visible wherever responsibility changes hands. A function receives something. A call makes a demand. A return carries a result forward. An object exposes some things and keeps other things private. An operation reveals what a value is expected to be. A callback, a module, or a branch makes the same kind of promise in a different form.&lt;/p&gt;

&lt;p&gt;These are not annotations added beside the program. They are the places where the program declares an expectation in executable form. The full implementation inventory belongs in the &lt;a href="https://github.com/augurone/artikulates-resilient/blob/main/docs/reference/contracts.md" rel="noopener noreferrer"&gt;contract documentation&lt;/a&gt;; the principle is simpler: where code changes hands, its expectations become visible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Defaults defend execution
&lt;/h3&gt;

&lt;p&gt;Defensive defaults are sometimes accused of hiding broken data. That criticism confuses two different jobs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&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="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default is an operational fail-safe for a missing or &lt;code&gt;undefined&lt;/code&gt; value. It keeps that absence from needlessly destroying the consuming path. It does not validate an arbitrary API payload. It does not make &lt;code&gt;null&lt;/code&gt; array-like. It does not make a known number acceptable as &lt;code&gt;items&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;resilient.configs.contracts&lt;/code&gt; enabled, when the source provides enough evidence, the development pipeline still flags the contradiction at the boundary. The application gets its intended absence behavior. The developer gets a diagnostic.&lt;/p&gt;

&lt;p&gt;Those are not competing goals. A user should not have to experience every upstream failure for a developer to learn that the contract was wrong.&lt;/p&gt;

&lt;p&gt;A default tells the analyzer a property is not required. If absence already has a defined meaning, flagging that absence would be a false error. A function parameter without a default carries no such absence policy, so a known local call that omits it can still be reported for arity. The default does not just protect execution; it is what marks a boundary as open to absence in the first place.&lt;/p&gt;

&lt;h3&gt;
  
  
  The evidence has to travel
&lt;/h3&gt;

&lt;p&gt;Once a contract is visible, it must remain available as the value moves. That is a different problem from identifying the boundary. Resilient propagates known contracts through aliases, returns, object properties, callbacks, local imports, re-export barrels, and known higher-order calls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;makeReader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;makeReader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The value is still a function after it is returned and stored on an object. The call still crosses a boundary. The source did not stop being understandable because the value took a short trip through the program.&lt;/p&gt;

&lt;p&gt;The same evidence can survive a resolved local module boundary and a destructure, even when no native operation follows immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// article.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getArticle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// view.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getArticle&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./article.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;summery&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getArticle&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// known returned shape: `summery` is absent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The typo is visible because the imported return shape remains part of the consumer’s evidence. The contract did not disappear just because the value crossed a file boundary and changed shape through destructuring.&lt;/p&gt;

&lt;p&gt;The project graph has two useful views:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Passive Tree: indexed source and contracts
        |
        +-- Active Tree: selected root and closure
                |
                +-- consumer diagnostics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Passive Tree indexes available project definitions, signatures, capabilities, and relationships. The Active Tree follows the statically resolvable path from a selected root through local module edges. The analyzer reasons from the source present in that tree and records external, dynamic, unresolved, and unsupported edges as unknown.&lt;/p&gt;

&lt;p&gt;When a provider changes, an ESLint run that includes an affected consumer rebuilds the relevant graph and analyzes the consumer again. Change the provider; the consumer call site receives the updated contract evidence.&lt;/p&gt;

&lt;p&gt;Unused files remain indexed but inactive. External and unsupported edges remain unknown. Nothing gets pulled into the active analysis because the engine felt optimistic that it probably knew what was there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unknown is not failure
&lt;/h3&gt;

&lt;p&gt;Some values cannot be known statically. API responses, database records, configuration files, dynamic properties, and third-party implementations are real boundaries. A tool that assigns certainty to them is not being helpful. It is fabricating inventory.&lt;/p&gt;

&lt;p&gt;Resilient keeps those values unknown until runtime validation, falsification, normalization, or an explicit guard establishes more evidence. Unknown is a boundary marker, not a final endorsement. When a value enters authored code, that marker tells us where a guard or normalizer may be needed. Unknown does not mean that every surrounding safety rule turns off. A dynamic value can still be subject to callback guards, failure ownership, mutation policy, and native runtime behavior.&lt;/p&gt;

&lt;p&gt;The distinction is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;known         → check it
contradictory → report it
unknown       → preserve it, avoid fabricated certainty, and keep safety obligations visible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a better result than turning uncertainty into a confident lie.&lt;/p&gt;

&lt;h3&gt;
  
  
  The value and the operation must agree
&lt;/h3&gt;

&lt;p&gt;A contract is not just a bag of allowed property names. The receiver, the operation, the callback, and the result belong to the same story. The same agreement that governs a return path also governs any native method called on that value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ready&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ready&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first operation agrees with the array-like result of &lt;code&gt;Object.entries&lt;/code&gt;. The second does not. Likewise, &lt;code&gt;[].map(...)&lt;/code&gt; makes sense while &lt;code&gt;[].trim()&lt;/code&gt; does not.&lt;/p&gt;

&lt;p&gt;Native prototype methods provide evidence about the value being used. Resilient protects that agreement. A familiar method name is not automatically valid on every receiver.&lt;/p&gt;

&lt;h3&gt;
  
  
  Safety is larger than value compatibility
&lt;/h3&gt;

&lt;p&gt;The most expensive failures are not always about a number reaching a string operation. They are often failures of ownership and control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an optional callback is invoked without a function guard;&lt;/li&gt;
&lt;li&gt;a promise rejection is dropped;&lt;/li&gt;
&lt;li&gt;an object owned by another boundary is mutated;&lt;/li&gt;
&lt;li&gt;a value-producing path returns an incompatible fallback;&lt;/li&gt;
&lt;li&gt;a silent &lt;code&gt;catch&lt;/code&gt; discards the failure;&lt;/li&gt;
&lt;li&gt;collection work is hidden inside loop state that obscures what is happening.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are dialect policies. They are not pretend types.&lt;/p&gt;

&lt;p&gt;Inference explains what the source proves. Policy decides what the project permits. An analyzer can understand a rejected mutation so later reads remain accurate while the dialect still rejects the mutation as unsafe.&lt;/p&gt;

&lt;p&gt;That separation is important. The machinery needs to understand what happened even when the code is not allowed to keep doing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model the boundary, not every brick
&lt;/h3&gt;

&lt;p&gt;Not every external model is redundant. A runtime schema or validator for an API payload, persisted record, versioned event, or public package surface has an independent job. It may validate data, define a compatibility boundary, generate documentation, or serve consumers who cannot inspect the implementation.&lt;/p&gt;

&lt;p&gt;Those models cross ownership, time, or a runtime boundary. They have a life outside the function that happens to consume them. That is different from placing a granular description on every local value whose behavior is already visible in the source.&lt;/p&gt;

&lt;p&gt;Model the things that cross meaningful boundaries. Infer the things that happen inside them. The model earns its keep when it has an independent job to do.&lt;/p&gt;

&lt;p&gt;The code should not have to carry a second structure just to prove that it has one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tooling should read the code
&lt;/h3&gt;

&lt;p&gt;The editor should be able to ask the code what it means. That is the model promised from the start: evidence that lives independently of any single consumer.&lt;/p&gt;

&lt;p&gt;Resilient’s contract core exposes signatures, value families, object shapes, return contracts, source stacks, module agreements, and diagnostics independently of ESLint. ESLint is one consumer of that model, not its owner.&lt;/p&gt;

&lt;p&gt;The implementation is open for inspection in the &lt;a href="https://github.com/augurone/artikulates-resilient/tree/main/rules/contracts" rel="noopener noreferrer"&gt;contract source&lt;/a&gt;, and the public API is documented in the &lt;a href="https://github.com/augurone/artikulates-resilient/blob/main/docs/reference/contracts.md" rel="noopener noreferrer"&gt;contract documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Human documentation still matters. It should explain purpose, context, examples, caveats, and external semantics. It should not become an alternate authority that disagrees with the executable boundary.&lt;/p&gt;

&lt;p&gt;The best documentation is not always more text. Sometimes it is a default in the right place, an explicit rest element, a guard before a callback, a return path that agrees with itself, or a native method that says exactly what the code is doing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The code is the contract
&lt;/h3&gt;

&lt;p&gt;I am not trying to invent a better language. I want standard JavaScript to be largely true to itself: readable by people, inspectable by tools, and disciplined at the places where values and responsibilities change hands.&lt;/p&gt;

&lt;p&gt;The code defines the boundary. Defaults define absence and express property intent (for example, a default should assign a testable, type-appropriate empty value where no other value is appropriate—'', [], {}, false, or 0—not null or undefined). Rest elements define intentional, contextual passthrough where the boundary allows it; they are not relevant to every transformation. Operations test whether the value and its behavior agree. Guards define safe optional behavior. Return paths define the result. Policies define ownership and failure handling.&lt;/p&gt;

&lt;p&gt;The code is the thing that has to survive. It is the load-bearing structure. Make it legible. Make its boundaries carry their own weight. Make the tools inspect what is actually there.&lt;/p&gt;

&lt;p&gt;Do not build a second structure to explain the first.&lt;/p&gt;

&lt;h3&gt;
  
  
  References: conceptual and theoretical
&lt;/h3&gt;

&lt;p&gt;This position did not arrive from nothing. These works either support it directly or shaped the instincts behind it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Douglas Crockford, &lt;em&gt;JavaScript: The Good Parts&lt;/em&gt;.&lt;/strong&gt; The case for treating a language as a chosen, disciplined subset rather than everything it permits is the direct ancestor of calling Resilient’s rules a dialect, not a type system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elijah Manor, &lt;a href="https://elijahmanor.github.io/talks/js-smells/" rel="noopener noreferrer"&gt;“Eliminate JavaScript Code Smells”&lt;/a&gt;.&lt;/strong&gt; A JavaScript-native vocabulary for recognizing runtime and control-flow hazards—dropped rejections, unguarded callbacks, silent catches—as smells worth catching, rather than treating them as a matter of taste.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Martin Fowler and Kent Beck, &lt;em&gt;Refactoring&lt;/em&gt;.&lt;/strong&gt; The book that popularized and developed “code smell” as a practical vocabulary for structural problems: a smell is evidence of a deeper issue, not a cosmetic complaint, which is why these policies are enforced rather than merely suggested.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kyle Simpson, &lt;a href="https://github.com/getify/You-Dont-Know-JS/tree/2nd-ed/types-grammar" rel="noopener noreferrer"&gt;&lt;em&gt;You Don’t Know JS: Types &amp;amp; Grammar&lt;/em&gt;&lt;/a&gt;.&lt;/strong&gt; A narrative, JS-native case for respecting the value and operation behavior that JavaScript actually provides—the same instinct behind treating a default as absence-handling rather than payload validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peter Naur, &lt;a href="https://pages.cs.wisc.edu/~remzi/Naur.pdf" rel="noopener noreferrer"&gt;“Programming as Theory Building”&lt;/a&gt;.&lt;/strong&gt; Support for the claim that a signature is not documentation about the contract—it is the contract, because the executable structure carries the real theory of what a program does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Findler and Felleisen, &lt;a href="https://dl.acm.org/doi/10.1145/581478.581484" rel="noopener noreferrer"&gt;“Contracts for Higher-Order Functions”&lt;/a&gt; (ICFP 2002).&lt;/strong&gt; A formal foundation for higher-order contracts and blame as boundary obligations between a provider and a consumer—close to the academic ancestor of what this piece calls a boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Siek and Taha, &lt;a href="https://www.researchgate.net/profile/Jeremy-Siek/publication/213883236_Gradual_typing_for_functional_languages/links/0912f507f2204802df000000/Gradual-typing-for-functional-languages.pdf" rel="noopener noreferrer"&gt;“Gradual Typing for Functional Languages”&lt;/a&gt; (2006).&lt;/strong&gt; The formal case for letting typed and dynamic regions coexist at an explicit boundary, closest in spirit to preserving &lt;code&gt;unknown&lt;/code&gt; values rather than forcing them into a type. Resilient does not implement gradual typing; the kinship is in the boundary, not the mechanism.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>eslint</category>
      <category>softwareengineering</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
