<?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: crevilla2050</title>
    <description>The latest articles on DEV Community by crevilla2050 (@crevilla2050).</description>
    <link>https://dev.to/crevilla2050</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%2F1394073%2F7784f346-7865-45d7-a99b-d0f7e082283f.jpeg</url>
      <title>DEV Community: crevilla2050</title>
      <link>https://dev.to/crevilla2050</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/crevilla2050"/>
    <language>en</language>
    <item>
      <title>The Dennis-on-Dennis Experiment: How a Malkovich Moment Led to Architecture Discovery</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Wed, 10 Jun 2026 13:45:21 +0000</pubDate>
      <link>https://dev.to/crevilla2050/the-dennis-on-dennis-experiment-how-a-malkovich-moment-led-to-architecture-discovery-3hj6</link>
      <guid>https://dev.to/crevilla2050/the-dennis-on-dennis-experiment-how-a-malkovich-moment-led-to-architecture-discovery-3hj6</guid>
      <description>&lt;p&gt;&lt;strong&gt;A duplicate-capability detector, a persistent Malkovich reference, several suspicious timestamp colonies, and the unexpected birth of architecture archaeology inside Dennis.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Body Appears
&lt;/h2&gt;

&lt;p&gt;During one of those late-night coding sessions where strange ideas tend to wander into the room uninvited, my brain had thrown an odd association onto the table:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Being John Malkovich.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the time, it made absolutely no sense.&lt;/p&gt;

&lt;p&gt;I wasn't thinking about movies.&lt;/p&gt;

&lt;p&gt;I wasn't thinking about architecture.&lt;/p&gt;

&lt;p&gt;I was looking at code.&lt;/p&gt;

&lt;p&gt;So I ignored it and moved on.&lt;/p&gt;

&lt;p&gt;Anyone who has worked on software long enough already knows where this is going.&lt;/p&gt;

&lt;p&gt;Days later, the idea was still there, sitting quietly in the corner of the room like a witness who had seen something important and wasn't leaving until someone asked the right question.&lt;/p&gt;

&lt;p&gt;Eventually curiosity won.&lt;/p&gt;

&lt;p&gt;The investigation began.&lt;/p&gt;

&lt;p&gt;At 6 PM that evening, the original plan was innocent enough:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Find duplicate code.
2. Write a detector.
3. Generate a report.
4. Go to sleep. 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;“Enough for one coding night.” Naive Carlos thought.&lt;/p&gt;

&lt;p&gt;The objective was simple: detect duplicate capabilities.&lt;br&gt;
Not duplicate files.&lt;br&gt;
Not duplicate lines.&lt;br&gt;
Capabilities.&lt;/p&gt;

&lt;p&gt;The kind of duplication that survives refactoring, renaming, and cosmetic changes.&lt;/p&gt;

&lt;p&gt;To do this, Dennis began parsing functions into Abstract Syntax Trees, stripping away irrelevant details, and comparing their normalized behavior.&lt;/p&gt;

&lt;p&gt;The first results looked promising.&lt;/p&gt;

&lt;p&gt;Then they started looking strange.&lt;/p&gt;

&lt;p&gt;What appeared on the screen wasn't a list of duplicate functions.&lt;/p&gt;

&lt;p&gt;It was something else.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Something more organic.&lt;/li&gt;
&lt;li&gt;Functions were gathering in groups.&lt;/li&gt;
&lt;li&gt;Some shared names.&lt;/li&gt;
&lt;li&gt;Others didn't.&lt;/li&gt;
&lt;li&gt;Some lived on opposite sides of the codebase and appeared to have no relationship whatsoever. Yet they behaved identically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more examples appeared, the less the word duplicate seemed to fit.&lt;/p&gt;

&lt;p&gt;These things weren't copies.&lt;/p&gt;

&lt;p&gt;They behaved more like colonies.&lt;/p&gt;

&lt;p&gt;The first major suspect was a timestamp helper.&lt;/p&gt;

&lt;p&gt;Then another.&lt;br&gt;
Then another.&lt;br&gt;
Then another.&lt;/p&gt;

&lt;p&gt;A few were called ts().&lt;/p&gt;

&lt;p&gt;Some preferred timestamp().&lt;/p&gt;

&lt;p&gt;Others had managed to establish themselves in entirely different modules, apparently unaware of one another's existence.&lt;/p&gt;

&lt;p&gt;Like a particularly stubborn species of software wildlife, the same capability had evolved repeatedly throughout the ecosystem.&lt;/p&gt;

&lt;p&gt;At this point the investigation should have ended.&lt;/p&gt;

&lt;p&gt;The case seemed straightforward.&lt;/p&gt;

&lt;p&gt;Duplicate code had been found.&lt;/p&gt;

&lt;p&gt;Mission accomplished.&lt;/p&gt;

&lt;p&gt;Except there was a problem: The deeper I looked, the more obvious it became that not every colony was guilty.&lt;/p&gt;

&lt;p&gt;Some of them appeared to exist for perfectly legitimate reasons.&lt;br&gt;
And that realization changed everything.&lt;/p&gt;

&lt;p&gt;We weren't looking at duplicate code anymore.&lt;/p&gt;

&lt;p&gt;We were looking at architecture.&lt;/p&gt;
&lt;h2&gt;
  
  
  Not Every Shady Suspect Is a Criminal
&lt;/h2&gt;

&lt;p&gt;At this point the investigation had produced a respectable pile of suspects.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;• Timestamp helpers.
• Database connection helpers.
• Storage methods.
• Utility functions.
• The usual collection of questionable individuals one encounters while wandering through a codebase after midnight.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The next logical step seemed obvious. &lt;br&gt;
The new revisited plan for the night, v.2.0 looked like:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Flag everything.
2. Declare victory.
3. Write release notes.
4. Go to sleep.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Fortunately, the chickens intervened.&lt;/p&gt;

&lt;p&gt;Over the course of several Dennis articles, our brave and highly trained quality assurance chickens have repeatedly sacrificed themselves to protect the project from bad ideas.&lt;/p&gt;

&lt;p&gt;This was one of those moments.&lt;/p&gt;

&lt;p&gt;Because the more evidence we gathered, the less convincing the original theory became.&lt;/p&gt;

&lt;p&gt;Some colonies were clearly suspicious.&lt;/p&gt;

&lt;p&gt;Others appeared to be perfectly healthy.&lt;/p&gt;

&lt;p&gt;Consider the storage layer. Dennis discovered multiple implementations of methods such as:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;• execute()
• commit()
• rollback()
• close()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;At first glance, these looked exactly like duplicate capabilities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The detector was correct.&lt;/li&gt;
&lt;li&gt;The behavior was nearly identical.&lt;/li&gt;
&lt;li&gt;The AST structures matched.&lt;/li&gt;
&lt;li&gt;The colony was real.&lt;/li&gt;
&lt;li&gt;The detector wasn't wrong. The accusation was.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But calling this a bug would have been a mistake.&lt;/p&gt;

&lt;p&gt;These functions existed because multiple storage back-ends were implementing the same contract.&lt;/p&gt;

&lt;p&gt;The duplication was intentional.&lt;/p&gt;

&lt;p&gt;In fact, removing it would have damaged the design rather than improving it.&lt;/p&gt;

&lt;p&gt;The same thing happened when Dennis encountered abstract storage contracts.&lt;/p&gt;

&lt;p&gt;A collection of methods existed solely to define expected behavior.&lt;/p&gt;

&lt;p&gt;Again, the detector was technically correct.&lt;br&gt;
Again, the architectural interpretation was completely different.&lt;/p&gt;

&lt;p&gt;And that was the moment the investigation changed direction.&lt;br&gt;
We stopped asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this duplicated?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And started asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why does this colony of suspects exist?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That single question transformed the entire exercise.&lt;/p&gt;

&lt;p&gt;We were no longer performing duplicate detection.&lt;/p&gt;

&lt;p&gt;We were performing architecture analysis.&lt;/p&gt;

&lt;p&gt;The detector had found the bodies.&lt;/p&gt;

&lt;p&gt;Now we needed a detective. Or perhaps a classifier.&lt;/p&gt;

&lt;p&gt;In Dennis, the distinction is becoming increasingly difficult to see.&lt;/p&gt;
&lt;h2&gt;
  
  
  Teaching Dennis to Ask Better Questions
&lt;/h2&gt;

&lt;p&gt;The problem was no longer finding colonies.&lt;/p&gt;

&lt;p&gt;The detector was already doing that quite well.&lt;/p&gt;

&lt;p&gt;The problem was interpretation.&lt;/p&gt;

&lt;p&gt;A timestamp colony and a storage back-end colony might look remarkably similar at first glance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both contain repeated capabilities.&lt;/li&gt;
&lt;li&gt;Both appear in multiple locations.&lt;/li&gt;
&lt;li&gt;Both trigger the same detector.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet one may indicate architectural debt while the other may represent a perfectly valid design decision.&lt;/p&gt;

&lt;p&gt;The evidence alone was no longer enough.&lt;/p&gt;

&lt;p&gt;Dennis needed context.&lt;/p&gt;

&lt;p&gt;And context, as it turns out, is where architecture begins.&lt;/p&gt;

&lt;p&gt;The solution was to introduce a second layer.&lt;/p&gt;

&lt;p&gt;The detector would continue doing what detectors do best:&lt;br&gt;
-observe.&lt;/p&gt;

&lt;p&gt;A classifier would then attempt to answer a different question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why does this colony exist?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The distinction sounds subtle.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;One system reports facts.&lt;/p&gt;

&lt;p&gt;The other attempts to interpret them.&lt;/p&gt;

&lt;p&gt;That difference gave birth to the first architecture classifications.&lt;/p&gt;

&lt;p&gt;Some colonies became:&lt;br&gt;
&lt;strong&gt;INTERFACE_IMPLEMENTATION&lt;/strong&gt;&lt;br&gt;
Multiple implementations of the same contract.&lt;br&gt;
Expected.&lt;br&gt;
Intentional.&lt;br&gt;
Healthy.&lt;/p&gt;

&lt;p&gt;Others became:&lt;br&gt;
&lt;strong&gt;ABSTRACT_CONTRACT&lt;/strong&gt;&lt;br&gt;
Capabilities that exist to define behavior rather than implement it.&lt;br&gt;
Again, intentional. Again, healthy.&lt;/p&gt;

&lt;p&gt;And then there were the interesting ones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The timestamp colonies.&lt;/li&gt;
&lt;li&gt;The database helper colonies.&lt;/li&gt;
&lt;li&gt;The utility functions that seemed to appear wherever developers happened to need them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These became:&lt;br&gt;
&lt;strong&gt;SHARED_UTILITY_CANDIDATE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A deliberately cautious classification whose translation can be summarized as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Something interesting is happening here and a human should probably take a look."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result was surprisingly powerful.&lt;br&gt;
Dennis was no longer saying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I found duplicate code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dennis was saying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I found a colony, and here is my best explanation for why it exists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first time the classifications appeared on screen, something clicked.&lt;/p&gt;

&lt;p&gt;The output no longer looked like a list of duplicates.&lt;/p&gt;

&lt;p&gt;It looked like a map.&lt;/p&gt;

&lt;p&gt;At that moment, the project quietly crossed a line.&lt;/p&gt;

&lt;p&gt;The goal was never to build an architecture analysis system.&lt;/p&gt;

