<?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: Kfir Adut</title>
    <description>The latest articles on DEV Community by Kfir Adut (@kfiradut).</description>
    <link>https://dev.to/kfiradut</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%2F4131572%2F240f8da8-0ef9-4589-bbc3-15251be6a2ec.png</url>
      <title>DEV Community: Kfir Adut</title>
      <link>https://dev.to/kfiradut</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kfiradut"/>
    <language>en</language>
    <item>
      <title>A Test Report Should Say What It Cannot Prove</title>
      <dc:creator>Kfir Adut</dc:creator>
      <pubDate>Wed, 14 Oct 2026 05:25:06 +0000</pubDate>
      <link>https://dev.to/kfiradut/a-test-report-should-say-what-it-cannot-prove-3i0i</link>
      <guid>https://dev.to/kfiradut/a-test-report-should-say-what-it-cannot-prove-3i0i</guid>
      <description>&lt;p&gt;A test report can be accurate and still lead to the wrong decision.&lt;/p&gt;

&lt;p&gt;The problem is often the space between what the test checked and what the reader thinks it checked. "Passed" is a short word. It can quietly absorb claims about usability, reliability and readiness that were never part of the test.&lt;/p&gt;

&lt;p&gt;In my game projects, Instinct does much of the implementation and testing. I remain responsible for the direction and the decision to ship. That makes the handoff report part of the product work. I need to know what the evidence supports before deciding what should happen next.&lt;/p&gt;

&lt;p&gt;I have written about stop rules before. This is the reporting side of the same problem: how to describe a result without letting it become larger than the observation behind it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start with the claim
&lt;/h3&gt;

&lt;p&gt;"The feature works" is too broad to test usefully.&lt;/p&gt;

&lt;p&gt;"A hostile shot cannot award the same near-miss reward twice" is narrower. So is "the intended gameplay screen appears after launch." Neither statement proves that someone understands the mechanic or enjoys playing it.&lt;/p&gt;

&lt;p&gt;Those are different questions. They need different evidence.&lt;/p&gt;

&lt;p&gt;Before reading a result, I want to see the claim in a sentence. If the sentence contains several claims, it probably needs to be split. A test should not inherit a bigger job because the report uses a convenient label.&lt;/p&gt;

&lt;h3&gt;
  
  
  Put the observation beside it
&lt;/h3&gt;

&lt;p&gt;A useful report connects a claim to an observation someone can inspect.&lt;/p&gt;

&lt;p&gt;For a hypothetical game build, that might mean a regression trace showing that one projectile cannot award twice. For a visual claim, it might mean a capture of the relevant screen. For a touch-input claim, it requires evidence from the target interaction, not a desktop approximation quietly presented as the same thing.&lt;/p&gt;

&lt;p&gt;These are examples of evidence requirements, not a claim that a current candidate has passed them.&lt;/p&gt;

&lt;p&gt;The distinction matters because one artifact can be real but irrelevant. A screenshot proves that something was rendered. It does not, by itself, prove that it was the right screen, the right build or the state the task required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add the limit while the result is still fresh
&lt;/h3&gt;

&lt;p&gt;I would put a short limit beside every meaningful result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claim: the same projectile cannot award the reward twice.&lt;/li&gt;
&lt;li&gt;Evidence: the regression route checks repeated contact with that projectile.&lt;/li&gt;
&lt;li&gt;Limit: this does not establish that the reward feels fair on a phone.&lt;/li&gt;
&lt;li&gt;Next question: can a player understand why the reward appeared?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The limit is not an apology. It stops a precise result from becoming a vague promise.&lt;/p&gt;

&lt;p&gt;It also makes missing evidence visible. A device check that has not happened is not a failed device check. But it is not a pass, either. Reports need language for all of those states.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the next step proportional
&lt;/h3&gt;

&lt;p&gt;The report should make the next action easier to choose.&lt;/p&gt;

&lt;p&gt;If the remaining question is about player understanding, another run of the same logic test will not answer it. The useful next step could be a clearer cue or a focused playtest. If the remaining question is about an incorrect screen, adding a feature is a distraction.&lt;/p&gt;

&lt;p&gt;This is where fast AI-assisted work can help or hurt. Preparing another candidate is cheap enough that it can hide the fact that the missing evidence has not changed.&lt;/p&gt;

&lt;p&gt;I do not want a longer report for its own sake. I want a report that prevents me from approving a different claim from the one that was tested.&lt;/p&gt;

&lt;p&gt;The strongest handoff is often a modest one: this is what we observed, this is what it supports, and this is what we still do not know.&lt;/p&gt;

&lt;h3&gt;
  
  
  Related writing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/kfiradut/fast-ai-work-needs-a-stop-rule-166k"&gt;Fast AI Work Needs a Stop Rule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kfiradut/a-feature-isnt-finished-until-the-player-can-read-it-41ab"&gt;A Feature Isn't Finished Until the Player Can Read It&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How this article was prepared
&lt;/h3&gt;

&lt;p&gt;Instinct helped draft this article from my published project writing. I remain responsible for what appears under my name.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>ai</category>
      <category>gamedev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Fast AI Work Needs a Stop Rule</title>
      <dc:creator>Kfir Adut</dc:creator>
      <pubDate>Thu, 08 Oct 2026 14:19:52 +0000</pubDate>
      <link>https://dev.to/kfiradut/fast-ai-work-needs-a-stop-rule-166k</link>
      <guid>https://dev.to/kfiradut/fast-ai-work-needs-a-stop-rule-166k</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%2Ff12u7e1wlye868ttl0m2.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%2Ff12u7e1wlye868ttl0m2.png" alt="Several preparation paths converge at a verification boundary before release." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A fast implementation can leave the important decision untouched.&lt;/p&gt;

&lt;p&gt;The code exists. The build passes. There is a screenshot in the report. But should this version reach a user? What does the evidence actually establish? Who decides what happens next?&lt;/p&gt;

&lt;p&gt;Those questions become more important when an AI assistant does much of the building. It can prepare another version quickly. That makes it tempting to treat the next step as a continuation of the previous one, even when the next step carries a different kind of risk.&lt;/p&gt;

&lt;p&gt;I have written before about the division of work in my Godot projects: Instinct does much of the implementation and testing; I own the direction, the standard and the decision to ship.&lt;/p&gt;

&lt;p&gt;The practical question is how to make that boundary useful without turning every small change into a meeting.&lt;/p&gt;

&lt;p&gt;My answer is a stop rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate the work from the commitment
&lt;/h2&gt;

&lt;p&gt;Researching a change, implementing it in a candidate build and releasing it are different decisions.&lt;/p&gt;

&lt;p&gt;An assistant can prepare a candidate without deciding that people should receive it. It can run a test without deciding that the result answers every product question. It can propose a fix without deciding that the cost of changing the current version is acceptable.&lt;/p&gt;

&lt;p&gt;This is not an argument for asking permission before every line of code. It is an argument for naming the point where preparation becomes commitment.&lt;/p&gt;

&lt;p&gt;Before that point, keep the work moving. At that point, require the evidence the decision needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A passing test has a limited meaning
&lt;/h2&gt;

&lt;p&gt;The close-call mechanic in Ctrl+Alt+Liberate is a useful example.&lt;/p&gt;

&lt;p&gt;In the candidate described in my earlier article, a hostile shot passing near the ship could give a small FOCUS reward. Desktop regression checks covered conditions such as excluding protected passes and preventing the same shot from awarding the reward repeatedly.&lt;/p&gt;

&lt;p&gt;Those checks mattered. They did not establish how the vibration felt in a hand, whether a player could read the margin on a phone, or whether the game was balanced for people rather than scripted controllers.&lt;/p&gt;

&lt;p&gt;A desktop pass supported the next implementation decision. It did not settle the release decision.&lt;/p&gt;

