<?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: juan gonzalez</title>
    <description>The latest articles on DEV Community by juan gonzalez (@taiwildlab_79c1fbf3cc5).</description>
    <link>https://dev.to/taiwildlab_79c1fbf3cc5</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%2F3873318%2F2704d37e-e97c-4543-bcd1-92bd95e0e87a.png</url>
      <title>DEV Community: juan gonzalez</title>
      <link>https://dev.to/taiwildlab_79c1fbf3cc5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/taiwildlab_79c1fbf3cc5"/>
    <language>en</language>
    <item>
      <title>Why an Evolutionary System Needs Memory</title>
      <dc:creator>juan gonzalez</dc:creator>
      <pubDate>Wed, 26 Aug 2026 10:07:27 +0000</pubDate>
      <link>https://dev.to/taiwildlab_79c1fbf3cc5/why-an-evolutionary-system-needs-memory-1ldn</link>
      <guid>https://dev.to/taiwildlab_79c1fbf3cc5/why-an-evolutionary-system-needs-memory-1ldn</guid>
      <description>&lt;p&gt;I used to think an evolutionary system needed two things:&lt;br&gt;
variation and selection.&lt;br&gt;
Something changes. The system observes the result. Better variants survive.&lt;br&gt;
That sounds reasonable — until you try to build one.&lt;br&gt;
While working on an evolutionary trading system, we ran into a more basic problem:&lt;br&gt;
If the system cannot reliably remember what changed, why it changed, and what happened afterward, it cannot prove that it is improving.&lt;br&gt;
It can only prove that it is changing.&lt;br&gt;
That distinction matters.&lt;br&gt;
A system can modify parameters, promote agents, remove weak strategies, or generate new variants. From the outside, all of that looks like evolution.&lt;br&gt;
But later you may want to ask:&lt;br&gt;
Why was this agent promoted?&lt;br&gt;
What evidence justified the decision?&lt;br&gt;
What was the previous state?&lt;br&gt;
What happened after the change?&lt;br&gt;
Was the new state actually better?&lt;br&gt;
If those answers cannot be reconstructed, the system has activity, but not real evolutionary memory.&lt;br&gt;
Memory is more than storage&lt;br&gt;
More logs are not enough.&lt;br&gt;
More metrics are not enough.&lt;br&gt;
Useful evolutionary memory needs structure.&lt;br&gt;
A meaningful change should leave behind something like:&lt;br&gt;
previous state → evidence → decision → change → resulting state&lt;br&gt;
That chain gives us provenance.&lt;br&gt;
It tells us not only what the system is now, but how it got there.&lt;br&gt;
This is similar to software development.&lt;br&gt;
A source file tells you what the code looks like today.&lt;br&gt;
Git tells you how it became that way.&lt;br&gt;
An evolutionary system needs the same kind of lineage.&lt;br&gt;
Sometimes evolution means doing nothing&lt;br&gt;
There is another consequence.&lt;br&gt;
An evolutionary system should not change simply because it has permission to change.&lt;br&gt;
If no candidate satisfies the evidence threshold, the correct action may be:&lt;br&gt;
no change.&lt;br&gt;
That is not failure.&lt;br&gt;
It is discipline.&lt;br&gt;
A system that always changes produces novelty.&lt;br&gt;
A system that remembers, evaluates, and sometimes refuses to change has a chance to produce learning.&lt;br&gt;
So my original equation:&lt;br&gt;
Evolution = variation + selection&lt;br&gt;
has changed.&lt;br&gt;
I would now write:&lt;br&gt;
Evolution = variation + selection + verifiable memory&lt;br&gt;
Because without memory, selection cannot accumulate knowledge.&lt;br&gt;
And without accumulated knowledge, a system may keep changing while repeatedly rediscovering the same mistakes.&lt;br&gt;
The better question is no longer:&lt;br&gt;
Can the system change itself?&lt;br&gt;
It is:&lt;br&gt;
Can the system explain, with evidence, why its current state exists?&lt;br&gt;
If it can, then we may be getting closer to a system that actually evolves.&lt;/p&gt;

