Files
resonance-engine/OBSERVER_SWEEP_BUILD_SPEC.md
T

117 lines
8.6 KiB
Markdown
Raw Normal View History

# OBSERVER-DRIVEN SYSTEMATIC INVESTIGATION — BUILD SPEC
**Written 2026-07-14. Build target for the coding agent. Back-checked by oversight after build.**
## PURPOSE
Stop testing single frozen operating points. Give the observer LLM its hands on the lattice's knobs
(omega, khra_amp, gixx_amp) and let it run a full automated sweep of variables AND combinations,
chase anomalies, and adapt — with an interactive mode where the human can steer it to points of
interest. This maps what the substrate ACTUALLY DOES across its parameter space before we claim to
know what it is.
## WHAT ALREADY EXISTS — EXTEND, DO NOT REBUILD
- `build/khra_gixx_1024_v5_observer` — daemon. Live command surface on ZMQ 5557:
`set_omega`[0.5,1.99], `set_khra_amp`[0,0.2], `set_gixx_amp`[0,0.1], `snapshot_now`,
`stress_snapshot_now`, `health_check`, `inject_density`, `save_state`, `load_state`.
Coarse field stream on 5561 (32x32x6, ~100Hz). Telemetry on 5556. **The knobs already turn live.**
- `navigator/lattice_observer.py` — existing observer. READ IT FIRST. Extend it.
- `navigator/zmq_raw_bridge.py` — existing command bridge to 5557. Use it; don't reinvent.
- `navigator/telemetry_server.py`, `sentry_monitor.py` — existing telemetry plumbing.
- `analysis/*.py` — existing analysis (capture_and_predict, baseline_orbit, etc.). Reuse the readers.
**First task of the build: read these files and report what's reusable BEFORE writing anything new.**
## NON-NEGOTIABLE CONSTRAINTS (violating any = the whole sweep is contaminated)
1. **≥10-FORCING-PERIOD AVERAGING FOR ALL SPATIAL READOUTS.** Buried, hard-won rule: short averages
make the khra/gixx carriers ADD instead of CANCEL, manufacturing FALSE spatial nulls. khra carrier
~251 cyc, gixx ~15.7 cyc. Any spatial measurement MUST average >=10 khra periods (>=~2510 cycles)
or it is an artifact. The whole coarse-stream analysis tonight was in the false-null regime. Fix this.
2. **THE GOVERNING VARIABLE IS THE COUPLING RATIO alpha, NOT omega alone.**
alpha = (A_khra * omega_gixx * lambda_gixx) / (A_gixx * omega_khra * lambda_khra).
omega=1.97 is just one value alpha takes at current amplitudes. Sweeping one knob = sweeping one
input to a ratio = a 1D line through a space governed by the COMBINATION. Sweep combinations.
Compute and log alpha at every grid point.
3. **NODAL MULTI-ATTRACTOR AWARENESS.** The founding Nodal Aether hypothesis: the lattice is a network
of nodes, each a small attractor; a lattice of this size = a SUITE of attractors. Global averaging
(9 scalars, or even 32x32) collapses the suite into one smooth mode — which is why everything looked
like a single global attractor. The sweep must probe for MULTIPLE basins, not assume one. Do not
declare "one attractor" from averaged data.
4. **RIGOR (unchanged, it's working — caught 6+ false positives).** Every anomaly/claim: pre-committed
threshold in code BEFORE looking; surrogate/permutation null; bootstrap distribution (never single
sample); threshold NOT within one noise-width of the value. A clean null is a real result.
5. **SAFETY.** Clamp all knobs to daemon-valid ranges. Never reset_equilibrium casually. Restore baseline
(omega 1.97, khra 0.03, gixx 0.008) and leave the field as found at end of each run. Launch daemon
DETACHED (setsid, poll log) — executor times out at 30s. Only ONE daemon holds ports 5556-5561.
NEVER touch canonical khra_gixx_1024_v5.cu.
## STAGE 1 — AUTOMATED SWEEP ENGINE (`analysis/sweep_engine.py`)
A controller that drives the live daemon through a parameter grid and characterizes each point.
- **Grid:** 3 axes — omega, khra_amp, gixx_amp. COARSE pass first (e.g. omega {1.4,1.6,1.8,1.9,1.97,1.99},
khra {0.01,0.03,0.06,0.1}, gixx {0.004,0.008,0.02,0.05}) = ~96 points. Refine hot regions after.
Grid is config-driven so it can be expanded without code changes.
- **Per grid point:**
1. Set knobs via 5557 bridge. Wait a SETTLE period (>=10 khra periods, ~2510+ cyc) for the field to
reach its attractor at the new parameters. Confirm settle by telemetry stabilizing.
2. Capture a MEASUREMENT window from 5561 (>=10 khra periods) with proper averaging.
3. Compute and log, per point: alpha; limit-cycle character (does coherence orbit? period? amplitude?
or does it go fixed / chaotic / blow up?); short-horizon predictability (persistence vs linear, the
+21% metric from tonight); mass-leak rate (density drift slope); dynamical richness / effective
dimension of the coarse field; and a MULTI-BASIN probe (does the field settle to the same place from
different phases, or are there distinct settling points?).
4. Save raw capture + computed metrics to a durable per-point file (resumable — sweep must survive a
crash and continue, given it takes days).
- **Output:** a growing `sweep_results.jsonl` (one line per point) + raw captures. A map of alpha-space:
where the system is boring/stable, where chaotic, where predictability peaks, where leak is worst,
and — the prize — where perturbations would hold longest (the candidate "memory" regime).
- **Resumable + detached + logged.** Days-long. Poll a progress file. Never inline in the executor.
## STAGE 2 — OBSERVER ANOMALY-CHASING (extend `navigator/lattice_observer.py`)
Give the observer LLM agency over the sweep: not just execute the grid, but ADAPT to what it sees.
- The observer receives each point's metrics as they compute. Its job: watch for ANOMALIES — points
where a metric jumps, a new orbit character appears, predictability spikes, the field does something
the smooth-global-mode picture doesn't predict.
- When it flags an anomaly, it can request the sweep engine to REFINE around that point (finer grid,
longer capture, multi-basin probe) — chasing the anomaly instead of blindly finishing the grid.
- **Prompt (write to `navigator/sweep_observer_prompt.json` or similar):** frame it as CHASE ANOMALIES,
not confirm expectations. Explicitly: "You are mapping an alien system across its parameter space. You
do NOT know what it is. Look for where its behaviour CHANGES CHARACTER — transitions, new modes,
regimes where perturbations persist. When you see an anomaly, chase it: request a refined sweep there.
Do NOT force it into a brain analogy or any expected shape. Report what changes and where. Time is a
variable — how long things persist matters as much as their magnitude. A boring flat map is a real
result; do not manufacture excitement." Include the false-null averaging rule and the alpha ratio in
the prompt so the observer reasons with them.
- **Kill the drift:** the observer must NOT reach for Golden Weave, other LLMs, or narrative. Its only
moves are: request a sweep point, request a refinement, report a metric-grounded observation. Every
claim needs the Stage-1 rigor. No poetry.
## STAGE 3 — INTERACTIVE HUMAN-IN-LOOP MODE (`analysis/sweep_interactive.py` or a mode flag)
A mode where the human can steer the observer to points of interest during a trial.
- Live view: current knob settings, current metrics, the alpha-space map so far (which points done, what
they showed). Reuse `field_viz.html`-style rendering for the live coarse field if feasible.
- Human can: jump the daemon to any (omega, khra, gixx); ask the observer to dwell and characterize a
point; ask it to sweep a custom line/region; mark a point as interesting for later refinement.
- The observer explains what it's seeing at the current point and suggests where to look next — the human
can accept, redirect, or override. Two-way.
- Implementation can be a simple CLI or a lightweight local web UI — agent's call, justify the choice.
## BUILD ORDER (do in sequence, report after each)
1. Read existing navigator/ + analysis/ files; report what's reusable. (No new code yet.)
2. Stage 1 sweep engine — get ONE grid point working end to end (set knobs, settle, capture with proper
averaging, compute metrics, save). Verify against oversight BEFORE running the full grid.
3. Run coarse grid (days). Resumable, detached.
4. Stage 2 observer anomaly-chasing on top of the running sweep.
5. Stage 3 interactive mode.
## DELIVERABLE
A running, resumable, days-long automated sweep of omega x khra x gixx that produces a map of alpha-space
with per-point dynamical characterization (all with >=10-forcing-period averaging), an observer that
chases anomalies within it, and an interactive mode for human steering. The goal is ONE thing: find out
what the substrate actually does across its parameter space — especially WHERE (if anywhere) perturbations
persist and WHERE the behaviour changes character — before we design any memory experiment.