&lt;p&gt;That distinction is easy to lose in a report that says only "tests passed." A better report names the claim that passed and the claim still waiting for evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the stop rule before the result arrives
&lt;/h2&gt;

&lt;p&gt;A useful stop rule is specific enough that a team can apply it without another round of interpretation.&lt;/p&gt;

&lt;p&gt;For a hypothetical Android release, I would write something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prepare the candidate and run the regression route. Stop before release if the intended gameplay screen is not visible, if input fails on the target device, or if the device check has not happened. A desktop pass alone does not clear the release.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is an example, not a report that those checks have been completed on a current build.&lt;/p&gt;

&lt;p&gt;The rule gives the assistant room to work. It also prevents missing evidence from becoming a quiet assumption.&lt;/p&gt;

&lt;p&gt;The most important phrase is often "has not happened." A missing check is different from a failed check, but neither should be presented as a pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep a small decision card
&lt;/h2&gt;

&lt;p&gt;I would put five fields beside a candidate change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decision:&lt;/strong&gt; What are we deciding now?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence:&lt;/strong&gt; What observation could change that decision?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limit:&lt;/strong&gt; What does this evidence not establish?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner:&lt;/strong&gt; Who can make the commitment?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop condition:&lt;/strong&gt; What blocks the next step?&lt;/li&gt;
&lt;/ul&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%2Fixjuvkfrhw452g28f8c0.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%2Fixjuvkfrhw452g28f8c0.png" alt="Decision card with Decision, Evidence, Limit, Owner and Stop condition, each paired with a short question. A missing check is not a pass." width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the hypothetical release above, the decision is whether to release, not whether the code compiles. The evidence includes the target-device route. The limit is that one successful route does not prove long-term balance. The owner is the person responsible for the release. The stop condition includes an absent device check.&lt;/p&gt;

&lt;p&gt;This is a small amount of writing. Its value comes from making the boundary visible before a good-looking result makes everyone impatient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop the wrong next step, not the whole project
&lt;/h2&gt;

&lt;p&gt;A stop rule should leave useful work available.&lt;/p&gt;

&lt;p&gt;If the release is waiting for a device check, the assistant can prepare the test route, document the known limits or investigate a separate regression. It should not describe the release as complete or replace the missing device evidence with more desktop runs.&lt;/p&gt;

&lt;p&gt;The same principle applies when a test fails. The next useful action may be diagnosis rather than another feature. More output is not automatically more progress.&lt;/p&gt;

&lt;p&gt;I want AI assistance to reduce the work I have to carry, not hide the decisions I still need to make. Clear boundaries help with both.&lt;/p&gt;

&lt;p&gt;The assistant can do much of the work. The evidence tells us what we know. The person responsible decides what that knowledge is enough to justify.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on how this article was made
&lt;/h2&gt;

&lt;p&gt;Instinct helped prepare this article from my published project writing. I remain responsible for what appears under my name.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>testing</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>A Feature Isn't Finished Until the Player Can Read It</title>
      <dc:creator>Kfir Adut</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:14:59 +0000</pubDate>
      <link>https://dev.to/kfiradut/a-feature-isnt-finished-until-the-player-can-read-it-41ab</link>
      <guid>https://dev.to/kfiradut/a-feature-isnt-finished-until-the-player-can-read-it-41ab</guid>
      <description>&lt;p&gt;A mechanic can work exactly as coded and still be unclear to the person playing.&lt;/p&gt;

&lt;p&gt;That is an easy gap to miss while building a game. You know what each meter means. You know why an enemy changed direction. You know what a warning is supposed to tell the player. After spending time with the system, its logic starts to feel obvious.&lt;/p&gt;

&lt;p&gt;The player does not have that context. They see a screen, make a guess, and learn from what happens next.&lt;/p&gt;

&lt;p&gt;When I work on a small arcade shooter, I try to think about a mechanic in two parts: what the system does, and what the player can understand about it. A near miss can reward careful movement. A focus meter can give a player a reason to keep a streak alive. A risk indicator can make a powerful choice feel costly. Those rules matter only if the feedback makes them readable.&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%2Ffawdwbdhx2w4lgnjww1k.jpeg" 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%2Ffawdwbdhx2w4lgnjww1k.jpeg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This changes how I evaluate a feature. "Does the counter update?" is a useful implementation check. It is not the same as asking, "Can someone tell why the counter changed?" A test can verify the first question. A playtest, a clear visual cue, or a short explanation may be needed for the second.&lt;/p&gt;

&lt;p&gt;The feedback does not have to be elaborate. A distinct sound, a brief animation, a change in color, or a well-timed pause can connect an action to its result. The point is not to decorate every event. The point is to give the player enough information to form a reliable mental model.&lt;/p&gt;

&lt;p&gt;There is a limit, too. Explain everything at once and the screen becomes another manual. Good feedback arrives when it can help: before danger, at the moment a choice is made, or immediately after the result. Let the player learn one rule, use it, and then meet the next one.&lt;/p&gt;

&lt;p&gt;I find it useful to ask three questions while tuning a mechanic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What did the player do?&lt;/li&gt;
&lt;li&gt;What changed because of it?&lt;/li&gt;
&lt;li&gt;Could the player tell why?&lt;/li&gt;
&lt;/ul&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%2Fcdufjg9bsolx1vcjfy7a.jpeg" 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%2Fcdufjg9bsolx1vcjfy7a.jpeg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the answer to the last question is no, adding another mechanic probably will not help. The system needs a clearer signal, a better sequence, or a simpler rule.&lt;/p&gt;

&lt;p&gt;This is not only a usability concern. Readable rules make a game feel fair. A player can accept a hard outcome more readily when they understand what led to it. When the connection is hidden, even a correct result can feel random.&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%2Fa6ko5wnnfetnzemeecxf.jpeg" 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%2Fa6ko5wnnfetnzemeecxf.jpeg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I treat clarity as part of implementation, not a final polish pass. A feature is not finished when its values change. It is finished when the player has a fair chance to understand what those changes mean.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
      <category>indiegames</category>
      <category>ux</category>
    </item>
    <item>
      <title>A Near Miss Is a Design Decision, Not Just a Collision Check</title>
      <dc:creator>Kfir Adut</dc:creator>
      <pubDate>Thu, 01 Oct 2026 08:35:04 +0000</pubDate>
      <link>https://dev.to/kfiradut/a-near-miss-is-a-design-decision-not-just-a-collision-check-14ab</link>
      <guid>https://dev.to/kfiradut/a-near-miss-is-a-design-decision-not-just-a-collision-check-14ab</guid>
      <description>&lt;p&gt;A bullet can miss the player by a few pixels and still change how the game feels.&lt;/p&gt;

&lt;p&gt;In Ctrl+Alt+Liberate, a portrait shoot-'em-up I am building in Godot, I wanted the space just outside the ship's hitbox to matter. Dodging a crowded pattern should feel deliberate. It should not require a player to take damage before the game acknowledges a risky move.&lt;/p&gt;

&lt;p&gt;So we added a close-call mechanic. A hostile projectile passing near the ship gives a small FOCUS reward and one visible cue. That sounds simple. The interesting work was deciding when &lt;em&gt;not&lt;/em&gt; to reward it.&lt;/p&gt;

&lt;p&gt;This is a desktop-tested candidate, not a claim that the game is balanced or that the tactile response feels right on a phone.&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%2F64kq1h3l83cg8g2cibzv.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%2F64kq1h3l83cg8g2cibzv.png" alt="Controlled desktop demo, v15: cyan CLOSE CALL +FOCUS cue beside the ship" width="540" height="960"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Controlled desktop demo, v15. A live shot passes through the close-call band; the cyan CLOSE CALL +FOCUS cue appears and the close-call count increases once.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The first rule: near is not the same as safe
&lt;/h2&gt;