&lt;p&gt;Yet somehow, after following a trail of timestamp helpers, suspicious utility functions, and one particularly persistent Malkovich scene in my head, that is exactly where we arrived.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Dennis-on-Dennis Experiment
&lt;/h2&gt;

&lt;p&gt;At this point there was only one reasonable thing left to do.&lt;br&gt;
Point the system at itself.&lt;/p&gt;

&lt;p&gt;History suggests that this is usually a terrible idea.&lt;/p&gt;

&lt;p&gt;Most software projects become noticeably uncomfortable when asked to explain their own behavior.&lt;/p&gt;

&lt;p&gt;Fortunately, Dennis had already spent several releases learning how to produce evidence, explain intent, verify transformations, and justify its conclusions.&lt;/p&gt;

&lt;p&gt;So we did what any responsible engineer would do.&lt;/p&gt;

&lt;p&gt;We ignored all warning signs and turned the detector loose on the Dennis source tree.&lt;/p&gt;

&lt;p&gt;The results were immediate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timestamp colonies.&lt;/li&gt;
&lt;li&gt;Storage contracts.&lt;/li&gt;
&lt;li&gt;Backend implementations.&lt;/li&gt;
&lt;li&gt;Connection helpers.&lt;/li&gt;
&lt;li&gt;Utility functions.&lt;/li&gt;
&lt;li&gt;Entire architectural neighborhoods began emerging from the evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What surprised me was not that Dennis found these things. &lt;/p&gt;

&lt;p&gt;Nor was the goal to produce a formal measurement of my own coding habits.&lt;/p&gt;

&lt;p&gt;Any sufficiently determined human could have found them eventually.&lt;/p&gt;

&lt;p&gt;What surprised me was the form in which they appeared.&lt;/p&gt;

&lt;p&gt;The findings didn't feel like search results.&lt;/p&gt;

&lt;p&gt;They felt like observations.&lt;/p&gt;

&lt;p&gt;Almost like field notes from a software archaeologist wandering through an abandoned city:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Here is a timestamp colony.&lt;/li&gt;
&lt;li&gt;There appears to be an abstract storage contract over there.&lt;/li&gt;
&lt;li&gt;Someone has been breeding database connection helpers behind that building.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evidence slowly accumulated. And then something unexpected happened:&lt;br&gt;
The findings themselves began to feel insufficient.&lt;/p&gt;

&lt;p&gt;Knowing that a colony existed was useful. But knowing why it existed was far more valuable.&lt;/p&gt;

&lt;p&gt;That realization led to another architectural boundary. One that, in retrospect, seems obvious: Observations and evidence are not the same thing.&lt;/p&gt;

&lt;p&gt;Detectives learn this early. Software usually doesn't.&lt;/p&gt;

&lt;p&gt;An observation is a conclusion.&lt;/p&gt;

&lt;p&gt;Evidence is the reason the conclusion exists.&lt;/p&gt;

&lt;p&gt;Until now both concepts had been living together inside the same structure.&lt;/p&gt;

&lt;p&gt;The arrangement worked.&lt;/p&gt;

&lt;p&gt;Right up until the moment it didn't.&lt;/p&gt;

&lt;p&gt;Once the distinction became visible, it became impossible to ignore.&lt;/p&gt;

&lt;p&gt;The solution was surprisingly simple.&lt;/p&gt;

&lt;p&gt;Dennis would generate two separate artifacts.&lt;/p&gt;

&lt;p&gt;An observation index:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What Dennis believes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And an evidence store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Dennis believes it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The two would be connected through deterministic evidence hashes.&lt;/p&gt;

&lt;p&gt;The observation could remain small, portable, and easy to inspect.&lt;/p&gt;

&lt;p&gt;The evidence could remain detailed, verbose, and suitable for future analysis.&lt;/p&gt;

&lt;p&gt;At first glance this may appear to be a minor implementation detail.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;This was the moment architecture observations stopped being console output and started becoming first-class artifacts.&lt;/p&gt;

&lt;p&gt;The detective had finally learned how to interrogate witnesses and write credible case files. &lt;/p&gt;
&lt;h2&gt;
  
  
  Do It at Home
&lt;/h2&gt;

&lt;p&gt;The nice thing about the Dennis-on-Dennis experiment is that there is nothing particularly special about Dennis itself.&lt;br&gt;
The architecture scanner doesn't know anything about the project beforehand.&lt;/p&gt;

&lt;p&gt;It simply observes capabilities, groups them into colonies, and attempts to explain why they exist.&lt;/p&gt;

&lt;p&gt;If you want to try it yourself, clone Dennis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/crevilla2050/string-audit/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dennis plan .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will produce a dennis-plan.json file, right afterwards you can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis architecture scan &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dennis will generate two artifacts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;architecture-index-&amp;lt;timestamp&amp;gt;.json
architecture-evidence-&amp;lt;timestamp&amp;gt;.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The observation index contains what Dennis believes.&lt;br&gt;
The evidence store contains why Dennis believes it.&lt;br&gt;
If you are feeling particularly brave, you can then package the results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis pack plan.json experiment.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And verify that the architecture snapshots are preserved inside the DEX artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-tzf&lt;/span&gt; experiment.dex | &lt;span class="nb"&gt;grep &lt;/span&gt;architecture
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything went well, you should see timestamped architecture observations sitting quietly alongside the rest of the project payload.&lt;/p&gt;

&lt;p&gt;Congratulations.&lt;/p&gt;

&lt;p&gt;You have just performed the Dennis-on-Dennis experiment.&lt;/p&gt;

&lt;p&gt;The results may be more revealing than expected.&lt;/p&gt;

&lt;p&gt;If you suddenly discover timestamp colonies, suspicious utility functions, or architectural neighborhoods you were not aware existed, don't panic.&lt;/p&gt;

&lt;p&gt;The chickens assure me this is a normal side effect.&lt;/p&gt;

&lt;p&gt;The author accepts no responsibility for discoveries involving abstract contracts, utility colonies, or unexpectedly messy coding habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing the Case
&lt;/h2&gt;

&lt;p&gt;Looking back, what fascinates me most about this release is that none of it was planned.&lt;/p&gt;

&lt;p&gt;There was no grand roadmap entry called:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture Discovery Engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There was no design document describing capability colonies, architecture classifications, evidence stores, or observation indexes.&lt;/p&gt;

&lt;p&gt;There was only that Malkovich scene in my thoughts, that appeared during an early-morning coding session and refused to leave.&lt;/p&gt;

&lt;p&gt;A few days later, that thought had become code.&lt;/p&gt;

&lt;p&gt;And the code had started revealing things about Dennis that I had not explicitly taught it to see.&lt;/p&gt;

&lt;p&gt;Not because the system had become intelligent.&lt;/p&gt;

&lt;p&gt;Quite the opposite. There is no AI involved (yet) in all this. It was different.&lt;/p&gt;

&lt;p&gt;Because it had become more disciplined.&lt;/p&gt;

&lt;p&gt;The detector observed.&lt;/p&gt;

&lt;p&gt;The classifier interpreted.&lt;/p&gt;

&lt;p&gt;The evidence justified the conclusion.&lt;/p&gt;

&lt;p&gt;Every step remained deterministic.&lt;/p&gt;

&lt;p&gt;Every conclusion remained inspectable.&lt;/p&gt;

&lt;p&gt;And somewhere along the way, a duplicate-capability detector quietly evolved into an architecture investigation tool.&lt;/p&gt;

&lt;p&gt;By the end of the release, the observations had stopped being &lt;br&gt;
console output entirely.&lt;/p&gt;

&lt;p&gt;Dennis was generating timestamped architecture snapshots, preserving them as evidence artifacts, and quietly carrying them inside DEX packages alongside the transformations that produced them.&lt;/p&gt;

&lt;p&gt;The detective had started keeping case files.&lt;/p&gt;

&lt;p&gt;The most surprising part is that Dennis was not analyzing a customer's project.&lt;/p&gt;

&lt;p&gt;It was analyzing itself.&lt;/p&gt;

&lt;p&gt;The Dennis-on-Dennis experiment started as a curiosity experiment.&lt;/p&gt;

&lt;p&gt;It ended by producing timestamp colonies, architecture classifications, evidence stores, observation indexes, and the first architecture snapshots in the project's history. &lt;/p&gt;

&lt;p&gt;More importantly, it did so without introducing a single AI model, heuristic scorer, or probabilistic guess into the process.&lt;/p&gt;

&lt;p&gt;In other words, it discovered what I had been suspecting all along: I am a messy coder.&lt;/p&gt;

&lt;p&gt;Not bad for a few days of following a suspiciously persistent Malkovich reference.&lt;/p&gt;

&lt;p&gt;As for the chickens, I am pleased to report that they survived the investigation.&lt;/p&gt;

&lt;p&gt;No poultry was sacrificed in the making of this release.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The evidence was collected.&lt;/li&gt;
&lt;li&gt;The witnesses were interrogated.&lt;/li&gt;
&lt;li&gt;The “Malkoviches” were identified.&lt;/li&gt;
&lt;li&gt;And the case of the platinum blonde has finally been closed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For now.&lt;/p&gt;

&lt;p&gt;Because somewhere out there, I am reasonably certain another colony is already forming.&lt;/p&gt;

&lt;p&gt;And the chickens have begun looking inconspicuous again.&lt;/p&gt;

&lt;p&gt;As for the platinum blonde, I suspect she knows exactly where to find us.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>refactorit</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Dennis 0.8.7 — When Artifacts Learn to Explain Themselves</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Thu, 21 May 2026 12:16:38 +0000</pubDate>
      <link>https://dev.to/crevilla2050/dennis-087-when-artifacts-learn-to-explain-themselves-10ec</link>
      <guid>https://dev.to/crevilla2050/dennis-087-when-artifacts-learn-to-explain-themselves-10ec</guid>
      <description>&lt;p&gt;In previous articles, I introduced &lt;strong&gt;Dennis&lt;/strong&gt; as a deterministic codemod engine and the &lt;strong&gt;DEX&lt;/strong&gt; format as a way to package transformations into reproducible artifacts.&lt;/p&gt;

&lt;p&gt;We talked about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic execution&lt;/li&gt;
&lt;li&gt;Stable diffs&lt;/li&gt;
&lt;li&gt;Lineage and verification&lt;/li&gt;
&lt;li&gt;Treating transformations as first-class objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But something was still missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Missing Piece: Intent
&lt;/h2&gt;

&lt;p&gt;Up to now, a DEX artifact could tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;what&lt;/strong&gt; changed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;how&lt;/strong&gt; it changed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;where&lt;/strong&gt; it came from&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;why it was created in the first place&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That “why” lived outside the system—in shell history, in someone’s head, or lost entirely.&lt;/p&gt;

&lt;p&gt;Dennis 0.8.7 changes that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing Intent-Aware Artifacts
&lt;/h2&gt;

&lt;p&gt;Dennis artifacts now embed &lt;strong&gt;intent&lt;/strong&gt; directly inside the artifact itself.&lt;/p&gt;

&lt;p&gt;Not as comments. Not as logs.&lt;/p&gt;

&lt;p&gt;As structured, inspectable data.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Commands to Intent
&lt;/h2&gt;

