<?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: Amn Tree</title>
    <description>The latest articles on DEV Community by Amn Tree (@amnezja3).</description>
    <link>https://dev.to/amnezja3</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%2F4138753%2Ff83dcc42-6ec3-4a39-92fe-3e0fc61c334d.png</url>
      <title>DEV Community: Amn Tree</title>
      <link>https://dev.to/amnezja3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amnezja3"/>
    <language>en</language>
    <item>
      <title>My Side Project Became a Systems Design Problem — So I Kept Building It</title>
      <dc:creator>Amn Tree</dc:creator>
      <pubDate>Wed, 23 Sep 2026 08:03:36 +0000</pubDate>
      <link>https://dev.to/amnezja3/my-side-project-became-a-systems-design-problem-so-i-kept-building-it-3p1g</link>
      <guid>https://dev.to/amnezja3/my-side-project-became-a-systems-design-problem-so-i-kept-building-it-3p1g</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlelesh57xmh31x2snp6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlelesh57xmh31x2snp6.png" alt=" " width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CHAOS in its current development state — a browser-based persistent world built around systems rather than predefined quests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I started building a browser game mostly to clear my head between other projects.&lt;/p&gt;

&lt;p&gt;No business plan.&lt;br&gt;
No monetization strategy.&lt;br&gt;
No investor deck.&lt;/p&gt;

&lt;p&gt;Just code.&lt;/p&gt;

&lt;p&gt;The project is called &lt;strong&gt;CHAOS — Cyber Hacking Adventure of Senses&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At the beginning, the idea was fairly simple: build a browser world inspired by old-school games, persistent online worlds and hacking culture.&lt;/p&gt;

&lt;p&gt;Then I made one decision that changed almost everything:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I didn't want the game to tell the player what to do.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No classic quest chain.&lt;/p&gt;

&lt;p&gt;No:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;go there → click this → collect reward&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, I wanted to build systems and let the player figure out how to use them.&lt;/p&gt;

&lt;p&gt;That sounded simple.&lt;/p&gt;

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


&lt;h2&gt;
  
  
  The game gives you systems, not instructions
&lt;/h2&gt;

&lt;p&gt;In CHAOS you enter a persistent world through something called the &lt;strong&gt;Ghost System&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You have a map.&lt;/p&gt;

&lt;p&gt;You can discover targets.&lt;/p&gt;

&lt;p&gt;You can use tools.&lt;/p&gt;

&lt;p&gt;You can build territory.&lt;/p&gt;

&lt;p&gt;You can attack somebody else's territory.&lt;/p&gt;

&lt;p&gt;You can trade data.&lt;/p&gt;

&lt;p&gt;You can cooperate with other players.&lt;/p&gt;

&lt;p&gt;You can join one of four factions.&lt;/p&gt;

&lt;p&gt;You can discover parts of machines hidden somewhere in the world.&lt;/p&gt;

&lt;p&gt;And eventually those machines can transmit data back to the year 2108.&lt;/p&gt;

&lt;p&gt;But the game doesn't give you one canonical procedure for achieving all of this.&lt;/p&gt;

&lt;p&gt;The same result may be reachable through the map, a window application, the terminal, a script, a purchased tool, a player-created tool or cooperation with somebody else.&lt;/p&gt;

&lt;p&gt;The important part is that the &lt;strong&gt;world defines the rules, but the player defines the strategy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That design decision slowly turned a small browser game into something much closer to a stateful simulation.&lt;/p&gt;

&lt;p&gt;And that is where things became interesting.&lt;/p&gt;


&lt;h2&gt;
  
  
  Adding features turned out to be the easy part
&lt;/h2&gt;

&lt;p&gt;Making a button is easy.&lt;/p&gt;

&lt;p&gt;Making a map marker is easy.&lt;/p&gt;

&lt;p&gt;Making an endpoint that says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /hack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is also easy.&lt;/p&gt;

