<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://patilrb.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://patilrb.github.io/" rel="alternate" type="text/html" /><updated>2026-10-20T07:16:34+00:00</updated><id>https://patilrb.github.io/feed.xml</id><title type="html">Patil Aslanian</title><subtitle>Notes on web game development and team workflows.</subtitle><entry><title type="html">Why the Same Particle Effect Glows Differently in PixiJS and Three.js</title><link href="https://patilrb.github.io/2026/10/20/why-the-same-particle-effect-glows-differently.html" rel="alternate" type="text/html" title="Why the Same Particle Effect Glows Differently in PixiJS and Three.js" /><published>2026-10-20T07:00:00+00:00</published><updated>2026-10-20T07:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/20/why-the-same-particle-effect-glows-differently</id><content type="html" xml:base="https://patilrb.github.io/2026/10/20/why-the-same-particle-effect-glows-differently.html"><![CDATA[<p>A particle effect can use the same seed, lifetime, velocity, and color curve in two previews and still produce different final pixels. That does not automatically mean one backend is broken.</p>

<p>The useful question is not “Why are the screenshots identical or different?” It is “Which part of the image came from the shared simulation, which part came from the renderer, and which part came from the host’s bloom and exposure pipeline?”</p>

<p>That distinction prevents a common debugging mistake: compensating for a post-processing difference by changing the particle effect itself.</p>

<h2 id="start-with-what-is-shared">Start with what is shared</h2>

<p>NixieFX uses one deterministic simulation core for its PixiJS and Three.js adapters. With the same exported effect, seed, and sequence of <code class="language-plaintext highlighter-rouge">update(deltaSeconds)</code> calls, particle birth, lifetime, motion, curves, and gradients are intended to follow the same simulation.</p>

<p>Rendering is not shared in the same way. PixiJS targets 2D scenes, HUD effects, and screen-space quads. Three.js targets 3D world effects with camera-facing quads, GPU depth behavior, and an instanced path for eligible emitters.</p>

<p>That means “the same effect” has two layers:</p>

<ol>
  <li>The authored and simulated behavior that should remain comparable.</li>
  <li>The backend and host-pipeline behavior that may legitimately look different.</li>
</ol>

<p>The current <a href="https://nixiefx.com/vfx-runtime-docs/">NixieFX documentation</a> makes this boundary explicit through per-backend support reports and a capability matrix.</p>

<h2 id="preview-bloom-is-not-an-exported-promise">Preview bloom is not an exported promise</h2>

<p>The editor includes HDR-style preview bloom controls such as threshold, intensity, exposure, scatter, quality, and downscale. Those values help an artist inspect an effect, but the preview-bloom configuration is not serialized into the exported effect bundle.</p>

<p>Authored HDR emissive intensity is different. It is preserved linearly so the game can feed it into its own tone mapping and bloom pipeline.</p>

<p>The practical consequence is simple: copying an editor exposure value into a bug report does not describe the shipped game. The report must also name the host renderer, tone mapping, bloom pass, threshold, output color space, background, and camera conditions.</p>

<p>For a Three.js game with its own HDR post-processing, do not stack a preview-grade bloom path on top of the real bloom pass. Leave preview bloom off, pass the authored over-range color into the game pipeline, and let that pipeline choose the threshold and exposure.</p>

<h2 id="pixijs-and-threejs-solve-different-rendering-problems">PixiJS and Three.js solve different rendering problems</h2>

<p>The shared simulation does not erase backend differences.</p>

<table>
  <thead>
    <tr>
      <th>Area</th>
      <th>PixiJS backend</th>
      <th>Three.js backend</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Primary space</td>
      <td>2D scenes, HUD, UI</td>
      <td>3D world effects</td>
    </tr>
    <tr>
      <td>Billboards</td>
      <td>Screen-space quads in batched containers</td>
      <td>Camera-facing world quads, with an instanced fast path when eligible</td>
    </tr>
    <tr>
      <td>Materials</td>
      <td>Baked textures plus per-particle channels</td>
      <td>Compiled shaders for dynamic per-pixel material features</td>
    </tr>
    <tr>
      <td>Lighting</td>
      <td>Lit shading is not supported</td>
      <td>Lit shading is supported for world/mesh particles</td>
    </tr>
    <tr>
      <td>Depth</td>
      <td>Deterministic 2.5D ordering and depth ink</td>
      <td>GPU depth test and depth write</td>
    </tr>
    <tr>
      <td>Mesh-surface emission</td>
      <td>Falls back to point and is reported</td>
      <td>Supported</td>
    </tr>
  </tbody>
</table>

<p>An additive spark can therefore be simulated identically while looking different against a 2D UI background and a tone-mapped 3D scene. A lit particle cannot be treated as portable just because it renders in the Three.js preview. A depth-related difference cannot be fixed responsibly by raising emissive intensity.</p>

<h2 id="a-reproducible-comparison-protocol">A reproducible comparison protocol</h2>

<p>Use one exported bundle and separate simulation checks from image checks.</p>

<h3 id="1-pin-the-inputs">1. Pin the inputs</h3>

<p>Record the effect hash or commit, NixieFX version, backend version, seed, fixed update step, and capture time. A comparison using different seeds or variable frame histories is not a controlled comparison.</p>

<h3 id="2-read-both-support-reports">2. Read both support reports</h3>

<p>Inspect <code class="language-plaintext highlighter-rouge">support.backends.pixi2d</code> and <code class="language-plaintext highlighter-rouge">support.backends.three3d</code>. Stop if either backend is <code class="language-plaintext highlighter-rouge">blocked</code>. If one is <code class="language-plaintext highlighter-rouge">partial</code>, list every approximation before discussing visual differences.</p>

<h3 id="3-disable-optional-post-processing">3. Disable optional post-processing</h3>

<p>Capture a baseline without preview bloom or a host bloom pass. Use a fixed solid background. In Three.js, pin the camera and tone-mapping settings. In PixiJS, pin resolution and the screen-space scale.</p>

<h3 id="4-compare-behavior-before-pixels">4. Compare behavior before pixels</h3>

<p>Check particle counts, spawn times, lifetime, motion, and event timing. If those diverge with the same seed and fixed steps, investigate the simulation or integration. Do not reach for exposure first.</p>

<h3 id="5-add-the-intended-host-pipeline">5. Add the intended host pipeline</h3>

<p>Turn on only the bloom and tone mapping the shipped host will use. Record the settings next to the capture. Compare the result against the baseline rather than against an editor screenshot with unknown preview controls.</p>

<h3 id="6-judge-backend-specific-features-separately">6. Judge backend-specific features separately</h3>

<p>If an effect uses lit shading, GPU depth, a dynamic material graph, or mesh-surface emission, evaluate that feature only on a backend that supports it. A portability check should use the exported warnings as evidence, not visual optimism.</p>

<h2 id="worked-example-a-blue-additive-spark">Worked example: a blue additive spark</h2>

<p>Consider a one-second spark burst with a blue-to-transparent gradient and authored HDR intensity. The motion uses a fixed seed and a 1/60-second update step.</p>

<p>The comparison record could look like this:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">effect</span><span class="pi">:</span> <span class="s">blue-spark-burst</span>
<span class="na">seed</span><span class="pi">:</span> <span class="m">42012</span>
<span class="na">step_seconds</span><span class="pi">:</span> <span class="m">0.0166667</span>
<span class="na">capture_at_seconds</span><span class="pi">:</span> <span class="m">0.25</span>

<span class="na">pixi</span><span class="pi">:</span>
  <span class="na">backend</span><span class="pi">:</span> <span class="s">pixi2d</span>
  <span class="na">support</span><span class="pi">:</span> <span class="s">supported</span>
  <span class="na">background</span><span class="pi">:</span> <span class="s2">"</span><span class="s">#10141c"</span>
  <span class="na">resolution</span><span class="pi">:</span> <span class="s2">"</span><span class="s">1280x720"</span>
  <span class="na">host_bloom</span><span class="pi">:</span> <span class="s">none</span>

<span class="na">three</span><span class="pi">:</span>
  <span class="na">backend</span><span class="pi">:</span> <span class="s">three3d</span>
  <span class="na">support</span><span class="pi">:</span> <span class="s">supported</span>
  <span class="na">background</span><span class="pi">:</span> <span class="s2">"</span><span class="s">#10141c"</span>
  <span class="na">camera</span><span class="pi">:</span> <span class="s2">"</span><span class="s">fixed,</span><span class="nv"> </span><span class="s">perspective"</span>
  <span class="na">tone_mapping</span><span class="pi">:</span> <span class="s">none</span>
  <span class="na">host_bloom</span><span class="pi">:</span> <span class="s">none</span>

<span class="na">compare_first</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s">active particle count</span>
  <span class="pi">-</span> <span class="s">particle positions</span>
  <span class="pi">-</span> <span class="s">alpha over lifetime</span>
  <span class="pi">-</span> <span class="s">unsupported feature list</span>
</code></pre></div></div>

<p>If those behavioral checks agree, add the real Three.js bloom pass and record its threshold and exposure. The new glow is then evidence about the host pipeline, not a claim that the PixiJS adapter lost particles.</p>

<p>This example is a test design, not a measured benchmark. It deliberately avoids invented screenshots or performance numbers.</p>

<h2 id="common-mistakes-and-better-fixes">Common mistakes and better fixes</h2>

<p><strong>Mistake: matching screenshots by eye.</strong> Two captures may use different backgrounds, cameras, device pixel ratios, or tone mapping. Fix the capture conditions before changing the effect.</p>

<p><strong>Mistake: serializing preview expectations.</strong> Preview bloom settings are inspection controls, not part of the effect export. Record the game’s real pipeline separately.</p>

<p><strong>Mistake: forcing identical pixels.</strong> The backends have different depth, lighting, and material capabilities. Aim for the same artistic intent and verified simulation where the feature is portable.</p>

<p><strong>Mistake: ignoring <code class="language-plaintext highlighter-rouge">partial</code>.</strong> An effect that renders with an approximation is not fully supported. Keep the warning in the review evidence.</p>

<p><strong>Mistake: brightening to hide a depth issue.</strong> Inspect sorting, depth test, depth write, blend mode, and camera space before changing emissive intensity.</p>

<h2 id="the-review-rule">The review rule</h2>

<p>Accept a cross-backend effect only when the record distinguishes three things:</p>

<ul>
  <li>what the shared simulation produced;</li>
  <li>what each backend supports or approximates;</li>
  <li>what the host’s bloom, exposure, tone mapping, and background added.</li>
</ul>