&lt;p&gt;Let’s start from a simple example using the demo repo:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/crevilla2050/hello-dennis" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/hello-dennis&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1 — Generate a spec (intent)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis plan &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--interactive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll be prompted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inject helper? (y/N): y
Helper file path: helper.py
Target file: hello.py
Insert at line (default 1): 12
Use git mode? (Y/n): y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"root"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"helpers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/helper.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/hello.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"use_git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-21T11-15-22Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spec-2026-05-21T11-15-22.json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file is your &lt;strong&gt;intent&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2 — Generate a plan from intent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis plan spec-2026-05-21T11-15-22.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or equivalently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis plan &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--add-helper&lt;/span&gt; helper.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target-file&lt;/span&gt; hello.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--line&lt;/span&gt; 12 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--use-git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both produce the same deterministic plan.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3 — Pack into a DEX artifact
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis pack dennis-plan.json artifact.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now something new happens.&lt;/p&gt;

&lt;p&gt;The artifact contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;payload/plan.json   → execution
meta/spec.json      → intent
manifest.json       → identity + lineage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Inspecting an Artifact (Now with Intent)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis inspect artifact.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intent
------
Mode:        project
Root:        .
Options:     {'use_git': True}

Helpers:
  - /path/helper.py → /path/hello.py:12

Created at:  2026-05-21T11-15-22Z

Artifact
--------
Hash:        a89498b4...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the key shift:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The artifact explains itself.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Determinism Still Holds
&lt;/h2&gt;

&lt;p&gt;Here’s the important part.&lt;/p&gt;

&lt;p&gt;Even though we embedded intent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running the same transformation twice&lt;/li&gt;
&lt;li&gt;With different timestamps&lt;/li&gt;
&lt;li&gt;Produces &lt;strong&gt;identical payload hashes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payload_equal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"added"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"removed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"modified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because Dennis separates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intent (spec.json)&lt;/strong&gt; → human, mutable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution (plan.json)&lt;/strong&gt; → deterministic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity (payload hash)&lt;/strong&gt; → canonical&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A New Mental Model
&lt;/h2&gt;

&lt;p&gt;Dennis artifacts now operate on four layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intent   → why
Plan     → what
Payload  → identity
Lineage  → where from
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Most tools give you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;diff → what changed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dennis gives you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;intent → plan → proof
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a patch&lt;/li&gt;
&lt;li&gt;and a &lt;strong&gt;reproducible transformation&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What This Unlocks
&lt;/h2&gt;

&lt;p&gt;With intent embedded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Artifacts become self-documenting&lt;/li&gt;
&lt;li&gt;Transformations become auditable&lt;/li&gt;
&lt;li&gt;Reproducibility includes &lt;em&gt;reasoning&lt;/em&gt;, not just execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And more importantly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You no longer need external context to understand a change.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Dennis 0.8.7 is not a feature release.&lt;/p&gt;

&lt;p&gt;It’s a shift in perspective.&lt;/p&gt;

&lt;p&gt;Artifacts are no longer just bundles of changes.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;executable, inspectable, self-describing transformations&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you want to try it yourself:&lt;br&gt;
👉 &lt;a href="https://github.com/crevilla2050/string-audit" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/string-audit&lt;/a&gt;&lt;br&gt;
clone, install and ...&lt;/p&gt;

&lt;p&gt;The source files to play safely at home:&lt;br&gt;
👉 &lt;a href="https://github.com/crevilla2050/hello-dennis" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/hello-dennis&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;More to come.&lt;/p&gt;

</description>
      <category>refactorit</category>
      <category>python</category>
      <category>opensource</category>
      <category>software</category>
    </item>
    <item>
      <title>Dennis 0.8.7 — When Artifacts Learn to Explain Themselves</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Thu, 21 May 2026 12:16:37 +0000</pubDate>
      <link>https://dev.to/crevilla2050/dennis-087-when-artifacts-learn-to-explain-themselves-2fo</link>
      <guid>https://dev.to/crevilla2050/dennis-087-when-artifacts-learn-to-explain-themselves-2fo</guid>
      <description>&lt;p&gt;In previous articles, I introduced &lt;strong&gt;Dennis&lt;/strong&gt; as a deterministic codemod engine and the &lt;strong&gt;DEX&lt;/strong&gt; format as a way to package transformations into reproducible artifacts.&lt;/p&gt;

&lt;p&gt;We talked about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic execution&lt;/li&gt;
&lt;li&gt;Stable diffs&lt;/li&gt;
&lt;li&gt;Lineage and verification&lt;/li&gt;
&lt;li&gt;Treating transformations as first-class objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But something was still missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Missing Piece: Intent
&lt;/h2&gt;

&lt;p&gt;Up to now, a DEX artifact could tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;what&lt;/strong&gt; changed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;how&lt;/strong&gt; it changed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;where&lt;/strong&gt; it came from&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;why it was created in the first place&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That “why” lived outside the system—in shell history, in someone’s head, or lost entirely.&lt;/p&gt;

&lt;p&gt;Dennis 0.8.7 changes that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing Intent-Aware Artifacts
&lt;/h2&gt;

&lt;p&gt;Dennis artifacts now embed &lt;strong&gt;intent&lt;/strong&gt; directly inside the artifact itself.&lt;/p&gt;

&lt;p&gt;Not as comments. Not as logs.&lt;/p&gt;

&lt;p&gt;As structured, inspectable data.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Commands to Intent
&lt;/h2&gt;

&lt;p&gt;Let’s start from a simple example using the demo repo:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/crevilla2050/hello-dennis" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/hello-dennis&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1 — Generate a spec (intent)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis plan &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--interactive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll be prompted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inject helper? (y/N): y
Helper file path: helper.py
Target file: hello.py
Insert at line (default 1): 12
Use git mode? (Y/n): y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"root"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"helpers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/helper.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/hello.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"use_git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-21T11-15-22Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spec-2026-05-21T11-15-22.json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file is your &lt;strong&gt;intent&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2 — Generate a plan from intent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis plan spec-2026-05-21T11-15-22.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or equivalently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis plan &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--add-helper&lt;/span&gt; helper.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target-file&lt;/span&gt; hello.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--line&lt;/span&gt; 12 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--use-git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both produce the same deterministic plan.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3 — Pack into a DEX artifact
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis pack dennis-plan.json artifact.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now something new happens.&lt;/p&gt;

&lt;p&gt;The artifact contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;payload/plan.json   → execution
meta/spec.json      → intent
manifest.json       → identity + lineage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Inspecting an Artifact (Now with Intent)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis inspect artifact.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intent
------
Mode:        project
Root:        .
Options:     {'use_git': True}

Helpers:
  - /path/helper.py → /path/hello.py:12

Created at:  2026-05-21T11-15-22Z

Artifact
--------
Hash:        a89498b4...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the key shift:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The artifact explains itself.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Determinism Still Holds
&lt;/h2&gt;

&lt;p&gt;Here’s the important part.&lt;/p&gt;

&lt;p&gt;Even though we embedded intent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running the same transformation twice&lt;/li&gt;
&lt;li&gt;With different timestamps&lt;/li&gt;
&lt;li&gt;Produces &lt;strong&gt;identical payload hashes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payload_equal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"added"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"removed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"modified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because Dennis separates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intent (spec.json)&lt;/strong&gt; → human, mutable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution (plan.json)&lt;/strong&gt; → deterministic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity (payload hash)&lt;/strong&gt; → canonical&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A New Mental Model
&lt;/h2&gt;

&lt;p&gt;Dennis artifacts now operate on four layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intent   → why
Plan     → what
Payload  → identity
Lineage  → where from
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Most tools give you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;diff → what changed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dennis gives you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;intent → plan → proof
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a patch&lt;/li&gt;
&lt;li&gt;and a &lt;strong&gt;reproducible transformation&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What This Unlocks
&lt;/h2&gt;

&lt;p&gt;With intent embedded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Artifacts become self-documenting&lt;/li&gt;
&lt;li&gt;Transformations become auditable&lt;/li&gt;
&lt;li&gt;Reproducibility includes &lt;em&gt;reasoning&lt;/em&gt;, not just execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And more importantly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You no longer need external context to understand a change.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Dennis 0.8.7 is not a feature release.&lt;/p&gt;

&lt;p&gt;It’s a shift in perspective.&lt;/p&gt;

&lt;p&gt;Artifacts are no longer just bundles of changes.&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;executable, inspectable, self-describing transformations&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you want to try it yourself:&lt;br&gt;
👉 &lt;a href="https://github.com/crevilla2050/string-audit" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/string-audit&lt;/a&gt;&lt;br&gt;
clone, install and ...&lt;/p&gt;

&lt;p&gt;The source files to play safely at home:&lt;br&gt;
👉 &lt;a href="https://github.com/crevilla2050/hello-dennis" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/hello-dennis&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;More to come.&lt;/p&gt;

</description>
      <category>refactorit</category>
      <category>python</category>
      <category>opensource</category>
      <category>software</category>
    </item>
    <item>
      <title>Dennis 0.8.5: The Chickens Are Safe, But Now We Need Trust (and Receipts)</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Fri, 15 May 2026 11:20:01 +0000</pubDate>
      <link>https://dev.to/crevilla2050/dennis-085-the-chickens-are-safe-but-now-we-need-trust-and-receipts-218b</link>
      <guid>https://dev.to/crevilla2050/dennis-085-the-chickens-are-safe-but-now-we-need-trust-and-receipts-218b</guid>
      <description>&lt;h1&gt;
  
  
  🐔 The Chickens Are Still Safe
&lt;/h1&gt;

&lt;p&gt;A few weeks ago, we solved a critical industry crisis:&lt;/p&gt;

&lt;p&gt;👉 Chickens were being unnecessarily sacrificed in code transformations.&lt;/p&gt;

&lt;p&gt;They were removed from rituals, given a proper coop, and are now attending coding seminars.&lt;/p&gt;

&lt;p&gt;Everything seemed under control.&lt;/p&gt;

&lt;p&gt;Transformations were deterministic.&lt;br&gt;
Diffs were canonical.&lt;br&gt;
Lineage was clear.&lt;/p&gt;

&lt;p&gt;And yet… something was still missing.&lt;/p&gt;

&lt;h1&gt;
  
  
  🧠 We Can Prove Transformations
&lt;/h1&gt;

&lt;p&gt;Up to this point, Dennis could already answer:&lt;/p&gt;

&lt;p&gt;What will change?&lt;br&gt;
What changed?&lt;br&gt;
Is this transformation correct?&lt;/p&gt;

&lt;p&gt;Not "probably correct." &lt;br&gt;
Deterministically correct.&lt;/p&gt;

&lt;p&gt;That’s a big step forward. But it’s not enough.&lt;/p&gt;

&lt;h1&gt;
  
  
  ❗ The Question That Actually Matters
&lt;/h1&gt;

&lt;p&gt;There is one question that keeps showing up in real systems:&lt;/p&gt;

&lt;p&gt;Should I trust this transformation?&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;Is the diff valid?&lt;br&gt;
Is the plan reproducible?&lt;br&gt;
But:&lt;/p&gt;

&lt;p&gt;Who made this… and do I trust them?&lt;br&gt;
That’s the gap Dennis 0.8.5 closes.&lt;/p&gt;

&lt;h1&gt;
  
  
  🔐 Trust, Made Explicit
&lt;/h1&gt;

&lt;p&gt;DEX artifacts could already be signed. Now, that signature actually means something.&lt;/p&gt;

&lt;p&gt;Dennis 0.8.5 introduces: 👉 Explicit, Inspectable Trust&lt;/p&gt;

&lt;h1&gt;
  
  
  🧾 Transformations With Receipts