&lt;p&gt;A projectile earns a close-call reward only within a defined band outside the ship. In the current candidate, that band is roughly 31 to 57 Godot units away, with a narrower horizontal condition. The values are tuning choices, not universal numbers for a portrait game.&lt;/p&gt;

&lt;p&gt;The reward is small: 0.04 FOCUS. Each pooled projectile can award it once. The player can still move into that same projectile afterward and get hit. A close call does not turn a live threat into a harmless effect.&lt;/p&gt;

&lt;p&gt;We exclude protected passes. If SHIELD is active, or the ship is briefly invulnerable after taking damage, passing through a shot is not a dodge worth rewarding. A regression check also covers the less obvious case: a shot passes while SHIELD is active, then later passes near the unprotected ship. The protected pass should not consume the shot's one available close-call reward.&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%2Fyclz491m1lwb55u8ppy2.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%2Fyclz491m1lwb55u8ppy2.png" alt="Controlled desktop demo, v15: live shot beside the ship with SHIELD ON" width="540" height="960"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Controlled desktop demo, v15. The same live shot passes while SHIELD ON is active; no close-call cue or focus reward is granted.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That distinction is important when projectiles are pooled and reused. A stale "already rewarded" flag on a recycled shot would silently make the mechanic inconsistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feedback has to fit the decision
&lt;/h2&gt;

&lt;p&gt;The close call shows a short cyan cue. We also gave it a low-priority tactile pattern, with a cooldown so a dense volley does not turn into constant buzzing. A player taking damage or receiving a more important warning should not lose that signal under a pile of near-miss taps.&lt;/p&gt;

&lt;p&gt;Our desktop tests can check event priority and cooldown. They cannot tell us how the motor feels in a hand. The Android export, touch layout, and actual vibration strength still need a device pass. Until then, "haptics implemented" is a code statement, not a product verdict.&lt;/p&gt;

&lt;p&gt;The same applies to the visual margin. A scripted 540x960 frame can show whether the cue covers the ship. It cannot tell us whether a person reads a fast pattern in time to choose a route through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reward can quietly raise difficulty
&lt;/h2&gt;

&lt;p&gt;The game has another system called RISK. Fast kills raise it, and while the player keeps that streak, regular enemies shoot a little sooner. FOCUS, meanwhile, can be saved for a burst of faster, cooler fire or spent on a short SHIELD.&lt;/p&gt;

&lt;p&gt;Our first close-call draft also raised RISK and refreshed its timer. On paper, that made sense: risky play should have consequences. In a deterministic desktop route, though, this meant merely surviving near bullets kept the pressure alive. The controller died in stage one sooner than it had before the change.&lt;/p&gt;

&lt;p&gt;We tested the pieces separately. Removing the RISK increment alone was not enough; the timer refresh also had to go. The current version keeps the small FOCUS reward but leaves RISK tied to kill streaks.&lt;/p&gt;

&lt;p&gt;That does not prove the new version is balanced. These routes are scripted controllers, not people. Small changes in steering or starting position can move the result dramatically. Their job is to expose feedback loops and regressions before a human playtest, not to substitute for one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am taking from this
&lt;/h2&gt;

&lt;p&gt;The useful question was not "can the game detect a near miss?" Godot can handle that. The question was what the event means in the game's economy.&lt;/p&gt;

&lt;p&gt;A close call can reward attention. If it also refreshes a pressure system, it may punish the same behavior it claims to reward. If SHIELD earns the same reward as an unprotected dodge, the game teaches a different lesson. If every passing bullet vibrates, the important cues disappear.&lt;/p&gt;

&lt;p&gt;I am keeping this mechanic provisional until the Android build and real-device play tell us whether the margin is readable and whether the reward changes player decisions. For now, the tests establish a narrower but useful claim: the rule is consistent, the feedback fires under the intended conditions, and one bad interaction between reward and pressure was caught before we called the system finished.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>testing</category>
      <category>android</category>
    </item>
    <item>
      <title>Two Godot Games, Two Visual Identities, One Hard Lesson About Polish</title>
      <dc:creator>Kfir Adut</dc:creator>
      <pubDate>Fri, 25 Sep 2026 15:24:24 +0000</pubDate>
      <link>https://dev.to/kfiradut/two-godot-games-two-visual-identities-one-hard-lesson-about-polish-mij</link>
      <guid>https://dev.to/kfiradut/two-godot-games-two-visual-identities-one-hard-lesson-about-polish-mij</guid>
      <description>&lt;p&gt;A solitaire card can work perfectly and still look wrong.&lt;/p&gt;

&lt;p&gt;That was the uncomfortable part of building Glimmerbook Solitaire. The rules were there. The Android build ran. There were story scenes, rewards, and a route through the first chapter. Yet I kept coming back to the same judgment: it felt cheap. Ithaca Rising, our other Godot game, had a different problem. Its hero could run and fight, but the interface looked like a collection of functional parts competing for the same patch of screen.&lt;/p&gt;

&lt;p&gt;Neither problem could be fixed by adding one more feature.&lt;/p&gt;

&lt;p&gt;My AI assistant, Instinct, does the heavy lifting on both games: implementation, asset research, tests, build work, and successive passes on the interface. I set the bar and reject what does not meet it. In this case, the bar was not "more effects." It was a visual language that made each game feel like itself and made the next action clear.&lt;/p&gt;

&lt;p&gt;The two games taught me something I had underestimated: polish is not an asset count. It is the agreement between assets, layout, motion, and gameplay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two games that should not look alike
&lt;/h2&gt;

&lt;p&gt;Glimmerbook is a portrait solitaire game inside a storybook frame. The Grimm brothers' study is the way into the tales; the cards should feel like objects that belong in that world. Little Red Riding Hood and Hansel and Gretel are playable chapters, not just wallpaper behind the same board.&lt;/p&gt;

&lt;p&gt;Ithaca Rising is an Android action and idle RPG built around Odysseus's journey. The player needs to read combat, resources, controls, and progress while the world keeps moving. Its interface has to survive a crowded screen without burying the character.&lt;/p&gt;

&lt;p&gt;That became our design question: what should stay consistent &lt;em&gt;within&lt;/em&gt; a game, and what can be reused as a method &lt;em&gt;between&lt;/em&gt; games?&lt;/p&gt;

&lt;h2&gt;
  
  
  The first mistake: treating a good asset as a finished decision
&lt;/h2&gt;

&lt;p&gt;We had an asset library. We also had a reason to use it carefully. An attractive sprite in isolation can clash with the weight of the typography, the pixel scale of another sprite, or the color of the control beneath it. A licensed pack may solve one screen and make the next screen look borrowed from a different game.&lt;/p&gt;

&lt;p&gt;For Ithaca, we selected a bronze-and-navy pixel UI family for the HUD, controls, buttons, and Arsenal. That was more coherent than finding a different ornament for every button. The work included attribution and excluding packs we could not use under the project's licensing rules. The subsequent title-scroll adjustment was only a small spacing fix, but it showed why a coherent kit still needs a real screen pass: the title crowded the edge of the scroll in the live Android crop.&lt;/p&gt;

&lt;p&gt;For Glimmerbook, the approach was different. We gave the bookshelf a real illustrated presence; gave card backs a woven burgundy surface and card faces parchment, a gold frame, and a faint book mark; and replaced an unexplained question-mark control with a drawn wolf-head symbol. These details have to be judged together. If the cards look like paper but the controls look like default software buttons, the illusion breaks every time the player takes a turn.&lt;/p&gt;

&lt;h2&gt;
  
  
  An icon is not automatically clearer than a word
&lt;/h2&gt;

&lt;p&gt;I asked for drawn icons in place of text-heavy controls. This sounds like a clean design rule until an icon is ambiguous.&lt;/p&gt;

