<?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: Adam Dworzyński</title>
    <description>The latest articles on DEV Community by Adam Dworzyński (@adworzynski).</description>
    <link>https://dev.to/adworzynski</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%2F4028855%2F989ccf63-bcc1-4686-bfce-975d76eb7972.png</url>
      <title>DEV Community: Adam Dworzyński</title>
      <link>https://dev.to/adworzynski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adworzynski"/>
    <language>en</language>
    <item>
      <title>EA as code: judgment vs. proof</title>
      <dc:creator>Adam Dworzyński</dc:creator>
      <pubDate>Tue, 14 Jul 2026 14:17:27 +0000</pubDate>
      <link>https://dev.to/adworzynski/ea-as-code-judgment-vs-proof-lgp</link>
      <guid>https://dev.to/adworzynski/ea-as-code-judgment-vs-proof-lgp</guid>
      <description>&lt;h1&gt;
  
  
  EA as code: judgment vs. proof
&lt;/h1&gt;

&lt;p&gt;Your AI will happily tell you your architecture is consistent. That's a guess.&lt;/p&gt;

&lt;p&gt;Ask any capable model to review a system design and it answers in fluent, confident prose: the boundaries look clean, the dependencies make sense, this all hangs together. It reads like a verdict. It's an impression — pattern-matched from text, with nothing underneath checking whether the thing it describes holds together. When the model says your architecture is sound, not one word of that sentence was verified.&lt;/p&gt;

&lt;p&gt;I spent a long time doing enterprise architecture the ordinary way, and the same gap was there long before the models arrived. The architecture lived in slide decks and wiki pages. "The architecture is consistent" was a sentence someone wrote, not a fact anyone could check. The AI didn't create the problem. It just made it faster to produce, and gave the guess a more convincing voice.&lt;/p&gt;

&lt;p&gt;So I built the other half. It's called EAaC — enterprise architecture as code — and the whole idea fits in one line: &lt;strong&gt;the deterministic part proves; the AI part judges, and never the reverse.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways prose architecture fails
&lt;/h2&gt;

&lt;p&gt;Think about where most architecture lives. Not in a system that understands it — in documents that describe it. That produces three failures, and they compound.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unvalidatable prose.&lt;/strong&gt; "The architecture is consistent" is an assertion nobody can check. There is no button to press, no exit code, no test that goes red. It's true until someone notices it isn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monolithic, lock-in-prone tooling.&lt;/strong&gt; The moment you do reach for rigor, one vendor's modeler owns your model — and it's only as portable, diffable, and reviewable as their export button lets it be. What should be open and checkable stays locked behind that button.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ungrounded AI assistance.&lt;/strong&gt; Now add a model on top. It's a spectacular writer and a confident reviewer, and it has no way to know whether what it just blessed is coherent. It guesses, in prose, and the prose is good enough that you believe it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the shape they share: something that should be &lt;em&gt;checkable&lt;/em&gt; is left as &lt;em&gt;narrative&lt;/em&gt;. Fix that one thing and all three ease at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  The split
&lt;/h2&gt;

&lt;p&gt;EAaC makes one move. Separate the parts of architecture that must be &lt;em&gt;provably correct&lt;/em&gt; from the parts that require &lt;em&gt;judgment&lt;/em&gt;. Give the correct parts one home that no host or vendor owns. And treat the body of architectural knowledge — the methods, the types, the rules — as &lt;strong&gt;data the system reads&lt;/strong&gt;, not logic it hardcodes.&lt;/p&gt;

&lt;p&gt;Concretely, that's two things with a hard line between them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A small &lt;strong&gt;deterministic core&lt;/strong&gt; (&lt;code&gt;ea&lt;/code&gt;, plain tested Python) that owns every operation with a single correct answer: validate, scaffold, graph, report, promote, migrate. Same inputs in, byte-identical output out. No wall-clock, no randomness, no network, no model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adapter surfaces&lt;/strong&gt; — today, a Claude Code plugin and a Google Antigravity plugin — where the AI lives. They tailor a methodology to your org, help author artifacts, advise. They &lt;em&gt;propose&lt;/em&gt;. The core &lt;em&gt;decides and writes&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one integration boundary between them is a CLI contract: JSON on stdout, plus exit codes. Everything above that line is judgment. Everything below it is determinism. An agent can't smuggle a guess past the core, because the only way to change your repository is to hand the core a proposal and let it check and apply it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof is an exit code
&lt;/h2&gt;

&lt;p&gt;This is the part that sounds like marketing until you run it, so run it.&lt;/p&gt;

