33 KiB
trade_lbm_v1 — Architecture Document
Status: DRAFT v4, pre-implementation.
Purpose: Define the architecture of a trade-native Lattice-Boltzmann simulator before any kernel code is written.
Author of design intent: Claude Desktop (relayed via user 2026-06-08).
Drafted by: Claude-on-Beast.
Decision gate: The wave-amplitude probe, the reset-equilibrium probe, and the Fractonaut 4-question follow-up have completed. All inform but do not gate this design.
v3 → v4 changes: §4.3 now has concrete ω-per-spread-tier ranges per Claude Desktop decision 2 (tight 1.5–1.97, normal 0.8–1.2, wide 0.2–0.4) backed by the Fractonaut Q4 finding that ω must drop by an order of magnitude for 10-min memory; §5 telemetry now anchors regime_product with known physics-lattice attractor values (9.2 / 164) as calibration anchors (not to be carried across); §10.1 adds the bifurcation sweep and 80%-of-bifurcation operating-point rule per Claude Desktop decision 3.
1. Premise
The existing lattice (khra_gixx_1024_v5) is a fluid dynamics simulator that happens to find patterns when fed market data. Its grid axes are dimensionless spatial coordinates; market values are injected at arbitrary (x, y) positions and the physics is hoped to surface useful structure.
A trade-native lattice inverts this. The geometry itself carries market meaning. The fluid dynamics is then operating on a substrate where every cell already corresponds to a real market quantity, so any emergent pattern is interpretable in market terms by construction.
This is not a rebrand. The forcing terms, observables, and command interface must all change.
2. Grid semantics
| Axis | Meaning | Units | Size (v1) |
|---|---|---|---|
| X | Price level (tick band) | ticks relative to mid | 512 columns |
| Y | Time | LBM timesteps; one row = one ingested trade-window snapshot | 512 rows |
| Q | D2Q9 discrete velocities | unchanged | 9 |
Price axis (X)
- Centred on rolling mid:
column = round((price - mid) / tick_size) + NX/2 - Trades outside the visible band are clamped to the edge columns (edge mass = unresolved off-grid flow; logged separately for diagnostics).
- The mid is recentred periodically (every N trades or every M wallclock seconds). Recentring shifts the entire density field by the integer column delta. Sub-tick drift is folded into the recentring residual.
Time axis (Y)
- New trade frames arrive at the bottom row (
y = 0). - The lattice's natural streaming step shifts mass upward through Y, producing a literal "time-history" stripe.
- The top row (
y = NY-1) is an absorbing boundary — history old enough to fall off the grid is discarded. - This means the Y axis is not a free spatial dimension. The streaming kernel is constrained: the e_y component represents the passage of simulation time, not arbitrary advection.
- Time advancement model (decided): fixed-rate. One snapshot interval = one Y-row regardless of underlying activity. A quiet 3am minute and an active crash minute both occupy one row. This makes vorticity and divergence well-defined and keeps the streaming step physically simple. The distortion — that row density is not proportional to wall-clock time during activity bursts — is acknowledged and surfaced to the Fractonaut prompt (see §7). For v1 the snapshot interval is the same 10-cycle cadence as the physics lattice (≈1s of wallclock per row).
Recentring (decided)
- Trigger: whenever rolling mid drifts more than
RECENTRE_THRESHOLD = NX / 16 = 32 columnsfrom grid centre. Each trigger fires at most once per snapshot interval. - Mechanism: integer-column shift of the entire
(ρ, u, f_i)field. Sub-tick residual is folded into the next mid update. - Telemetry exposure (critical): every snapshot carries
recenter_cumulative_drift(integer ticks, signed) andrecenter_count_since_start. Arecenter_eventflag fires for one snapshot whenever a shift occurred, with the magnitude. - Fractonaut implication: support/resistance levels are reported in absolute price, not column index. The kernel translates column → price using
mid_at_emit - (col - NX/2) * tick_size. The LLM never sees raw column numbers for structural reports. Recentring is therefore invisible to the structural interpretation but visible to the diagnostic interpretation. - This resolves the "support at column 195 yesterday was column 200 today" problem by hiding the column representation from the structural layer entirely.
Why this works
A trader looking at the field sees a price-vs-time chart where each cell's value is the local order-flow density. Standard physics observables (vorticity, divergence, pressure) then translate directly into market-structural concepts (consolidation, breakout, support/resistance) without any post-hoc mapping.
3. Distribution function, macroscopic fields, and equilibrium
Same D2Q9 layout as the existing kernel. The macroscopic fields gain market interpretation:
| LBM quantity | Market meaning |
|---|---|
| ρ(x, y) | net signed order flow density at (price, time) cell |
| u_x(x, y) | rate of price drift — flow component along price axis |
| u_y(x, y) | rate of temporal propagation — should be ~constant if time is a clean axis |
| p(x, y) | local liquidity pressure (ρ·c_s²) |
| stress_xx | longitudinal price-axis tension — directional buy/sell pressure |
| stress_xy | shear between price and time — momentum changes across time |
| stress_yy | temporal autocorrelation strength of flow |
Sign convention: positive ρ = net buy-side aggression at that price-time cell; negative ρ = net sell-side aggression.
3.5 Equilibrium choice (decided — non-standard)
Claude Desktop's review correctly flagged this as the most consequential of the six open questions. Standard Maxwell-Boltzmann equilibrium assumes the fluid relaxes toward uniform zero-mean flow at uniform density. In a market that is wrong: the market "equilibrium" is the current order book — a non-uniform density profile with persistent peaks at heavily-quoted price levels and persistent troughs in thin zones.
Using standard MB would mean the lattice systematically erases the very structure (support, resistance, liquidity peaks) we are trying to surface. The relaxation step would push every column toward zero density, dissolving any persistent feature in O(1/ω) timesteps. That is the opposite of what is needed.
Decision: depth-weighted equilibrium.
Each column carries a slowly-updating bid_depth[x] and ask_depth[x] from the order book (refreshed on book-update events, decays exponentially between updates with τ ≈ 30 s). The equilibrium density and momentum at column x are:
ρ_eq[x] = (bid_depth[x] + ask_depth[x]) * DEPTH_WEIGHTu_eq_x[x] = (bid_depth[x] - ask_depth[x]) / (bid_depth[x] + ask_depth[x] + ε) * BIAS_WEIGHTu_eq_y[x] = constant(the upward time-streaming velocity; same for all columns)
The Maxwell-Boltzmann form is preserved — only the target (ρ_eq, u_eq) is non-uniform and market-derived. The BGK collision then pulls each column toward its own book-derived state, not toward zero. Persistent book imbalances naturally create persistent density features in the lattice. Support and resistance are built into the relaxation, not hoped to emerge from injection alone.
DEPTH_WEIGHT and BIAS_WEIGHT are calibration constants set during the §10 validation phase, not chosen up front.
Cost: the equilibrium recompute is O(NX) per cycle, negligible against the O(NX·NY·Q) collision+streaming workload.
Fallback: if bid_depth / ask_depth are unavailable for a given instrument (some venues don't expose full book), the kernel falls back to standard MB with ρ_eq = global_mean(ρ). This degradation is logged loudly in telemetry; the lattice still runs but is operating in a known-impaired mode.
3.5.1 Single regime degree of freedom (added v3)
The wave-modulator probe on the physics lattice (§11) revealed that, at any fixed forcing configuration, asymmetry × coherence is conserved to <1%:
| State on physics lattice | asym | coh | product |
|---|---|---|---|
| True equilibrium (post reset_equilibrium) | 12.3 | 0.74 | 9.1 |
| Metastable basin we'd been calling "baseline" | ~116 | ~0.62 | ~72 |
| Khra=0.05 elevated | 327.7 | 0.5015 | 164.3 |
| Combined Khra+Gixx+dipole | 320.7 | 0.5122 | 164.3 |
| Gixx=0.024 elevated | 300.7 | 0.5423 | 163.1 |
Different forcings populate the same product. Three different basins produce three different product values. The product is the basin identifier; asymmetry and coherence individually slide along a constant-product hyperbola within a basin. This is a strong constraint: at the level of global scalars, the lattice has one regime degree of freedom, not two.
Architectural consequence for trade_lbm_v1: the primary regime observable surfaced to Fractonaut is regime_product = global_asymmetry * global_coherence, not the two values separately. Both individual values remain available as secondary diagnostics, but the SYSTEM prompt frames them as "two views of the same underlying quantity, redundant for regime classification." Whether the trade lattice exhibits the same hyperbolic invariant is an open empirical question — it likely does because the constraint emerges from D2Q9 conservation laws, not from forcing details — but the architecture treats the product as the canonical observable from day one.
4. Forcing terms — replacing Khra and Gixx
The forcing structure of the existing kernel is preserved (two-scale sinusoidal driving plus inject_density). The meaning of the two scales is anchored to market quantities.
4.1 Khra equivalent → oi_drive (data source decided)
- Preferred source: exchange-reported open interest, sampled at the same cadence as snapshots, normalised against a rolling 24-hour ΔOI envelope. For perp instruments (e.g. HL BTC perp) this is available.
- Fallback source (v1 default, because clean historical OI was not part of the April pull): reconstructed ΔOI proxy from signed cumulative aggressive flow over a 5-minute trailing window. This is well-known to be a degraded proxy (it conflates flips with new positioning) but it is available now against the April HL dataset already on disk.
- Explicit v1 commitment: the kernel exposes
set_oi_drive value=Aand consumes whichever source the runner provides. The runner — not the kernel — chooses between the real and proxy source. If neither is available for a given instrument,set_oi_drive value=0.0is the documented safe default; in that mode the slow-scale forcing is off and the lattice runs on flow_drive plus inject_trade alone. This is a degraded but valid mode of operation, and the lattice telemetry includes anoi_drive_activeboolean so Fractonaut knows. - Wavelength λ ≈ 128 columns (≈ 25% of price-axis span).
- Physical role: maintains a slow, large-scale standing wave representing committed capital pressure across the visible price band.
4.2 Gixx equivalent → flow_drive
- Source: trade count rate in the most recent window.
- Wavelength λ ≈ 8 columns (≈ 1.5% of span).
- Amplitude:
set_flow_drive value=Anormalised against rolling trade-count envelope. - Physical role: high-frequency fine-scale jitter representing tape activity.
These two are the only "baked-in" forcings. Both are measurable and time-varying; they are not arbitrary constants. The lattice receives a new (oi_drive, flow_drive) amplitude pair every snapshot interval.
4.3 BGK relaxation rate ω → set_spread
- The current kernel exposes one global ω. The trade lattice should expose ω per column:
omega_col[x]. - Source: current bid-ask spread at price level X.
- Tight spread → ω close to 2 (fast relaxation, liquid columns equilibrate quickly).
- Wide spread → ω close to 0.5 (slow relaxation, illiquid columns retain memory).
- This is physically exact: BGK ω literally controls relaxation speed to equilibrium, and spread is literally the cost of forcing the market back to equilibrium.
Spread → omega calibration (v3, per Fractonaut Q4 follow-up). The physics lattice confirmed that field-memory timescale scales as 1/ω and that ω must be reduced by roughly an order of magnitude to extend memory from seconds to ~10 minutes. The trade lattice maps spread tiers to ω as follows:
| Spread tier | Example (BTC perp ticks) | ω range | Approx column memory |
|---|---|---|---|
| Tight (deep, liquid) | ≤ 1 tick | 1.5 – 1.97 | seconds |
| Normal | 2 – 4 ticks | 0.8 – 1.2 | 1 – 2 minutes |
| Wide (thin, illiquid) | ≥ 5 ticks | 0.2 – 0.4 | ≈ 10 minutes |
Mapping is monotonic and continuous within each tier (no step discontinuities at tier boundaries). The exact function is calibrated during §10.1 against a target column memory that matches observed market-impact decay for the instrument (≈5–15 minutes for HL BTC perps per published microstructure work).
4.4 Injection — inject_trade
Replaces inject_density. Trade events are placed at their natural column:
{ "cmd": "inject_trade",
"price": 67215.5,
"side": "buy" | "sell",
"size": 0.42, // base-asset units
"aggressor": true, // taker vs maker
"t_window": 0 } // 0 = current frame; allows backfilling
Kernel translates:
column = round((price - mid) / tick) + NX/2row = NY - 1 - t_window(bottom row = newest)Δρ = +sizefor buy,-sizefor sell- Optional Gaussian spread along X with σ = 1 tick to avoid single-cell delta spikes.
If a trade falls outside the grid window, it is not injected but is counted toward an off_grid_mass telemetry field. Persistent off-grid mass = grid window too narrow; the recentring step will widen or shift.
5. Telemetry — what the observer reads
The existing global scalars (asymmetry, coherence, divergence) are global means. On a trade lattice we need per-column and localised quantities because the spatial axis means something.
Every snapshot (10 cycles, same cadence as current kernel):
Per-column (length-NX arrays)
density_profile[x]— column sum of ρvorticity_profile[x]— column mean of curl(u)divergence_profile[x]— column mean of ∇·ustress_xx_profile[x]— longitudinal tension per price bandomega_profile[x]— current per-column relaxation (echoing the spread)
Global scalars (retained for sanity, but secondary)
regime_product = mean_asymmetry * mean_coherence— PRIMARY regime classifier per §3.5.1. Different attractor basins produce different product values; transitions between basins are the regime signal.- Known physics-lattice attractor values (calibration anchor only):
~9.2(true normal attractor, asym ≈12.4 / coh ≈0.74),~164(elevated attractor, asym ≈320 / coh ≈0.51). These are physics-lattice numbers measured onkhra_gixx_1024_v52026-06-08. The trade lattice will have its own attractor product values determined in the §10.1 calibration; do NOT carry the 9.2/164 numbers across. total_mass,net_signed_flow,mean_abs_velocity,mean_vorticitymean_asymmetry,mean_coherence(kept available as diagnostics; SYSTEM prompt frames them as redundant for regime use)off_grid_massrecenter_count,recenter_drift
Event detectors (cheap to compute, useful to Fractonaut)
breakout_signal: max positive divergence across X above threshold + sign of net flow thereconsolidation_band: contiguous range of X with high vorticity and low divergencesupport_levels: list of (x, density_peak) above threshold for density that has persisted across ≥ K rowsresistance_levels: same but for negative-density bands
The point: Fractonaut should not have to infer market structure from raw global scalars. The kernel computes the structural primitives and exposes them as named fields. The LLM then reads things like "breakout_signal at column 287 (price 68,140), divergence z = 3.4, consolidation_band 240–268 dissipating, support at column 195 (price 66,800) intact across 47 rows" and reasons about that.
6. Command interface
ZMQ topology preserved (PUB telemetry, SUB cmd, PUB snapshot, ack, stress) on a disjoint port block so trade_lbm_v1 can coexist with the physics lattice during the comparison phase.
Suggested ports:
- 5566 telemetry PUB
- 5567 cmd SUB
- 5568 snapshot PUB
- 5569 ack PUB
- 5570 stress PUB
Commands (JSON over ZMQ, field names confirmed at implementation, NOT now):
set_oi_drive value=<float>set_flow_drive value=<float>set_spread col=<int> value=<float>(orset_spread_profile values=[NX floats])inject_trade price=… side=… size=… aggressor=… t_window=…recenter mid=<float>(manual recenter; otherwise automatic)set_tick_size value=<float>(rare, but needed when switching instruments)pause/resume/reset/snapshot
7. Fractonaut interface changes
The observer's prompt schema must be rebuilt around per-column and event-detector data. The current Fractonaut prompt baselines (asymmetry mean=110.97 std=4.51 etc.) become irrelevant. New baselines will be needed by running the trade lattice on synthetic and historical data for a calibration window.
The prompt should expose:
- The current top-K support/resistance levels with persistence counts (reported in absolute price, not column index — see §2 recentring)
- Active breakout / consolidation events
- Per-column profiles as compact strings (every Nth column with significant activity)
- Global scalars only as a stability check ("is the lattice exploding")
- The injection_state hint stays, but its meaning shifts to "is live trade data flowing into the lattice" (ACTIVE / PAUSED / REPLAY / SYNTHETIC)
oi_drive_activeboolean (see §4.1) so the LLM knows when slow-scale forcing is offrecenter_eventflag + recent drift magnitude (see §2)
The structural-fact paragraph in the current SYSTEM prompt (the ky = kx/2 block) is deleted. On a trade lattice that fact does not apply. Replacement structural facts that go into the new SYSTEM prompt:
- "Row 0 is newest; row NY-1 is oldest. Streaming pushes mass upward at a constant simulated rate."
- "One row corresponds to one snapshot interval, NOT one minute of wall-clock time. During active periods, more market activity is compressed into each row; during quiet periods, less. Row density does not equal wall-clock density."
- "Equilibrium is depth-weighted, not zero. Persistent density at a column reflects persistent order book depth at that price level."
- "Column-to-price conversion is handled before you see it. All structural reports use absolute price."
- "oi_drive may be inactive (proxy unavailable or source missing); when inactive, slow-scale features will be weaker by construction."
- "Global asymmetry and global coherence are NOT independent. Within any one operating regime their product is conserved (see §3.5.1). For regime classification, read
regime_productonly. The two underlying values are kept for diagnostics, not for regime calls."
7.1 Baseline recalibration (v3 addition)
The current Fractonaut deployment (against the physics lattice) was calibrated with BASELINE_MEAN["asymmetry"] ≈ 111 and corresponding sigma. The 2026-06-08 reset_equilibrium probe showed the true equilibrium asymmetry is ≈12.3, not 111 — the lattice had been sitting in a metastable elevated basin for an unknown length of time when those baselines were measured. Every z-score Fractonaut has emitted in recent days was computed against the wrong reference.
For trade_lbm_v1 this is a procedural rule, not a code change: baseline statistics for the new SYSTEM prompt MUST be measured immediately after a clean kernel startup (or reset_equilibrium) and re-measured if any global parameter is changed mid-run. The Fractonaut deployment scripts will record the baseline-capture cycle range in the prompt itself so the LLM (and operators) can see exactly which run produced the reference.
8. What v1 explicitly does NOT do
- No prediction. v1 is an observatory. It surfaces structure; trading logic reads the surfaced structure separately.
- No multi-instrument. One symbol per binary. Compose later.
- No back-testing of the lattice itself in v1. Replay mode (
SYNTHETIC/REPLAYinjection_state) is for calibration only. - No physics analogies beyond LBM mechanics. No "market temperature", no "free energy". Use the actual LBM observables and let their market interpretation stand on its own.
9. Architectural decisions (was: open questions)
Resolved in priority order per Claude Desktop review 2026-06-08. All six gating questions are now committed.
9.1 Recentring policy — see §2 "Recentring"
Decided: integer-column shift when mid drifts > NX/16 = 32 columns, structural reports in absolute price, diagnostic telemetry exposes drift. Resolves the "support level moved between days" interpretation problem by removing column indices from the structural layer entirely.
9.2 Equilibrium choice — see §3.5
Decided: depth-weighted equilibrium, not standard Maxwell-Boltzmann. Each column's BGK target is computed from rolling bid/ask depth at that price level. Standard MB is the fallback when book depth is unavailable, logged as impaired mode. This is the most consequential architectural decision in v1 and reverses the recommendation in DRAFT v1.
9.3 oi_drive data source — see §4.1
Decided: runner-selected, kernel-agnostic. Preferred = exchange OI; fallback = 5-min reconstructed ΔOI proxy from signed flow; safe default = set_oi_drive value=0.0 (slow-scale forcing off, telemetry flags oi_drive_active=false). v1 will likely launch with the proxy against the April HL dataset.
9.4 Validation criteria — see §10
Decided: concrete numeric pass/fail for the breakout replay test, specific April BTC event named, expected column window, expected row window, minimum signal strength all specified in advance.
9.5 Time advancement model — see §2 "Time axis"
Decided: fixed-rate, one snapshot = one Y-row, ≈1s wallclock cadence. Distortion (row density ≠ wallclock density during bursts) acknowledged and surfaced as fact #2 in the new Fractonaut SYSTEM prompt (§7).
9.6 TAKER_WEIGHT
Decided: TAKER_WEIGHT = 1.5 compile-time constant. Aggressor side multiplies injected |Δρ| by this factor; passive side uses 1.0. Low-priority calibration parameter — can be retuned during §10 validation if a clear signal-to-noise improvement is observed, otherwise left at 1.5.
Off-grid mass (lower priority, also decided)
Report-only in v1. off_grid_mass telemetry counter accumulates between recentre events and resets on recentre. Sustained high off_grid_mass signals "grid window too narrow for instrument volatility" — at that point the operator widens NX or shrinks tick_size; the kernel does not auto-adjust.
Staleness handling (added per Claude Desktop comment)
Decided: last_trade_age_s exposed every snapshot. Fractonaut SYSTEM prompt includes the rule "if last_trade_age_s > 60, treat the field as drifting toward equilibrium with no fresh information and report only structural persistence, not new events."
10. Build/deploy plan with numeric validation gate
10.1 Calibration data set and bifurcation sweep
Instrument: HL BTC perp, April 2026 dataset already on disk at D:\PaperTrader\research\hl_data\ (window 2026-04-01 → 2026-04-30, pulled with 8 workers, complete). Spot trade-by-trade resolution suitable for tick-level replay.
Replay-mode injections (injection_state=REPLAY) drive the lattice from this dataset to establish baseline distributions for the new Fractonaut prompt: means and standard deviations for regime_product, density_profile, vorticity_profile, divergence_profile, stress_xx_profile, plus event-detector firing rates per hour during quiet vs active regimes.
Bifurcation sweep (v3 addition, per Claude Desktop decision 3). Before any operating amplitude is chosen for oi_drive and flow_drive, sweep each amplitude from 0 to its kernel-clamp maximum while holding the other at zero and the lattice fed with a typical April day of trade data. Record regime_product at each amplitude step. The bifurcation point is the amplitude at which regime_product transitions sharply between attractor values — a step or kink in the product-vs-amplitude curve.
Operating-point rule: the resting amplitude for both oi_drive and flow_drive is set to 80% of the bifurcation amplitude for that channel. This places the lattice near the bifurcation but on the normal-attractor side, so:
- Routine market activity perturbs the field within the normal attractor (small
regime_productexcursions are interpretable). - A genuinely regime-shifting event (large coordinated flow, sustained OI build) can push the field across the bifurcation into the elevated attractor — which the kernel reports as a step change in
regime_product. That step is the regime-change signal. - The lattice is not stuck deep in either basin where injections are absorbed without qualitative change.
If the bifurcation sweep finds no clean transition (smooth product-vs-amplitude curve, no step), the lattice is operating in a single-attractor regime and the trade design needs review before validation gates run.
10.2 Validation gate — numeric pass/fail
Event A (breakout test): the April BTC move from ~66,200 → ~68,800 over the first 6 hours of 2026-04-12 (the largest single-day directional move of the month). Specific window: 2026-04-12 04:00:00 UTC → 2026-04-12 10:00:00 UTC.
| Criterion | Pass threshold |
|---|---|
breakout_signal fires at least once during the window |
required |
First firing occurs within the row corresponding to wallclock 04:00 ± 30 minutes of the actual breakout start |
required |
Firing column corresponds to a price within ± 200 USD of the actual breakout pivot price (~66,400) |
required |
| Signal magnitude (divergence z-score at firing column) ≥ 3.0 | required |
No more than 2 false-positive breakout_signal firings during the 6-hour replay window |
required |
Failing any of the five criteria means the kernel is wrong and iterates. Iteration touches forcing amplitudes, equilibrium weights, and event-detector thresholds — not grid semantics.
Event B (consolidation test): the BTC range-bound window 2026-04-18 00:00:00 UTC → 2026-04-18 12:00:00 UTC (~12 hours of mean-reverting price action between roughly 67,400 and 67,900, no >0.5% directional moves).
| Criterion | Pass threshold |
|---|---|
consolidation_band is active continuously for at least 8 of the 12 hours |
required |
| Active band spans a price range of width 200–600 USD around the actual mid (~67,650) | required |
breakout_signal does NOT fire during the window |
required (no more than zero firings) |
support_levels and resistance_levels lists contain at least one entry each, persisting across at least 50% of the window |
required |
Failing any of the four means false-positive breakouts will dominate live operation; iterate.
Order of execution: Event B before Event A. A kernel that fires breakout during consolidation is broken in a way that no breakout-test pass can rescue.
10.3 Parallel run
Once both events pass: run trade_lbm_v1 in parallel with the physics lattice during live market hours for one full week (7×24 = 168 hours of paper observation). Fractonaut receives both streams via separate prompt channels and HTTP endpoints (28822 stays physics; trade lattice uses 28823). Compare the structural reports side by side at one-hour granularity, log disagreements explicitly.
10.4 Decision
Retire physics lattice, retain physics lattice as control, or merge findings — decided after the parallel-run week using the disagreement log as evidence, not subjective judgement.
No live trading logic touches the trade lattice in v1. That linkage is a separate document.
11. Relationship to the physics-lattice probes
Two probes against the existing khra_gixx_1024_v5 lattice informed (but did not gate) this design.
11.1 Wave-modulator probe (2026-06-08 18:46–19:12)
Tested whether set_khra_amp / set_gixx_amp channels meaningfully move the field. Results:
- Khra elevated 0.030→0.050 → asymmetry 116→327 (≈3×), coherence 0.62→0.50, stress_yy sign-flipped, Fractonaut correctly identified as "highly agitated, large-scale oscillations, decoupled metrics".
- Gixx elevated 0.008→0.024 → asymmetry 116→300 with markedly higher velocity variance and vorticity than Khra-elevated; Fractonaut correctly identified as "turbulent fine-scale rough texture".
- Combined + opposing dipole pulses absorbed in <60 s each with no cumulative directional accumulation.
- Channel separability is real and clean in the velocity/vorticity observables, not in asymmetry/coherence (which are entangled per §3.5.1).
11.2 reset_equilibrium probe (2026-06-08 19:14)
Claude Desktop predicted, after seeing the wave-modulator results, that the field's failure to return to "baseline" after the probe was either (A) slow natural relaxation or (B) genuine metastability in a wrong attractor basin. The reset probe distinguished them:
- Pre-reset: asymmetry 309, coherence 0.53, product 164 (the elevated attractor).
- 10 s after
reset_equilibrium: asymmetry 12.3, coherence 0.74, product 9.1. - Held flat for 120 s with no further drift.
Interpretation B confirmed, A rejected. The field relaxes instantly (under one snapshot interval) when given an explicit reset; the apparent "hysteresis" was the field trapped in a higher-energy attractor basin that the BGK collision alone cannot escape because each elevated state is itself a local fixed point of the dynamics.
This also means:
- The "baseline asymmetry ≈ 116" used as Fractonaut's reference for the past several days was also a metastable displaced state, not the true equilibrium. True equilibrium is asym ≈ 12.
- Every lattice-derived analysis since the v2 ramp compared two displaced states against each other, not against a true baseline. Findings that came from raw trade-data parquets (e.g. trade_count signal) are unaffected; findings that involved lattice global scalars need additional skepticism.
11.3 Why the wave modulator cannot do minute-timescale market tracking on the physics lattice
A market regime can flip bullish→bearish in minutes. The physics lattice cannot follow such a flip via Khra/Gixx amplitude changes because:
- Each (khra, gixx, omega) tuple has its own attractor basin and the field stays there until externally reset.
- There is no
set_book_stateanalogue — the BGK target is implicit-uniform, so the field has nothing to relax toward except whatever it was last sitting at. - Amplitude modulation drives the field via the forcing term, not the equilibrium, so it can only displace the field within whatever basin the equilibrium chooses.
The physics lattice may still be useful for hour-to-day timescale regime tracking, where the lag implicit in basin escape is tolerable. It is structurally unsuitable for minute-level tracking. This kills the wave-modulator hypothesis as originally drafted for high-frequency market use.
11.4 Why trade_lbm_v1 solves this by construction
The depth-weighted equilibrium in §3.5 is precisely the missing piece. On the trade lattice:
- The BGK target
(ρ_eq, u_eq)is recomputed every snapshot from live order-book depth. - When the book shifts (a bid wall pulled, an ask wall added), the equilibrium shifts with it.
- The BGK collision then naturally drags the field toward the new equilibrium with timescale 1/ω, which we explicitly tune (per-column omega from spread, §4.3) so field memory matches market microstructure decay (≈5–15 minutes for BTC perps on HL per published microstructure work).
- No
reset_equilibriumis needed. There is no metastability problem because the equilibrium is never a fixed wrong point — it is the present market itself.
The reason the trade lattice does not need Khra/Gixx amplitude modulation for regime tracking is precisely because the equilibrium IS the regime. This is the central architectural insight that the wave-modulator probe forced into focus, and it is what makes §3.5 the most important section of this document.
11.5 Disposition of the physics lattice
The parallel-run plan in §10.3 still allows the physics lattice to run alongside trade_lbm_v1 as a slow-regime sensor (hour-to-day timescale only, after reset_equilibrium has been issued and Fractonaut baselines recalibrated against the true equilibrium of asym ≈12). It is no longer a candidate for minute-level market observation. The fork's go/no-go remains independent of any of this.