</description>
      <category>evolution</category>
      <category>provenance</category>
      <category>memory</category>
      <category>agents</category>
    </item>
    <item>
      <title>I shipped a fix. The system recovered. The fix wasn't why.</title>
      <dc:creator>juan gonzalez</dc:creator>
      <pubDate>Sat, 08 Aug 2026 19:02:51 +0000</pubDate>
      <link>https://dev.to/taiwildlab_79c1fbf3cc5/i-shipped-a-fix-the-system-recovered-the-fix-wasnt-why-jc7</link>
      <guid>https://dev.to/taiwildlab_79c1fbf3cc5/i-shipped-a-fix-the-system-recovered-the-fix-wasnt-why-jc7</guid>
      <description>&lt;p&gt;An autonomous system of mine lost access to its execution environment and went into a crash loop. I read the logs, formed a theory, wrote a commit, deployed it. It came back up. I closed the incident and moved on.&lt;/p&gt;

&lt;p&gt;A few days later I checked it properly, because not taking a system's word for itself is the work I do — and that has to include when the system is mine.&lt;/p&gt;

&lt;p&gt;Here is what the check looked like.&lt;/p&gt;

&lt;p&gt;The claim: a code change restored the system's access to its execution environment.&lt;/p&gt;

&lt;p&gt;The source that could settle it: not my commit message, and not my memory of that evening. The operational log, the provider's own error code, and the diff of what the commit actually modified.&lt;/p&gt;

&lt;p&gt;The test: compare the failure class in the log against the mechanism the commit changed. If they're the same mechanism, the claim holds. If they aren't, it can't hold, no matter how convincing the timing was.&lt;/p&gt;

&lt;p&gt;The result: the incident was an authentication failure. My commit corrected clock synchronisation — a real bug, in a different failure class entirely. The two were never connected. Something else brought the system back, most likely an environment change I made around the same time and didn't record.&lt;/p&gt;

&lt;p&gt;Verdict: FALSIFIED.&lt;/p&gt;

&lt;p&gt;The limit: I still can't show which environment variable changed. Key rotation fits the evidence. It is not demonstrated, and I'm not going to write it down as if it were. The gap is part of the finding.&lt;/p&gt;

&lt;p&gt;The shape of the reasoning&lt;/p&gt;

&lt;p&gt;The uncomfortable part isn't being wrong about a cause. It's the shape of the reasoning, because it's the shape most of us use:&lt;/p&gt;

&lt;p&gt;I deployed X. The problem stopped. Therefore X fixed it.&lt;/p&gt;

&lt;p&gt;That holds up exactly as long as nobody checks. In most systems nobody does, because there's nothing forcing the question. The incident closed. The graph went green. The next thing was already on fire.&lt;/p&gt;

&lt;p&gt;It gets worse with autonomous systems, and I think this part is under-discussed. Classic software failed loudly — an exception, a non-zero exit, a stack trace. Agents and pipelines fail quietly and keep reporting success. The path that executes and the path that reports are usually the same path. An agent says "done" because the command returned, not because the file exists. A dashboard says the traffic is human because the dashboard counts it that way.&lt;/p&gt;

&lt;p&gt;In that architecture, the absence of errors tells you nothing at all.&lt;/p&gt;

&lt;p&gt;What I do about it&lt;/p&gt;

&lt;p&gt;I take one specific claim a system makes about itself and check it against a source the system can't write to.&lt;/p&gt;

&lt;p&gt;Not an audit of the organisation. Not an implementation of the fix. One claim.&lt;/p&gt;

&lt;p&gt;Four possible verdicts: confirmed, falsified, partially confirmed, not assessable. The last one is a real outcome, not a failure of the check. If a claim can't be tested, what you've found is a hole in your observability — and a system that can't demonstrate what it claims today won't be able to demonstrate it on the day it breaks either.&lt;/p&gt;