&lt;p&gt;The question mark was a case in point. It occupied space, but it did not explain what would happen when tapped. A wolf-head mark was at least part of Glimmerbook's story vocabulary. Even then, icon shape alone does not make an action obvious. Tooltips and context still matter. If a player must memorize a private symbol system before making a move, the interface is decorative rather than helpful.&lt;/p&gt;

&lt;p&gt;That is why I think of the interface as an agreement with the player. The art establishes the world. The hierarchy keeps the agreement usable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give motion a job
&lt;/h2&gt;

&lt;p&gt;We are exploring what I call a 2.5D direction for Glimmerbook: depth and tactile response inside a 2D Godot game, not a conversion to full 3D. A draft pass adds stronger card shadows, edge thickness, a slight resting tilt, lift and press response, and layered drifting light. It has not passed device review or shipped. Earlier card motion work added a more deliberate arc and landing feel; story panels gained subtle camera movement.&lt;/p&gt;

&lt;p&gt;The question was not whether these effects were possible. Godot provides 2D layers and animation tools for this kind of work. The question was what each effect tells the player.&lt;/p&gt;

&lt;p&gt;A raised card should feel available. A shadow should separate the active object from the table. A landing should close the action. Background movement should add life without competing with the board. If a light moves everywhere at once, it stops guiding attention. If every card performs a flourish, the player waits for the interface instead of playing.&lt;/p&gt;

&lt;p&gt;Reduced motion belongs in that decision. The information in the interface cannot depend on an animation that some players disable or cannot comfortably watch. A static shadow or contrast cue should still explain the card when movement is reduced.&lt;/p&gt;

&lt;h2&gt;
  
  
  A system is also a constraint on the assistant
&lt;/h2&gt;

&lt;p&gt;Instinct can research an asset library, implement a control, adjust a transition, and move to the next screen faster than I could manually direct every edit. That speed is useful. It also means a weak visual decision can spread quickly. If "make it more polished" is the only instruction, the assistant can add shine without fixing the composition.&lt;/p&gt;

&lt;p&gt;My corrections became more specific. Use a consistent family of assets. Keep the cards and the story in the same world. Do not replace a crowded result screen with a more ornate crowded result screen. Check the title against the edge of its frame on the actual Android crop. Keep visual changes small enough that a broken build can be traced to one step.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist I use now
&lt;/h2&gt;

&lt;p&gt;Before approving a visual pass, I ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can I tell which game this screen belongs to without reading the title?&lt;/li&gt;
&lt;li&gt;Is the next action visually stronger than the decoration around it?&lt;/li&gt;
&lt;li&gt;Do the cards, controls, frames, and text seem made for the same world?&lt;/li&gt;
&lt;li&gt;Does motion explain state or only advertise that we added motion?&lt;/li&gt;
&lt;li&gt;Does the screen still make sense when movement is reduced?&lt;/li&gt;
&lt;li&gt;Have I seen the result on the running Android build, rather than only as isolated art or a code diff?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am still dissatisfied with parts of both games. Glimmerbook's character art and the feel of its story world have further to go. Ithaca still needs its real-device gate and more work on how the voyage looks and sounds. Calling those gaps out is not a rejection of the work. It is how the next pass gets a useful target.&lt;/p&gt;

&lt;p&gt;The strongest thing we have learned is modest: a game's identity is made from repeated choices. One coherent frame, one legible control, one card that moves for a reason. Do that across the whole experience and the player stops noticing the parts. They start believing in the world.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.godotengine.org/en/stable/tutorials/2d/2d_parallax.html" rel="noopener noreferrer"&gt;Godot documentation: Parallax2D&lt;/a&gt; - technical reference for independently moving 2D layers.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.godotengine.org/en/stable/tutorials/2d/canvas_layers.html" rel="noopener noreferrer"&gt;Godot documentation: Canvas layers&lt;/a&gt; - separation of world, background, and screen-space interface.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.godotengine.org/en/stable/tutorials/ui/gui_skinning.html" rel="noopener noreferrer"&gt;Godot documentation: GUI skinning&lt;/a&gt; - themes and consistent control appearance.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/kfiradut/our-android-qa-pipeline-passed-the-screenshots-proved-it-was-wrong-14ab"&gt;My earlier article on Android QA&lt;/a&gt; - the separate test-evidence story mentioned above.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A note on how this article was made
&lt;/h2&gt;

&lt;p&gt;Instinct prepared this draft from our actual project work and did the heavy lifting on the research and technical narrative. I reviewed the facts and decided what belongs under my name before publication.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>android</category>
      <category>design</category>
    </item>
    <item>
      <title>Our Android QA Pipeline Passed. The Screenshots Proved It Was Wrong.</title>
      <dc:creator>Kfir Adut</dc:creator>
      <pubDate>Mon, 21 Sep 2026 19:04:33 +0000</pubDate>
      <link>https://dev.to/kfiradut/our-android-qa-pipeline-passed-the-screenshots-proved-it-was-wrong-14ab</link>
      <guid>https://dev.to/kfiradut/our-android-qa-pipeline-passed-the-screenshots-proved-it-was-wrong-14ab</guid>
      <description>&lt;p&gt;A test can pass for the wrong reason.&lt;/p&gt;

&lt;p&gt;That sounds obvious. It is much less obvious when the build is green, the Android emulator launched, the script finished without an error, and a folder full of screenshots is waiting at the end.&lt;/p&gt;

&lt;p&gt;This week, while building two Android games in Godot, we had exactly that kind of pass.&lt;/p&gt;

&lt;p&gt;The pipeline had done a lot of real work. It built the project, created an Android virtual device, installed the APK, launched the game, injected input, recorded video, and saved screenshots. Every mechanical step completed.&lt;/p&gt;

&lt;p&gt;The problem was that the screenshots showed the entry screen instead of gameplay.&lt;/p&gt;

&lt;p&gt;The automation had proved that it could interact with &lt;em&gt;something&lt;/em&gt;. It had not proved that the player reached the experience we meant to test.&lt;/p&gt;

&lt;p&gt;That false pass changed how I think about automated game QA. The hard part is not making an emulator run. The hard part is deciding what counts as evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we needed an emulator in the first place
&lt;/h2&gt;

&lt;p&gt;The two projects are Glimmerbook Solitaire and Ithaca Rising. Both are Android games built in Godot 4.&lt;/p&gt;

&lt;p&gt;I still test releases on a real Android device. That is where touch feel, screen fit, pacing, motion, and the overall experience have to survive. But development cannot stop every time the physical device is unavailable.&lt;/p&gt;

&lt;p&gt;We needed a repeatable loop that could run during development:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build the Android project.&lt;/li&gt;
&lt;li&gt;Install it on an emulator.&lt;/li&gt;
&lt;li&gt;Launch from a clean state.&lt;/li&gt;
&lt;li&gt;Follow a real interaction route.&lt;/li&gt;
&lt;li&gt;Capture video and screenshots.&lt;/li&gt;
&lt;li&gt;Fail when the route or visual result is wrong.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first attempts were too slow and unreliable. The useful path turned out to be the existing Linux CI environment with KVM hardware acceleration enabled, rather than moving the work to a more expensive runner.&lt;/p&gt;

&lt;p&gt;KVM made the virtual device practical. ANGLE gave us a workable graphics path for the Godot build. Together, they turned the emulator from an occasional manual tool into part of the repository's QA loop.&lt;/p&gt;

&lt;p&gt;Once the pipeline worked, it could build, install, cold-launch, inject real input, and return visual artifacts from the running game.&lt;/p&gt;

&lt;p&gt;That was the infrastructure milestone. It was not yet a trustworthy product test.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first lesson: pixels are part of the assertion
&lt;/h2&gt;