<p>Once those layers are named, “the glow looks different” becomes a bounded engineering question instead of an invitation to tweak values until two screenshots happen to resemble each other.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[A practical comparison protocol for separating NixieFX simulation, backend support, preview bloom, exposure, and the host game's post-processing pipeline.]]></summary></entry><entry><title type="html">Give repeated player effects different seeds without losing replayability</title><link href="https://patilrb.github.io/2026/10/19/player-effect-seeds-replay-and-variation.html" rel="alternate" type="text/html" title="Give repeated player effects different seeds without losing replayability" /><published>2026-10-19T05:00:00+00:00</published><updated>2026-10-19T05:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/19/player-effect-seeds-replay-and-variation</id><content type="html" xml:base="https://patilrb.github.io/2026/10/19/player-effect-seeds-replay-and-variation.html"><![CDATA[<p>Repeated player effects can feel copied even when their timing is responsive. A pickup burst sprays the same particles in the same directions. Trigger it again and the pattern repeats. That may be correct deterministic behavior: the host might be starting every instance with the same seed.</p>

<p>A seed gives a pseudorandom simulation a reproducible starting point. To make repeated effects vary, give distinct events distinct seeds. To replay a particular event, preserve its seed alongside the other simulation inputs.</p>

<p>This example uses a web game VFX editor workflow with a small NixieFX burst. The <a href="https://nixiefx.com/vfx-runtime-docs/">NixieFX editor and runtime reference</a> provides the export and backend context. The measurements below come from a local Three.js adapter fixture, not a cross-device or cross-renderer screenshot test.</p>

<h2 id="keep-the-effect-deliberately-simple">Keep the effect deliberately simple</h2>

<p>The fixture emits 24 particles in a single starting burst, with no continuous emission. Each lives for 0.6 seconds. Its initial velocity samples x and y independently between -2 and 2; z stays zero. Procedural unlit billboards use a constant size of 0.055 units and fade from alpha 0.9 to zero.</p>

<p>The effect targets the portable profile. It uses no file textures, mesh particles, lighting, collision, or depth-buffer requirement. That keeps the comparison about seeded particle motion instead of external assets or a feature that only one backend can draw.</p>

<p>The sample pins <code class="language-plaintext highlighter-rouge">nixie-fx@0.1.20</code> and <code class="language-plaintext highlighter-rouge">three@0.185.1</code>. A different package version should be tested again before comparing stored numeric snapshots.</p>

<h2 id="give-each-spawn-an-explicit-seed">Give each spawn an explicit seed</h2>

<p>Assume <code class="language-plaintext highlighter-rouge">effect</code> is the verified compiled burst from the export bundle and <code class="language-plaintext highlighter-rouge">vfx</code> is the host’s Three.js VFX renderer:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">spawnNumber</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">baseSeed</span> <span class="o">=</span> <span class="mi">2020</span><span class="p">;</span>

<span class="kd">function</span> <span class="nx">spawnPlayerBurst</span><span class="p">(</span><span class="nx">position</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">seed</span> <span class="o">=</span> <span class="p">(</span><span class="nx">baseSeed</span> <span class="o">+</span> <span class="nx">spawnNumber</span><span class="o">++</span><span class="p">)</span> <span class="o">&gt;&gt;&gt;</span> <span class="mi">0</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">instance</span> <span class="o">=</span> <span class="nx">vfx</span><span class="p">.</span><span class="nx">createEffect</span><span class="p">(</span><span class="nx">effect</span><span class="p">,</span> <span class="p">{</span> <span class="nx">position</span><span class="p">,</span> <span class="nx">seed</span> <span class="p">});</span>
  <span class="k">return</span> <span class="p">{</span> <span class="nx">instance</span><span class="p">,</span> <span class="nx">seed</span> <span class="p">};</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This counter is an example allocation policy, not an event identifier supplied by the runtime. It wraps at the unsigned 32-bit boundary. If replay depends on the seed, record the actual assigned value for the event rather than reconstructing it from a counter whose call order may later change.</p>

<p>Do not reseed an existing burst every frame. The seed belongs to the spawn. Continue advancing the renderer once per host frame with elapsed seconds.</p>

<p>For a reproduction, use the recorded value directly:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">replay</span> <span class="o">=</span> <span class="nx">vfx</span><span class="p">.</span><span class="nx">createEffect</span><span class="p">(</span><span class="nx">effect</span><span class="p">,</span> <span class="p">{</span>
  <span class="na">position</span><span class="p">:</span> <span class="nx">recordedPosition</span><span class="p">,</span>
  <span class="na">seed</span><span class="p">:</span> <span class="nx">recordedSeed</span><span class="p">,</span>
<span class="p">});</span>
</code></pre></div></div>

<p>The recorded position, effect definition, update sequence, and host-driven motion matter too. The same seed cannot compensate for a different emitter path or a changed effect asset.</p>

<h2 id="test-equality-before-testing-variety">Test equality before testing variety</h2>

<p>The local check creates independent instances with seed 2020, advances each through twelve 1/60-second updates, and records the adapter’s particle debug positions. That samples the burst at 0.2 seconds while all 24 particles are still alive.</p>

<p>The comparison sorts records by particle index so it checks matching particles. It compares numeric world positions rather than whole camera-facing transform matrices or screenshots.</p>