&lt;p&gt;Three evidence levels, stated openly in every report: direct (read-only access), reproduced (you run the query, I read the output), declared (a statement, which doesn't stand on its own).&lt;/p&gt;

&lt;p&gt;Some claims I check with no access at all, because the surface is already public — response headers, DNS, what an endpoint actually returns, what a downloadable artefact actually contains.&lt;/p&gt;

&lt;p&gt;If you run one of these&lt;/p&gt;

&lt;p&gt;If you operate an agent, a RAG pipeline, or an automation, and there's one sentence about it you'd be uncomfortable defending under questioning — that sentence is the interesting one.&lt;/p&gt;

&lt;p&gt;I'm running a few of these free right now while I build the public record. You get the full report either way, including when the verdict is boring.&lt;/p&gt;

&lt;p&gt;taiwildlab.com — Juan Gonzalez, TaiwildLab&lt;/p&gt;

</description>
      <category>ai</category>
      <category>debugging</category>
      <category>devops</category>
      <category>architecture</category>
    </item>
    <item>
      <title>A Shadow Decision System Found a Semantic Boundary Bug in 14 Minutes</title>
      <dc:creator>juan gonzalez</dc:creator>
      <pubDate>Sun, 12 Jul 2026 11:18:00 +0000</pubDate>
      <link>https://dev.to/taiwildlab_79c1fbf3cc5/a-shadow-decision-system-found-a-semantic-boundary-bug-in-14-minutes-13fd</link>
      <guid>https://dev.to/taiwildlab_79c1fbf3cc5/a-shadow-decision-system-found-a-semantic-boundary-bug-in-14-minutes-13fd</guid>
      <description>&lt;p&gt;I am running an experimental autonomous trading architecture called Darwin. During an audit of its agent-ranking and sizing authorities, I built a read-only shadow producer to compare a candidate constraint system against the existing runtime behavior.&lt;/p&gt;

&lt;p&gt;The candidate had no operational authority:&lt;/p&gt;

&lt;p&gt;no position or capital writes;&lt;br&gt;
no lifecycle mutations;&lt;br&gt;
no promotions or reproduction;&lt;br&gt;
no writes to the operational sizing ledger;&lt;br&gt;
separate persistence for shadow cycles, events and comparisons.&lt;/p&gt;

&lt;p&gt;The first complete diagnostic cycle ran on July 11 at 18:22.&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;p&gt;agents_evaluated: 25&lt;br&gt;
matches: 8&lt;br&gt;
mismatches: 17&lt;br&gt;
max_absolute_delta: 0.5&lt;/p&gt;

&lt;p&gt;Every mismatch had the same multiplicative shape:&lt;/p&gt;

&lt;p&gt;expected  candidate&lt;br&gt;
0.500     1.000&lt;br&gt;
0.425     0.850&lt;br&gt;
0.350     0.700&lt;br&gt;
0.275     0.550&lt;br&gt;
0.200     0.400&lt;/p&gt;

&lt;p&gt;This immediately suggested that one path applied a 0.5 constraint that the other did not.&lt;/p&gt;

&lt;p&gt;The useful design decision was persisting the composition of each resolved multiplier, not only the final values.&lt;/p&gt;

&lt;p&gt;The comparison data showed the semantic divergence:&lt;/p&gt;

&lt;p&gt;expected_sources:&lt;br&gt;
[reduce_50, anticonvergence_penalty]&lt;/p&gt;

&lt;p&gt;candidate_sources:&lt;br&gt;
[anticonvergence_penalty]&lt;/p&gt;

&lt;p&gt;The discrepancy was therefore not primarily numerical. It was a disagreement about authority.&lt;br&gt;
The legacy expected-value translator applied a 50% reduction whenever coherence was below 0.40.&lt;br&gt;
The approved architecture defined two different domains:&lt;/p&gt;

&lt;p&gt;0.30 &amp;lt;= coherence &amp;lt; 0.40&lt;br&gt;
    sizing authority&lt;br&gt;
    multiplier *= 0.5&lt;/p&gt;

&lt;p&gt;coherence &amp;lt; 0.30&lt;br&gt;
    severe lifecycle condition&lt;br&gt;
    outside sizing authority&lt;/p&gt;

&lt;p&gt;The candidate producer respected the new boundary. The dual-run oracle still encoded the legacy interpretation.&lt;br&gt;
The bug was in the expected-value mechanism, not in the candidate.&lt;br&gt;
The correction was committed at 18:36. The same condition was executed again at 18:37:&lt;/p&gt;

&lt;p&gt;agents_evaluated: 25&lt;br&gt;
matches: 25&lt;br&gt;
mismatches: 0&lt;br&gt;
max_absolute_delta: 0.0&lt;/p&gt;

&lt;p&gt;The failed cycle was retained.&lt;br&gt;
The operational databases remained unchanged, and the operational sizing ledger contained zero new events.&lt;/p&gt;

&lt;p&gt;What made the diagnosis fast?&lt;br&gt;
A shadow comparator that stores only:&lt;/p&gt;

&lt;p&gt;expected_multiplier&lt;br&gt;
candidate_multiplier&lt;br&gt;
absolute_delta&lt;/p&gt;

&lt;p&gt;can raise an alert.&lt;br&gt;
A comparator that also stores:&lt;/p&gt;

&lt;p&gt;expected_sources&lt;br&gt;
candidate_sources&lt;br&gt;
dominant_constraint&lt;br&gt;
rule_version&lt;br&gt;
input_snapshot&lt;/p&gt;

&lt;p&gt;can produce a diagnosis.&lt;br&gt;
That changes the debugging question from:&lt;br&gt;
Where did the multiplication go wrong?&lt;br&gt;
to:&lt;br&gt;
Which rule was present on one decision path and absent on the other?&lt;br&gt;
The second audit: residual authority&lt;br&gt;
After correcting the mismatch, I opened a formal 48-hour observation window.&lt;br&gt;
The population was supposed to remain fixed. Reproduction had already been disabled through:&lt;br&gt;
REPRODUCTION_ACTIVE=false&lt;br&gt;
However, an hourly cron entry still executed auto_promote.py.&lt;br&gt;
No promotion occurred during the initial observation period, but the authority to mutate agent stages remained active.&lt;br&gt;
The process was disabled, and the formal window was restarted from the first successful shadow cycle after the freeze.&lt;br&gt;
This produced a useful distinction:&lt;br&gt;
Absence of mutation is not absence of mutation authority.&lt;br&gt;
For controlled observation, capabilities matter more than labels such as “reproduction disabled” or “read-only.”&lt;br&gt;
General design principles&lt;br&gt;
From this incident, I would extract five reusable rules:&lt;br&gt;
Persist decision composition, not only resolved values.&lt;br&gt;
Treat the expected-value oracle as a hypothesis, not as truth.&lt;br&gt;
Separate permission to calculate from permission to enforce.&lt;br&gt;
Preserve failed cycles as evidence.&lt;br&gt;
Audit every component that retains authority over the observed state.&lt;/p&gt;

&lt;p&gt;The shadow did not merely detect that two functions differed.&lt;/p&gt;

&lt;p&gt;It made the semantic boundary visible.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>architecture</category>
      <category>fintech</category>
      <category>testing</category>
    </item>
    <item>
      <title>La confianza no es una propiedad del agente. Es una propiedad de la arquitectura.</title>
      <dc:creator>juan gonzalez</dc:creator>
      <pubDate>Tue, 07 Jul 2026 17:31:15 +0000</pubDate>
      <link>https://dev.to/taiwildlab_79c1fbf3cc5/la-confianza-no-es-una-propiedad-del-agente-es-una-propiedad-de-la-arquitectura-142c</link>
      <guid>https://dev.to/taiwildlab_79c1fbf3cc5/la-confianza-no-es-una-propiedad-del-agente-es-una-propiedad-de-la-arquitectura-142c</guid>
      <description></description>
    </item>
    <item>
      <title>I Run 20+ Autonomous Trading Agents. Here Are the 5 Memory Failures That Almost Killed the System.</title>
      <dc:creator>juan gonzalez</dc:creator>
      <pubDate>Sat, 11 Apr 2026 10:39:29 +0000</pubDate>
      <link>https://dev.to/taiwildlab_79c1fbf3cc5/i-run-20-autonomous-trading-agents-here-are-the-5-memory-failures-that-almost-killed-the-system-718</link>
      <guid>https://dev.to/taiwildlab_79c1fbf3cc5/i-run-20-autonomous-trading-agents-here-are-the-5-memory-failures-that-almost-killed-the-system-718</guid>
      <description></description>
    </item>
  </channel>
</rss>