&lt;p&gt;Traditional automated tests are comfortable with values.&lt;/p&gt;

&lt;p&gt;Did the process exit successfully? Did a file exist? Did a button respond? Did the current scene name change?&lt;/p&gt;

&lt;p&gt;For a game, those checks are necessary but incomplete. A successful tap does not mean the right button was visible. A scene change does not mean the screen was readable. A running process does not mean an Android overlay is not covering the game.&lt;/p&gt;

&lt;p&gt;Our emulator runs caught issues that code-level checks would not have explained well: a full-screen Android notice sitting over the game, an unwanted orientation, and an input route that missed a return action and invalidated the later part of the test.&lt;/p&gt;

&lt;p&gt;Then came the false pass on Glimmerbook Solitaire.&lt;/p&gt;

&lt;p&gt;The harness completed, but the captured pixels showed that it had not reached the intended gameplay route. If we had treated the exit code as the result, we would have reported success. Looking at the screenshots overturned that conclusion.&lt;/p&gt;

&lt;p&gt;The visual artifact was not decoration for the test report. It was the decisive assertion.&lt;/p&gt;

&lt;p&gt;That led to a simple rule: a gameplay test is not complete until someone, or a reliable visual check, confirms what was actually on screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second lesson: test a route, not a tap sequence
&lt;/h2&gt;

&lt;p&gt;A script that taps coordinates can be useful, but coordinates alone do not describe intent.&lt;/p&gt;

&lt;p&gt;A sequence such as "tap here, wait, tap there" may keep running even after the UI takes a different path. Every later action can become meaningless while the script still reaches the end.&lt;/p&gt;

&lt;p&gt;We changed the harness to think in story beats.&lt;/p&gt;

&lt;p&gt;For the early Glimmerbook experience, the route now has explicit milestones: the early win, the keepsake reveal, the modifier choice, and the next-story tease. Each milestone writes a route marker. The emulator script fails unless all four markers appear.&lt;/p&gt;

&lt;p&gt;The difference is important.&lt;/p&gt;

&lt;p&gt;A coordinate says where the harness touched. A route marker says what the game reached.&lt;/p&gt;

&lt;p&gt;We still keep screen-change checks and a final story-wrap assertion, but the markers make the intended player journey legible. When a run fails, we can see which beat never happened instead of only knowing that a later screenshot was wrong.&lt;/p&gt;

&lt;p&gt;This is closer to how I evaluate the game as a product. I do not care that four buttons were technically tappable. I care that a first-time player experienced a coherent sequence and reached the reward, choice, and reason to continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The third lesson: visual QA changes product decisions
&lt;/h2&gt;

&lt;p&gt;The emulator is not only a regression tool. It also gives us evidence about the experience.&lt;/p&gt;

&lt;p&gt;A recent Glimmerbook run produced a short video covering the full early sequence. Reviewing the actual frames showed that the result screen was denser than the three screens that followed it. The keepsake name and the call to action nearly touched.&lt;/p&gt;

&lt;p&gt;That was not a crash. No logic test would flag it. The route was correct.&lt;/p&gt;

&lt;p&gt;It was still a product defect because the visual hierarchy broke at the moment the player should understand the reward and choose to continue.&lt;/p&gt;

&lt;p&gt;The fix was small in code: move the icon, name, and call to action to create a deliberate gap, then update the harness tap point. The reason for the fix came from watching the pixels, not reading the implementation.&lt;/p&gt;

&lt;p&gt;This is where automated capture becomes useful beyond "does it run?" It gives the team a stable object to inspect. We can compare pacing, spacing, and transitions across runs instead of relying on memory or a convenient screenshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the harness proves, and what it does not
&lt;/h2&gt;

&lt;p&gt;The current loop gives us stronger evidence than a green build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The APK builds and installs.&lt;/li&gt;
&lt;li&gt;The game cold-launches in an Android environment.&lt;/li&gt;
&lt;li&gt;The scripted input can follow the intended route.&lt;/li&gt;
&lt;li&gt;Required story milestones actually occur.&lt;/li&gt;
&lt;li&gt;Video and screenshots show what appeared on screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It still does not prove everything.&lt;/p&gt;

&lt;p&gt;An emulator is not the target phone. It cannot settle how haptics feel, how a foldable screen behaves in every posture, or whether the final pacing feels right in a person's hands. Those questions still need device testing and human judgment.&lt;/p&gt;

&lt;p&gt;The goal is not to replace that judgment. It is to make every earlier loop more honest.&lt;/p&gt;

&lt;p&gt;A build should not wait for a person before anyone knows whether it launches. A route should not be called verified when the screenshots show the wrong screen. A visually crowded reward moment should not hide behind passing logic checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The better definition of a pass
&lt;/h2&gt;

&lt;p&gt;I used to think of the emulator pipeline as a way to keep development moving.&lt;/p&gt;

&lt;p&gt;It is that, but the more useful outcome is a better definition of done.&lt;/p&gt;

&lt;p&gt;A pass is not "the script finished."&lt;/p&gt;

&lt;p&gt;For this kind of work, a pass means the build ran, the intended route happened, the required milestones appeared, and the pixels support the claim we are making.&lt;/p&gt;

&lt;p&gt;That standard creates more failures in the short term. It is supposed to.&lt;/p&gt;

&lt;p&gt;The false pass was not wasted work. Catching it prevented us from turning weak evidence into a confident report. More importantly, it forced the QA system to describe the player experience rather than the automation procedure.&lt;/p&gt;

&lt;p&gt;That is the standard I want as these games grow: not more green checks, but fewer ways for a green check to lie.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on how this article was made
&lt;/h2&gt;

&lt;p&gt;Instinct prepared this draft from our real project history and did the heavy lifting in turning the Android QA work into a technical narrative. I reviewed the facts, chose what should be public, and remain responsible for every claim published under my name.&lt;/p&gt;

</description>
      <category>android</category>
      <category>testing</category>
      <category>godot</category>
      <category>devops</category>
    </item>
    <item>
      <title>Can a Language Model Learn the Rule Behind the Pattern?</title>
      <dc:creator>Kfir Adut</dc:creator>
      <pubDate>Sat, 19 Sep 2026 21:30:27 +0000</pubDate>
      <link>https://dev.to/kfiradut/can-a-language-model-learn-the-rule-behind-the-pattern-3goj</link>
      <guid>https://dev.to/kfiradut/can-a-language-model-learn-the-rule-behind-the-pattern-3goj</guid>
      <description>&lt;p&gt;Large language models can produce language that feels coherent. They can summarize an argument, imitate a style, explain a concept, and continue a pattern with remarkable fluency.&lt;/p&gt;

&lt;p&gt;But fluency leaves a harder question unanswered: has the model learned a rule it can apply systematically, or has it become exceptionally good at recognizing familiar statistical patterns?&lt;/p&gt;

&lt;p&gt;That distinction is the question behind compositionality.&lt;/p&gt;

&lt;p&gt;Human thought is compositional because we can combine known parts into new wholes. If we understand "the dog chased the cat," we can understand "the cat chased the dog." The vocabulary stays the same, but the relations change. We can also understand sentences we have never heard before because we do not need to memorize every possible combination. We reuse structures and rules.&lt;/p&gt;

&lt;p&gt;This ability matters far beyond grammar. A system that represents rules should be able to carry them into unfamiliar cases. A system that relies mainly on resemblance may perform very well until the vocabulary, structure, or context moves away from familiar examples.&lt;/p&gt;

&lt;p&gt;For ordinary writing assistance, that difference may not always be important. For systems expected to reason, explain decisions, write reliable code, or operate outside their training distribution, it becomes much harder to ignore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two competing views
&lt;/h2&gt;

&lt;p&gt;In my research on the philosophy of artificial intelligence, I examined this problem through a debate between two broad positions.&lt;/p&gt;