&lt;p&gt;Here's a real architecture — a payments system. One command asks the core whether it's consistent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea validate &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;span class="go"&gt;{ "status": "ok", "diagnostics": [] }
exit: 0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit 0. Not "looks fine" — &lt;em&gt;checks out&lt;/em&gt;. Every reference resolves, every rule the method carries is satisfied. Now I'll break it the way a real change breaks things: a service that realizes a capability, pointed at a capability id that no longer exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/payment-processing/payment-processing-GONE/'&lt;/span&gt; …/card-authorization.md
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea validate &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;span class="go"&gt;{
  "status": "invalid",
  "diagnostics": [
    { "code": "reference.dangling",
      "message": "reference {type: capability, id: payment-processing-GONE} does not resolve" },
    { "code": "reference.shape",
      "message": "relationship 'realizes' target is not a valid reference" }
  ]
}
exit: 3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit 3. No human declared it fine; no model waved it through. The core found the dangling reference and said so, precisely, and it did it with an &lt;strong&gt;exit code&lt;/strong&gt;. Exit 3 means "the tool ran fine, the architecture is invalid," kept deliberately distinct from exit 1/2 (tool and usage errors) and exit 4 (a write-guard). A CI pipeline can then fail the build on a real architectural finding and nothing else:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ea validate --all&lt;/span&gt;    &lt;span class="c1"&gt;# exit 3 fails the build, with JSON diagnostics on stdout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your architecture's consistency is an exit code now, not an opinion in a document — a gate in your pipeline the build can fail on. The whole thesis, in one number.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fuy5lpuvi7o2zj40kfxjx.gif" class="article-body-image-wrapper"&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%2Farticles%2Fuy5lpuvi7o2zj40kfxjx.gif" alt="Terminal cast — ea validate --all passes (exit 0); then a broken capability reference flips it to invalid (exit 3) with precise diagnostics."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the AI helps
&lt;/h2&gt;

&lt;p&gt;None of this makes the model less useful. It makes it useful in the place it's good.&lt;/p&gt;

&lt;p&gt;Tailoring a methodology to a specific organization is judgment — it's elicitation, taste, tradeoffs, the stuff with no single right answer. Drafting a first artifact from a messy conversation is judgment. Advising on what's missing is judgment. That work belongs to the surface agent, and the core stays out of it entirely: no authoring intelligence, no "AI reviewer," nothing that requires taste, lives below the line.&lt;/p&gt;

&lt;p&gt;The discipline that keeps this honest is &lt;em&gt;elicit-first&lt;/em&gt;. The agent doesn't pre-draft your whole architecture and take one bulk approval — it draws the substance out of you one step at a time, and every write is still gated. Every mutating command is dry-run by default: it returns a plan bound to a content-derived token, and only re-running with that token applies it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea init
&lt;span class="go"&gt;{ "status": "ok",
  "writes": ["ea.manifest.yaml"],
  "confirmation_token": "sha256:cfe221b992aeb…31636d" }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent proposes the change; you (or the core, on your say-so) confirm the exact bytes. If the repository drifted in between, the token no longer matches and the core refuses. The model never gets to be the thing that silently rewrites your source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methods are data, not code
&lt;/h2&gt;

&lt;p&gt;The last piece is what makes this more than one team's opinion about architecture. The methods themselves — the types you can model, the relationships between them, the rules that must hold — ship as versioned &lt;strong&gt;Method Packs&lt;/strong&gt;: plain YAML the core reads at runtime. Adopting a methodology is configuration, not a code change.&lt;/p&gt;

&lt;p&gt;The first build command fetches a pack library; from there everything resolves offline and deterministically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea pack fetch https://github.com/adworzynski/ea-as-code.git
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea init &lt;span class="nt"&gt;--confirm&lt;/span&gt; &amp;lt;token&amp;gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea preset list                    &lt;span class="c"&gt;# enterprise-architecture · lean-ux · open-agile-architecture&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea manifest adopt lean-ux &lt;span class="nt"&gt;--confirm&lt;/span&gt; &amp;lt;token&amp;gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea project create checkout &lt;span class="nt"&gt;--confirm&lt;/span&gt; &amp;lt;token&amp;gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea scaffold hypothesis &lt;span class="nt"&gt;--project&lt;/span&gt; checkout &lt;span class="nt"&gt;--id&lt;/span&gt; faster-checkout
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea validate &lt;span class="nt"&gt;--all&lt;/span&gt;                 &lt;span class="c"&gt;# exit 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ea scaffold&lt;/code&gt; doesn't just make an empty file — it hands back a typed stub plus the authoring guidance that pack defines: which fields to fill, which relationships are allowed, the steps to follow. The same division shows up here in miniature. The pack supplies the structure and the standard; you supply the judgment that fills it in; the core proves the result is well-formed.&lt;/p&gt;

&lt;p&gt;Three archetypes ship today — a rigorous four-domain &lt;strong&gt;Enterprise Architecture&lt;/strong&gt; grounded in TOGAF's ADM, a lightweight outcomes-first &lt;strong&gt;Lean UX&lt;/strong&gt;, and a full outside-in &lt;strong&gt;Open Agile Architecture&lt;/strong&gt;. The same engine runs all three, because the engine doesn't know any of them. It reads them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The claim is falsifiable, which is the point. Clone the repo and let the core prove an existing architecture consistent on your own machine — the shipped example needs no setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git clone https://github.com/adworzynski/ea-as-code.git
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;ea-as-code/examples/payments-oaa/repo
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ea validate &lt;span class="nt"&gt;--all&lt;/span&gt;        &lt;span class="c"&gt;# exit 0 — see for yourself&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/adworzynski/ea-as-code" rel="noopener noreferrer"&gt;github.com/adworzynski/ea-as-code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://adworzynski.github.io/ea-as-code/" rel="noopener noreferrer"&gt;adworzynski.github.io/ea-as-code&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep the model for what it's great at — the judgment, the drafting, the conversation. Stop letting it be the thing that tells you your architecture is sound. Let something that can actually check answer that one, in an exit code.&lt;/p&gt;

</description>
      <category>enterprisearchitecture</category>
      <category>ai</category>
      <category>determinism</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