&lt;p&gt;This command is just a simplified example of a gameplay request: the client asks the backend to perform an action on the world.&lt;/p&gt;

&lt;p&gt;The difficult part starts when that action affects several systems at once.&lt;/p&gt;

&lt;p&gt;Imagine this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;player action
    ↓
target state
    ↓
territory ownership
    ↓
conflict state
    ↓
player profile projection
    ↓
map
    ↓
other players
    ↓
events / notifications / narrative
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This flow shows why a seemingly small action stops being local: once the world is persistent, one decision can change ownership, conflict state, UI projections and what other players are allowed to see.&lt;/p&gt;

&lt;p&gt;At some point I stopped thinking about CHAOS as a collection of endpoints.&lt;/p&gt;

&lt;p&gt;I started thinking about it as a world with multiple projections of the same truth.&lt;/p&gt;

&lt;p&gt;That distinction caused one of the most interesting bugs I've had in this project.&lt;/p&gt;




&lt;h1&gt;
  
  
  The hack succeeded — and the server returned failure
&lt;/h1&gt;

&lt;p&gt;There is a territory conflict system in CHAOS.&lt;/p&gt;

&lt;p&gt;To capture one of the conflict pillars, the player has to complete several actions.&lt;/p&gt;

&lt;p&gt;The last action finalizes the capture.&lt;/p&gt;

&lt;p&gt;Simple enough.&lt;/p&gt;

&lt;p&gt;Except sometimes the final request returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;409 CONFLICT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkkf7acz3wjvvbe0egmmx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkkf7acz3wjvvbe0egmmx.png" alt=" " width="799" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A territory conflict in CHAOS. One of the harder bugs appeared exactly at the moment when the final pillar changed ownership.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This status normally tells the client that the operation could not be completed because the expected state no longer matches the current state.&lt;/p&gt;

&lt;p&gt;The weird part was this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the pillar had actually been captured.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The world changed.&lt;/p&gt;

&lt;p&gt;Ownership changed.&lt;/p&gt;

&lt;p&gt;The request looked like a failure.&lt;/p&gt;

&lt;p&gt;And when the player tried the exact same action again, it usually succeeded.&lt;/p&gt;

&lt;p&gt;That is a nasty kind of bug.&lt;/p&gt;

&lt;p&gt;Because the UI says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;something failed&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;while the world says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;no, it didn't.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The production call chain eventually looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tool
→ /gonna-win
→ canonical ownership capture
→ territory commit
→ update previous owner's profile projection
→ stale profile revision
→ ProfileWriteConflict
→ HTTP 409
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sequence shows the actual failure boundary: the authoritative territory change had already committed successfully, but a later synchronization of a secondary player-profile projection failed because its revision was stale. &lt;/p&gt;

&lt;p&gt;That was the key realization.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;canonical state was already correct&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The thing that failed was only a secondary projection.&lt;/p&gt;

&lt;p&gt;The server was effectively saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I successfully changed the world, but failed to update one representation of that world, therefore I will tell the client the entire operation failed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which is obviously wrong.&lt;/p&gt;

&lt;p&gt;The invariant became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;canonical capture success
must not become failure
because a secondary projection lost a CAS race
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rule separates the authoritative transaction from derived state: once canonical ownership has committed, a later projection conflict may require retry or deferred repair, but it cannot retroactively turn that world mutation into a failed gameplay action. &lt;/p&gt;

&lt;p&gt;The fix wasn't "retry the request from JavaScript".&lt;/p&gt;

&lt;p&gt;That would have hidden the problem.&lt;/p&gt;

&lt;p&gt;Instead, the secondary projection was removed from the canonical commit boundary.&lt;/p&gt;

&lt;p&gt;Profile synchronization became a bounded patch using the latest revision, with retry/rebase for ordinary CAS conflicts.&lt;/p&gt;

&lt;p&gt;And if that projection still couldn't be written, it could be repaired later.&lt;/p&gt;