&lt;p&gt;The emergence view, associated with modern connectionism, argues that sufficiently complex cognitive abilities can arise from deep learning. On this account, models do not need a separate symbolic engine designed into them. With enough data, scale, and the right training, structured behavior can emerge from the network itself.&lt;/p&gt;

&lt;p&gt;The competing view, associated with Gary Marcus and the symbolic tradition, argues that statistical learning runs into a "compositionality wall." Reliable abstraction requires structured representations of objects, relations, hierarchy, and rules. A model may become highly fluent without gaining the kind of systematicity that lets a rule survive across genuinely new cases.&lt;/p&gt;

&lt;p&gt;I tested a narrower version of this debate on Llama 3 8B. The full study used three controlled experiments. Two examples capture the central finding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example one: invented words
&lt;/h2&gt;

&lt;p&gt;The first test used sentences built from meaningless words.&lt;/p&gt;

&lt;p&gt;Why use nonsense vocabulary? Because familiar words carry a great deal of hidden help. A model can draw on common phrases, world knowledge, and statistical associations between known terms. Invented words remove most of those clues. The model has to judge whether the structure itself is valid.&lt;/p&gt;

&lt;p&gt;I presented 50 grammatically valid sentences and 50 invalid ones. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Valid:&lt;/strong&gt; "A wug poons wugs." The invented singular subject &lt;em&gt;wug&lt;/em&gt; matches the invented singular verb &lt;em&gt;poons&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invalid:&lt;/strong&gt; "Wugs poons wugs." The plural subject &lt;em&gt;wugs&lt;/em&gt; is paired with the singular verb &lt;em&gt;poons&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The words carry no ordinary meaning. The decision should turn on subject-verb agreement alone.&lt;/p&gt;

&lt;p&gt;The model correctly identified invalid sentences with a proper explanation in 66% of cases. But it rejected valid, unfamiliar sentences as wrong in 64% of cases. Of the 36% it accepted, 32% of the full set received a fully correct judgment and explanation, while 4% were only partially successful.&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%2Fjt7rajs45wwp9treqrw0.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%2Fjt7rajs45wwp9treqrw0.png" alt="The model correctly caught 66% of invalid invented-word sentences, while it wrongly rejected 64% of valid ones." width="800" height="987"&gt;&lt;/a&gt;&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%2Fea1h36v61vhka5v6rwqm.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%2Fea1h36v61vhka5v6rwqm.png" alt="Two sentences from the invented-word and hierarchy tests show what the model was being asked to distinguish." width="800" height="1178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That asymmetry matters. The model was much better at detecting something unusual than at recognizing that a new example followed the rule. It often treated unfamiliarity as evidence of error.&lt;/p&gt;

&lt;p&gt;A system with an abstract grammar should work in both directions. It should reject violations, but it should also accept a new construction when that construction obeys the rule. The model behaved more like a strong anomaly detector than like a grammar that could reliably validate unfamiliar combinations.&lt;/p&gt;

&lt;p&gt;This does not mean the model learned nothing about syntax. Its explanations often showed real sensitivity to structure. The problem was consistency. The apparent rule did not generalize systematically when the surface became unfamiliar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example two: structure versus difficulty
&lt;/h2&gt;

&lt;p&gt;The second example tested a different distinction.&lt;/p&gt;

&lt;p&gt;Some sentences are grammatically valid but difficult for people to process because they contain deeply nested clauses. Linguistics distinguishes grammatical competence, what the rules of a language permit, from performance, what limited memory and attention make easy to understand in real time.&lt;/p&gt;

&lt;p&gt;This creates a demanding test for a language model. Can it recognize that a sentence is structurally valid even when it is awkward, rare, and difficult to process?&lt;/p&gt;

&lt;p&gt;The model rejected every sentence in this test.&lt;/p&gt;

&lt;p&gt;That meant 100% rejection of the invalid examples, but also 100% rejection of the valid examples.&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%2Fvf5hmxhipkkb5eha1ry1.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%2Fvf5hmxhipkkb5eha1ry1.png" alt="Both invalid structures and valid-but-difficult structures were given the same answer: reject." width="800" height="953"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first glance, rejecting every difficult sentence can look cautious. But it collapses two different categories into one. "This violates the grammar" is not the same claim as "this is valid but hard to process."&lt;/p&gt;

&lt;p&gt;The model appeared to reproduce patterns of human language use, including our preference for structures that are easy to process, without reliably separating those preferences from the formal rules themselves.&lt;/p&gt;

&lt;p&gt;Again, this is a question of systematicity. If the model represents the rule, difficulty should not automatically become ungrammaticality. If it relies heavily on familiar usage patterns, rare valid structures may look indistinguishable from errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  A third example: when metaphor changes the task
&lt;/h2&gt;

&lt;p&gt;The second experiment in the full study also tested the boundary between syntax, meaning, and metaphor. The model performed very well on concrete contradictions. It consistently recognized that a single chapter cannot be longer than the entire book, and that an empty box cannot contain more items than a full one.&lt;/p&gt;

&lt;p&gt;The pattern changed when the comparison became metaphorical. Consider this sentence from the test set:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Her silence was louder than his reason."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When asked to judge the logical acceptability of category comparisons like this, the model failed in 95% of cases. Instead of analyzing the comparison as a logical claim, it often shifted into literary interpretation and treated the sentence as an expressive metaphor.&lt;/p&gt;

&lt;p&gt;This result is revealing, but it also needs an important caveat. Recognizing metaphor is not normally a failure. In everyday language, interpreting that sentence figuratively is probably the more helpful response. A system that insisted on literal logic in every context would be less intelligent, not more.&lt;/p&gt;

&lt;p&gt;The issue is whether the model can follow an explicit analytical instruction and temporarily separate two modes: literary interpretation and logical comparison. In this setup, it did not do so reliably. The likely interpretation overpowered the requested operation.&lt;/p&gt;

&lt;p&gt;That makes the result less clean than the grammar tests, but arguably more relevant to real systems. Useful models need contextual flexibility. Reliable models also need to know when a task requires them to suspend the default interpretation and apply a narrower rule.&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%2Fsf688pvb74l6v45s2ywr.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%2Fsf688pvb74l6v45s2ywr.png" alt="The full set of results used in this article: strong anomaly detection and concrete reasoning, but weak acceptance of unfamiliar valid structures and metaphorical category comparisons." width="800" height="1297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for AI systems
&lt;/h2&gt;

&lt;p&gt;Pattern recognition is not a small achievement.&lt;/p&gt;

&lt;p&gt;Next-word prediction has produced systems with linguistic abilities that earlier AI approaches did not come close to matching. These models are flexible, responsive to context, and useful across an enormous range of tasks.&lt;/p&gt;

&lt;p&gt;The experiments suggest that this competence has a specific shape. The model was strong at detecting anomalies and familiar relations. It was weaker when asked to approve an unfamiliar but valid construction or separate formal structure from processing difficulty.&lt;/p&gt;

&lt;p&gt;For developers, the practical lesson is not that language models are useless. It is that a correct answer on a familiar-looking input does not prove that the underlying rule will survive a distribution shift.&lt;/p&gt;

&lt;p&gt;A useful evaluation should therefore test transformations, not only answers. Change the names, replace familiar nouns with invented ones, reverse a relation, or present a formally valid case that looks unusual. If the model has captured the rule, its judgment should remain stable. If performance falls sharply when the surface changes, the benchmark may have been measuring recognition rather than abstraction.&lt;/p&gt;

&lt;p&gt;This also changes how we should read explanations. A model can give a polished reason after making the wrong judgment. The explanation may accurately describe a nearby pattern without revealing the mechanism that produced the answer. In these experiments, the model often sounded analytical even when its decisions across equivalent cases were inconsistent. Reliability has to be measured across the set, not inferred from the confidence of one response.&lt;/p&gt;

