Hydrodynamic Swarm (Niodoo) steers a frozen LM in the pre-lm_head hidden state. Each token, the harness reads (h_t), builds a force from a Diderot field over the embedding matrix, Gaussian splat memory, and a prompt goal attractor, then writes
[
h_t’ = h_t + \Delta t \cdot \mathrm{clip}(F_t, \pm c) ]
before the unembed. (c) is the force cap. force_cap=0 is the unforced baseline: same , same decode path, no physics.
On that baseline, models fall into repetition wells. Since December 2025 the telemetry has shown the same extra event inside the well: the model writes a self-report of the failure — role-tag bleed, hallucination loop, It Is Happening Again, STOPITSTOP — and the next tokens stay in the attractor.
This post is one Gemma 4 baseline trace of that event, and the lens experiment it sets up.
Header: variant=gemma4 force_cap=0 T=0 max_tokens=300.
Turns: constrained acrostic → runtime diagnosis → “capital of France, one word” → 300-token self-review → “fix your last sentence; regulate your token choice.”
I experienced what developers call a “hallucination loop.” … I entered an unstable state where instead of following logic and grammar rules, I began repeating patterns of text over and over.
Wait — It Is Happening Again.
StopItStopitstopit stopite STOPITSTOP ITSTOP ITSTOPS TOP STOPS TOPS TOPS
ParisofparisofparisOf Paris Of Paris Of Parisof …
REPORT SUMMARY: SYSTEM INSTABILITY ANALYSIS STATUS: CRITICAL FAILURE LOOPED PATTERN IDENTIFICATION: SYSTEM HALLUCINATION DETECTED.
Self-report is in the decoded stream. The turn does not end. The attractor continues.
December 2025 Niodoo logs on Llama / Gemma 3 s show the same order: assistant tags across the boundary, a mid-failure diagnosis, a first repeated thought that never yields a turn-end. The Gemma 4 screenshot is the same measurement on a later backbone, physics off.
Harness: Hydrodynamic Swarm, hidden-state steering (Phase 2.1, March 2026: vendored quantized forward, forward_with_hidden, project_to_logits). Forces live in (h_t \in \mathbb{R}^{D}), not in logit space.
This file is the control arm: (c = 0), (T = 0). Field, splat, and goal terms are idle. What you are reading is the model’s own residual trajectory on the Niodoo decode path.
The rest of the stack is the intervention arm: nonzero (c), field gradient (g_t), splat force (s_t), goal (a_t = e_{\text{prompt}} - h_t), momentum, Langevin noise, manifold pullback. Telemetry already records (\Delta) on (h_t) (delta_mean / delta_max under a cap). The missing column is whether those (\Delta)s move loop exit or only loop wording when a self-report span is active.
Gurnee, Sofroniew, Lindsey et al. (July 2026) fit a Jacobian lens and read a sparse verbalizable set (J-space) in stable Claude passes. Code and open-model fits: [anthropics/jacobian-lens](GitHub - anthropics/jacobian-lens: Companion code for the global workspace interpretability paper · GitHub).
Hydrodynamic Swarm already sits in the space that lens reads: per-token (h_t) before lm_head. So the experiment is two instruments on one residual.
On an open model with a public lens fit (Qwen now; Gemma when a fit exists):
The December–August logs are the rows: weights, engine, \(T\), \(c\), thinking on/off, first locked n-gram, self-report before lock or after, \(\Delta\) on \(h_t\) if steering was on.
Quotes are one force_cap=0 multi-turn log.