&lt;p&gt;The world action remained successful.&lt;/p&gt;

&lt;p&gt;That one bug taught me more about the architecture of the project than a lot of planned features did.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source of truth is not the same thing as what the UI currently sees
&lt;/h2&gt;

&lt;p&gt;CHAOS has accumulated several versions of the same kind of lesson.&lt;/p&gt;

&lt;p&gt;A map can show a projection.&lt;/p&gt;

&lt;p&gt;A profile can show a projection.&lt;/p&gt;

&lt;p&gt;A cache can contain a projection.&lt;/p&gt;

&lt;p&gt;A player's current target can be a projection.&lt;/p&gt;

&lt;p&gt;But none of these things should automatically become the source of truth.&lt;/p&gt;

&lt;p&gt;One especially painful incident came from treating a bounded player identity projection as if it were a complete profile object.&lt;/p&gt;

&lt;p&gt;The result was exactly what you would expect from overwriting a large object with a sparse one:&lt;/p&gt;

&lt;p&gt;missing fields.&lt;/p&gt;

&lt;p&gt;Progression disappeared.&lt;/p&gt;

&lt;p&gt;Identity fields disappeared.&lt;/p&gt;

&lt;p&gt;Parts of the account looked like a fresh profile.&lt;/p&gt;

&lt;p&gt;The architectural rule that came out of that incident was brutally simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sparse projection != canonical state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rule means that a smaller representation created for one purpose must never be accepted as a complete authoritative object just because both happen to resemble the same data structure. &lt;/p&gt;

&lt;p&gt;That sounds obvious when written down.&lt;/p&gt;

&lt;p&gt;It was much less obvious while several systems were evolving at the same time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then the profile became 30 MB
&lt;/h2&gt;

&lt;p&gt;Another fun one.&lt;/p&gt;

&lt;p&gt;At one point, historical operations started leaking back into the main player profile.&lt;/p&gt;

&lt;p&gt;Some accounts accumulated hundreds or more than a thousand operations.&lt;/p&gt;

&lt;p&gt;One profile had roughly &lt;strong&gt;33 MB&lt;/strong&gt; of historical operation data.&lt;/p&gt;

&lt;p&gt;And suddenly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hacking was around five times slower,&lt;/li&gt;
&lt;li&gt;the map became slower,&lt;/li&gt;
&lt;li&gt;operation controls became slower,&lt;/li&gt;
&lt;li&gt;the file manager became slower,&lt;/li&gt;
&lt;li&gt;the market became slower.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first instinct in a system like this is usually:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which worker is eating the CPU?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We stopped several workers.&lt;/p&gt;

&lt;p&gt;It didn't help.&lt;/p&gt;

&lt;p&gt;The real problem was that multiple hot paths were hydrating a massive profile containing data that already had its own canonical store. &lt;/p&gt;

&lt;p&gt;The solution was not caching harder.&lt;/p&gt;

&lt;p&gt;It was reducing responsibility.&lt;/p&gt;

&lt;p&gt;Operations stayed in the canonical operations store.&lt;/p&gt;

&lt;p&gt;Files got their own canonical store.&lt;/p&gt;

&lt;p&gt;Finalization received only the bounded data it required.&lt;/p&gt;

&lt;p&gt;The full player profile stopped being the transport layer between unrelated systems. &lt;/p&gt;

&lt;p&gt;That's probably one of the most reusable lessons I've taken from the project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When unrelated screens become slow at the same time, don't immediately optimize them individually. Look for a shared object that everybody suddenly started dragging through the system.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  And now I'm working on the part I'm most curious about
&lt;/h1&gt;

&lt;p&gt;The next experiment is something I'm currently calling the &lt;strong&gt;AI Interface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;CHAOS already uses AI for some narrative work.&lt;/p&gt;

&lt;p&gt;But I don't want the next step to be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;add an LLM-controlled NPC.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That feels too easy.&lt;/p&gt;

&lt;p&gt;The idea is much stranger.&lt;/p&gt;