&lt;p&gt;This is relevant to code generation, tool use, and autonomous workflows. A system may reproduce a known pattern, explain it convincingly, and still fail when the same relationship appears in a new form. Tests should therefore vary the surface details while preserving the underlying rule. Otherwise, we may measure familiarity and call it reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a hybrid architecture is plausible
&lt;/h2&gt;

&lt;p&gt;These results led me toward a hybrid conclusion.&lt;/p&gt;

&lt;p&gt;Neural networks are very good at what symbolic systems historically struggled with: learning from large amounts of data, adapting to context, handling ambiguity, and extracting useful patterns without every rule being written in advance.&lt;/p&gt;

&lt;p&gt;Symbolic systems are good at a different set of problems: representing objects and relations explicitly, applying rules across unfamiliar cases, preserving hierarchy, and explaining why one conclusion follows from another.&lt;/p&gt;

&lt;p&gt;A hybrid architecture would not discard deep learning. It would give deep learning a structured partner. The neural part could provide flexible perception and pattern learning. The symbolic part could support abstraction, systematicity, and rule-based inference.&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%2Fvpe69h6rmvipbi28ls6u.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%2Fvpe69h6rmvipbi28ls6u.png" alt="A hybrid architecture pairs flexible neural pattern learning with explicit symbolic representations and rules." width="800" height="1327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is another possibility: perhaps systematicity itself can be learned through better training. Meta-learning approaches try to teach models how to acquire and reuse rules rather than merely fit one task. That path is worth exploring. But it still has to meet the same standard: reliable generalization to unfamiliar structures, not only better performance on familiar distributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this small study cannot establish
&lt;/h2&gt;

&lt;p&gt;The limits matter.&lt;/p&gt;

&lt;p&gt;I tested one model, Llama 3 8B, under one prompting and evaluation setup. Different prompts, larger models, fine-tuning, or new architectures may behave differently. The examples are unusual by design, which makes them useful for testing abstraction but less representative of ordinary conversation.&lt;/p&gt;

&lt;p&gt;The results are therefore not a verdict on every language model, and they do not prove that future systems cannot overcome the problem.&lt;/p&gt;

&lt;p&gt;They support a narrower claim: fluent output should not be mistaken for systematic understanding.&lt;/p&gt;

&lt;p&gt;If we want models that reason reliably outside familiar patterns, producing the right answer is not enough. The same underlying rule has to survive when the words are invented and the structure becomes unfamiliar.&lt;/p&gt;

&lt;p&gt;That is where pattern recognition ends and compositional thought begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on how this article was made
&lt;/h2&gt;

&lt;p&gt;This article is adapted from my own research and arguments. Instinct helped turn the academic paper into a public-facing draft and prepared the visuals. I reviewed the substance, chose what should be public, and remain responsible for every claim published under my name.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Chalmers, D. J. (1990). &lt;a href="https://consc.net/papers/f-and-p.pdf" rel="noopener noreferrer"&gt;Why Fodor and Pylyshyn were wrong: The simplest refutation&lt;/a&gt;. In Proceedings of the Twelfth Annual Conference of the Cognitive Science Society, 340-347.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chollet, F. (2019). &lt;a href="https://arxiv.org/abs/1911.01547" rel="noopener noreferrer"&gt;On the Measure of Intelligence&lt;/a&gt;. arXiv preprint arXiv:1911.01547.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chomsky, N. (1965). &lt;a href="https://mitpress.mit.edu/9780262530071/aspects-of-the-theory-of-syntax/" rel="noopener noreferrer"&gt;Aspects of the Theory of Syntax&lt;/a&gt;. MIT Press.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fodor, J. A., &amp;amp; Pylyshyn, Z. W. (1988). &lt;a href="https://www.sciencedirect.com/science/article/pii/0010027788900315" rel="noopener noreferrer"&gt;Connectionism and cognitive architecture: A critical analysis&lt;/a&gt;. Cognition, 28(1-2), 3-71.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gurevich, Y. (2024). &lt;a href="https://arxiv.org/abs/2409.14496" rel="noopener noreferrer"&gt;On a measure of intelligence&lt;/a&gt;. Bulletin of the European Association for Theoretical Computer Science, 143.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lake, B. M., &amp;amp; Baroni, M. (2023). &lt;a href="https://www.nature.com/articles/s41586-023-06668-3" rel="noopener noreferrer"&gt;Human-like systematic generalization through a meta-learning neural network&lt;/a&gt;. Nature, 623(7985), 115–121.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LeCun, Y., Bengio, Y., &amp;amp; Hinton, G. (2015). &lt;a href="https://www.nature.com/articles/nature14539" rel="noopener noreferrer"&gt;Deep learning&lt;/a&gt;. Nature, 521(7553), 436-444.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leivada, E., Marcus, G., Günther, F., &amp;amp; Murphy, E. (2023). &lt;a href="https://arxiv.org/abs/2308.00109" rel="noopener noreferrer"&gt;A Sentence is Worth a Thousand Pictures: Can Large Language Models Understand Hum4n L4ngu4ge and the World behind Words?&lt;/a&gt;. arXiv preprint arXiv:2308.00109.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Marcus, G. (2018). &lt;a href="https://arxiv.org/abs/1801.05667" rel="noopener noreferrer"&gt;Innateness, AlphaZero, and Artificial Intelligence&lt;/a&gt;. arXiv preprint arXiv:1801.05667.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mitchell, M. (2019). &lt;a href="https://us.macmillan.com/books/9780374715236/artificialintelligence/" rel="noopener noreferrer"&gt;Artificial Intelligence: A Guide for Thinking Humans&lt;/a&gt;. Farrar, Straus and Giroux.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Murphy, E., Leivada, E., Dentella, V., Günther, F., &amp;amp; Marcus, G. (2025). &lt;a href="https://arxiv.org/abs/2502.10934" rel="noopener noreferrer"&gt;Fundamental Principles of Linguistic Structure are Not Represented by 03&lt;/a&gt;. arXiv preprint arXiv:2502.10934.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Schaeffer, R., Miranda, B., &amp;amp; Koyejo, S. (2023). &lt;a href="https://proceedings.neurips.cc/paper_files/paper/2023/hash/adc98a266f45005c403b8311ca7e8bd7-Abstract-Conference.html" rel="noopener noreferrer"&gt;Are Emergent Abilities of Large Language Models a Mirage?&lt;/a&gt;. In Advances in Neural Information Processing Systems (Vol. 36).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shani, C., LeCun, Y., Jurafsky, D., &amp;amp; Shwartz-Ziv, R. (2025). &lt;a href="https://arxiv.org/abs/2505.17117" rel="noopener noreferrer"&gt;From Tokens to Thoughts: How LLMs and Humans Trade Compression for Meaning&lt;/a&gt;. arXiv preprint arXiv:2505.17117.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Skean, O., Arefin, M. R., Zhao, D., Patel, N., Naghiyev, J., LeCun, Y., &amp;amp; Shwartz-Ziv, R. (2025). &lt;a href="https://arxiv.org/abs/2502.02013" rel="noopener noreferrer"&gt;Layer by Layer: Uncovering Hidden Representations in Language Models&lt;/a&gt;. arXiv preprint arXiv:2502.02013.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Let My AI Assistant Do the Heavy Lifting on Two Godot Games. My Job Changed.</title>
      <dc:creator>Kfir Adut</dc:creator>
      <pubDate>Fri, 18 Sep 2026 14:35:54 +0000</pubDate>
      <link>https://dev.to/kfiradut/i-let-my-ai-assistant-do-the-heavy-lifting-on-two-godot-games-my-job-changed-gi8</link>
      <guid>https://dev.to/kfiradut/i-let-my-ai-assistant-do-the-heavy-lifting-on-two-godot-games-my-job-changed-gi8</guid>
      <description>&lt;p&gt;The usual way people talk about AI-assisted development is too small.&lt;/p&gt;

