<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Compatibility on Brian Faust</title><link>https://vacua.dev/tags/compatibility/</link><description>Recent content in Compatibility 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/tags/compatibility/rss.xml" rel="self" type="application/rss+xml"/><item><title>Stored Data Is a Caller You Cannot Find with Code Search</title><link>https://vacua.dev/thoughts/stored-data-is-a-caller-you-cannot-find-with-code-search/</link><pubDate>Sun, 01 Dec 2019 00:00:00 +0000</pubDate><guid>https://vacua.dev/thoughts/stored-data-is-a-caller-you-cannot-find-with-code-search/</guid><description>&lt;p&gt;An enum migration looked mechanical. A package-backed value object became a
native PHP backed enum. The domain concept stayed the same, the new cases were
easy to search, and current code wrote the canonical values.&lt;/p&gt;
&lt;p&gt;Then an older row loaded a lowercase value. The native enum expected the same
word with different casing and rejected it during hydration.&lt;/p&gt;
&lt;p&gt;The missing caller was not in the source tree. It was sitting in the database.&lt;/p&gt;</description></item><item><title>Deprecation Is a Migration, Not a Warning</title><link>https://vacua.dev/thoughts/deprecation-is-a-migration-not-a-warning/</link><pubDate>Tue, 01 Oct 2019 00:00:00 +0000</pubDate><guid>https://vacua.dev/thoughts/deprecation-is-a-migration-not-a-warning/</guid><description>&lt;p&gt;A billing rewrite introduced durable export records before removing several
legacy queue jobs. Each new worker carried a record identifier. The export
type, payload snapshot, attempts, failure details, and retry state lived in the
database. A registry selected the current handler.&lt;/p&gt;
&lt;p&gt;That order matters. A queued object is not merely code waiting to run. Its
serialized class name and properties are data. Delete the class while an old
payload remains, and PHP can deserialize it as an incomplete object which no
longer has the method the worker expects.&lt;/p&gt;</description></item><item><title>Renaming a Field Is a Protocol Migration</title><link>https://vacua.dev/thoughts/renaming-a-field-is-a-protocol-migration/</link><pubDate>Thu, 01 Nov 2018 00:00:00 +0000</pubDate><guid>https://vacua.dev/thoughts/renaming-a-field-is-a-protocol-migration/</guid><description>&lt;p&gt;An API changes &lt;code&gt;serviceIds&lt;/code&gt; to &lt;code&gt;deliveryOptionIds&lt;/code&gt;. The new name describes the
domain better. The implementation becomes easier to read.&lt;/p&gt;
&lt;p&gt;An existing client still sends:&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-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;serviceIds&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;express&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&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 request now fails validation before any application code runs.&lt;/p&gt;
&lt;p&gt;Nothing about the client&amp;rsquo;s intent changed. The server chose a cleaner name and
turned that preference into a breaking protocol change.&lt;/p&gt;
&lt;p&gt;Once another process sends a field, renaming it is no longer a refactor. It is
a migration involving deployed callers whose release schedule the server may
not control.&lt;/p&gt;</description></item><item><title>Data Outlives the Code That Created It</title><link>https://vacua.dev/thoughts/data-outlives-the-code-that-created-it/</link><pubDate>Fri, 01 Dec 2017 00:00:00 +0000</pubDate><guid>https://vacua.dev/thoughts/data-outlives-the-code-that-created-it/</guid><description>&lt;p&gt;A failed queue record kept returning. Its payload named a mail class the
running application could not resolve correctly, so retrying it could only
repeat the same failure.&lt;/p&gt;
&lt;p&gt;The retained workaround was blunt: once a minute, delete failed records whose
payload matched that job. It stopped an unusable delivery attempt from
disturbing the queue. It did not make the payload readable.&lt;/p&gt;
&lt;p&gt;That small incident exposes an awkward storage contract. Serializing an
executable object does not merely store its arguments. It preserves facts about
the code which created it: class name, namespace, property layout, and sometimes
framework behavior. The payload can live much longer than those facts.&lt;/p&gt;</description></item></channel></rss>