&lt;/h1&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dennis inspect artifact.dex&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And you get more than metadata. You get a Trust Report:&lt;/p&gt;

&lt;p&gt;Who signed it&lt;br&gt;
Whether the signature is valid&lt;br&gt;
Whether that identity is trusted&lt;br&gt;
Whether the artifact should be accepted&lt;/p&gt;

&lt;p&gt;No assumptions. &lt;br&gt;
No conventions. &lt;br&gt;
No "looks legit to me."&lt;/p&gt;

&lt;p&gt;Just a decision.&lt;/p&gt;

&lt;h1&gt;
  
  
  ⚖️ Strict Trust (No Middle Ground)
&lt;/h1&gt;

&lt;p&gt;Dennis now follows a simple rule:&lt;/p&gt;

&lt;p&gt;An artifact is accepted only if at least one trusted signature exists.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;✅ Trusted → Accepted&lt;br&gt;
❌ Not Trusted → Rejected&lt;/p&gt;

&lt;p&gt;Nothing in between.&lt;/p&gt;

&lt;h1&gt;
  
  
  🧠 Why This Changes Things
&lt;/h1&gt;

&lt;p&gt;We already trust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commits&lt;/li&gt;
&lt;li&gt;Builds&lt;/li&gt;
&lt;li&gt;Containers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But transformations? Those usually come from:&lt;/p&gt;

&lt;p&gt;A script someone ran&lt;br&gt;
Somewhere&lt;br&gt;
At some point&lt;br&gt;
Dennis changes that. Now transformations have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identity&lt;/li&gt;
&lt;li&gt;Signatures&lt;/li&gt;
&lt;li&gt;Policy&lt;/li&gt;
&lt;li&gt;Consequences&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  📦 Also: Size Matters
&lt;/h1&gt;

&lt;p&gt;Artifacts now track their size end-to-end.&lt;/p&gt;

&lt;p&gt;And the result is… almost boring:&lt;/p&gt;

&lt;p&gt;They’re tiny.&lt;/p&gt;

&lt;p&gt;Which is exactly what you want. Because now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storing them is trivial&lt;/li&gt;
&lt;li&gt;Sharing them is cheap&lt;/li&gt;
&lt;li&gt;Scaling them is realistic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And artifact-based workflows stop being theoretical.&lt;/p&gt;

&lt;h1&gt;
  
  
  🔄 The Shift
&lt;/h1&gt;

&lt;p&gt;You can feel the evolution now:&lt;/p&gt;

&lt;p&gt;Before: Run and hope.&lt;br&gt;
Then: Inspect and verify.&lt;br&gt;
Now: Decide whether to trust.&lt;/p&gt;

&lt;p&gt;That last step is the one that matters in teams.&lt;/p&gt;

&lt;h1&gt;
  
  
  🐔 The Chickens, Revisited
&lt;/h1&gt;

&lt;p&gt;The chickens reviewed the new trust model.&lt;/p&gt;

&lt;p&gt;Their feedback:&lt;/p&gt;

&lt;p&gt;Fewer rituals&lt;br&gt;
More signatures&lt;br&gt;
Significantly reduced anxiety&lt;/p&gt;

&lt;p&gt;Legal is still involved. The chickens remain cautiously optimistic.&lt;/p&gt;

&lt;h1&gt;
  
  
  🚀 Try It
&lt;/h1&gt;