&lt;p&gt;I want AI to become an actual player.&lt;/p&gt;

&lt;p&gt;Not a narrator.&lt;/p&gt;

&lt;p&gt;Not a scripted NPC.&lt;/p&gt;

&lt;p&gt;Not an admin bot.&lt;/p&gt;

&lt;p&gt;A player.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;its own account,&lt;/li&gt;
&lt;li&gt;money,&lt;/li&gt;
&lt;li&gt;tools,&lt;/li&gt;
&lt;li&gt;files,&lt;/li&gt;
&lt;li&gt;territory,&lt;/li&gt;
&lt;li&gt;relationships,&lt;/li&gt;
&lt;li&gt;history,&lt;/li&gt;
&lt;li&gt;knowledge,&lt;/li&gt;
&lt;li&gt;mistakes,&lt;/li&gt;
&lt;li&gt;consequences.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core rule is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human and AI players should live in the same world and follow the same game rules.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The difference should only be how they perceive the interface and how they make decisions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qc2470v8dirlrnhkq5q.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qc2470v8dirlrnhkq5q.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The AI Interface idea: two different clients, one world, one set of rules. The model should never get privileged access to canonical state.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  But giving an AI the backend API would be cheating
&lt;/h2&gt;

&lt;p&gt;This is the part I'm currently thinking about the most.&lt;/p&gt;

&lt;p&gt;A human player sees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;windows,&lt;/li&gt;
&lt;li&gt;buttons,&lt;/li&gt;
&lt;li&gt;a map,&lt;/li&gt;
&lt;li&gt;markers,&lt;/li&gt;
&lt;li&gt;files,&lt;/li&gt;
&lt;li&gt;terminal output,&lt;/li&gt;
&lt;li&gt;messages,&lt;/li&gt;
&lt;li&gt;notifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Giving a model direct database access would obviously destroy the idea.&lt;/p&gt;

&lt;p&gt;Giving it functions like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hack_target(target_id)
find_best_enemy()
get_hidden_machine_part()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;would also destroy it.&lt;/p&gt;

&lt;p&gt;These functions would turn the model into an operator with privileged knowledge rather than a player discovering the world.&lt;/p&gt;

&lt;p&gt;So the current design is different.&lt;/p&gt;

&lt;p&gt;The human gets the graphical CHAOS client.&lt;/p&gt;

&lt;p&gt;The AI gets a &lt;strong&gt;semantic client representing the same interface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If the human opens the map, the AI can open the map.&lt;/p&gt;

&lt;p&gt;If the human has to inspect a target before knowing what it is, the AI also has to inspect it.&lt;/p&gt;

&lt;p&gt;If the human needs to type &lt;code&gt;help&lt;/code&gt; in the terminal to discover a command, the AI has to do the same.&lt;/p&gt;

&lt;p&gt;If a player doesn't own a tool, the AI doesn't magically get its capability.&lt;/p&gt;

&lt;p&gt;And every actual gameplay action still goes through the normal game engine, which validates range, ownership, costs, cooldowns, state and permissions before executing it. &lt;/p&gt;

&lt;p&gt;The model chooses.&lt;/p&gt;

&lt;p&gt;The world decides whether that choice is legal.&lt;/p&gt;




&lt;h2&gt;
  
  
  The weirdest requirement: AI must also be allowed to be wrong
&lt;/h2&gt;

&lt;p&gt;This is where the problem gets really interesting.&lt;/p&gt;

&lt;p&gt;CHAOS contains deception.&lt;/p&gt;

&lt;p&gt;Fake markers.&lt;/p&gt;

&lt;p&gt;False traces.&lt;/p&gt;

&lt;p&gt;Modified projections.&lt;/p&gt;

&lt;p&gt;Incomplete information.&lt;/p&gt;

&lt;p&gt;So if the human interface can be fooled, the AI interface should also be fooled.&lt;/p&gt;