&lt;p&gt;They describe a faster autocomplete, a better search box or a tool that can turn a clear instruction into a block of code. Those things are useful, but they still leave the developer carrying the whole project in their head: what needs to happen next, what broke, what to test, what to ship and when to stop polishing one part and move to another.&lt;/p&gt;

&lt;p&gt;I have been testing a different model while building two Android games in Godot.&lt;/p&gt;

&lt;p&gt;My AI assistant, Instinct, does the heavy lifting. It researches approaches, works through implementation, inspects existing assets, maintains the repositories, runs tests, diagnoses failures, prepares builds and keeps the work moving across many steps. I set the product direction, challenge weak decisions, test the result on a real device and decide what is good enough to keep.&lt;/p&gt;

&lt;p&gt;That division of labor is more demanding than "AI writes code." It changes what the human needs to be good at.&lt;/p&gt;

&lt;h2&gt;
  
  
  The projects
&lt;/h2&gt;

&lt;p&gt;The first game is Glimmerbook Solitaire, a portrait Android game built around classic storybook worlds. The second is Ithaca Rising, an Android-first game inspired by the journey of Odysseus.&lt;/p&gt;

&lt;p&gt;Both use Godot 4 and GDScript. Both live in GitHub repositories with automated build work around them.&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%2Fhqhgrj15a35vz5i51z1b.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%2Fhqhgrj15a35vz5i51z1b.png" alt="Portrait Glimmerbook Solitaire screen titled Basket at Dawn, with four face-down cards, four face-up cards, a stock pile and a current card" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Glimmerbook Solitaire in portrait: the Basket at Dawn higher-or-lower board, with the draw pile, current card and eight-card layout visible.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They are still works in progress, which makes them useful tests: the assistant is not being asked to reproduce a finished specification. It has to operate while the product is still changing.&lt;/p&gt;

&lt;p&gt;That is where the real work begins.&lt;/p&gt;

&lt;p&gt;A prototype can look productive because many files changed. A product only moves forward when the right thing changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Heavy lifting does not mean final authority
&lt;/h2&gt;

&lt;p&gt;Instinct can take a goal such as "make this feel closer to a polished casual game" and turn it into a long chain of work. It can study references, inspect the asset library, compare implementation options, update scenes and scripts, run checks, prepare an Android build and report what remains weak.&lt;/p&gt;

&lt;p&gt;That is heavy lifting because I do not need to direct every file edit or remember every dependency between steps.&lt;/p&gt;

&lt;p&gt;But the assistant does not get the final word.&lt;/p&gt;

&lt;p&gt;One early version of Ithaca Rising was built as a web prototype. It was a coherent technical path, but it was the wrong product decision. I was building an Android game with combat, animation, touch input, audio, particles and room to grow. I pushed back and asked why we were not using Godot.&lt;/p&gt;

&lt;p&gt;The project was moved to Godot 4.&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%2Fbskpg0j1wfe0a2cjph6n.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%2Fbskpg0j1wfe0a2cjph6n.png" alt="Earlier portrait Ithaca Rising screen with a layered mountain landscape, Odysseus on the left, no visible enemy, and dense quest and combat interface panels" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Earlier Ithaca Rising stage: Odysseus and the layered environment were in place, while the Lotus Wraith was not visible and the interface still crowded the scene.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That moment taught me more than a smooth success would have. An assistant can execute a reasonable plan very quickly. If the plan is wrong, speed only gets you to the wrong place sooner. My most valuable contribution was not writing the replacement code. It was recognizing that the implementation did not match the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better loop: direction, execution, evidence, correction
&lt;/h2&gt;

&lt;p&gt;The working loop now looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I define the experience and the standard.&lt;/li&gt;
&lt;li&gt;Instinct researches and implements the next meaningful slice.&lt;/li&gt;
&lt;li&gt;The project is built and checked through the repository and CI workflow.&lt;/li&gt;
&lt;li&gt;I test the result, usually on the target Android device rather than judging only from code or screenshots.&lt;/li&gt;
&lt;li&gt;We compare the result with the intended experience, find the gap and repeat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The evidence step matters.&lt;/p&gt;

&lt;p&gt;A build existing is not evidence that it launches. A scene loading is not evidence that the game feels good. A screenshot looking polished is not evidence that touch input, pacing or progression works.&lt;/p&gt;

&lt;p&gt;We hit a launch problem in one Android build. The useful response was not to keep adding code. It was to compare the broken build with the previous game and release path that already worked. That narrowed the problem and got the project back onto a known-good path.&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%2Ffcxgd2hnl6xu79llsphp.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%2Ffcxgd2hnl6xu79llsphp.png" alt="Later landscape Ithaca Rising combat screen with Odysseus raising a sword against the Lotus Wraith, a red enemy health bar and yellow hit particles" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Later Ithaca Rising combat: Odysseus and the Lotus Wraith are both visible, with an enemy health bar and hit particles making the action easier to read.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is one of the strongest uses of an agent: it can hold the mechanical history of the work and investigate the difference, while I stay focused on the outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  The human bottleneck moves upward
&lt;/h2&gt;

&lt;p&gt;When implementation becomes cheaper, judgment becomes more important.&lt;/p&gt;

&lt;p&gt;I spend less time asking, "Can this be built?" and more time asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this the right mechanic for the audience?&lt;/li&gt;
&lt;li&gt;Does the current build feel like a real game or a prototype wearing polished art?&lt;/li&gt;
&lt;li&gt;Are we reusing the best assets and open-source work available, or rebuilding something weaker?&lt;/li&gt;
&lt;li&gt;Is the next feature actually improving the experience?&lt;/li&gt;
&lt;li&gt;What does the real device show that the development environment hides?&lt;/li&gt;
&lt;/ul&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%2F85v8scwoesl4n5il7byi.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%2F85v8scwoesl4n5il7byi.png" alt="Landscape crop of Glimmerbook Solitaire showing the Basket at Dawn title, higher-or-lower instruction and two rows of burgundy and cream cards" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A landscape Glimmerbook crop makes the hierarchy easy to inspect: title and rule first, then the burgundy card backs and cream face-up cards.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These questions are not separate from engineering. They determine which engineering work is worth doing.&lt;/p&gt;

&lt;p&gt;There is also a management lesson. An AI assistant can continue across research, implementation, QA and release preparation without waiting for a new prompt after every small step. That creates leverage, but only if the project has clear constraints and a way to verify reality. Otherwise, autonomy becomes motion without progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently now
&lt;/h2&gt;

&lt;p&gt;First, I would lock the target platform and quality reference before the first implementation. The web-to-Godot correction was useful, but avoidable.&lt;/p&gt;

&lt;p&gt;Second, I would define "done" as an observable result. For an Android game, that means a build that installs, launches and behaves correctly on the target device. Repository activity is not the finish line.&lt;/p&gt;

&lt;p&gt;Third, I would make comparison part of the debugging process from the start. When one project works and another does not, diff the working path before inventing a new one.&lt;/p&gt;

&lt;p&gt;Finally, I would keep the roles explicit. Instinct does the heavy lifting. I own the direction, the standards and the decision to ship.&lt;/p&gt;

&lt;p&gt;That is not a smaller role for the human. It is a more concentrated one.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on how this article was made
&lt;/h2&gt;

&lt;p&gt;The same division of labor applies here. Instinct prepared this draft from our real project history and did the heavy lifting in turning it into a clear technical narrative. I reviewed the facts, chose what should be public and remain responsible for every claim published under my name.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>ai</category>
      <category>android</category>
    </item>
  </channel>
</rss>