&lt;p&gt;Dennis 0.8.5 is live.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upgrade:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;pip install dennis-forge --upgrade&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create your key (if you haven't):&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;dennis keygen&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up trust: Approve your key so Dennis knows to trust artifacts signed by it:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
dennis key approve ~/.dennis/keys/default.pub --signer ~/.dennis/keys/default.key&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apply with strict trust:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;dennis apply artifact.dex --strict&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🔗 Dennis on GitHub 🔗 The Forge (SaaS)
&lt;/h1&gt;

&lt;p&gt;Final Thought&lt;br&gt;
We made transformations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visible&lt;/li&gt;
&lt;li&gt;Deterministic&lt;/li&gt;
&lt;li&gt;Verifiable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we’re making them:&lt;/p&gt;

&lt;p&gt;Trustworthy&lt;/p&gt;

&lt;p&gt;And that’s when they stop being tools… and start becoming something you can rely on.&lt;/p&gt;

&lt;p&gt;How do you currently handle trust in your refactoring workflows?&lt;br&gt;
Manual review? Signed commits? Something else?&lt;br&gt;
Curious how others approach this.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>refactorit</category>
      <category>python</category>
    </item>
    <item>
      <title>Announcing Dennis 0.8.3 — Deterministic Diff &amp; Git-Aware Scope</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:47:10 +0000</pubDate>
      <link>https://dev.to/crevilla2050/announcing-dennis-083-deterministic-diff-git-aware-scope-33ie</link>
      <guid>https://dev.to/crevilla2050/announcing-dennis-083-deterministic-diff-git-aware-scope-33ie</guid>
      <description>&lt;p&gt;Dennis 0.8.3 is out.&lt;/p&gt;

&lt;p&gt;This one is a big step forward.&lt;/p&gt;

&lt;p&gt;Until now, Dennis could show what would change and apply it safely.&lt;br&gt;
Now it can also verify what actually changed — in a deterministic way.&lt;/p&gt;

&lt;p&gt;The diff system is now:&lt;br&gt;
• git-aware (no more noise from .git or random files)&lt;br&gt;
• text-only (binary junk is ignored)&lt;br&gt;
• deterministic (same input → same diff → same hash)&lt;/p&gt;

&lt;p&gt;This turns diffs into something closer to evidence than just a visual hint.&lt;/p&gt;

&lt;p&gt;Also added a --verbose mode to inspect exactly how the diff is built.&lt;/p&gt;

&lt;p&gt;It might not sound flashy, but this is the kind of change that makes everything else more trustworthy.&lt;/p&gt;

&lt;p&gt;Write-up here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/crevilla2050" rel="noopener noreferrer"&gt;
        crevilla2050
      &lt;/a&gt; / &lt;a href="https://github.com/crevilla2050/string-audit" rel="noopener noreferrer"&gt;
        string-audit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Small script to help devs catch i18n strings and hardcoded english strings in project's source code
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Dennis the Forge 🪓&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Deterministic transformation engine and DEX artifact system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; Active development
&lt;strong&gt;License:&lt;/strong&gt; MIT
&lt;strong&gt;Python:&lt;/strong&gt; 3.10+
&lt;strong&gt;CLI:&lt;/strong&gt; &lt;code&gt;dennis&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dennis is a &lt;strong&gt;deterministic transformation platform&lt;/strong&gt; that turns code changes into &lt;strong&gt;portable, inspectable, and verifiable artifacts (DEX)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Plans are reviewable
Artifacts are inspectable
Transformations are reversible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No magic. Just steel.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🔥 What Makes Dennis Different&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Most tools extract.&lt;/p&gt;
&lt;p&gt;Dennis &lt;strong&gt;decides&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Before any transformation is created, Dennis evaluates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what is meaningful&lt;/li&gt;
&lt;li&gt;what is noise&lt;/li&gt;
&lt;li&gt;what should be transformed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This &lt;strong&gt;decision layer (Clean Engine)&lt;/strong&gt; ensures that transformations are built on &lt;strong&gt;signal, not garbage&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Deterministic input → deterministic output
Garbage input → deterministic garbage&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dennis avoids both.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚙️ The Pipeline&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;scan → decide → plan → pack → sign → inspect → rehydrate → apply → invert
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Every step is explicit. Every step is inspectable.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📦 What is a DEX Artifact?&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;A DEX artifact is a portable package describing a…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/crevilla2050/string-audit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Curious what people think — especially those working in audits, compliance or large-scale refactors.&lt;/p&gt;

&lt;p&gt;Dennis' home: &lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://dennis-forge.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcrevilla2050.github.io%2Fdennis-forge%2Fassets%2Fimages%2Fdennis-forge-hero.png" height="1200" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://dennis-forge.com/" rel="noopener noreferrer" class="c-link"&gt;
            Dennis the Forge
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Plan, inspect, export, and undo large code transformations safely. CLI-first, open source, deterministic.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          dennis-forge.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
Dennis' Artifact's repo: &lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://dennis-forge.com/repo/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;dennis-forge.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>python</category>
      <category>opensource</category>
      <category>refactoring</category>
      <category>git</category>
    </item>
    <item>
      <title>From Diff to Proof: Teaching Dennis to Verify Transformations</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Sat, 25 Apr 2026 11:01:24 +0000</pubDate>
      <link>https://dev.to/crevilla2050/from-diff-to-proof-teaching-dennis-to-verify-transformations-21bl</link>
      <guid>https://dev.to/crevilla2050/from-diff-to-proof-teaching-dennis-to-verify-transformations-21bl</guid>
      <description>&lt;p&gt;Large code transformations are tricky.&lt;br&gt;
Not because we can’t describe them.&lt;br&gt;
Not because we can’t apply them.&lt;br&gt;
But because, once they run… we’re never entirely sure they did exactly what we intended.&lt;/p&gt;

&lt;p&gt;In previous articles, I introduced Dennis and DEX: Dennis generates deterministic transformation plans; DEX turns those plans into portable, inspectable artifacts&lt;/p&gt;

&lt;p&gt;That already solves a big part of the problem:&lt;br&gt;
👉 transformations become visible&lt;/p&gt;

&lt;p&gt;But something was still missing: "The missing Question":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Even with a plan…&lt;/li&gt;
&lt;li&gt;Even with an artifact…&lt;/li&gt;
&lt;li&gt;Even with signatures…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How do you know the transformation is actually correct?&lt;br&gt;
Not “looks correct”.&lt;br&gt;
Not “probably correct”.&lt;/p&gt;

&lt;p&gt;Correct.&lt;/p&gt;

&lt;p&gt;The Problem With Traditional Diffs:&lt;/p&gt;

&lt;p&gt;We already have diffs, right?&lt;br&gt;
git diff has been around forever.&lt;br&gt;
But here’s the uncomfortable truth: Diffs are not deterministic.&lt;/p&gt;

&lt;p&gt;Two environments can produce slightly different diffs for the same change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;different line endings&lt;/li&gt;
&lt;li&gt;different grouping&lt;/li&gt;
&lt;li&gt;different context&lt;/li&gt;
&lt;li&gt;different ordering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are great for humans.&lt;br&gt;
They are not reliable as evidence.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Dennis Needed:
&lt;/h2&gt;

&lt;p&gt;Dennis needed something stricter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a canonical representation of change&lt;/li&gt;
&lt;li&gt;independent of environment&lt;/li&gt;
&lt;li&gt;independent of tooling&lt;/li&gt;
&lt;li&gt;stable across time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: a diff that behaves like an artifact&lt;/p&gt;
&lt;h2&gt;
  
  
  Enter: Canonical Diff
&lt;/h2&gt;

&lt;p&gt;Dennis now produces a canonical diff format:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deterministic&lt;/li&gt;
&lt;li&gt;lossless&lt;/li&gt;
&lt;li&gt;normalized (including Unicode)&lt;/li&gt;
&lt;li&gt;order-stable&lt;/li&gt;
&lt;li&gt;hashable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same input → same diff → same hash&lt;br&gt;
Every time.&lt;/p&gt;

&lt;p&gt;No surprises.&lt;/p&gt;
&lt;h2&gt;
  
  
  From Diff to Identity
&lt;/h2&gt;

&lt;p&gt;Once the diff is canonical, something interesting happens.&lt;br&gt;
You can hash it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;diff_hash = sha256(canonical_diff)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now the transformation is no longer just visible.&lt;br&gt;
👉 It has an identity.&lt;br&gt;
And That Changes Everything&lt;/p&gt;

&lt;p&gt;Because now you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compare transformations across machines&lt;/li&gt;
&lt;li&gt;verify that two systems produced the same result&lt;/li&gt;
&lt;li&gt;detect drift immediately&lt;/li&gt;
&lt;li&gt;attach diffs to lineage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re no longer looking at change.&lt;br&gt;
You’re verifying it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conformance: The System That Checks Itself
&lt;/h2&gt;

&lt;p&gt;To make this reliable, Dennis now includes a new command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dennis test-diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command runs a set of canonical transformation cases and checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structure matches expected output&lt;/li&gt;
&lt;li&gt;hash matches expected identity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If anything changes—even slightly—the test fails.&lt;br&gt;
This is not a unit test.&lt;/p&gt;

&lt;p&gt;It’s a protocol check.&lt;br&gt;
It answers a single question:&lt;/p&gt;

&lt;p&gt;“Is Dennis still behaving like Dennis?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;At this point, something subtle happens.&lt;br&gt;
DEX artifacts describe transformations.&lt;br&gt;
Canonical diffs verify them.&lt;br&gt;
Together, they form something stronger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transformations that can be inspected, reproduced… and proven.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where Dennis stops being a tool. And starts becoming a system of record.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;Software development already treats many things as artifacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;builds&lt;/li&gt;
&lt;li&gt;containers&lt;/li&gt;
&lt;li&gt;dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But transformations—the things that actually change systems— are still mostly invisible. DEX made them visible. Canonical diff makes them verifiable.&lt;/p&gt;

&lt;p&gt;And Dennis?&lt;br&gt;
Dennis is still the forge.&lt;/p&gt;

&lt;p&gt;But now the forge doesn’t just produce artifacts.&lt;br&gt;
👉 It produces evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;With deterministic diffs in place, the next step becomes obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;diff lineage&lt;/li&gt;
&lt;li&gt;transformation verification across systems&lt;/li&gt;
&lt;li&gt;UI visualization of state transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that’s a story for another article.&lt;/p&gt;

&lt;p&gt;Final Thought&lt;br&gt;
We’ve learned to trust code.&lt;br&gt;
We’ve learned to trust builds.&lt;br&gt;
We’ve learned to trust artifacts.&lt;br&gt;
Maybe it’s time we learned to trust transformations too.&lt;/p&gt;

&lt;p&gt;And no…&lt;/p&gt;

&lt;p&gt;the chickens are still retired.&lt;br&gt;
They’re now attending coding seminars.&lt;/p&gt;

&lt;p&gt;Web site: &lt;br&gt;
&lt;a href="https://dennis-forge.com" rel="noopener noreferrer"&gt;https://dennis-forge.com&lt;/a&gt;&lt;br&gt;
Repository&lt;br&gt;
&lt;a href="https://dennis-forge.com/repo/" rel="noopener noreferrer"&gt;https://dennis-forge.com/repo/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>software</category>
      <category>opensource</category>
      <category>refactorit</category>
      <category>backend</category>
    </item>
    <item>
      <title>Hidden Answers in Plain Sight: A CLI to Ask the Earth</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Sat, 18 Apr 2026 05:17:31 +0000</pubDate>
      <link>https://dev.to/crevilla2050/hidden-answers-in-plain-sight-a-cli-to-ask-the-earth-44gl</link>
      <guid>https://dev.to/crevilla2050/hidden-answers-in-plain-sight-a-cli-to-ask-the-earth-44gl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-04-16"&gt;Weekend Challenge: Earth Day Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 What I Built
&lt;/h2&gt;

&lt;p&gt;I built a small command-line experiment called earth-oracle.&lt;/p&gt;

&lt;p&gt;You ask the Earth a question…&lt;br&gt;
and it answers.&lt;/p&gt;

&lt;p&gt;But not in the way you might expect.&lt;/p&gt;

&lt;p&gt;Instead of generating answers, the oracle reveals something more uncomfortable:&lt;/p&gt;

&lt;p&gt;the answer was already there.&lt;/p&gt;
&lt;h2&gt;
  
  
  🎬 Demo
&lt;/h2&gt;

&lt;p&gt;Here’s what it looks like:&lt;/p&gt;

&lt;p&gt;earth oracle ready&amp;gt;&lt;/p&gt;

&lt;p&gt;the earth listens best to questions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;dear earth, i know you need help, is my following action helping you heal?&lt;/p&gt;

&lt;p&gt;Does showering every 3 days instead of daily help?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;estimating carbon impact...&lt;/p&gt;
&lt;h2&gt;
  
  
  🌍 the earth says:
&lt;/h2&gt;

&lt;p&gt;"Yes, but buy a good deodorant."&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Zj-5Uppw8c0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;No APIs required.&lt;br&gt;
No datasets.&lt;br&gt;
No knowledge base.&lt;/p&gt;

&lt;p&gt;And yet… it feels like the system knew.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Idea
&lt;/h2&gt;

&lt;p&gt;This project is based on a classic “oracle” illusion I built years ago with friends.&lt;/p&gt;

&lt;p&gt;The trick is simple:&lt;/p&gt;

&lt;p&gt;the user secretly types the answer first&lt;br&gt;
the interface masks that input&lt;br&gt;
the system later reveals it as if it knew in advance&lt;/p&gt;

&lt;p&gt;For this challenge, I reimagined that idea as something more reflective:&lt;/p&gt;

&lt;p&gt;a tool that shows we already know what we should be doing for the planet&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ How I Built It
&lt;/h2&gt;

&lt;p&gt;The core of the project is not AI — it’s terminal control.&lt;/p&gt;

&lt;p&gt;raw input handling using Python (tty, termios)&lt;br&gt;
character-by-character interception&lt;br&gt;
masking user input while displaying a predefined “invocation”&lt;br&gt;
switching between hidden and visible input phases&lt;br&gt;
controlled reveal timing for dramatic effect&lt;/p&gt;

&lt;p&gt;The result is a CLI that feels… slightly uncanny.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ AI as Reflection, Not Authority
&lt;/h2&gt;

&lt;p&gt;I integrated GEMINI not to generate answers — but to interpret them.&lt;/p&gt;

&lt;p&gt;Instead of asking the model:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What is the right thing to do?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What does this action reveal?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;earth-oracle --use-gemini&lt;/p&gt;

&lt;p&gt;Instead of answering the question, Gemini provides a short reflection on the user’s own statement.&lt;/p&gt;

&lt;p&gt;This was intentional:&lt;/p&gt;

&lt;p&gt;the oracle reveals&lt;br&gt;
the AI reflects&lt;/p&gt;

&lt;p&gt;I wanted to avoid building “just another chatbot.”&lt;/p&gt;

&lt;h2&gt;
  
  
  🏆 Prize Categories
&lt;/h2&gt;

&lt;p&gt;✅ Best Use of Google Gemini&lt;/p&gt;

&lt;p&gt;Gemini is used not to generate answers, but to interpret and reflect on user-provided intentions, preserving the core concept of the oracle.&lt;/p&gt;

&lt;h2&gt;
  
  
  💭 Why This Matters
&lt;/h2&gt;

&lt;p&gt;Most tools try to tell us what to do for the environment.&lt;/p&gt;

&lt;p&gt;This one does something different:&lt;/p&gt;

&lt;p&gt;it reminds us that we already know.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔚 Final Thought
&lt;/h2&gt;

&lt;p&gt;The problem isn’t that we don’t know how to help the Earth.&lt;br&gt;
It’s that we don’t listen to ourselves.&lt;/p&gt;

&lt;p&gt;🔗 Code&lt;/p&gt;

&lt;p&gt;GitHub repo: &lt;a href="https://github.com/crevilla2050/earth-oracle" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/earth-oracle&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>"Behold Dennis The Forge" (or how the chickens helped give DEX a home)</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Sun, 12 Apr 2026 00:34:50 +0000</pubDate>
      <link>https://dev.to/crevilla2050/behold-dennis-the-forge-or-how-the-chickens-helped-give-dex-a-home-da</link>
      <guid>https://dev.to/crevilla2050/behold-dennis-the-forge-or-how-the-chickens-helped-give-dex-a-home-da</guid>
      <description>&lt;p&gt;🐔 From Chickens to Code&lt;/p&gt;

&lt;p&gt;A few weeks ago, I presented a very real problem:&lt;br&gt;
chickens were being unnecessarily sacrificed in the process of applying code transformations.&lt;/p&gt;

&lt;p&gt;Fortunately, after a long and exhausting legal battle, they secured a brand new coop.&lt;/p&gt;

&lt;p&gt;DEX artifacts, however, were not so lucky.&lt;/p&gt;

&lt;p&gt;They still had no home.&lt;/p&gt;

&lt;p&gt;Before Dennis, code refactoring and patch delivery lived in a strange place —&lt;br&gt;
critical, yet obscure. Necessary, yet often chaotic.&lt;/p&gt;

&lt;p&gt;Scripts were written.&lt;br&gt;
Commands were executed.&lt;br&gt;
Changes happened.&lt;/p&gt;

&lt;p&gt;And then… they disappeared.&lt;/p&gt;

&lt;p&gt;Then came DEX.&lt;/p&gt;

&lt;p&gt;A deterministic transformation artifact:&lt;br&gt;
inspectable, transparent, reversible.&lt;/p&gt;

&lt;p&gt;For the first time, transformations could be treated as something real —&lt;br&gt;
something you could hold, examine, verify.&lt;/p&gt;

&lt;p&gt;Not just something you ran.&lt;/p&gt;

&lt;p&gt;But watching the chickens win their case raised an uncomfortable question:&lt;/p&gt;

&lt;p&gt;If chickens could get a home…&lt;/p&gt;

&lt;p&gt;why couldn’t transformations?&lt;/p&gt;

&lt;p&gt;So I built one.&lt;/p&gt;

&lt;p&gt;A place where DEX artifacts can live, be shared, inspected, downloaded, and trusted.&lt;/p&gt;

&lt;p&gt;A place where transformations don’t vanish after execution.&lt;/p&gt;

&lt;p&gt;A place where they become part of a system.&lt;/p&gt;

&lt;p&gt;🔥 Behold: Dennis The Forge&lt;/p&gt;

&lt;p&gt;Behold Dennis The Forge.&lt;/p&gt;

&lt;p&gt;A repository where DEX artifacts can finally live.&lt;/p&gt;

&lt;p&gt;A place where users can upload, store, share, and inspect transformations —&lt;br&gt;
as long as they are marked public.&lt;/p&gt;

&lt;p&gt;This is the first prototype.&lt;/p&gt;

&lt;p&gt;It is not complete.&lt;br&gt;
It is not polished.&lt;br&gt;
And it is definitely missing a few important pieces —&lt;br&gt;
a proper UI diff, online editing, and other goodies that are already on the horizon.&lt;/p&gt;

&lt;p&gt;But the foundation is there.&lt;/p&gt;

&lt;p&gt;In The Forge, users can organize their work into Workspaces,&lt;br&gt;
group related efforts into Projects,&lt;br&gt;
and attach individual DEX artifacts to each of them.&lt;/p&gt;

&lt;p&gt;Today, this structure is simple.&lt;/p&gt;

&lt;p&gt;Tomorrow, it evolves.&lt;/p&gt;

&lt;p&gt;Users will be able to invite collaborators —&lt;br&gt;
individuals, or entire organizations —&lt;br&gt;
and transformations will stop being a solitary act.&lt;/p&gt;

&lt;p&gt;Because that’s the real shift:&lt;/p&gt;

&lt;p&gt;Transformations are no longer just something you execute.&lt;/p&gt;

&lt;p&gt;They become something you share,&lt;br&gt;
something you review,&lt;br&gt;
something you can trust.&lt;/p&gt;

&lt;p&gt;The Forge is already usable.&lt;/p&gt;

&lt;p&gt;You can explore it.&lt;br&gt;
You can upload artifacts.&lt;br&gt;
You can see how this idea behaves in the real world.&lt;/p&gt;

&lt;p&gt;And yes — it will change.&lt;/p&gt;

&lt;p&gt;It will evolve.&lt;br&gt;
It will probably break a few times along the way.&lt;/p&gt;

&lt;p&gt;But that’s part of the point.&lt;/p&gt;

&lt;p&gt;🧩 What the Hex is a DEX?&lt;/p&gt;

&lt;p&gt;But if you are still wondering:&lt;/p&gt;

&lt;p&gt;“What the hex is a DEX?”&lt;/p&gt;

&lt;p&gt;I invite you to read the article with the same name.&lt;/p&gt;

&lt;p&gt;Here’s the short version.&lt;/p&gt;

&lt;p&gt;A DEX artifact represents a transformation.&lt;/p&gt;

&lt;p&gt;It could be a code refactoring patch, a string translation,&lt;br&gt;
or anything that modifies source code at its deepest levels.&lt;/p&gt;

&lt;p&gt;But it’s not just the change.&lt;/p&gt;

&lt;p&gt;It’s a radiography of the change:&lt;/p&gt;

&lt;p&gt;what will happen&lt;br&gt;
where it will happen&lt;br&gt;
how it will happen&lt;br&gt;
and, most importantly - why&lt;/p&gt;

&lt;p&gt;Traceability has always been a problem.&lt;/p&gt;

&lt;p&gt;Changes happen.&lt;br&gt;
Context disappears.&lt;br&gt;
And eventually, nobody remembers who did what — or why.&lt;/p&gt;

&lt;p&gt;DEX changes that.&lt;/p&gt;

&lt;p&gt;Each artifact carries its own lineage.&lt;/p&gt;

&lt;p&gt;Every transformation can be traced, step by step,&lt;br&gt;
back to the very first artifact in the chain.&lt;/p&gt;

&lt;p&gt;And if something goes wrong?&lt;/p&gt;

&lt;p&gt;You don’t guess.&lt;/p&gt;

&lt;p&gt;You don’t patch over the patch.&lt;/p&gt;

&lt;p&gt;You simply revert the transformation — cleanly, in one step.&lt;/p&gt;

&lt;p&gt;This means that any change can be:&lt;/p&gt;

&lt;p&gt;inspected&lt;br&gt;
signed&lt;br&gt;
approved&lt;br&gt;
and only then applied&lt;/p&gt;

&lt;p&gt;In that sense, it may feel a bit like Git.&lt;/p&gt;

&lt;p&gt;But while Git tracks files…&lt;/p&gt;

&lt;p&gt;DEX tracks intent.&lt;/p&gt;

&lt;p&gt;🚀 How to Start Using The Forge&lt;/p&gt;

&lt;p&gt;If you want to try it out, you can already do so:&lt;/p&gt;

&lt;p&gt;📖 Project homepage: &lt;a href="https://www.dennis-forge.com/" rel="noopener noreferrer"&gt;https://www.dennis-forge.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 Forge (SaaS): &lt;a href="https://www.dennis-forge.com/repo/" rel="noopener noreferrer"&gt;https://www.dennis-forge.com/repo/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basic flow:&lt;br&gt;
Register (or enter as guest)&lt;br&gt;
Create a Workspace&lt;br&gt;
Create a Project&lt;br&gt;
Upload a DEX artifact&lt;br&gt;
Assign DEX artifact to project&lt;br&gt;
Explore, inspect, and share&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;No magic. No hidden steps.&lt;/p&gt;

&lt;p&gt;Just transformations becoming visible.&lt;/p&gt;

&lt;p&gt;🧠 Why This Matters&lt;/p&gt;

&lt;p&gt;DEX is, at its core, a form of quality assurance.&lt;/p&gt;

&lt;p&gt;Not after the fact.&lt;br&gt;
Not as an afterthought.&lt;/p&gt;

&lt;p&gt;But embedded directly into the transformation itself.&lt;/p&gt;

&lt;p&gt;It ensures:&lt;/p&gt;

&lt;p&gt;traceability&lt;br&gt;
reproducibility&lt;br&gt;
and responsibility&lt;/p&gt;

&lt;p&gt;Now imagine a different workflow.&lt;/p&gt;

&lt;p&gt;Instead of shipping a simple link to a Git repository…&lt;/p&gt;

&lt;p&gt;you could ship the story of the change.&lt;/p&gt;

&lt;p&gt;A complete, inspectable narrative of what happened,&lt;br&gt;
why it happened,&lt;br&gt;
and how it will affect the system.&lt;/p&gt;

&lt;p&gt;Not just code.&lt;/p&gt;

&lt;p&gt;Intent.&lt;/p&gt;

&lt;p&gt;DEX is not trying to replace Git.&lt;/p&gt;

&lt;p&gt;They solve different problems.&lt;/p&gt;

&lt;p&gt;DEX operates alongside your Git project, optionally integrating into your workflow, and focusing only on the transformations that matter—without getting in your way.&lt;/p&gt;

&lt;p&gt;When used inside a Git repository, Dennis can even reuse your existing .gitignore rules to filter out irrelevant files.&lt;/p&gt;

&lt;p&gt;But it does not depend on Git.&lt;/p&gt;

&lt;p&gt;DEX can operate in environments where version control is absent — or simply not allowed — while preserving the same guarantees of traceability and reproducibility.&lt;/p&gt;

&lt;p&gt;Together, they turn delivery into something cleaner,&lt;br&gt;
more transparent,&lt;br&gt;
and far less mysterious.&lt;/p&gt;

&lt;p&gt;🔌 Current Scope (and What Comes Next)&lt;/p&gt;

&lt;p&gt;Right now, Dennis is implemented in Python, and the available transformation engine is focused on Python projects.&lt;/p&gt;

&lt;p&gt;But that’s not a limitation — it’s the starting point.&lt;/p&gt;

&lt;p&gt;The system is designed to be extensible.&lt;/p&gt;

&lt;p&gt;Support for other ecosystems — React, Java, C/C++, PHP, HTML/XML, Go, and more — will come through dedicated plugins that follow the same deterministic principles.&lt;/p&gt;

&lt;p&gt;Today, there is one plugin. Tomorrow, there will be many.&lt;/p&gt;

&lt;p&gt;Because the goal is not to solve transformations for one language.&lt;/p&gt;

&lt;p&gt;It is to define a model that can work across all of them.&lt;/p&gt;

&lt;p&gt;And The Forge?&lt;br&gt;
It’s where those stories begin to live. &lt;br&gt;
For the first time, transformations stop being ephemeral.&lt;/p&gt;

&lt;p&gt;Now the DEX has its own coop.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>saas</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>The DEX was not a HEX. Why deterministic artifacts depend on deterministic classification</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Sat, 21 Mar 2026 05:29:21 +0000</pubDate>
      <link>https://dev.to/crevilla2050/the-dex-was-not-a-hex-why-deterministic-artifacts-depend-on-deterministic-classification-2728</link>
      <guid>https://dev.to/crevilla2050/the-dex-was-not-a-hex-why-deterministic-artifacts-depend-on-deterministic-classification-2728</guid>
      <description>&lt;p&gt;In a previous article, I introduced DEX — deterministic transformation artifacts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/crevilla2050/what-the-hex-is-a-dex-introducing-deterministic-transformation-artifacts-397d"&gt;https://dev.to/crevilla2050/what-the-hex-is-a-dex-introducing-deterministic-transformation-artifacts-397d&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"What the Hex is a DEX? Introducing Deterministic Transformation Artifacts"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At the time, it looked like magic:&lt;/p&gt;

&lt;p&gt;scan a codebase&lt;br&gt;&lt;br&gt;
generate a plan&lt;br&gt;&lt;br&gt;
package it&lt;br&gt;&lt;br&gt;
sign it&lt;br&gt;&lt;br&gt;
apply it&lt;br&gt;&lt;br&gt;
undo it  &lt;/p&gt;

&lt;p&gt;No chickens required. No rituals. No late-night debugging séances.&lt;br&gt;
Clean. Surgical. Almost suspicious. But there was a missing piece.&lt;/p&gt;

&lt;p&gt;DEX looks like a packaging format. It isn’t.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Misunderstanding
&lt;/h2&gt;

&lt;p&gt;It’s very easy — dangerously easy — to think:&lt;/p&gt;

&lt;p&gt;“DEX is just a better codemod format.”&lt;/p&gt;

&lt;p&gt;That’s how you end up in trouble. DEX is not about how transformations are stored.&lt;br&gt;
DEX is about whether those transformations make any sense at all. The Real Problem Was Never Extraction&lt;/p&gt;

&lt;p&gt;Let’s rewind.&lt;/p&gt;

&lt;p&gt;You want to internationalize a codebase.&lt;br&gt;
You run a string extractor.&lt;br&gt;
And it obediently hands you… everything.&lt;/p&gt;

&lt;p&gt;"btn btn-primary"&lt;br&gt;
"SELECT * FROM users"&lt;br&gt;
"/api/v1/orders"&lt;br&gt;
"chr_nombre_prod"&lt;br&gt;
"Error al guardar"&lt;/p&gt;

&lt;p&gt;Beautiful.&lt;br&gt;
Accurate.&lt;br&gt;
Completely unhinged.&lt;/p&gt;

&lt;p&gt;Because extraction is easy. Meaning is where things start to fall apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signal vs Noise
&lt;/h2&gt;

&lt;p&gt;Real codebases are not polite.&lt;br&gt;
They are loud, chaotic ecosystems of:&lt;/p&gt;

&lt;p&gt;SQL fragments pretending to be text&lt;br&gt;
CSS classes cosplaying as language&lt;br&gt;
URLs, identifiers, and paths everywhere&lt;br&gt;
binary junk sneaking in like contraband&lt;br&gt;
templating artifacts that look meaningful until they bite you&lt;/p&gt;

&lt;p&gt;If you extract everything, you get noise.&lt;br&gt;
If you filter too aggressively, you lose signal.&lt;br&gt;
If you get it wrong…&lt;/p&gt;

&lt;p&gt;You ship bugs with confidence.&lt;/p&gt;

&lt;p&gt;This Is Where Dennis Actually begins to shine&lt;br&gt;
Before DEX.&lt;br&gt;
Before artifacts.&lt;br&gt;
Before signatures and packaging and all the shiny machinery.&lt;br&gt;
There is a moment where the system has to decide:&lt;/p&gt;

&lt;p&gt;“Is this actually meaningful?”&lt;/p&gt;

&lt;p&gt;Dennis is not just a scanner. It’s a decision engine. And it has opinions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Clean Engine (the quiet part that does all the work)
&lt;/h2&gt;

&lt;p&gt;Inside Dennis there is a second pass.&lt;br&gt;
No glamour. No marketing slides.&lt;br&gt;
Just judgment.&lt;/p&gt;

&lt;p&gt;It looks at a string and asks:&lt;/p&gt;

&lt;p&gt;is this SQL pretending to be human language?&lt;br&gt;
is this CSS dressed up as meaning?&lt;br&gt;
is this code leaking into text?&lt;br&gt;
is this something a human would actually read?&lt;/p&gt;

&lt;p&gt;And then it makes a decision.&lt;/p&gt;

&lt;p&gt;No guessing.&lt;br&gt;
No vibes.&lt;br&gt;
Same input → same verdict.&lt;br&gt;
Every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Because DEX artifacts don’t store strings. They store decisions that survived scrutiny.&lt;/p&gt;

&lt;p&gt;Now imagine skipping that step.&lt;/p&gt;

&lt;p&gt;You generate a transformation plan straight from raw extraction.&lt;br&gt;
You package it.&lt;br&gt;
You sign it.&lt;br&gt;
You distribute it.&lt;br&gt;
And then you apply it.&lt;br&gt;
What happens?&lt;/p&gt;

&lt;p&gt;CSS classes get rewritten&lt;br&gt;
SQL fragments get “translated”&lt;br&gt;
helpers get injected into places they should never exist&lt;br&gt;
your codebase mutates into something… creative&lt;/p&gt;

&lt;p&gt;Congratulations.&lt;/p&gt;

&lt;p&gt;You have built a perfectly deterministic disaster.&lt;/p&gt;

&lt;p&gt;DEX Needs Clean Input&lt;/p&gt;

&lt;p&gt;This is the uncomfortable truth: DEX is only as good as the decisions that precede it.&lt;/p&gt;

&lt;p&gt;Not the packaging.&lt;br&gt;
Not the signatures.&lt;br&gt;
Not the CLI.&lt;br&gt;
The decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Extraction to Meaning
&lt;/h2&gt;

&lt;p&gt;The pipeline people imagine:&lt;/p&gt;

&lt;p&gt;scan → pack → apply&lt;/p&gt;

&lt;p&gt;The pipeline that actually works:&lt;/p&gt;

&lt;p&gt;scan → decide → plan → package → sign → apply&lt;/p&gt;

&lt;p&gt;That second step?&lt;br&gt;
That’s the whole game.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Better Analogy
&lt;/h2&gt;

&lt;p&gt;People like to say:&lt;/p&gt;

&lt;p&gt;“DEX is like a Git commit + migration + signature.”&lt;/p&gt;

&lt;p&gt;That’s fine. But here’s the one that actually sticks:&lt;/p&gt;

&lt;p&gt;A DEX artifact is to transformations what a container image is to execution.&lt;/p&gt;

&lt;p&gt;And just like containers:&lt;/p&gt;

&lt;p&gt;you still need a clean build&lt;br&gt;
you still need a sane base&lt;br&gt;
you still need a history&lt;br&gt;
and if you mess it up…&lt;br&gt;
you get reproducible garbage at scale&lt;/p&gt;

&lt;h2&gt;
  
  
  The Point of Determinism
&lt;/h2&gt;

&lt;p&gt;Determinism is not about rigidity. It’s about removing surprises.&lt;/p&gt;

&lt;p&gt;Same input:&lt;/p&gt;

&lt;p&gt;same extraction&lt;br&gt;
same decisions&lt;br&gt;
same plan&lt;br&gt;
same artifact&lt;/p&gt;

&lt;p&gt;No ghosts.&lt;br&gt;
No hidden state.&lt;br&gt;
No “it worked on my machine, I swear.”&lt;br&gt;
No excuses.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lineage (or: how to make transformations testify in court)
&lt;/h2&gt;

&lt;p&gt;Determinism gives you consistency.&lt;/p&gt;

&lt;p&gt;Lineage gives you &lt;strong&gt;memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every DEX artifact produced by Dennis carries a trace of how it came to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the original inputs
&lt;/li&gt;
&lt;li&gt;the transformation plan
&lt;/li&gt;
&lt;li&gt;the resulting artifact
&lt;/li&gt;
&lt;li&gt;the signatures applied
&lt;/li&gt;
&lt;li&gt;and critically — the hash of the previous state
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each step is chained.&lt;br&gt;
Each artifact knows where it came from.&lt;br&gt;
Each transformation leaves a fingerprint.&lt;/p&gt;




&lt;p&gt;This is not just versioning. This is &lt;strong&gt;forensic lineage&lt;/strong&gt;.&lt;br&gt;
It doesn’t just record history. It makes history verifiable.&lt;/p&gt;




&lt;p&gt;You can take the latest artifact in a chain and walk it backwards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what changed
&lt;/li&gt;
&lt;li&gt;when it changed
&lt;/li&gt;
&lt;li&gt;how it changed
&lt;/li&gt;
&lt;li&gt;who signed it&lt;/li&gt;
&lt;li&gt;and which exact artifact caused it
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No guesswork. No archaeology.&lt;br&gt;
No “who ran that script three weeks ago?”&lt;/p&gt;




&lt;p&gt;And because every step is hashed and linked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tampering is not just difficult — it’s obvious&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Break the chain, and the artifact tells on you.&lt;/p&gt;




&lt;p&gt;This is where DEX stops being a developer convenience and starts becoming something else:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;a system of record for transformations&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;At that point, you’re no longer just applying changes.&lt;/p&gt;

&lt;p&gt;You’re building a history that can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspected
&lt;/li&gt;
&lt;li&gt;verified
&lt;/li&gt;
&lt;li&gt;replayed
&lt;/li&gt;
&lt;li&gt;audited
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Or, if things go sideways…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reversed with surgical precision
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Determinism tells you &lt;em&gt;what will happen&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Lineage tells you &lt;em&gt;what already happened&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Together?&lt;/p&gt;

&lt;p&gt;That’s trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  And Then DEX Makes Sense
&lt;/h2&gt;

&lt;p&gt;Once the input is clean:&lt;/p&gt;

&lt;p&gt;the plan becomes inspectable&lt;br&gt;
the artifact becomes trustworthy&lt;br&gt;
the signature actually means something&lt;br&gt;
the undo becomes real, not theoretical&lt;/p&gt;

&lt;p&gt;DEX isn’t the magic trick.&lt;br&gt;
DEX is what happens after you stop lying to yourself about your input.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shift
&lt;/h2&gt;

&lt;p&gt;Before:&lt;br&gt;
“Let’s run a script and hope this doesn’t ruin everything.”&lt;/p&gt;

&lt;p&gt;After:&lt;br&gt;
“Let’s generate a deterministic plan, inspect it, and then decide if we trust it.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;We’ve learned to version:&lt;/p&gt;

&lt;p&gt;code&lt;br&gt;
dependencies&lt;br&gt;
infrastructure&lt;/p&gt;

&lt;p&gt;But the transformations that shape them? Those usually vanish the moment they run.&lt;/p&gt;

&lt;p&gt;Gone.&lt;br&gt;
Untraceable.&lt;br&gt;
Unrepeatable.&lt;/p&gt;

&lt;p&gt;DEX artifacts don’t just package transformations. They force them into the light.&lt;/p&gt;

&lt;p&gt;And Dennis?&lt;br&gt;
Dennis is still the forge. But the forge was never the interesting part.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crevilla2050.github.io/dennis-forge/" rel="noopener noreferrer"&gt;https://crevilla2050.github.io/dennis-forge/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real power was deciding what was worth forging in the first place.&lt;/p&gt;

&lt;p&gt;And yes…&lt;/p&gt;

&lt;p&gt;The chickens have been officially retired.&lt;/p&gt;

&lt;p&gt;No severance package. &lt;br&gt;
Negotiations ongoing.&lt;br&gt;
Legal is reviewing the chickens' case.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>refactorit</category>
    </item>
    <item>
      <title>What the Hex is a Dex? Introducing Deterministic Transformation Artifacts</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Fri, 13 Mar 2026 07:11:43 +0000</pubDate>
      <link>https://dev.to/crevilla2050/what-the-hex-is-a-dex-introducing-deterministic-transformation-artifacts-397d</link>
      <guid>https://dev.to/crevilla2050/what-the-hex-is-a-dex-introducing-deterministic-transformation-artifacts-397d</guid>
      <description>&lt;p&gt;Large code refactors usually happen through fragile scripts, regex sorcery, and the occasional ritual chicken.&lt;/p&gt;

&lt;p&gt;What if transformations themselves were portable, inspectable artifacts you could sign, verify, and undo?&lt;/p&gt;

&lt;p&gt;Meet DEX — deterministic transformation artifacts, forged with a tool called Dennis.&lt;/p&gt;

&lt;p&gt;The Problem: Code Transformations Are Usually Chaos&lt;/p&gt;

&lt;p&gt;Software engineers constantly need to transform codebases.&lt;br&gt;
Not just small edits. We're talking about massive structural changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API migrations&lt;/li&gt;
&lt;li&gt;framework upgrades&lt;/li&gt;
&lt;li&gt;localization rewrites&lt;/li&gt;
&lt;li&gt;security patches across hundreds of repositories&lt;/li&gt;
&lt;li&gt;refactors touching thousands of files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the time these transformations are done with a mix of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fragile scripts&lt;/li&gt;
&lt;li&gt;regex sorcery&lt;/li&gt;
&lt;li&gt;one-off codemods&lt;/li&gt;
&lt;li&gt;questionable search-and-replace rituals involving chickens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And once the script runs… Well.&lt;br&gt;
Good luck.&lt;/p&gt;

&lt;p&gt;You often get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no clear audit trail&lt;/li&gt;
&lt;li&gt;no reproducibility&lt;/li&gt;
&lt;li&gt;no safe rollback&lt;/li&gt;
&lt;li&gt;no way to inspect the transformation beforehand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: You just ran a very large mutation across your codebase and now you're praying to the CI gods that the chicken satisfied their thirst for bugs.&lt;/p&gt;

&lt;p&gt;But... What If Code Transformations Were Artifacts?&lt;br&gt;
Imagine this: Instead of executing transformations blindly, what if we treated them like first-class artifacts? Something you could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspect&lt;/li&gt;
&lt;li&gt;verify&lt;/li&gt;
&lt;li&gt;share&lt;/li&gt;
&lt;li&gt;sign&lt;/li&gt;
&lt;li&gt;reproduce&lt;/li&gt;
&lt;li&gt;and even undo (without needing any chickens)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the idea behind DEX.&lt;br&gt;
DEX: Deterministic Transformation Artifacts&lt;/p&gt;

&lt;p&gt;A DEX artifact is a portable package that describes a code transformation in a deterministic way.&lt;/p&gt;

&lt;p&gt;Think of it as something like:&lt;/p&gt;

&lt;p&gt;Git commit&lt;br&gt;
+&lt;br&gt;
migration script&lt;br&gt;
+&lt;br&gt;
cryptographic signature&lt;br&gt;
+&lt;br&gt;
replayable transformation plan&lt;/p&gt;

&lt;p&gt;But instead of being tied to a specific repository state, a DEX artifact describes the transformation itself.&lt;/p&gt;

&lt;p&gt;Inside a DEX artifact you typically find:&lt;/p&gt;

&lt;p&gt;DEX&lt;br&gt;
├── manifest.json&lt;br&gt;
├── payload/&lt;br&gt;
│ └── plan.json&lt;br&gt;
└── signatures/&lt;/p&gt;

&lt;p&gt;The important piece is the transformation plan. That plan describes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which files change&lt;/li&gt;
&lt;li&gt;which lines are modified&lt;/li&gt;
&lt;li&gt;what the original code was&lt;/li&gt;
&lt;li&gt;what the replacement becomes&lt;/li&gt;
&lt;li&gt;which helpers were injected&lt;/li&gt;
&lt;li&gt;the exact hash of the source file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything needed to reproduce the change deterministically.&lt;br&gt;
Given the same inputs, the artifact will always produce the same transformation output. No hidden state, no runtime surprises.&lt;/p&gt;

&lt;p&gt;The Dennis Forge&lt;/p&gt;

&lt;p&gt;DEX artifacts are produced by a tool called Dennis.&lt;br&gt;
Dennis is a deterministic codemod engine designed around a simple philosophy:&lt;/p&gt;

&lt;p&gt;"Transformations should be planned, inspectable, and reversible."&lt;/p&gt;

&lt;p&gt;The workflow looks like this:&lt;/p&gt;

&lt;p&gt;Scan → Plan → Package → Sign → Verify → Apply&lt;/p&gt;

&lt;p&gt;Instead of modifying your project directly, Dennis first generates a plan.&lt;br&gt;
It is safe enough to try at home. No chickens required.&lt;/p&gt;

&lt;p&gt;So... enough theory.&lt;br&gt;
Let’s forge an artifact.&lt;br&gt;
To begin with, clone the small example repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/crevilla2050/hello-dennis
&lt;span class="nb"&gt;cd &lt;/span&gt;hello-dennis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside you will find a minimal Python program:&lt;/p&gt;

&lt;h1&gt;
  
  
  !/usr/bin/env python3
&lt;/h1&gt;

&lt;p&gt;def main():&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;print("Hello world.")
print("Thank you for using Dennis. Love, the Dennis Team.")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;if &lt;strong&gt;name&lt;/strong&gt; == "&lt;strong&gt;main&lt;/strong&gt;":&lt;br&gt;
    main()&lt;/p&gt;

&lt;p&gt;Nothing fancy.&lt;br&gt;
Just two hardcoded strings — exactly the kind of thing that quietly spreads across a codebase until someone eventually says:&lt;/p&gt;

&lt;p&gt;“We should probably internationalize this.”&lt;/p&gt;
&lt;h2&gt;
  
  
  Generating the Transformation Plan
&lt;/h2&gt;

&lt;p&gt;To build a new artifact, once the repository is on your local machine, run the following inside the project folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis plan run &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--dict&lt;/span&gt; messages_en.json &lt;span class="nt"&gt;--add-helper&lt;/span&gt; helper.py &lt;span class="nt"&gt;--target-file&lt;/span&gt; hello.py &lt;span class="nt"&gt;--line&lt;/span&gt; 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command analyzes the project and produces a deterministic transformation plan describing exactly what changes will occur.&lt;/p&gt;

&lt;p&gt;However, nothing is modified yet.&lt;/p&gt;

&lt;p&gt;Dennis always starts with a plan.&lt;/p&gt;

&lt;p&gt;The plan is simply a JSON document describing the transformation.&lt;br&gt;
You can open it and inspect it directly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Packaging the Artifact
&lt;/h2&gt;

&lt;p&gt;Once the plan exists, you can package it into a DEX artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis pack plan.json hello-dennis.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point the transformation becomes a portable artifact. It can be shared, inspected, versioned, and stored like any other build artifact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signing the Artifact
&lt;/h2&gt;

&lt;p&gt;DEX artifacts can also be cryptographically signed.&lt;br&gt;
First generate a signing key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis keygen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then sign the artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis dex sign hello-dennis.dex &lt;span class="nt"&gt;--key&lt;/span&gt; dennis.key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the artifact contains a verifiable signature proving its origin. If someone modifies the artifact payload and signs it again, older signatures remain inside the artifact as part of its historical record. This creates a chain of custody for transformations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspecting the Artifact
&lt;/h2&gt;

&lt;p&gt;Before executing anything, you can inspect the artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis inspect hello-dennis.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dennis will display:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;artifact metadata&lt;/li&gt;
&lt;li&gt;payload type&lt;/li&gt;
&lt;li&gt;payload hash&lt;/li&gt;
&lt;li&gt;signatures&lt;/li&gt;
&lt;li&gt;transformation information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows engineers to verify what the artifact contains before trusting it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Applying the Transformation
&lt;/h2&gt;

&lt;p&gt;To execute the transformation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis rehydrate hello-dennis.dex
dennis apply rehydrated-plan.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your Python script will be transformed into a localization-ready structure. Instead of hardcoded strings, the program will now load messages from a dictionary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Result
&lt;/h2&gt;

&lt;p&gt;You can now try running the program with different language settings.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;es python hello.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;de python hello.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The program will automatically load the corresponding translation dictionary.&lt;br&gt;
No chicken magic. Just deterministic, reversible transformations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Undoing the Transformation
&lt;/h2&gt;

&lt;p&gt;Dennis transformations are reversible by design. If something goes wrong, you can generate the inverse plan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis invert rehydrated-plan.json
dennis apply rehydrated-plan.undo.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your project returns to its original state.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Git resets.&lt;/li&gt;
&lt;li&gt;No archaeology.&lt;/li&gt;
&lt;li&gt;Just a deterministic undo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Encrypted Artifacts: XDEX
&lt;/h2&gt;

&lt;p&gt;In some situations you may want to distribute a transformation artifact without exposing the internal transformation logic.&lt;/p&gt;

&lt;p&gt;For that purpose Dennis supports &lt;strong&gt;XDEX artifacts&lt;/strong&gt;.&lt;br&gt;
An XDEX artifact is simply an encrypted version of a DEX file.&lt;/p&gt;

&lt;p&gt;DEX  →  XDEX&lt;/p&gt;

&lt;p&gt;The payload is encrypted while the outer metadata remains visible.&lt;/p&gt;

&lt;p&gt;This allows organizations to distribute verifiable transformation artifacts while keeping the transformation plan confidential.&lt;/p&gt;

&lt;p&gt;You can encrypt an artifact like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis encrypt hello-dennis.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Matters?
&lt;/h2&gt;

&lt;p&gt;Modern software pipelines treat many things as artifacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;container images&lt;/li&gt;
&lt;li&gt;compiled binaries&lt;/li&gt;
&lt;li&gt;dependency locks&lt;/li&gt;
&lt;li&gt;signed releases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But strangely, code transformations themselves are often invisible. DEX artifacts change that. They turn transformations into portable, inspectable, verifiable objects. Which means software evolution itself becomes something we can track, audit, and reproduce.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Software history is written through transformations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactors.&lt;/li&gt;
&lt;li&gt;Migrations.&lt;/li&gt;
&lt;li&gt;Patches.&lt;/li&gt;
&lt;li&gt;Upgrades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the time those transformations vanish after they run.&lt;/p&gt;

&lt;p&gt;DEX artifacts make them visible.&lt;/p&gt;

&lt;p&gt;And Dennis is the forge where they are made.&lt;/p&gt;

&lt;p&gt;The forge lives under: &lt;a href="https://github.com/crevilla2050/string-audit" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/string-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install with pip or pipx, and start DEX-ing your code.&lt;br&gt;
DEX artifacts turn transformations into something you can pass around, inspect, and trust.&lt;/p&gt;

&lt;p&gt;And may chickens live forever!&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.amazonaws.com%2Fuploads%2Farticles%2F31v4gyf9o2hccx6yat1m.png" 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.amazonaws.com%2Fuploads%2Farticles%2F31v4gyf9o2hccx6yat1m.png" alt=" " width="740" height="740"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>refactorit</category>
      <category>devtools</category>
    </item>
    <item>
      <title>My first Dev.to post: building a deterministic codemod engine (Dennis Forge)</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Thu, 05 Mar 2026 06:22:32 +0000</pubDate>
      <link>https://dev.to/crevilla2050/my-first-devto-post-building-a-deterministic-codemod-engine-dennis-forge-296n</link>
      <guid>https://dev.to/crevilla2050/my-first-devto-post-building-a-deterministic-codemod-engine-dennis-forge-296n</guid>
      <description>&lt;p&gt;Hello Dev.to!&lt;/p&gt;

&lt;p&gt;This is my first post here, so I thought I would introduce a small open-source tool I've been working on called Dennis Forge.&lt;/p&gt;

&lt;p&gt;The idea behind Dennis came from a very practical problem.&lt;/p&gt;

&lt;p&gt;In one of my projects I ended up with a mixture of translated strings, hard-coded strings, and inconsistent localization logic. Fixing it with quick scripts felt risky, because those scripts modify files immediately and it is difficult to see exactly what they will change.&lt;/p&gt;

&lt;p&gt;I started wondering if there was a safer workflow.&lt;/p&gt;

&lt;p&gt;Instead of modifying code directly, what if the tool generated a plan first?&lt;/p&gt;

&lt;p&gt;That idea eventually became Dennis.&lt;/p&gt;

&lt;p&gt;The core idea: Dennis is a CLI tool that generates deterministic transformation plans for codebases. Simple as that, yet powerful.&lt;/p&gt;

&lt;p&gt;Instead of immediately changing files, the workflow looks like this:&lt;/p&gt;

&lt;p&gt;scan project&lt;br&gt;
→ generate transformation plan&lt;br&gt;
→ inspect or edit the plan&lt;br&gt;
→ validate&lt;br&gt;
→ apply changes&lt;/p&gt;

&lt;p&gt;The plan is stored as human-readable JSON and becomes the source of truth for the transformation.&lt;br&gt;
Because of that, changes are transparent and predictable.&lt;/p&gt;

&lt;p&gt;Some design goals that while building Dennis, I tried to keep a few principles in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic output&lt;/li&gt;
&lt;li&gt;Human-readable plans&lt;/li&gt;
&lt;li&gt;Reversible transformations&lt;/li&gt;
&lt;li&gt;Fully offline operation&lt;/li&gt;
&lt;li&gt;No hidden magic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, Dennis tries to make large transformations inspectable before they happen.&lt;/p&gt;

&lt;p&gt;DEX artifacts&lt;/p&gt;

&lt;p&gt;Recently I added something called DEX artifacts.&lt;/p&gt;

&lt;p&gt;A DEX file packages a transformation plan together with metadata and optional cryptographic signatures. This allows plans to be shared or verified across machines while preserving determinism.&lt;/p&gt;

&lt;p&gt;The idea is still evolving, but it has been a fun architectural problem to explore.&lt;/p&gt;

&lt;p&gt;The project&lt;/p&gt;

&lt;p&gt;Dennis is fully open source.&lt;/p&gt;

&lt;p&gt;GitHub&lt;br&gt;
&lt;a href="https://github.com/crevilla2050/string-audit" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/string-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Project page&lt;br&gt;
&lt;a href="https://crevilla2050.github.io/dennis-forge/" rel="noopener noreferrer"&gt;https://crevilla2050.github.io/dennis-forge/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why I'm sharing it&lt;/p&gt;

&lt;p&gt;Partly to introduce myself to the Dev.to community, and partly because I'm curious how other developers approach large refactors or codemods safely.&lt;/p&gt;

&lt;p&gt;If you have experience with tools like this, I would love to hear your thoughts, if you have any comments, suggestions, questions or whatever your heart wants to say, I will be happy to hear from you.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>python</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