&lt;p&gt;An autonomous AI player should not receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;marker:
  type: fake_marker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because a human doesn't see that label.&lt;/p&gt;

&lt;p&gt;It should just see the marker.&lt;/p&gt;

&lt;p&gt;Only after using the correct detection mechanism should its knowledge change.&lt;/p&gt;

&lt;p&gt;The design rule I currently use is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Equality also means an equal right to be deceived.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AI Interface is therefore not supposed to expose canonical reality.&lt;/p&gt;

&lt;p&gt;It should expose &lt;strong&gt;the reality available to that player&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;And this creates the question I'm genuinely unsure about.&lt;/p&gt;




&lt;h1&gt;
  
  
  What would you do?
&lt;/h1&gt;

&lt;p&gt;If you were building an autonomous player for a persistent browser world, which direction would you take?&lt;/p&gt;

&lt;p&gt;Would you make the AI literally operate the same graphical interface as a human — vision, mouse, windows and all?&lt;/p&gt;

&lt;p&gt;Or would you build a semantic equivalent of the interface, where:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pixels → structured perception
click → semantic interaction
GUI state → bounded world observation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This mapping describes the proposed AI Interface: visual presentation is translated into structured perception and explicit interactions, but only information that the human client could legitimately expose is allowed through.&lt;/p&gt;

&lt;p&gt;The semantic version is obviously cheaper and more reliable.&lt;/p&gt;

&lt;p&gt;But it introduces a dangerous architectural question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At what point does a semantic interface stop being an equivalent interface and start becoming an unfair privileged API?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the part I find genuinely interesting.&lt;/p&gt;

&lt;p&gt;My current answer is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;same world,&lt;/li&gt;
&lt;li&gt;same capabilities,&lt;/li&gt;
&lt;li&gt;same visibility,&lt;/li&gt;
&lt;li&gt;same consequences,&lt;/li&gt;
&lt;li&gt;no administrative knowledge,&lt;/li&gt;
&lt;li&gt;no optimal strategy supplied by the backend,&lt;/li&gt;
&lt;li&gt;no hidden target discovery,&lt;/li&gt;
&lt;li&gt;no direct canonical-state access,&lt;/li&gt;
&lt;li&gt;every action validated by the normal game engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I'm not convinced this is the only good answer.&lt;/p&gt;

&lt;p&gt;If you've worked on autonomous agents, game AI, semantic interfaces, simulations or anything remotely similar, I'm really curious how you would draw that boundary.&lt;/p&gt;

&lt;p&gt;And if you're building some weird side project that started small and got completely out of hand, drop it in the comments.&lt;/p&gt;

&lt;p&gt;I collect those kinds of projects.&lt;/p&gt;

&lt;p&gt;They tend to be the most interesting ones.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;CHAOS started as a way to relax by writing some code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It somehow turned into a persistent-world experiment involving state machines, canonical stores, projections, race conditions, territorial conflicts, local LLMs and now autonomous AI players.&lt;/p&gt;

&lt;p&gt;So far, that has been the fun part.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to take a look inside:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live dev environment:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://chaos.dmd-transport.pl" rel="noopener noreferrer"&gt;https://chaos.dmd-transport.pl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not the official domain of the game or a polished public landing page. Think of it as a &lt;strong&gt;developer entrance into the current CHAOS world&lt;/strong&gt; — things may change, break or still be unfinished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source / project:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/amnezja3/chaos" rel="noopener noreferrer"&gt;https://github.com/amnezja3/chaos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to play with it — you're welcome.&lt;br&gt;
If you want to add something of your own — you're welcome.&lt;br&gt;
If you think something is badly designed, overengineered or simply makes no sense — you're also very welcome.&lt;/p&gt;

&lt;p&gt;Good ideas help the project grow.&lt;br&gt;
Good criticism usually helps even more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;See you somewhere inside CHAOS.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// Amn Tree&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>gamedev</category>
      <category>programming</category>
      <category>architecture</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