<p>A test outline looks like this:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">first</span> <span class="o">=</span> <span class="nx">sample</span><span class="p">(</span><span class="mi">2020</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">repeat</span> <span class="o">=</span> <span class="nx">sample</span><span class="p">(</span><span class="mi">2020</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">varied</span> <span class="o">=</span> <span class="nx">sample</span><span class="p">(</span><span class="mi">2021</span><span class="p">);</span>

<span class="nx">assert</span><span class="p">.</span><span class="nx">deepEqual</span><span class="p">(</span><span class="nx">first</span><span class="p">.</span><span class="nx">particles</span><span class="p">,</span> <span class="nx">repeat</span><span class="p">.</span><span class="nx">particles</span><span class="p">);</span>
<span class="nx">assert</span><span class="p">.</span><span class="nx">notDeepEqual</span><span class="p">(</span><span class="nx">first</span><span class="p">.</span><span class="nx">particles</span><span class="p">,</span> <span class="nx">varied</span><span class="p">.</span><span class="nx">particles</span><span class="p">);</span>
</code></pre></div></div>

<p>Here <code class="language-plaintext highlighter-rouge">sample</code> is the helper defined in the <a href="https://patilrb.github.io/assets/day10/N-515-source.zip">complete source and test archive</a>, not a NixieFX API. It creates the scene and adapter, advances twelve 1/60-second steps, reads <code class="language-plaintext highlighter-rouge">getParticleDebugTransforms()</code>, and destroys the renderer after collecting the result. Extract the archive, run <code class="language-plaintext highlighter-rouge">npm ci</code> and <code class="language-plaintext highlighter-rouge">npm run check</code>, then <code class="language-plaintext highlighter-rouge">npm run build</code> and serve <code class="language-plaintext highlighter-rouge">public/</code> over HTTP. The <a href="https://patilrb.github.io/assets/day10/N-515-demo.html">runnable seed-comparison demo</a> exposes both comparison modes and replay.</p>

<h2 id="what-the-local-test-established">What the local test established</h2>

<p>Both seed-2020 samples matched exactly at the sampled time. Restarting an instance and replaying the same twelve updates also reproduced its positions. Two runs that omitted the seed matched each other in this tested version, which explains why relying on an omitted seed did not create variety.</p>

<p>Changing the seed to 2021 changed the sampled position of all 24 corresponding particles. The adapter reported no unsupported features for this fixture. These are bounded numeric results. They do not promise that every seed pair will look meaningfully different for every authored effect.</p>

<p>Randomness only affects properties that actually sample it. A burst with fixed positions and fixed velocities may look identical under many seeds because its visible properties have no randomized range.</p>

<h2 id="compare-the-pictures-under-controlled-conditions">Compare the pictures under controlled conditions</h2>

<p>The browser fixture places two bursts side by side under one orthographic camera. Their settings, elapsed time, and update steps match. The same-seed comparison should show the same relative pattern around each origin. The different-seed comparison should show another arrangement without changing lifetime, count, or color.</p>

<p>Use a fixed sample time when reviewing the images. If one burst is older than the other, fading and travel can look like seed variation. The fixture’s comparison controls freeze both at 0.2 seconds; a separate replay control shows the animation.</p>

<p>Inspect the effect at its real game size as well. A numeric difference can be technically real but visually unimportant when the whole burst occupies a few pixels.</p>

<h2 id="keep-backend-limits-separate-from-seed-results">Keep backend limits separate from seed results</h2>

<p>The export reports this selected effect supported for both <code class="language-plaintext highlighter-rouge">three3d</code> and <code class="language-plaintext highlighter-rouge">pixi2d</code>, with no warnings or blockers. The Pixi report still includes an informational note: depth-ink semantics concern draw ordering, not a GPU depth buffer. That note must not become a claim of identical 3D depth behavior.</p>

<p>Only the Three.js adapter and Chrome fixture are measured here. PixiJS rendering, screenshot equality across browsers, collision, and device performance remain outside the check. The reserved renderer <code class="language-plaintext highlighter-rouge">clockSpace</code> option is not a seed-control mechanism.</p>

<p>Use fixed seeds for debugging and stored event seeds for replay. Use deliberately assigned varied seeds when repeated events should look different. Then judge variation through the actual effect, camera, timing, and backend that the player will see.</p>

<p><em>Disclosure: This article and procedural fixture were prepared with AI assistance. Numeric claims describe the local tests above; no production-game or cross-renderer visual-parity result is claimed.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[A 24-particle fixture separates repeatable simulation from visible variation, with explicit limits for cross-renderer use.]]></summary></entry><entry><title type="html">Review an agent-written level tool with a designer before it touches a real project</title><link href="https://patilrb.github.io/2026/10/19/review-a-level-auditor-with-a-designer.html" rel="alternate" type="text/html" title="Review an agent-written level tool with a designer before it touches a real project" /><published>2026-10-19T05:00:00+00:00</published><updated>2026-10-19T05:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/19/review-a-level-auditor-with-a-designer</id><content type="html" xml:base="https://patilrb.github.io/2026/10/19/review-a-level-auditor-with-a-designer.html"><![CDATA[<p>A designer can judge whether a level report describes the intended room without being able to audit every line of JavaScript. An engineer can inspect the script without knowing whether the enemy marker belongs near the exit. A useful review needs both kinds of judgment.</p>

<p>This AI game development workflow starts with a deliberately limited tool: read a sample level, report marker problems, and leave the input unchanged. The script and sample below were prepared with AI assistance. They are synthetic examples, not exports from a production game. No qualified human engineer has signed off on this draft.</p>

<h2 id="write-the-contract-before-running-the-script">Write the contract before running the script</h2>

<p>The proposed tool accepts a JSON room with positive integer dimensions and a list of named markers. Coordinates start at zero. For a room four cells wide, valid x values are 0 through 3. The tool reports out-of-bounds coordinates and duplicate marker IDs.</p>

<p>It does not repair the level, write an output level, decide where enemies belong, or inspect an engine project. These limits give the designer something specific to review and keep the first execution away from valuable assets.</p>

<p>Use a copied sample folder. Do not begin by pointing an unfamiliar agent-written script at the team’s content directory. The sample has only two files: <code class="language-plaintext highlighter-rouge">room.json</code> and <code class="language-plaintext highlighter-rouge">audit-level.mjs</code>.</p>

<h2 id="give-the-designer-a-room-they-can-check-by-eye">Give the designer a room they can check by eye</h2>

<p>Put this in <code class="language-plaintext highlighter-rouge">room.json</code>:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"width"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w">
  </span><span class="nl">"height"</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w">
  </span><span class="nl">"markers"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"spawn"</span><span class="p">,</span><span class="w"> </span><span class="nl">"x"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">"y"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"exit"</span><span class="p">,</span><span class="w"> </span><span class="nl">"x"</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="nl">"y"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"enemy-2"</span><span class="p">,</span><span class="w"> </span><span class="nl">"x"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="nl">"y"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>The spawn and exit occupy valid corner cells. The enemy’s x coordinate is just outside the room. That boundary is intentional: testing a coordinate equal to the width catches an off-by-one mistake that an obviously distant coordinate might not reveal.</p>

<p>Before running anything, ask the designer to predict the report. This makes the acceptance rule independent of whatever the script happens to print.</p>

<h2 id="keep-the-implementation-small-enough-to-inspect">Keep the implementation small enough to inspect</h2>

<p>Save the following as <code class="language-plaintext highlighter-rouge">audit-level.mjs</code> and run it with a maintained Node.js installation:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">readFile</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">node:fs/promises</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">function</span> <span class="nx">auditLevel</span><span class="p">(</span><span class="nx">level</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">level</span> <span class="o">||</span> <span class="o">!</span><span class="nb">Number</span><span class="p">.</span><span class="nx">isInteger</span><span class="p">(</span><span class="nx">level</span><span class="p">.</span><span class="nx">width</span><span class="p">)</span> <span class="o">||</span> <span class="nx">level</span><span class="p">.</span><span class="nx">width</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span>
      <span class="o">!</span><span class="nb">Number</span><span class="p">.</span><span class="nx">isInteger</span><span class="p">(</span><span class="nx">level</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="o">||</span> <span class="nx">level</span><span class="p">.</span><span class="nx">height</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span>
      <span class="o">!</span><span class="nb">Array</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">level</span><span class="p">.</span><span class="nx">markers</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Expected positive dimensions and a markers array</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="kd">const</span> <span class="nx">issues</span> <span class="o">=</span> <span class="p">[],</span> <span class="nx">seen</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Set</span><span class="p">();</span>
  <span class="k">for</span> <span class="p">(</span><span class="kd">const</span> <span class="nx">marker</span> <span class="k">of</span> <span class="nx">level</span><span class="p">.</span><span class="nx">markers</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">marker</span> <span class="o">||</span> <span class="k">typeof</span> <span class="nx">marker</span><span class="p">.</span><span class="nx">id</span> <span class="o">!==</span> <span class="dl">"</span><span class="s2">string</span><span class="dl">"</span> <span class="o">||</span> <span class="o">!</span><span class="nx">marker</span><span class="p">.</span><span class="nx">id</span><span class="p">.</span><span class="nx">trim</span><span class="p">()</span> <span class="o">||</span>
        <span class="o">!</span><span class="nb">Number</span><span class="p">.</span><span class="nx">isInteger</span><span class="p">(</span><span class="nx">marker</span><span class="p">.</span><span class="nx">x</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="nb">Number</span><span class="p">.</span><span class="nx">isInteger</span><span class="p">(</span><span class="nx">marker</span><span class="p">.</span><span class="nx">y</span><span class="p">))</span> <span class="p">{</span>
      <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Each marker needs an id and integer x/y</span><span class="dl">"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">seen</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">marker</span><span class="p">.</span><span class="nx">id</span><span class="p">))</span> <span class="nx">issues</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">`ERROR </span><span class="p">${</span><span class="nx">marker</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span><span class="s2">: duplicate id`</span><span class="p">);</span>
    <span class="nx">seen</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">marker</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">marker</span><span class="p">.</span><span class="nx">x</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="nx">marker</span><span class="p">.</span><span class="nx">x</span> <span class="o">&gt;=</span> <span class="nx">level</span><span class="p">.</span><span class="nx">width</span> <span class="o">||</span>
        <span class="nx">marker</span><span class="p">.</span><span class="nx">y</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="nx">marker</span><span class="p">.</span><span class="nx">y</span> <span class="o">&gt;=</span> <span class="nx">level</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="p">{</span>
      <span class="nx">issues</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">`ERROR </span><span class="p">${</span><span class="nx">marker</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span><span class="s2">: (</span><span class="p">${</span><span class="nx">marker</span><span class="p">.</span><span class="nx">x</span><span class="p">}</span><span class="s2">,</span><span class="p">${</span><span class="nx">marker</span><span class="p">.</span><span class="nx">y</span><span class="p">}</span><span class="s2">) outside </span><span class="p">${</span><span class="nx">level</span><span class="p">.</span><span class="nx">width</span><span class="p">}</span><span class="s2">x</span><span class="p">${</span><span class="nx">level</span><span class="p">.</span><span class="nx">height</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="nx">issues</span><span class="p">.</span><span class="nx">sort</span><span class="p">();</span>
<span class="p">}</span>

<span class="k">try</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">level</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="k">await</span> <span class="nx">readFile</span><span class="p">(</span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="dl">"</span><span class="s2">utf8</span><span class="dl">"</span><span class="p">));</span>
  <span class="kd">const</span> <span class="nx">issues</span> <span class="o">=</span> <span class="nx">auditLevel</span><span class="p">(</span><span class="nx">level</span><span class="p">);</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">issues</span><span class="p">.</span><span class="nx">length</span> <span class="p">?</span> <span class="nx">issues</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="dl">"</span><span class="se">\n</span><span class="dl">"</span><span class="p">)</span> <span class="p">:</span> <span class="dl">"</span><span class="s2">OK: no marker issues</span><span class="dl">"</span><span class="p">);</span>
  <span class="nx">process</span><span class="p">.</span><span class="nx">exitCode</span> <span class="o">=</span> <span class="nx">issues</span><span class="p">.</span><span class="nx">length</span> <span class="p">?</span> <span class="mi">2</span> <span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">`INPUT ERROR: </span><span class="p">${</span><span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="nx">process</span><span class="p">.</span><span class="nx">exitCode</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Run:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>node audit-level.mjs room.json
</code></pre></div></div>

<p>Expected output:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ERROR enemy-2: (4,1) outside 4x3
</code></pre></div></div>

<p>The expected exit code is 2 because the input was understood and a marker issue was found. Exit code 1 means the input could not be read or validated. Exit code 0 means this small audit found no marker issues; it does not mean the level is playable.</p>

<h2 id="separate-designer-acceptance-from-code-review">Separate designer acceptance from code review</h2>

<p>The designer checks the coordinate convention, the sample’s expected result, and whether the report uses recognizable marker IDs. They should also decide whether duplicate IDs are invalid in the actual project. A tool cannot infer that rule from a field name.</p>

<p>A qualified engineer reviews the file-reading path, validation, bounds comparison, output ordering, exit behavior, and absence of writes. The supplied implementation imports <code class="language-plaintext highlighter-rouge">readFile</code> and contains no write or delete operation. That is a concrete property of this version, not permission to trust every later revision.</p>

<p>The engineer should also inspect any dependency or process execution added by a future change. A report-only tool that quietly grows an automatic repair mode has crossed its original review boundary.</p>

<p>The agent or developer executes with their own authorized tools. QA prepares the sample and expected results. The engineer judges code correctness, and the designer judges the content rule. For a broader discussion of those roles, see <a href="https://wagglet.com/blog/meaningful-work-with-human-ai-pairs">Wagglet’s article on meaningful work with human–AI pairs</a>.</p>

<h2 id="use-neighboring-cases-to-expose-common-mistakes">Use neighboring cases to expose common mistakes</h2>

<p>The local fixture checked valid corner cells, coordinates equal to width or height, duplicate IDs, invalid dimensions, and a fractional coordinate. Its command-line run produced the expected error and exit code. A SHA-256 comparison confirmed that the sample input did not change during that run.</p>

<p>Those checks address several common failures: treating the upper bound as inclusive, accepting malformed values through coercion, hiding duplicate identities, and confusing an error report with a repaired level.</p>

<p>They do not establish compatibility with a game’s importer, coordinate transforms, filesystem layout, or asset references. The article’s standalone listing uses the same audit logic as the tested fixture; the companion source separates the function from the command-line entry point so it can be tested directly.</p>

<h2 id="require-a-qualified-review-before-expanding-scope">Require a qualified review before expanding scope</h2>

<p>The next useful step is a named engineer’s review against the actual project’s schema, followed by a designer-led check on copied project data. That review remains pending here. Do not describe this synthetic example as an approved production tool.</p>

<p>If the team later needs automatic repair, write a new contract for proposed changes, preview output, rollback, and acceptance. Keep the first report-only version small until both reviewers can explain what it promises and what it leaves unresolved.</p>

<p><em>Disclosure: Prepared with AI assistance. Local checks establish the stated sample behavior; qualified human code review and production integration remain unverified.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[A read-only marker auditor, a small sample level, and a concrete division between designer acceptance and engineering review.]]></summary></entry><entry><title type="html">Build snowfall in Three.js without attaching the weather to the camera</title><link href="https://patilrb.github.io/2026/10/19/threejs-snowfall-world-space.html" rel="alternate" type="text/html" title="Build snowfall in Three.js without attaching the weather to the camera" /><published>2026-10-19T05:00:00+00:00</published><updated>2026-10-19T05:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/19/threejs-snowfall-world-space</id><content type="html" xml:base="https://patilrb.github.io/2026/10/19/threejs-snowfall-world-space.html"><![CDATA[<p>Snowfall is a useful test of a particle integration because the effect stays on screen for a long time. Small mistakes in density, coordinate space, or shutdown become visible as the camera moves through the scene.</p>

<p>This example uses procedural billboard flakes in a fixed world volume. It is a small weather fixture, not a snow simulation. It does not collide with the floor or accumulate on surfaces. The purpose is to make motion and lifecycle easy to inspect before adding a more elaborate visual treatment.</p>

<p>If you use a three js particle editor, the editor preview is only the beginning of the check. The exported effect still needs to behave correctly in the game’s Three.js scene. The <a href="https://nixiefx.com/threejs-runtime/">NixieFX Three.js runtime documentation</a> describes the adapter used here.</p>

<h2 id="start-with-a-density-budget">Start with a density budget</h2>

<p>The fixture emits 12 flakes per second and gives each a five-second lifetime. Multiplying those values suggests about 60 live particles once emission reaches a steady state. The emitter capacity is 80, leaving some room around that estimate.</p>

<p>That arithmetic is a planning estimate, not a promise about an exact count on every frame. The local fixed-step test reached 61 active particles. Emission and retirement happen at discrete update boundaries, so a one-particle difference is not evidence of an uncontrolled leak.</p>

<p>The spawn volume is six units wide, 0.2 units high, and five units deep. Place its origin at <code class="language-plaintext highlighter-rouge">[0, 4, 0]</code>. Initial vertical speed ranges from -0.8 to -0.6 units per second; a small horizontal component prevents every flake from drawing the same vertical line.</p>

<p>The test fixes the seed at 254. Keep that seed when comparing recipe changes so a different random arrangement does not obscure a change in size or opacity.</p>

<h2 id="define-the-effect-explicitly">Define the effect explicitly</h2>

<p>The companion source uses <code class="language-plaintext highlighter-rouge">nixie-fx@0.1.20</code> and <code class="language-plaintext highlighter-rouge">three@0.185.1</code>. This is the complete effect-construction function; the host receives a verified compiled effect from it:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span>
  <span class="nx">createDefaultParticleEffect</span><span class="p">,</span>
  <span class="nx">createConstantParticleScalar</span> <span class="k">as</span> <span class="nx">scalar</span><span class="p">,</span>
<span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">nixie-fx</span><span class="dl">"</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">compileVfxExport</span><span class="p">,</span> <span class="nx">loadVfxExportBundle</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">nixie-fx/export</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">function</span> <span class="nx">makeSnowfall</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">p</span> <span class="o">=</span> <span class="nx">createDefaultParticleEffect</span><span class="p">(</span><span class="dl">"</span><span class="s2">snowfall</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">World-space snowfall</span><span class="dl">"</span><span class="p">);</span>
  <span class="nx">p</span><span class="p">.</span><span class="nx">targetProfile</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">three-world-3d</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">p</span><span class="p">.</span><span class="nx">timeline</span><span class="p">.</span><span class="nx">duration</span> <span class="o">=</span> <span class="mi">6</span><span class="p">;</span>
  <span class="nx">p</span><span class="p">.</span><span class="nx">timeline</span><span class="p">.</span><span class="nx">loop</span><span class="p">.</span><span class="nx">enabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">e</span> <span class="o">=</span> <span class="nx">p</span><span class="p">.</span><span class="nx">emitters</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">flakes</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">duration</span> <span class="o">=</span> <span class="mi">6</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">loop</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">maxParticles</span> <span class="o">=</span> <span class="mi">80</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">shape</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">box</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">box</span> <span class="o">=</span> <span class="p">[</span><span class="mi">6</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">simulationSpace</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">world</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">rate</span> <span class="o">=</span> <span class="mi">12</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">rateValue</span> <span class="o">=</span> <span class="nx">scalar</span><span class="p">(</span><span class="mi">12</span><span class="p">);</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">bursts</span> <span class="o">=</span> <span class="p">[];</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">lifetime</span> <span class="o">=</span> <span class="nx">scalar</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">velocity</span><span class="p">.</span><span class="nx">mode</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">vector</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">velocity</span><span class="p">.</span><span class="nx">min</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mf">0.1</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.8</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.1</span><span class="p">];</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">velocity</span><span class="p">.</span><span class="nx">max</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.1</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.6</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">];</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">size</span> <span class="o">=</span> <span class="nx">scalar</span><span class="p">(</span><span class="mf">0.045</span><span class="p">);</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">billboard</span><span class="p">.</span><span class="nx">sizeStart</span> <span class="o">=</span> <span class="mf">0.045</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">billboard</span><span class="p">.</span><span class="nx">sizeEnd</span> <span class="o">=</span> <span class="mf">0.045</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">billboard</span><span class="p">.</span><span class="nx">sizeValue</span> <span class="o">=</span> <span class="nx">scalar</span><span class="p">(</span><span class="mf">0.045</span><span class="p">);</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">render</span><span class="p">.</span><span class="nx">shading</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">unlit</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">render</span><span class="p">.</span><span class="nx">blend</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">alpha</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">render</span><span class="p">.</span><span class="nx">depthTest</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">render</span><span class="p">.</span><span class="nx">depthWrite</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.85</span><span class="p">,</span> <span class="mf">0.93</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">];</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">modules</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nx">gradient</span><span class="p">.</span><span class="nx">colorStops</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span> <span class="na">position</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="na">color</span><span class="p">:</span> <span class="p">[</span><span class="mf">0.85</span><span class="p">,</span> <span class="mf">0.93</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="p">},</span>
    <span class="p">{</span> <span class="na">position</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">color</span><span class="p">:</span> <span class="p">[</span><span class="mf">0.85</span><span class="p">,</span> <span class="mf">0.93</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="p">},</span>
  <span class="p">];</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nx">gradient</span><span class="p">.</span><span class="nx">alphaStops</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span> <span class="na">position</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="na">alpha</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span>
    <span class="p">{</span> <span class="na">position</span><span class="p">:</span> <span class="mf">0.1</span><span class="p">,</span> <span class="na">alpha</span><span class="p">:</span> <span class="mf">0.8</span> <span class="p">},</span>
    <span class="p">{</span> <span class="na">position</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span> <span class="na">alpha</span><span class="p">:</span> <span class="mf">0.8</span> <span class="p">},</span>
    <span class="p">{</span> <span class="na">position</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">alpha</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span>
  <span class="p">];</span>
  <span class="kd">const</span> <span class="nx">c</span> <span class="o">=</span> <span class="nx">compileVfxExport</span><span class="p">([</span>
    <span class="p">{</span> <span class="na">effect</span><span class="p">:</span> <span class="nx">p</span><span class="p">,</span> <span class="na">effectPath</span><span class="p">:</span> <span class="dl">"</span><span class="s2">effects/snowfall.json</span><span class="dl">"</span> <span class="p">},</span>
  <span class="p">]);</span>
  <span class="k">return</span> <span class="nx">loadVfxExportBundle</span><span class="p">({</span>
    <span class="na">manifest</span><span class="p">:</span> <span class="nx">c</span><span class="p">.</span><span class="nx">manifest</span><span class="p">,</span>
    <span class="na">effectsByPath</span><span class="p">:</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">fromEntries</span><span class="p">(</span><span class="nx">c</span><span class="p">.</span><span class="nx">effects</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">x</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="nx">x</span><span class="p">.</span><span class="nx">path</span><span class="p">,</span> <span class="nx">x</span><span class="p">.</span><span class="nx">effect</span><span class="p">])),</span>
    <span class="na">assetPaths</span><span class="p">:</span> <span class="p">[],</span>
  <span class="p">},</span> <span class="p">{</span> <span class="na">requiredBackend</span><span class="p">:</span> <span class="dl">"</span><span class="s2">three3d</span><span class="dl">"</span><span class="p">,</span> <span class="na">requireEveryAsset</span><span class="p">:</span> <span class="kc">true</span> <span class="p">})</span>
    <span class="p">.</span><span class="nx">effectsById</span><span class="p">.</span><span class="kd">get</span><span class="p">(</span><span class="dl">"</span><span class="s2">snowfall</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The definition references no file assets. The fixture therefore needs no texture provider. For a deployed game, precompile and serve the export bundle with the game’s static assets instead of doing authoring work inside a frame loop.</p>

<h2 id="keep-the-weather-in-world-space">Keep the weather in world space</h2>

<p>Mount the VFX renderer in the scene, using the same camera that renders the game. Leave its root out of the camera hierarchy. The camera can then move through the weather volume without carrying old flakes along with it.</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">ThreeVfxRenderer</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">nixie-fx/three</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">vfx</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ThreeVfxRenderer</span><span class="p">({</span> <span class="nx">scene</span><span class="p">,</span> <span class="nx">camera</span> <span class="p">});</span>
<span class="kd">const</span> <span class="nx">snowfall</span> <span class="o">=</span> <span class="nx">vfx</span><span class="p">.</span><span class="nx">createEffect</span><span class="p">(</span><span class="nx">makeSnowfall</span><span class="p">(),</span> <span class="p">{</span>
  <span class="na">position</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
  <span class="na">seed</span><span class="p">:</span> <span class="mi">254</span><span class="p">,</span>
<span class="p">});</span>

<span class="c1">// Call once from the existing host loop, with elapsed seconds.</span>
<span class="kd">function</span> <span class="nx">updateWeather</span><span class="p">(</span><span class="nx">dt</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">vfx</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">dt</span><span class="p">);</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">leaveSnowArea</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">snowfall</span><span class="p">.</span><span class="nx">allowCompletion</span><span class="p">();</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">destroyWeather</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">vfx</span><span class="p">.</span><span class="nx">destroy</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This volume stays at its authored location. An endless weather system may move the emission volume as the player travels, but old world-space particles should retain their own positions. Repositioning emission and teleporting every live flake are different operations.</p>

<h2 id="check-falling-motion-and-shutdown-separately">Check falling motion and shutdown separately</h2>

<p>The adapter test creates one diagnostic flake with continuous emission disabled. After an initial update makes it visible, another half second of fixed-step updates moves it downward by about 0.325 world units. Moving the camera with zero elapsed simulation time preserves its world position.</p>

<p>A second check runs continuous snowfall for ten simulated seconds. It records the 61-particle peak and an empty unsupported-feature list. Calling <code class="language-plaintext highlighter-rouge">allowCompletion()</code> stops new emission; after another 5.5 seconds, the active count reaches zero. These are local adapter measurements, not GPU or mobile benchmarks.</p>

<p>The browser fixture adds Restart, Inspect four seconds, Stop and drain, and Orbit camera controls. Compare the flakes against a fixed landmark while orbiting. Then stop emission and watch the remaining flakes disappear without replenishment. Pausing is a separate action: frozen particles do not demonstrate that lifetime cleanup works.</p>

<h2 id="keep-the-unsupported-behavior-visible">Keep the unsupported behavior visible</h2>

<p>The selected effect’s Three.js support report has no warnings or blockers. That result covers this recipe. It does not establish support for every authored setting or for a different package version.</p>

<p>The renderer option <code class="language-plaintext highlighter-rouge">clockSpace</code> is reserved and unused in this runtime; the fixture uses the emitter’s <code class="language-plaintext highlighter-rouge">simulationSpace</code> setting. Collision and accumulation are not implemented by this recipe. Depth testing can hide a flake behind opaque geometry without making it collide with that geometry.</p>

<p>Before using the effect in a level, check contrast on bright backgrounds, opaque occlusion, transparent sorting, camera distance, and shutdown during scene changes. Offer a reduced-motion option that disables the weather. Measure the real scene on the intended device before making a performance claim.</p>

<p><em>Disclosure: This original article and procedural fixture were prepared with AI assistance. The reported numbers come from the local adapter checks described above; no production footage or target-device result is claimed.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[A tested NixieFX snowfall fixture with a bounded particle budget, world-space motion, and an explicit drain path.]]></summary></entry><entry><title type="html">Replace ‘make it better’ with one result someone can verify</title><link href="https://patilrb.github.io/2026/10/19/turn-a-vague-ai-request-into-one-verifiable-task.html" rel="alternate" type="text/html" title="Replace ‘make it better’ with one result someone can verify" /><published>2026-10-19T05:00:00+00:00</published><updated>2026-10-19T05:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/19/turn-a-vague-ai-request-into-one-verifiable-task</id><content type="html" xml:base="https://patilrb.github.io/2026/10/19/turn-a-vague-ai-request-into-one-verifiable-task.html"><![CDATA[<p>“Make the asset browser better” sounds like a task until someone tries to finish it. Better could mean faster search, clearer thumbnails, fewer clicks, or a different layout. An agent can choose an interpretation and produce a substantial change while the person who asked for it expected something else entirely.</p>

<p>A useful first move is to identify one observable failure and decide what evidence would resolve it. That gives the implementer a stopping point and gives the reviewer a decision they can actually make. Here is a fictional example that a technical team could adapt to its own application.</p>

<h2 id="start-with-the-moment-that-fails">Start with the moment that fails</h2>

<p>Imagine a level designer searching an asset browser for <code class="language-plaintext highlighter-rouge">oak</code>. The current folder contains no matching assets. The browser displays a blank grid. The designer cannot tell whether the search finished, the folder is empty, or loading failed.</p>

<p>The original request is “make the asset browser better.” The narrower problem is uncertainty after a completed search returns zero matches. That is specific enough to discuss without redesigning the browser.</p>

<p>Before writing a task, the preparer should confirm the behavior in the real application. Record the route, the selected folder, the exact query, and the state after loading completes. If nobody can reproduce it, the next task is investigation. An assumed cause should not quietly become an implementation instruction.</p>

<p>For this example, suppose the behavior is confirmed and the team chooses a small empty-state improvement. Search speed, ranking, and asset loading remain separate questions. Keeping those questions visible prevents an attractive but unrelated improvement from swallowing the original request.</p>

<h2 id="write-one-bounded-outcome">Write one bounded outcome</h2>

<p>A task can now name a result instead of a preference:</p>

<blockquote>
  <p>When a completed asset search has zero matches in the selected folder, show the query and a “Clear search” action. Activating that action clears the query and restores the selected folder’s unfiltered assets. Preserve the selected folder.</p>
</blockquote>

<p>The title could be “Explain zero search results and let the designer clear the query.” It names a user-visible behavior that can be checked in one short session.</p>

<p>The task should also distinguish adjacent states. A folder with no assets needs its existing empty-folder message. A pending request needs its loading state. A failed request needs its error state. Zero results should appear only after a successful search completes. Those boundaries matter because a component can display the new sentence correctly while showing it at the wrong time.</p>

<p>Keep implementation freedom where it is useful. The implementer can inspect the existing component structure and reuse the project’s established controls. The task need not prescribe a new state-management library or a specific CSS technique unless the project has a real constraint requiring it.</p>

<h2 id="turn-the-outcome-into-a-short-acceptance-check">Turn the outcome into a short acceptance check</h2>

<p>Use a known fixture so the reviewer can repeat the check. Suppose the selected folder contains <code class="language-plaintext highlighter-rouge">pine_small</code> and <code class="language-plaintext highlighter-rouge">pine_large</code>, and searching for <code class="language-plaintext highlighter-rouge">oak</code> returns neither. A compact check is:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Given: folder Trees contains pine_small and pine_large
When: search oak completes successfully with zero matches
Then: the grid shows the query oak and a Clear search action
When: Clear search is activated
Then: the query is empty and both pine assets are visible
And: Trees remains the selected folder
</code></pre></div></div>

<p>Add two boundary checks: searching for <code class="language-plaintext highlighter-rouge">pine</code> still shows both matches, and a loading or failed request never presents itself as a completed zero-result search. Keyboard activation of the clear action should follow the application’s existing accessible control behavior.</p>

<p>This is a proposed acceptance procedure, not a claim that an existing product passed it. The actual team must attach its fixture or equivalent reproducible data before execution. Screenshots can establish the message and selected folder; an interaction recording or test can establish what the action does.</p>

<h2 id="make-the-three-responsibilities-explicit">Make the three responsibilities explicit</h2>

<p>The human preparer supplies the observed problem, the fixture, and the proposed boundary. They ask the designer whether preserving the selected folder is the desired behavior. That decision belongs before implementation because a technically correct reset could otherwise discard useful navigation context.</p>

<p>The implementer, whether an agent or a person, uses their own authorized tools and project access to inspect the code, make the bounded change, and run the relevant checks. Their completion note should identify changed files, checks performed, and any behavior they could not verify. If the existing API cannot distinguish a failed search from an empty response, they should report that dependency instead of inventing a success signal.</p>

<p>The human acceptance reviewer repeats the agreed scenario and judges whether the result resolves the designer’s uncertainty. A green test is useful evidence, but the reviewer still needs to see whether the message is understandable in context. The reviewer can accept the bounded task while opening a separate request about search performance or ranking.</p>

<p>For teams thinking about <strong>work management for human and AI teams</strong>, this separation fits the discussion in <a href="https://wagglet.com/blog/dual-prompt-human-agent-task-design">Wagglet’s human and agent task-design article</a>. The practical question is whether each participant knows which decision they own and which evidence they owe the next person.</p>

<h2 id="stop-when-the-agreed-result-is-established">Stop when the agreed result is established</h2>

<p>Before handing over the task, check that the request names a trigger, a visible outcome, a reset behavior, and the states it must preserve. Confirm that someone can reproduce the acceptance procedure without guessing which data to use. Assign the person who will make the final acceptance decision.</p>

<p>This approach does not solve every design question. It cannot establish that the entire browser is intuitive, that every folder performs well, or that the chosen wording works for every audience. It establishes one smaller result: after a successful search finds nothing, the designer can understand the state and recover without losing their place. That is a task someone can finish and someone else can verify.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[A worked example for turning an ambiguous AI request into a bounded change, a reproducible check, and a human acceptance decision.]]></summary></entry><entry><title type="html">Give a pickup burst one simulation contract and two host integrations</title><link href="https://patilrb.github.io/2026/10/18/pickup-burst-two-hosts.html" rel="alternate" type="text/html" title="Give a pickup burst one simulation contract and two host integrations" /><published>2026-10-18T20:00:00+00:00</published><updated>2026-10-18T20:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/18/pickup-burst-two-hosts</id><content type="html" xml:base="https://patilrb.github.io/2026/10/18/pickup-burst-two-hosts.html"><![CDATA[<p>A pickup effect is a useful place to begin a cross-renderer experiment. The interaction is short, the trigger is clear, and the effect should end without leaving a loop running in the scene. It is also easy to overcomplicate: a rotating coin mesh, bloom, a UI flight path, and a reward counter introduce several systems before the basic burst has been checked.</p>

<p>This example starts with a simpler contract. Trigger one gold burst, let it expand in a plane, and let every particle expire. The visual specification is deliberately limited to untextured gold billboards. It does not claim to include a finished coin sprite or a physically rotating coin.</p>

<h2 id="define-the-pickup-independently-of-the-renderer">Define the pickup independently of the renderer</h2>

<p>Use a portable effect with a single emitter named <code class="language-plaintext highlighter-rouge">coins</code>. Set its maximum population to 24, continuous emission to zero, and one scheduled burst of 24 at time zero. Give each particle a 0.6-second lifetime. Randomize initial velocity between minus two and plus two on X and Y, with Z fixed at zero.</p>

<p>Choose unlit alpha blending, disable depth testing for this planar example, and fade alpha from one to zero over the particle lifetime. Keep the timeline non-looping. The particle size is a small world-unit value in the fixture; the host must decide how that maps to its screen.</p>

<p>The complete authored fixture is in <code class="language-plaintext highlighter-rouge">coin-contract.mjs</code> in the preparation pack. It uses <code class="language-plaintext highlighter-rouge">nixie-fx@0.1.20</code>, builds a compiled bundle, and requires each backend separately when loading the result. Keeping that fixture beside the article makes the configured values reviewable instead of relying on a screenshot of editor controls.</p>

<h2 id="treat-the-export-as-a-bundle">Treat the export as a bundle</h2>

<p>A game needs the manifest, the compiled effect JSON, and any referenced assets from the same export. Mixing a new manifest with an old effect file creates a different problem from a renderer compatibility issue.</p>

<p>The fixture has no external texture assets. If you replace the gold billboards with coin artwork, re-export and resolve the asset paths through the appropriate provider. Do not assume that putting a PNG beside the article makes it available to the runtime.</p>

<p>For teams choosing a particle editor for PixiJS and Three.js, the <a href="https://nixiefx.com/pixijs-particle-effects/">NixieFX PixiJS guide</a> is relevant context. The integration still needs a declared coordinate system and a backend support check for the actual exported effect.</p>

<h2 id="make-the-two-host-choices-explicit">Make the two host choices explicit</h2>

<p>In a PixiJS UI, choose a container whose transform maps the fixture’s small simulation units to a useful screen size. Position that container at the pickup indicator. Avoid attaching it under a parent that later receives an unrelated gameplay scale.</p>

<p>In Three.js, choose an orthographic camera for the first comparison, keep the burst in its XY plane, and place the camera along Z looking toward it. This reduces perspective as a source of disagreement while leaving the effect in a normal Three.js scene.</p>

<p>Both hosts create an instance from the exported definition with seed 270. Each host advances its adapter once per frame with a delta in seconds. If an application advances both the instance and the owning adapter, it may accidentally simulate twice. Choose one owner for that update.</p>

<p>The following is the intended lifecycle once the renderer and loaded effect exist:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// vfx is the host's PixiVfxRenderer or ThreeVfxRenderer.</span>
<span class="kd">const</span> <span class="nx">pickup</span> <span class="o">=</span> <span class="nx">vfx</span><span class="p">.</span><span class="nx">createEffect</span><span class="p">(</span><span class="nx">effect</span><span class="p">,</span> <span class="p">{</span> <span class="na">seed</span><span class="p">:</span> <span class="mi">270</span> <span class="p">});</span>

<span class="kd">function</span> <span class="nx">updateEffect</span><span class="p">(</span><span class="nx">deltaSeconds</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">vfx</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">deltaSeconds</span><span class="p">);</span> <span class="c1">// one call per host frame</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">replayPickup</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">pickup</span><span class="p">.</span><span class="nx">restart</span><span class="p">();</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">releaseScene</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">vfx</span><span class="p">.</span><span class="nx">destroy</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This is an integration excerpt, not a complete HTML application. The fixture and its check run independently of a GPU. A public demo still needs the renderer setup, viewport, trigger control, and final draw call.</p>

<h2 id="compare-a-known-moment-then-the-full-lifecycle">Compare a known moment, then the full lifecycle</h2>

<p>The included CPU check advances the loaded effect at 1/60-second steps. For this fixture, both backend-required loads produced shared-core counts of 24 active particles at 0.2 seconds and zero at 1 second. This measures population and lifetime only. It does not establish that PixiJS and Three.js rendered matching pixels.</p>

<p>Use that known time for a visual review. Freeze each host at 0.2 seconds, show the seed and scale, and capture the entire burst against the same background. Then replay the animation and confirm that the effect disappears, the pickup can retrigger, and scene cleanup removes its owned resources.</p>

<h2 id="keep-the-limits-in-the-published-example">Keep the limits in the published example</h2>

<ul>
  <li>Confirm both exported backend reports and retain any approximation notes.</li>
  <li>Record renderer versions, viewport size, projection, and container scale.</li>
  <li>Add actual captures from both hosts before calling the visual comparison complete.</li>
  <li>Check a second pickup and teardown, rather than only the first trigger.</li>
  <li>Do not generalize this planar alpha test to lit meshes, bloom, or depth occlusion.</li>
</ul>

<p>The portable profile is an eligibility contract, not a promise of identical presentation. A Three.js object can participate in world depth in ways that a Pixi container does not reproduce as a GPU depth buffer. This fixture avoids that dependency rather than silently treating the two scenes as equivalent.</p>

<p>AI assistance was used to prepare this article and fixture. The local export and CPU check were run; the two browser renders, screenshots, and a production pickup integration remain review work.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[A small portable gold burst, explicit coordinate choices, and a review checklist for PixiJS and Three.js.]]></summary></entry><entry><title type="html">Ambient fireflies should stay in the room when the camera moves</title><link href="https://patilrb.github.io/2026/10/16/fireflies-world-space.html" rel="alternate" type="text/html" title="Ambient fireflies should stay in the room when the camera moves" /><published>2026-10-16T05:00:00+00:00</published><updated>2026-10-16T05:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/16/fireflies-world-space</id><content type="html" xml:base="https://patilrb.github.io/2026/10/16/fireflies-world-space.html"><![CDATA[<p>A firefly effect can look convincing in a still frame and fail as soon as the camera moves. If the particles follow the camera like an overlay, the room appears to move with them. If every particle is bright and large, the effect can cover the scene instead of suggesting depth.</p>

<p>This recipe treats ambient fireflies as a small, world-space detail. It uses a bounded emitter and a repeatable seed so that placement and lifecycle can be inspected separately from art direction. The companion fixture uses NixieFX 0.1.20 and Three.js 0.185.1. It is a synthetic scene, not a performance claim about a game or device.</p>

<h2 id="specify-the-space-before-the-glow">Specify the space before the glow</h2>

<p>Place the effect near a landmark that stays fixed in the world. A box, doorway, or column gives the eye something to compare against when the camera moves. The particles should remain associated with that region rather than sliding across the screen at a constant pixel offset.</p>

<p>Use a modest box-shaped spawn volume. For this fixture, the intended volume is four units wide, two high, and three deep. These are scene units; their physical meaning depends on the game. Set the particles to world simulation space and use a low initial speed. The point is a restrained ambient cue, not a swarm navigating around obstacles.</p>

<p>A three js particle editor helps author the effect, but the integration still needs a defined coordinate system. The <a href="https://nixiefx.com/threejs-runtime/">NixieFX Three.js runtime guide</a> is the reference for the adapter used here.</p>

<h2 id="build-a-bounded-recipe">Build a bounded recipe</h2>

<p>The companion source constructs a simple effect, compiles it, and validates it for the Three backend before returning the exported definition. The relevant authoring choices are:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Target: three-world-3d
Spawn: box, 4 x 2 x 3 scene units
Simulation: world space
Emission: 8 particles per second
Lifetime: 3 seconds
Capacity: 48 particles
Initial speed: 0.025 scene units per second
Rendering: unlit alpha billboards; depth test on; depth write off
Opacity: fade in, hold, fade out
</code></pre></div></div>

<p>At a steady eight particles per second with three-second lifetimes, the nominal occupancy is about 24 live particles. That arithmetic is a planning estimate. The configured hard cap remains important during warmup, timing changes, and future edits. Check the real occupancy rather than relying on the estimate.</p>

<p>The small fixture’s simulation check advances the adapter for 20 seconds, records peak occupancy, and verifies that the selected effect reports no unsupported features. It then stops further emission and advances long enough for the existing particles to expire. Those are lifecycle checks; they do not measure GPU frame time.</p>

<h2 id="companion-recipe-module">Companion recipe module</h2>

<p>Save the following as <code class="language-plaintext highlighter-rouge">effects.mjs</code> in a project with the stated dependencies. It is source for the fixture described above.</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span><span class="nx">createDefaultParticleEffect</span><span class="p">,</span><span class="nx">createConstantParticleScalar</span> <span class="k">as</span> <span class="nx">s</span><span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">nixie-fx</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span><span class="nx">compileVfxExport</span><span class="p">,</span><span class="nx">loadVfxExportBundle</span><span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">nixie-fx/export</span><span class="dl">'</span><span class="p">;</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">effect</span><span class="p">(</span><span class="nx">id</span><span class="p">){</span>
 <span class="kd">const</span> <span class="nx">p</span><span class="o">=</span><span class="nx">createDefaultParticleEffect</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span><span class="nx">id</span><span class="p">),</span><span class="nx">e</span><span class="o">=</span><span class="nx">p</span><span class="p">.</span><span class="nx">emitters</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
 <span class="kd">const</span> <span class="nx">pixi</span><span class="o">=</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">portrait</span><span class="dl">'</span><span class="p">;</span><span class="nx">p</span><span class="p">.</span><span class="nx">targetProfile</span><span class="o">=</span><span class="nx">pixi</span><span class="p">?</span><span class="dl">'</span><span class="s1">pixi-ui-2d</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">three-world-3d</span><span class="dl">'</span><span class="p">;</span>
 <span class="nx">p</span><span class="p">.</span><span class="nx">timeline</span><span class="p">.</span><span class="nx">duration</span><span class="o">=</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">rain</span><span class="dl">'</span><span class="p">?.</span><span class="mi">6</span><span class="p">:</span><span class="mi">4</span><span class="p">;</span><span class="nx">p</span><span class="p">.</span><span class="nx">timeline</span><span class="p">.</span><span class="nx">loop</span><span class="p">.</span><span class="nx">enabled</span><span class="o">=</span><span class="nx">id</span><span class="o">!==</span><span class="dl">'</span><span class="s1">rain</span><span class="dl">'</span><span class="p">;</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">id</span><span class="o">=</span><span class="dl">'</span><span class="s1">particles</span><span class="dl">'</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">duration</span><span class="o">=</span><span class="nx">p</span><span class="p">.</span><span class="nx">timeline</span><span class="p">.</span><span class="nx">duration</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">loop</span><span class="o">=</span><span class="nx">id</span><span class="o">!==</span><span class="dl">'</span><span class="s1">rain</span><span class="dl">'</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">maxParticles</span><span class="o">=</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">rain</span><span class="dl">'</span><span class="p">?</span><span class="mi">12</span><span class="p">:</span><span class="mi">48</span><span class="p">;</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">shape</span><span class="o">=</span><span class="nx">pixi</span><span class="p">?</span><span class="dl">'</span><span class="s1">circle</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">box</span><span class="dl">'</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">radius</span><span class="o">=</span><span class="nx">pixi</span><span class="p">?</span><span class="mi">70</span><span class="p">:</span><span class="mi">1</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">radiusValue</span><span class="o">=</span><span class="nx">s</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">radius</span><span class="p">);</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">boxSize</span><span class="o">=</span><span class="nx">pixi</span><span class="p">?[</span><span class="mi">140</span><span class="p">,</span><span class="mi">180</span><span class="p">,</span><span class="mi">0</span><span class="p">]:</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">fog</span><span class="dl">'</span><span class="p">?[</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">8</span><span class="p">]:[</span><span class="mi">4</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">];</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">simulationSpace</span><span class="o">=</span><span class="dl">'</span><span class="s1">world</span><span class="dl">'</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">rate</span><span class="o">=</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">rain</span><span class="dl">'</span><span class="p">?</span><span class="mi">0</span><span class="p">:</span><span class="mi">8</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">rateValue</span><span class="o">=</span><span class="nx">s</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">rate</span><span class="p">);</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">bursts</span><span class="o">=</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">rain</span><span class="dl">'</span><span class="p">?[{</span><span class="na">time</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="na">count</span><span class="p">:</span><span class="mi">12</span><span class="p">,</span><span class="na">cycles</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="na">interval</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="na">probability</span><span class="p">:</span><span class="mi">1</span><span class="p">}]:[];</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">lifetime</span><span class="o">=</span><span class="nx">s</span><span class="p">(</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">rain</span><span class="dl">'</span><span class="p">?.</span><span class="mi">35</span><span class="p">:</span><span class="mi">3</span><span class="p">);</span><span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">velocity</span><span class="p">.</span><span class="nx">speed</span><span class="o">=</span><span class="nx">s</span><span class="p">(</span><span class="nx">pixi</span><span class="p">?</span><span class="mi">4</span><span class="p">:.</span><span class="mi">025</span><span class="p">);</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">size</span><span class="o">=</span><span class="nx">s</span><span class="p">(</span><span class="nx">pixi</span><span class="p">?</span><span class="mi">2</span><span class="p">:.</span><span class="mi">04</span><span class="p">);</span><span class="nx">e</span><span class="p">.</span><span class="nx">billboard</span><span class="p">.</span><span class="nx">sizeStart</span><span class="o">=</span><span class="nx">pixi</span><span class="p">?</span><span class="mi">2</span><span class="p">:.</span><span class="mi">04</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">billboard</span><span class="p">.</span><span class="nx">sizeEnd</span><span class="o">=</span><span class="nx">e</span><span class="p">.</span><span class="nx">billboard</span><span class="p">.</span><span class="nx">sizeStart</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">billboard</span><span class="p">.</span><span class="nx">sizeValue</span><span class="o">=</span><span class="nx">s</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">billboard</span><span class="p">.</span><span class="nx">sizeStart</span><span class="p">);</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">render</span><span class="p">.</span><span class="nx">blend</span><span class="o">=</span><span class="dl">'</span><span class="s1">alpha</span><span class="dl">'</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">render</span><span class="p">.</span><span class="nx">shading</span><span class="o">=</span><span class="dl">'</span><span class="s1">unlit</span><span class="dl">'</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">render</span><span class="p">.</span><span class="nx">depthTest</span><span class="o">=!</span><span class="nx">pixi</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">render</span><span class="p">.</span><span class="nx">depthWrite</span><span class="o">=</span><span class="kc">false</span><span class="p">;</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nx">color</span><span class="o">=</span><span class="nx">pixi</span><span class="p">?[.</span><span class="mi">4</span><span class="p">,.</span><span class="mi">7</span><span class="p">,</span><span class="mi">1</span><span class="p">,.</span><span class="mi">35</span><span class="p">]:</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">fireflies</span><span class="dl">'</span><span class="p">?[.</span><span class="mi">8</span><span class="p">,</span><span class="mi">1</span><span class="p">,.</span><span class="mi">3</span><span class="p">,.</span><span class="mi">65</span><span class="p">]:[.</span><span class="mi">6</span><span class="p">,.</span><span class="mi">8</span><span class="p">,</span><span class="mi">1</span><span class="p">,.</span><span class="mi">25</span><span class="p">];</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">modules</span><span class="p">.</span><span class="nx">color</span><span class="o">=</span><span class="kc">true</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nx">gradient</span><span class="p">.</span><span class="nx">colorStops</span><span class="o">=</span><span class="p">[{</span><span class="na">position</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="na">color</span><span class="p">:</span><span class="nx">pixi</span><span class="p">?[.</span><span class="mi">4</span><span class="p">,.</span><span class="mi">7</span><span class="p">,</span><span class="mi">1</span><span class="p">]:[.</span><span class="mi">8</span><span class="p">,</span><span class="mi">1</span><span class="p">,.</span><span class="mi">6</span><span class="p">]},{</span><span class="na">position</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="na">color</span><span class="p">:</span><span class="nx">pixi</span><span class="p">?[.</span><span class="mi">4</span><span class="p">,.</span><span class="mi">7</span><span class="p">,</span><span class="mi">1</span><span class="p">]:[.</span><span class="mi">8</span><span class="p">,</span><span class="mi">1</span><span class="p">,.</span><span class="mi">6</span><span class="p">]}];</span>
 <span class="nx">e</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nx">gradient</span><span class="p">.</span><span class="nx">alphaStops</span><span class="o">=</span><span class="p">[{</span><span class="na">position</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="na">alpha</span><span class="p">:</span><span class="mi">0</span><span class="p">},{</span><span class="na">position</span><span class="p">:.</span><span class="mi">25</span><span class="p">,</span><span class="na">alpha</span><span class="p">:</span><span class="nx">pixi</span><span class="p">?.</span><span class="mi">3</span><span class="p">:.</span><span class="mi">45</span><span class="p">},{</span><span class="na">position</span><span class="p">:.</span><span class="mi">75</span><span class="p">,</span><span class="na">alpha</span><span class="p">:</span><span class="nx">pixi</span><span class="p">?.</span><span class="mi">3</span><span class="p">:.</span><span class="mi">45</span><span class="p">},{</span><span class="na">position</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="na">alpha</span><span class="p">:</span><span class="mi">0</span><span class="p">}];</span>
 <span class="k">if</span><span class="p">(</span><span class="nx">id</span><span class="o">===</span><span class="dl">'</span><span class="s1">rain</span><span class="dl">'</span><span class="p">){</span><span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">shape</span><span class="o">=</span><span class="dl">'</span><span class="s1">point</span><span class="dl">'</span><span class="p">;</span><span class="nx">e</span><span class="p">.</span><span class="nx">spawn</span><span class="p">.</span><span class="nx">rotation</span><span class="o">=</span><span class="p">[</span><span class="mi">90</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">];</span><span class="nx">e</span><span class="p">.</span><span class="nx">initializeParticle</span><span class="p">.</span><span class="nx">velocity</span><span class="p">.</span><span class="nx">speed</span><span class="o">=</span><span class="nx">s</span><span class="p">(.</span><span class="mi">3</span><span class="p">);}</span>
 <span class="kd">const</span> <span class="nx">c</span><span class="o">=</span><span class="nx">compileVfxExport</span><span class="p">([{</span><span class="na">effect</span><span class="p">:</span><span class="nx">p</span><span class="p">,</span><span class="na">effectPath</span><span class="p">:</span><span class="s2">`effects/</span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2">.json`</span><span class="p">}]);</span>
 <span class="k">return</span> <span class="nx">loadVfxExportBundle</span><span class="p">({</span><span class="na">manifest</span><span class="p">:</span><span class="nx">c</span><span class="p">.</span><span class="nx">manifest</span><span class="p">,</span><span class="na">effectsByPath</span><span class="p">:</span><span class="nb">Object</span><span class="p">.</span><span class="nx">fromEntries</span><span class="p">(</span><span class="nx">c</span><span class="p">.</span><span class="nx">effects</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">v</span><span class="o">=&gt;</span><span class="p">[</span><span class="nx">v</span><span class="p">.</span><span class="nx">path</span><span class="p">,</span><span class="nx">v</span><span class="p">.</span><span class="nx">effect</span><span class="p">])),</span><span class="na">assetPaths</span><span class="p">:[]},{</span><span class="na">requiredBackend</span><span class="p">:</span><span class="nx">pixi</span><span class="p">?</span><span class="dl">'</span><span class="s1">pixi2d</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">three3d</span><span class="dl">'</span><span class="p">,</span><span class="na">requireEveryAsset</span><span class="p">:</span><span class="kc">true</span><span class="p">}).</span><span class="nx">effectsById</span><span class="p">.</span><span class="kd">get</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="keep-the-host-loop-easy-to-inspect">Keep the host loop easy to inspect</h2>

<p>Once the fixture’s compiled definition is available, the host integration is short:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">ThreeVfxRenderer</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">nixie-fx/three</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">effect</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./effects.mjs</span><span class="dl">'</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">vfx</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ThreeVfxRenderer</span><span class="p">({</span> <span class="nx">scene</span><span class="p">,</span> <span class="nx">camera</span> <span class="p">});</span>
<span class="kd">const</span> <span class="nx">fireflies</span> <span class="o">=</span> <span class="nx">vfx</span><span class="p">.</span><span class="nx">createEffect</span><span class="p">(</span><span class="nx">effect</span><span class="p">(</span><span class="dl">'</span><span class="s1">fireflies</span><span class="dl">'</span><span class="p">),</span> <span class="p">{</span>
  <span class="na">position</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">],</span>
  <span class="na">seed</span><span class="p">:</span> <span class="mi">242</span>
<span class="p">});</span>

<span class="c1">// Called by the existing host frame loop; dt is in seconds.</span>
<span class="kd">function</span> <span class="nx">updateAmbient</span><span class="p">(</span><span class="nx">dt</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">vfx</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">dt</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">));</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">leaveRoom</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">fireflies</span><span class="p">.</span><span class="nx">allowCompletion</span><span class="p">();</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">destroyScene</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">vfx</span><span class="p">.</span><span class="nx">destroy</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">effects.mjs</code> is part of the companion fixture, not a package export. In a deployed game, load the validated exported bundle instead of constructing authoring data in the frame loop. Keep one owner for simulation updates and a clear teardown path when the scene is released.</p>

<p>Clamping the elapsed time here intentionally slows simulation after a long stall. It is a presentation policy for this ambient demo, not a universal simulation strategy. A game requiring strict replay timing should choose its own fixed-step policy and document it.</p>

<h2 id="inspect-the-camera-and-shutdown-separately">Inspect the camera and shutdown separately</h2>

<p>First, keep the camera still and let the effect reach a steady state. Then move the camera sideways while the landmark remains visible. Look for particles becoming hidden behind opaque geometry and for perspective changes between near and far particles.</p>

<p>Next, stop emission without moving the camera. The existing particles should fade out; they should not be replenished indefinitely. Finally, destroy the scene and check that the effect is no longer mounted or updated.</p>

<p>Repeat with the same seed when comparing two recipe revisions. Changing the seed at the same time as opacity or size makes a visual comparison harder to interpret.</p>

<h2 id="know-what-the-example-leaves-out">Know what the example leaves out</h2>

<p>These billboards do not navigate, collide with the walls, illuminate the room, or provide volumetric fog. Their glow is an opacity and color treatment. The fixture does not add a bloom pass, and it does not establish mobile performance. Transparent objects can require additional sorting decisions even when opaque depth occlusion works.</p>

<p>Before using the effect in a level, inspect it against bright and dark backgrounds, at the intended camera distance, and with the game’s real postprocessing. For reduced motion, offer a static ambient treatment or disable the effect while retaining the scene’s visual landmarks.</p>

<p><em>Disclosure: Prepared with AI assistance for a NixieFX-related content task. The example uses procedural assets and makes no claim about production footage or device performance.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[A bounded Three.js firefly recipe with world-space simulation, a cleanup check, and explicit rendering limits.]]></summary></entry><entry><title type="html">Turn a dialogue-skip reproduction into a bounded agent repair</title><link href="https://patilrb.github.io/2026/10/15/dialogue-repeat-repair-handoff.html" rel="alternate" type="text/html" title="Turn a dialogue-skip reproduction into a bounded agent repair" /><published>2026-10-15T08:00:00+00:00</published><updated>2026-10-15T08:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/15/dialogue-repeat-repair-handoff</id><content type="html" xml:base="https://patilrb.github.io/2026/10/15/dialogue-repeat-repair-handoff.html"><![CDATA[<p>Holding a dialogue key can look like a small input bug and still break the player’s understanding of a quest. A report that says “dialogue skips” leaves the next person guessing about focus, repeat events, and the expected interaction. A useful repair task makes those conditions reproducible before anybody asks an agent to change code.</p>

<p>Disclosure: this article was prepared with AI assistance for a Wagglet marketing assignment. The clip is an original, purpose-built browser fixture using scripted keyboard-event flags. It is not footage from a production game or proof of a shipped fix.</p>

<h2 id="start-with-a-reproduction-someone-else-can-run">Start with a reproduction someone else can run</h2>

<p>The fixture contains five dialogue lines. The original handler advances on every Space keydown, including repeat events. The corrected handler advances on a fresh Space keydown and ignores repeats. Both modes begin on line one.</p>

<video controls="" preload="metadata" style="width:100%;max-width:900px" aria-label="Scripted original and corrected dialogue comparison"><source src="data:video/webm;base64,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" type="video/webm" />Your browser cannot play this WebM. The source download lets you reproduce the comparison.</video>

<p>The recording shows the original reaching “Mission complete,” line five, while the corrected version stays on “Find the brass key,” line two. A single fresh event followed by three repeats drives each comparison. That distinction matters: scripted events exercise the handler’s repeat branch; they do not establish how a particular keyboard, mobile wrapper, or accessibility tool produces input.</p>

<p><a download="W-487-repro-source.zip" href="data:application/zip;base64,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">Download the complete example source (ZIP)</a></p>

<p>Unzip the source, run <code class="language-plaintext highlighter-rouge">python3 -m http.server 8080</code> inside its folder, and open <code class="language-plaintext highlighter-rouge">http://localhost:8080</code>. The fixture needs no package installation. Click <strong>Reset original</strong>, then <strong>Fresh Space</strong> once and <strong>Repeat Space</strong> three times. Reset to the corrected version and repeat that sequence. Its canvas also accepts Space when focused, so a reviewer can separately try a physical held key.</p>

<p>Record the actual environment with the report. This attempt used Chrome 155.0.0.0 on a Mac; the page prints the browser’s user-agent string. The canvas is 900 × 360 pixels. This is a local browser check, with no production build, device-performance measurement, or mobile test implied.</p>

<h2 id="give-the-agent-a-bounded-repair-brief">Give the agent a bounded repair brief</h2>

<p>The important artifact is the input contract. Here is the fixture’s whole transition function:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">export</span> <span class="kd">function</span> <span class="nx">advanceDialogue</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">event</span><span class="p">,</span> <span class="nx">fixed</span><span class="p">,</span> <span class="nx">total</span> <span class="o">=</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">code</span> <span class="o">!==</span> <span class="dl">'</span><span class="s1">Space</span><span class="dl">'</span><span class="p">)</span> <span class="k">return</span> <span class="nx">index</span><span class="p">;</span>
  <span class="k">if</span> <span class="p">(</span><span class="nx">fixed</span> <span class="o">&amp;&amp;</span> <span class="nx">event</span><span class="p">.</span><span class="nx">repeat</span><span class="p">)</span> <span class="k">return</span> <span class="nx">index</span><span class="p">;</span>
  <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">total</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>For a real project, QA should attach the original clip and exact build identifier, name the dialogue route and save state, and explain whether the first press reveals text or advances a line. That last decision belongs to the game’s interaction design. It should not emerge accidentally from an agent’s first patch.</p>

<p>A paste-ready brief for this fixture is:</p>

<blockquote>
  <p>Reproduce the original Space-repeat behavior. Change only the dialogue advancement path so an initial keydown advances one line and repeated keydowns do not advance it again. Keep a second independent press working. Preserve the final-line boundary and unrelated input behavior. Add a focused regression check for these cases. Report changed files and actual commands run. Stop if the real project routes input through a different abstraction or the agreed interaction requires a two-stage reveal.</p>
</blockquote>

<p>The narrow scope avoids turning a repeat-event fix into a new input framework. An agent can inspect the existing handler, propose the smallest patch, run the checks available in that checkout, and explain deviations. It cannot infer the studio’s desired dialogue rhythm from a stack trace.</p>

<h2 id="separate-preparation-execution-and-acceptance">Separate preparation, execution, and acceptance</h2>

<p>QA prepares the reproduction, expected behavior, environment, and affected state. The task author adds repository location, relevant files, setup commands, and boundaries. An eligible teammate executes through their own authorized tools and agent session, observes the example, and returns evidence. The feature engineer reviews the input change; QA or the designated feature owner judges the player-facing acceptance criteria.</p>

<p>This is a concrete way to organize <strong>human AI collaboration in game development</strong>. The <a href="https://wagglet.com/blog/ai-native-mobile-game-studio-stack">Wagglet article on the AI-native mobile game studio stack</a> describes how technical instructions and the human runner’s responsibilities travel together. For this example, the useful connection is preserving the reproduction and acceptance boundary across that handoff. The ticket’s delivery still needs an independent acceptance decision.</p>

<h2 id="require-regression-proof-that-matches-the-claim">Require regression proof that matches the claim</h2>

<p>Running <code class="language-plaintext highlighter-rouge">node check.mjs</code> in the supplied source completed these checks locally:</p>

<table>
  <thead>
    <tr>
      <th>Input sequence</th>
      <th>Original fixture</th>
      <th>Corrected fixture</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>One fresh Space plus three repeats</td>
      <td>Line five</td>
      <td>Line two</td>
    </tr>
    <tr>
      <td>Another fresh Space after that</td>
      <td>Not the acceptance case</td>
      <td>Line three</td>
    </tr>
    <tr>
      <td>Escape instead of Space</td>
      <td>No advancement</td>
      <td>No advancement</td>
    </tr>
    <tr>
      <td>Space at the final line</td>
      <td>Bounded at line five</td>
      <td>Bounded at line five</td>
    </tr>
  </tbody>
</table>

<p>The assertions cover the transition function. The browser comparison covers its connection to the fixture’s visible dialogue. Neither establishes integration with a game’s input manager. A real repair should repeat the named scenario in the affected build and test focus loss, text reveal, controller navigation, and touch input where those paths exist.</p>

<h2 id="a-short-acceptance-checklist">A short acceptance checklist</h2>

<ul>
  <li>Confirm the clip and report identify the same build and input path.</li>
  <li>Try one physical held key and two separate presses with the dialogue focused.</li>
  <li>Confirm unrelated input and the final line still behave as designed.</li>
  <li>Compare the changed files with the permitted fix scope.</li>
  <li>Attach fresh evidence and record any untested device or input path.</li>
</ul>

<p>Accept the repair when the evidence satisfies that contract. Keep an untested mobile wrapper or ambiguous reveal rule visible as remaining work. A small bug becomes transferable when another teammate can reproduce it, run a bounded correction, and give the reviewer enough evidence to make a specific decision.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[A reproducible keyboard-repeat fixture, a narrow repair brief, and acceptance evidence for a game team.]]></summary></entry><entry><title type="html">Before repairing CI, reproduce its working directory</title><link href="https://patilrb.github.io/2026/10/15/reproduce-the-ci-working-directory.html" rel="alternate" type="text/html" title="Before repairing CI, reproduce its working directory" /><published>2026-10-15T08:00:00+00:00</published><updated>2026-10-15T08:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/15/reproduce-the-ci-working-directory</id><content type="html" xml:base="https://patilrb.github.io/2026/10/15/reproduce-the-ci-working-directory.html"><![CDATA[<p>A test can pass from a project’s root and fail when another command launches it from a different directory. The code did not change. Its assumption about where to find a file did.</p>

<p>Before asking a coding agent to repair that failure, capture the invocation that makes the difference. A precise working-directory reproduction gives the runner a small problem to execute and the reviewer a clear boundary to accept.</p>

<p>Disclosure: this article was prepared with AI assistance for a Wagglet marketing assignment. The example and results come from an original local fixture. They do not describe a production incident or a hosted CI run.</p>

<h2 id="make-the-hidden-dependency-visible">Make the hidden dependency visible</h2>

<p>Suppose a module reads a receipt stored beside its source file:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">readFileSync</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">node:fs</span><span class="dl">'</span><span class="p">;</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">readReceipt</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">readFileSync</span><span class="p">(</span><span class="dl">'</span><span class="s1">ci-receipt.json</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">utf8</span><span class="dl">'</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The receipt contains <code class="language-plaintext highlighter-rouge">{"suite":"artifact-check","passed":3}</code>. From the fixture directory, this reader returns the expected object. From an empty temporary directory, it throws an <code class="language-plaintext highlighter-rouge">ENOENT</code> error because the relative filename is resolved against the process’s working directory.</p>

<p>The number three is test data inside the receipt, not a claim that a real CI suite passed three checks. Keeping that distinction visible prevents a demonstration artifact from turning into invented delivery evidence.</p>

<p><a download="W-411-working-directory-source.zip" href="data:application/zip;base64,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">Download the complete working-directory example (ZIP)</a></p>

<p>Unzip the source into an empty folder. It contains the broken reader, corrected reader, receipt, complete test file, and a short README. With Node.js 22 available, run the original:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>node <span class="nt">--test</span> receipt-path.test.mjs
</code></pre></div></div>

<p>The two tests launch a child Node process with the same absolute module URL. One uses the fixture directory as its working directory; the other uses a newly created empty temporary directory. The test removes its own temporary directory afterward. No package installation or CI account is required.</p>

<h2 id="preserve-the-useful-failure-log">Preserve the useful failure log</h2>

<p>The local run used Node.js 22.23.2 on a Mac. The original returned exit code 1 with this outcome:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ok 1 - receipt loads from its own directory
not ok 2 - receipt loads from a different working directory
# tests 2
# pass 1
# fail 1
</code></pre></div></div>

<p>The failed child process reported an <code class="language-plaintext highlighter-rouge">ENOENT</code> error opening <code class="language-plaintext highlighter-rouge">ci-receipt.json</code>. The log identifies a file lookup problem. It does not justify reinstalling dependencies, relaxing assertions, or editing the CI workflow before checking the reader’s path contract.</p>

<p>For an actual job, attach the exact command and working directory alongside the relevant error excerpt. Include the runtime version and the location where the receipt is supposed to exist. Remove credentials and unrelated job output before handing over the evidence.</p>

<h2 id="decide-which-location-is-the-contract">Decide which location is the contract</h2>

<p>The fixture’s contract says the receipt belongs beside the reader module. That decision matters. Some applications intentionally read a file relative to the caller’s directory; others receive its path as an argument. A coding agent should not choose between those designs simply because one change makes the current test green.</p>

<p>The human preparer confirms the intended location and records these limits:</p>

<ul>
  <li>Keep the receipt’s contents and both tests unchanged.</li>
  <li>Change only the reader’s path resolution.</li>
  <li>Preserve errors for a genuinely missing or malformed receipt.</li>
  <li>Avoid workflow, dependency, deployment, or access changes.</li>
</ul>

<p>The agent then executes through the tools and workspace already authorized for it. The preparer supplies context; a named maintainer judges the resulting patch and acceptance evidence.</p>

<h2 id="give-the-agent-an-executable-repair-brief">Give the agent an executable repair brief</h2>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Observed: the original reader passes in its own directory and
fails from an empty temporary directory with ENOENT.

Required: read the receipt beside the module, independently
of the calling process's working directory.

Allowed change: reader implementation only. Preserve the
receipt and both assertions. No workflow or dependency edits.

Deliver: exact commands, exit codes, two-test summaries,
changed files, and the checks that remain outside this fixture.

Stop: if the real project expects a caller-selected path or
generates the receipt elsewhere, return that contract question.
</code></pre></div></div>

<p>This is the useful unit of <strong>coding agent task management</strong>: a reproducible observation, an agreed contract, and evidence another person can inspect. The <a href="https://wagglet.com/for/engineering-teams">Wagglet engineering teams guide</a> is relevant when a team wants those instructions and the human review role to travel together. The local example still needs its own command, constraints, and reviewer.</p>

<h2 id="verify-the-smallest-correction">Verify the smallest correction</h2>

<p>For the stated contract, the corrected reader resolves the receipt relative to the module:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">readFileSync</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">node:fs</span><span class="dl">'</span><span class="p">;</span>
<span class="k">export</span> <span class="kd">function</span> <span class="nx">readReceipt</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">readFileSync</span><span class="p">(</span>
    <span class="k">new</span> <span class="nx">URL</span><span class="p">(</span><span class="dl">'</span><span class="s1">./ci-receipt.json</span><span class="dl">'</span><span class="p">,</span> <span class="k">import</span><span class="p">.</span><span class="nx">meta</span><span class="p">.</span><span class="nx">url</span><span class="p">),</span> <span class="dl">'</span><span class="s1">utf8</span><span class="dl">'</span>
  <span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Run the same tests against the candidate:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">CANDIDATE</span><span class="o">=</span>./reader-fixed.mjs node <span class="nt">--test</span> receipt-path.test.mjs
</code></pre></div></div>

<p>This local candidate returned exit code 0: two tests passed and zero failed. Both child processes printed the same receipt fields. The correction does not copy files into the working directory or catch the error and substitute a successful result.</p>

<h2 id="close-the-handoff-with-an-acceptance-decision">Close the handoff with an acceptance decision</h2>

<p>The maintainer should inspect the path change, rerun both candidate tests, and confirm the baseline still demonstrates the failure. The human runner records that evidence with the changed filename and the agreed contract.</p>

<p>A real CI repair has another step: confirm the job actually imports this reader and rerun that job through an authorized account. These local checks establish path independence for this fixture. They do not test artifact upload, a generated receipt’s location, packaging, another operating system, or a deployment.</p>

<p>Accept the bounded change when its evidence matches the contract. If the real job writes the receipt somewhere else, return the task with that specific observation instead of widening the patch until an unrelated command turns green.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[A two-directory Node fixture turns a file-lookup failure into a bounded coding-agent repair and a clear acceptance check.]]></summary></entry><entry><title type="html">Two laser hits, two independent bursts in Three.js</title><link href="https://patilrb.github.io/2026/10/15/two-laser-hits-independent-bursts.html" rel="alternate" type="text/html" title="Two laser hits, two independent bursts in Three.js" /><published>2026-10-15T08:00:00+00:00</published><updated>2026-10-15T08:00:00+00:00</updated><id>https://patilrb.github.io/2026/10/15/two-laser-hits-independent-bursts</id><content type="html" xml:base="https://patilrb.github.io/2026/10/15/two-laser-hits-independent-bursts.html"><![CDATA[<p>Two laser hits arrive a tenth of a second apart. The first burst is still alive when the second hits a differently angled wall. This is where a single reusable effect object becomes awkward: restarting it removes the first burst, and changing a shared transform couples two impacts that should be independent.</p>

<p>This walkthrough uses one short-lived instance per impact, with a small concurrency cap. It focuses on overlapping hits and lifecycle ownership. Disclosure: it was prepared with AI assistance for a NixieFX marketing assignment. The screenshot and source come from the local example described below, not a production game or performance benchmark.</p>

<h2 id="run-the-two-wall-example">Run the two-wall example</h2>

<p><img src="data:image/png;base64,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" alt="Local Three.js fixture: two wall impacts remain separate with two instances, 24 live and visible shards, and no unsupported features." style="width:100%;height:auto" /></p>

<p><a download="N-456-overlap-source.zip" href="data:application/zip;base64,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">Download the complete example source (ZIP)</a></p>

<p>Unzip the source into an empty directory. With Node.js 22 installed, run:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install
</span>npm <span class="nb">test
</span>npm run build
python3 <span class="nt">-m</span> http.server 8080
</code></pre></div></div>

<p>Open <code class="language-plaintext highlighter-rouge">http://localhost:8080</code>. <strong>Two quick hits</strong> creates the first burst, advances ten 0.01-second steps, creates the second, then advances ten more steps. The paused view therefore shows the first at 0.20 seconds and the second at 0.10 seconds. <strong>Play</strong> resumes time; <strong>Finish</strong> advances another 1.50 seconds; <strong>Dispose</strong> releases this example’s resources. Reload to run again after disposal.</p>

<p>The package pins <code class="language-plaintext highlighter-rouge">nixie-fx</code> 0.1.20, Three.js 0.185.1, and esbuild 0.28.2. The supplied check ran with Node.js 22.23.2, and the visual example ran in Chrome 155 on a Mac. Install access to npm and a browser with WebGL are prerequisites. No external texture files or account are needed for the fixture.</p>

<h2 id="mistake-one-treating-every-shot-as-the-same-burst">Mistake one: treating every shot as the same burst</h2>

<p>Keep a set of live instances. Each confirmed wall hit creates a new instance with its own position, rotation, and seed. Update the renderer once per frame in seconds, then remove instances that have completed. Do not also update each renderer-owned instance separately.</p>

<p>The source’s <code class="language-plaintext highlighter-rouge">Impacts</code> class caps concurrent instances at four. A fifth hit is ignored until one finishes. That explicit policy prevents a rapid-fire input from creating an unbounded collection; a game could choose another measured budget. This cap is a gameplay integration choice, not an automatic runtime limit.</p>

<p>The tiny effect emits twelve procedural triangle shards once, with a 0.55-second lifetime and a 2.2-unit-per-second initial speed. Continuous emission is zero. The cone points along local positive Y, with a 65-degree angle and a small initial radius. Mesh size is 0.095 units with its size module enabled. Those values are deliberately easy to inspect, not a universal recipe for sparks.</p>

<p>If you are choosing a <strong>three js particle editor</strong>, the <a href="https://nixiefx.com/threejs-runtime/">NixieFX Three.js runtime guide</a> explains the exported bundle, backend validation, and instance lifecycle used here. The downloadable fixture constructs and compiles its small authoring definition in code, then verifies it with <code class="language-plaintext highlighter-rouge">loadVfxExportBundle</code> before spawning. An editor-authored project should export the runtime bundle and load that bundle through the same validation boundary.</p>

<h2 id="mistake-two-using-a-local-normal-as-a-world-direction">Mistake two: using a local normal as a world direction</h2>

<p>A raycast face normal belongs to the mesh’s local coordinates. Convert it with the normal matrix after updating the object’s world matrix. This is especially important when the wall has nonuniform scale. Orient the outward burst away from the incoming ray:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">normal</span> <span class="o">=</span> <span class="nx">hit</span><span class="p">.</span><span class="nx">face</span><span class="p">.</span><span class="nx">normal</span><span class="p">.</span><span class="nx">clone</span><span class="p">().</span><span class="nx">applyNormalMatrix</span><span class="p">(</span>
  <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">Matrix3</span><span class="p">().</span><span class="nx">getNormalMatrix</span><span class="p">(</span><span class="nx">hit</span><span class="p">.</span><span class="nx">object</span><span class="p">.</span><span class="nx">matrixWorld</span><span class="p">)</span>
<span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">normal</span><span class="p">.</span><span class="nx">dot</span><span class="p">(</span><span class="nx">incomingDirection</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="nx">normal</span><span class="p">.</span><span class="nx">negate</span><span class="p">();</span>
<span class="nx">normal</span><span class="p">.</span><span class="nx">normalize</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">q</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">Quaternion</span><span class="p">().</span><span class="nx">setFromUnitVectors</span><span class="p">(</span>
  <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">Vector3</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="nx">normal</span>
<span class="p">);</span>
<span class="kd">const</span> <span class="nx">euler</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">Euler</span><span class="p">().</span><span class="nx">setFromQuaternion</span><span class="p">(</span><span class="nx">q</span><span class="p">,</span> <span class="dl">'</span><span class="s1">XYZ</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">position</span> <span class="o">=</span> <span class="nx">hit</span><span class="p">.</span><span class="nx">point</span><span class="p">.</span><span class="nx">clone</span><span class="p">().</span><span class="nx">addScaledVector</span><span class="p">(</span><span class="nx">normal</span><span class="p">,</span> <span class="mf">0.025</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">burst</span> <span class="o">=</span> <span class="nx">vfx</span><span class="p">.</span><span class="nx">createEffect</span><span class="p">(</span><span class="nx">effect</span><span class="p">,</span> <span class="p">{</span>
  <span class="na">position</span><span class="p">:</span> <span class="nx">position</span><span class="p">.</span><span class="nx">toArray</span><span class="p">(),</span>
  <span class="na">rotation</span><span class="p">:</span> <span class="p">[</span><span class="nx">euler</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">euler</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">euler</span><span class="p">.</span><span class="nx">z</span><span class="p">],</span>
  <span class="na">seed</span><span class="p">:</span> <span class="nx">nextSeed</span><span class="o">++</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Instance rotations use radians. The small position offset moves the initial shard centers in front of the wall. This mesh-particle example rotates each complete instance once and leaves that transform fixed for its lifetime. It does not use camera-facing billboards or move a live burst between impacts.</p>

<p>The beam lines and green arrows are ordinary Three.js debugging helpers. The raycast chooses a surface hit; there is no collision simulation, wall decal, damage system, or dynamic light in this example.</p>

<h2 id="mistake-three-confusing-appearance-with-support">Mistake three: confusing appearance with support</h2>

<p>The effect uses unlit additive rendering with depth testing enabled and depth writing disabled. Mesh particles follow the per-particle rendering path here, so twelve shards are not one instanced draw call. Do not extrapolate the small fixture into a mobile frame-rate claim. Measure your scene and target devices before increasing particle counts.</p>

<p>Current adapter limitations also matter: the constructor’s <code class="language-plaintext highlighter-rouge">clockSpace</code> option is reserved and unused, and texture offset/repeat are not applied on the instanced billboard path. Neither is used here. Preview bloom is disabled; additive color does not create a postprocessing bloom pass. Inspect the export support report and runtime <code class="language-plaintext highlighter-rouge">unsupportedFeatures</code> rather than assuming every authored setting carries across unchanged.</p>

<h2 id="mistake-four-leaving-completed-effects-attached">Mistake four: leaving completed effects attached</h2>

<p>The local assertions observed two instances and 24 active particles during overlap, with the first instance’s origin unchanged. Both transformed-wall bursts had particle centers on the outward side. The fifth concurrent hit was rejected at the configured cap. After another 1.50 seconds, active particles and instance count were both zero. These are correctness checks for this fixture, not performance results.</p>

<p>Scene disposal stops the animation loop, removes the example’s handlers, clears its live set, destroys the VFX renderer, and disposes its own wall, beam, helper, and renderer resources. Shared provider-owned assets would need separate ownership rules; this fixture creates none.</p>

<p>Before adapting it, check both bursts remain visible at their original hits, test the cap under rapid input, verify completion reaches zero, and unload the scene while particles are alive. That sequence catches the integration mistakes a single attractive impact screenshot cannot show.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Avoid shared-transform mistakes with per-impact mesh bursts, world normals, concurrency limits, and complete teardown.]]></summary></entry></feed>