<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Domain Discovery and Integration on Brian Faust</title><link>https://vacua.dev/series/domain-discovery-and-integration/</link><description>Recent content in Domain Discovery and Integration on Brian Faust</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://vacua.dev/series/domain-discovery-and-integration/rss.xml" rel="self" type="application/rss+xml"/><item><title>An Open Host Service Is Not a Published Language</title><link>https://vacua.dev/an-open-host-service-is-not-a-published-language/</link><pubDate>Fri, 01 Jul 2022 00:00:00 +0000</pubDate><guid>https://vacua.dev/an-open-host-service-is-not-a-published-language/</guid><description>&lt;p&gt;Inventory exposes one endpoint to Storefront, Fulfilment, and Replenishment:&lt;/p&gt;
&lt;figure class="code-figure"&gt;
 &lt;div class="code-block" data-copy-code&gt;
 &lt;button class="copy-code" type="button" aria-label="Copy code"&gt;copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET /availability/{sku}?location={location}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/figure&gt;
&lt;p&gt;The route, authentication, media type, and JSON shape remain unchanged. One
release quietly redefines &lt;code&gt;available_quantity&lt;/code&gt;. Yesterday it meant physical
stock at the location. Today it means stock which may still be promised after
reservations and holds.&lt;/p&gt;
&lt;p&gt;Every request still returns &lt;code&gt;200&lt;/code&gt;. Schema validation still sees an integer.
Storefront, Fulfilment, and Replenishment now act on a different fact.&lt;/p&gt;</description></item><item><title>An API Cannot Tell You Who Has Influence</title><link>https://vacua.dev/an-api-cannot-tell-you-who-has-influence/</link><pubDate>Wed, 01 Jun 2022 00:00:00 +0000</pubDate><guid>https://vacua.dev/an-api-cannot-tell-you-who-has-influence/</guid><description>&lt;p&gt;Two Order Management features call the same Payments endpoint. They use the
same schema, service credential, and provider-managed release process.&lt;/p&gt;
&lt;p&gt;The first feature needs a &lt;code&gt;reversal_reason&lt;/code&gt;. Orders raises the request,
Payments accepts it into quarterly planning, and a Payments owner commits to a
compatibility window.&lt;/p&gt;
&lt;p&gt;The second feature asks for another Orders-specific field. Payments declines
it as outside the product roadmap. Orders decides that the generic refund
status is adequate for its support view and accepts the cost of adapting when
the provider contract changes.&lt;/p&gt;</description></item><item><title>An Anti-Corruption Layer Must Own the Translation</title><link>https://vacua.dev/an-anti-corruption-layer-must-own-the-translation/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://vacua.dev/an-anti-corruption-layer-must-own-the-translation/</guid><description>&lt;p&gt;Payments adds a refund state named &lt;code&gt;reversed&lt;/code&gt;. Order Management already has a
default branch for provider failures, so the new event keeps moving:&lt;/p&gt;
&lt;figure class="code-figure"&gt;
 &lt;div class="code-block" data-copy-code&gt;
 &lt;button class="copy-code" type="button" aria-label="Copy code"&gt;copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;anything except completed ──▶ provider-refund-failed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/figure&gt;
&lt;p&gt;Nothing crashes. That is the problem.&lt;/p&gt;
&lt;p&gt;The provider has reported a fact, but Orders has invented its consequence. A
reversed refund might reopen the order, create a debt, require manual recovery,
or leave the order cancelled while Finance resolves the money. The provider
enum cannot choose among those policies.&lt;/p&gt;</description></item><item><title>A Context Map Must Say What the Arrow Means</title><link>https://vacua.dev/a-context-map-must-say-what-the-arrow-means/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://vacua.dev/a-context-map-must-say-what-the-arrow-means/</guid><description>&lt;p&gt;The cancellation workshop ends with three boxes: Orders, Payments, and
Fulfilment. Someone connects them in event order. The diagram looks plausible.&lt;/p&gt;
&lt;p&gt;It is also impossible to read.&lt;/p&gt;
&lt;p&gt;Does the arrow mean an HTTP request, a domain event, a dependency, ownership,
or influence over another model? Does it describe the system that exists or
the one the team hopes to build? Who translates “refund declined” into an
order state? The line answers none of these questions.&lt;/p&gt;</description></item><item><title>Shared Kernel or Published Language: Choose Where Coordination Lives</title><link>https://vacua.dev/integration-patterns-shared-kernel-vs-published-language/</link><pubDate>Tue, 01 Mar 2022 00:00:00 +0000</pubDate><guid>https://vacua.dev/integration-patterns-shared-kernel-vs-published-language/</guid><description>&lt;p&gt;Billing and fulfilment both use the word “order.” Sharing an &lt;code&gt;Order&lt;/code&gt; class
looks like the obvious way to keep them consistent.&lt;/p&gt;
&lt;p&gt;Then billing adds credit notes, tax evidence, and settlement state. Fulfilment
adds picking waves, split shipments, and packing exceptions. The shared class
either accumulates both models or becomes a negotiation every time one team
changes it.&lt;/p&gt;
&lt;p&gt;Integration always creates coordination. A Shared Kernel and a Published
Language place that coordination in different locations. The first shares a
small piece of model and requires teams to change it together. The second
shares a versioned language at the boundary and lets each side translate it
into its own model.&lt;/p&gt;</description></item><item><title>EventStorming Finds Disagreement Before It Finds Services</title><link>https://vacua.dev/domain-modeling-workshops-eventstorming-in-practice/</link><pubDate>Tue, 01 Feb 2022 00:00:00 +0000</pubDate><guid>https://vacua.dev/domain-modeling-workshops-eventstorming-in-practice/</guid><description>&lt;p&gt;Ask sales, support, finance, and engineering when an order becomes cancelled
and the answers may sound compatible until they share a wall.&lt;/p&gt;
&lt;p&gt;Sales says cancellation happens when the customer asks. Support says it
happens after a case is approved. Finance says a paid order remains active
until the refund clears. Engineering points to a &lt;code&gt;cancelled_at&lt;/code&gt; column written
before the payment provider responds.&lt;/p&gt;
&lt;p&gt;That disagreement is not workshop noise. It is the model.&lt;/p&gt;</description></item></channel></rss>