2026-03-24 12:10:43 +07:00
|
|
|
# KHRA'GIXX 1024x1024 SYSTEM MANUAL
|
|
|
|
|
|
|
|
|
|
**Read this ENTIRE document before touching anything.**
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## ARCHITECTURE
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─────────────────────────────────────────────────────────┐
|
|
|
|
|
│ WSL2 Ubuntu │
|
|
|
|
|
│ ┌─────────────────────────────────────────────────┐ │
|
|
|
|
|
│ │ khra_gixx_1024_stable (CUDA binary) │ │
|
|
|
|
|
│ │ - D2Q9 Lattice Boltzmann at 1024x1024 │ │
|
|
|
|
|
│ │ - BGK collision, omega=1.97 │ │
|
|
|
|
|
│ │ - Khra'gixx dual-frequency perturbation │ │
|
|
|
|
|
│ │ - Publishes JSON via ZMQ PUB on port 5556 │ │
|
|
|
|
|
│ └──────────────────────┬──────────────────────────┘ │
|
|
|
|
|
│ │ tcp://127.0.0.1:5556 │
|
|
|
|
|
└─────────────────────────┼───────────────────────────────┘
|
|
|
|
|
│ (WSL2 → Windows bridge)
|
|
|
|
|
┌─────────────────────────┼───────────────────────────────┐
|
|
|
|
|
│ Windows Python │ │
|
|
|
|
|
│ ┌──────────────────────▼──────────────────────────┐ │
|
|
|
|
|
│ │ capture_state.py / floating_creativity.py / │ │
|
|
|
|
|
│ │ manifested_reality_inquiry.py │ │
|
|
|
|
|
│ │ - ZMQ SUB subscriber │ │
|
|
|
|
|
│ │ - Receives JSON frames from daemon │ │
|
|
|
|
|
│ │ - Feeds telemetry to LoRA model │ │
|
|
|
|
|
│ └─────────────────────────────────────────────────┘ │
|
|
|
|
|
└─────────────────────────────────────────────────────────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The CUDA daemon runs in WSL. Python scripts run on Windows.
|
|
|
|
|
ZMQ crosses the WSL2↔Windows boundary on `tcp://127.0.0.1:5556`.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## HOW TO START THE DAEMON
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# From any terminal that can reach WSL:
|
|
|
|
|
wsl -d Ubuntu -e bash -c "
|
|
|
|
|
cd /mnt/d/fractal-brain/beast-build &&
|
|
|
|
|
export LD_LIBRARY_PATH=/usr/local/cuda-12.6/lib64:/usr/lib/x86_64-linux-gnu:\$LD_LIBRARY_PATH &&
|
|
|
|
|
nohup ./khra_gixx_1024_stable > /tmp/khra_daemon.log 2>&1 &
|
|
|
|
|
echo PID=\$!
|
|
|
|
|
"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Then verify:
|
|
|
|
|
```bash
|
|
|
|
|
wsl -d Ubuntu -e bash -c "sleep 2; tail -3 /tmp/khra_daemon.log"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
You should see:
|
|
|
|
|
```
|
|
|
|
|
Cycle 100: Coherence=0.732, Asymmetry=13.4378
|
|
|
|
|
Cycle 200: Coherence=0.742, Asymmetry=12.1718
|
|
|
|
|
...
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**DO NOT start lbm_1024x1024 or lbm_cuda_daemon at the same time.**
|
|
|
|
|
They all bind to port 5556. Only ONE daemon at a time.
|
|
|
|
|
|
|
|
|
|
### Check if a daemon is already running
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
wsl -d Ubuntu -e bash -c "ps aux | grep -E 'lbm|khra' | grep -v grep"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
If something is running, kill it first:
|
|
|
|
|
```bash
|
|
|
|
|
wsl -d Ubuntu -e bash -c "pkill -f khra_gixx_1024; pkill -f lbm_"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### How to rebuild after code changes
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-03-25 07:34:34 +07:00
|
|
|
wsl -d Ubuntu -e bash /mnt/d/Resonance_Engine/beast-build/compile_khra_1024.sh
|
2026-03-24 12:10:43 +07:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Requires: CUDA 12.6 toolkit, libzmq3-dev. Architecture: sm_89 (RTX 4090).
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## HOW TO CONNECT FROM PYTHON (Windows)
|
|
|
|
|
|
|
|
|
|
### The correct ZMQ subscriber pattern
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
import zmq
|
|
|
|
|
import json
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
ctx = zmq.Context()
|
|
|
|
|
sub = ctx.socket(zmq.SUB)
|
|
|
|
|
|
|
|
|
|
# 1. Set subscription BEFORE connect
|
|
|
|
|
sub.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
|
|
|
|
|
|
|
|
# 2. Connect
|
|
|
|
|
sub.connect("tcp://127.0.0.1:5556")
|
|
|
|
|
|
|
|
|
|
# 3. WAIT for subscription to propagate (MANDATORY)
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
|
|
|
|
|
# 4. Use Poller — NOT zmq.NOBLOCK
|
|
|
|
|
poller = zmq.Poller()
|
|
|
|
|
poller.register(sub, zmq.POLLIN)
|
|
|
|
|
|
|
|
|
|
# 5. Receive with timeout
|
|
|
|
|
events = poller.poll(5000) # 5 second timeout
|
|
|
|
|
if events:
|
|
|
|
|
msg = sub.recv()
|
|
|
|
|
frame = json.loads(msg)
|
|
|
|
|
print(frame)
|
|
|
|
|
else:
|
|
|
|
|
print("No data — is the daemon running?")
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### CRITICAL RULES
|
|
|
|
|
|
|
|
|
|
1. **`time.sleep(1)` after `connect()` is MANDATORY.**
|
|
|
|
|
ZMQ PUB/SUB needs time for the subscription to propagate from subscriber
|
|
|
|
|
to publisher. Without this sleep, you will receive NOTHING. This is called
|
|
|
|
|
the "slow joiner" problem and it is fundamental to ZMQ, not a bug.
|
|
|
|
|
|
|
|
|
|
2. **NEVER use `zmq.NOBLOCK` in a tight loop.**
|
|
|
|
|
This pattern is BROKEN:
|
|
|
|
|
```python
|
|
|
|
|
# WRONG — DO NOT DO THIS
|
|
|
|
|
for i in range(50):
|
|
|
|
|
try:
|
|
|
|
|
msg = sub.recv(flags=zmq.NOBLOCK)
|
|
|
|
|
except zmq.Again:
|
|
|
|
|
time.sleep(0.05)
|
|
|
|
|
```
|
|
|
|
|
This burns through 50 retries in 2.5 seconds. The subscription needs ~500ms
|
|
|
|
|
to activate. By the time it's active, you've already exhausted half your
|
|
|
|
|
retries on a socket that wasn't ready yet. Use `zmq.Poller` with a real
|
|
|
|
|
timeout instead.
|
|
|
|
|
|
|
|
|
|
3. **Set `SUBSCRIBE` BEFORE `connect()`.**
|
|
|
|
|
If you connect first and subscribe second, there's a race condition where
|
|
|
|
|
messages arrive before the filter is set.
|
|
|
|
|
|
|
|
|
|
4. **File paths: Windows Python uses Windows paths.**
|
|
|
|
|
If your Python runs on Windows, write to `"current_state.json"` (relative)
|
2026-03-25 07:34:34 +07:00
|
|
|
or `"D:\\Resonance_Engine\\beast-build\\output.json"` (absolute Windows path).
|
2026-03-24 12:10:43 +07:00
|
|
|
NEVER use `/mnt/d/...` paths in Windows Python — that's a WSL path.
|
|
|
|
|
|
|
|
|
|
5. **ONE daemon on port 5556 at a time.**
|
|
|
|
|
Before starting a daemon, always check `ps aux | grep -E 'lbm|khra'`.
|
|
|
|
|
If you start two, the second one's `zmq_bind` will fail silently (fixed
|
|
|
|
|
version warns but continues), and neither will publish correctly.
|
|
|
|
|
|
|
|
|
|
6. **Do NOT kill and restart the daemon in a loop.**
|
|
|
|
|
If the subscriber can't receive, the problem is the SUBSCRIBER, not the
|
|
|
|
|
daemon. The daemon is fine. Fix your subscriber pattern (see rules 1-3).
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## JSON FRAME FORMAT
|
|
|
|
|
|
|
|
|
|
The daemon publishes one JSON message every 10 simulation cycles:
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"cycle": 5320,
|
|
|
|
|
"coherence": 0.7393,
|
|
|
|
|
"asymmetry": 12.4235,
|
|
|
|
|
"khra_amp": 0.03,
|
|
|
|
|
"gixx_amp": 0.008,
|
|
|
|
|
"grid": 1024
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
| Field | Type | Description |
|
|
|
|
|
|-------------|-------|------------------------------------------------------|
|
|
|
|
|
| `cycle` | int | Simulation cycle number |
|
|
|
|
|
| `coherence` | float | `1/(1+sqrt(variance))` — density field uniformity |
|
|
|
|
|
| `asymmetry` | float | `mean((rho-1)²) * 100` — Magnifying Glass metric |
|
|
|
|
|
| `khra_amp` | float | Khra component amplitude (always 0.03) |
|
|
|
|
|
| `gixx_amp` | float | gixx component amplitude (always 0.008) |
|
|
|
|
|
| `grid` | int | Grid dimension (always 1024) |
|
|
|
|
|
|
|
|
|
|
### Expected values at steady state
|
|
|
|
|
|
|
|
|
|
- **Coherence**: ~0.74 (drops from 1.0 at init as Khra'gixx perturbs the field)
|
|
|
|
|
- **Asymmetry**: ~12.0-13.0 (density deviations amplified by Magnifying Glass)
|
|
|
|
|
|
|
|
|
|
If you see Coherence=0.555 and Asymmetry=64.4, the binary is BROKEN
|
|
|
|
|
(see DEFECT_REPORT_khra_1024.log).
|
|
|
|
|
|
|
|
|
|
If you see Coherence=1.000 constant, the Khra'gixx injection is disabled.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## EXISTING PYTHON SCRIPTS
|
|
|
|
|
|
|
|
|
|
### Working (fixed ZMQ pattern):
|
|
|
|
|
|
|
|
|
|
| Script | Purpose |
|
|
|
|
|
|--------|---------|
|
|
|
|
|
| `capture_state.py` | Grab one frame, save to `current_state.json` |
|
|
|
|
|
| `floating_creativity.py` | Dynamic temperature: Artist (T=1.6) at low asymmetry, Scientist (T=0.2) at high. Requires v0.8 LoRA. |
|
|
|
|
|
| `manifested_reality_inquiry.py` | Scientist-mode inquiry when A > 1.0. Requires v0.8 LoRA. |
|
|
|
|
|
|
|
|
|
|
### Reference (may have stale ZMQ patterns — check before using):
|
|
|
|
|
|
|
|
|
|
There are 58 Python files in beast-build. Most were written with the broken
|
|
|
|
|
`zmq.NOBLOCK` pattern. If you need to use one, fix its ZMQ subscriber to
|
|
|
|
|
match the pattern in "The correct ZMQ subscriber pattern" above.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## QUICK DIAGNOSTIC CHECKLIST
|
|
|
|
|
|
|
|
|
|
**"I'm not receiving ZMQ data"**
|
|
|
|
|
|
|
|
|
|
1. Is the daemon running? → `wsl -d Ubuntu -e bash -c "ps aux | grep khra"`
|
|
|
|
|
2. Is it producing output? → `wsl -d Ubuntu -e bash -c "tail -3 /tmp/khra_daemon.log"`
|
|
|
|
|
3. Did you `time.sleep(1)` after `connect()`? → If not, add it.
|
|
|
|
|
4. Are you using `zmq.Poller` or `zmq.NOBLOCK`? → Use Poller.
|
|
|
|
|
5. Is another daemon already on port 5556? → Kill it first.
|
|
|
|
|
6. Are you using WSL paths in Windows Python? → Use Windows paths.
|
|
|
|
|
|
|
|
|
|
**"The daemon crashes silently"**
|
|
|
|
|
|
|
|
|
|
It doesn't. Run it in foreground to see output:
|
|
|
|
|
```bash
|
|
|
|
|
wsl -d Ubuntu -e bash -c "
|
2026-03-25 07:34:34 +07:00
|
|
|
cd /mnt/d/Resonance_Engine/beast-build &&
|
2026-03-24 12:10:43 +07:00
|
|
|
export LD_LIBRARY_PATH=/usr/local/cuda-12.6/lib64:/usr/lib/x86_64-linux-gnu:\$LD_LIBRARY_PATH &&
|
|
|
|
|
./khra_gixx_1024_stable 2>&1
|
|
|
|
|
"
|
|
|
|
|
```
|
|
|
|
|
If it exits immediately with no output, check `nvidia-smi` — the GPU may be
|
|
|
|
|
occupied by a stale CUDA context from a previous crash.
|
|
|
|
|
|
|
|
|
|
**"Coherence and Asymmetry values look wrong"**
|
|
|
|
|
|
|
|
|
|
| Coherence | Asymmetry | Diagnosis |
|
|
|
|
|
|-----------|-----------|-----------|
|
|
|
|
|
| ~0.74 | ~12-13 | CORRECT — Khra'gixx active, steady state |
|
|
|
|
|
| 1.000 | 0.000 | Khra'gixx injection disabled (check source) |
|
|
|
|
|
| 0.555 | 64.4 | Init bug — d_w read from host (use fixed binary) |
|
|
|
|
|
| NaN | NaN | Velocity diverged — omega too low or Mach limit hit |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## FILES THAT MATTER
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
beast-build/
|
|
|
|
|
├── khra_gixx_1024_stable.cu ← PRODUCTION source (FIXED)
|
|
|
|
|
├── khra_gixx_1024_stable ← Compiled binary
|
|
|
|
|
├── compile_khra_1024.sh ← Build script
|
|
|
|
|
├── khra_gixx_1024.cu ← Original (works, verbose debug output)
|
|
|
|
|
├── lbm_cuda_daemon.cu ← 512x512 daemon (legacy, works)
|
|
|
|
|
├── lbm_1024x1024.cu ← Alt 1024 daemon (no streaming kernel)
|
|
|
|
|
├── lbm_1024x1024_safe.cu ← ⚠ HAS MEMORY LEAK — cudaMalloc in main loop
|
|
|
|
|
├── capture_state.py ← Quick state grab (FIXED)
|
|
|
|
|
├── floating_creativity.py ← Dynamic-T inquiry (FIXED)
|
|
|
|
|
├── manifested_reality_inquiry.py ← Scientist inquiry (FIXED)
|
|
|
|
|
├── DEFECT_REPORT_khra_1024.log ← What was wrong and why
|
|
|
|
|
├── RECOVERED_ALASKA_PHYSICS.log ← Forensic data recovery
|
|
|
|
|
└── SYSTEM_MANUAL.md ← THIS FILE
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**DO NOT USE `lbm_1024x1024_safe.cu`** — it has `cudaMalloc` inside the main loop,
|
|
|
|
|
leaking 36MB per cycle. It will consume all GPU memory within seconds.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## DO NOT
|
|
|
|
|
|
|
|
|
|
- Start multiple daemons on port 5556
|
|
|
|
|
- Use `zmq.NOBLOCK` in a loop instead of `zmq.Poller`
|
|
|
|
|
- Skip `time.sleep(1)` after `sub.connect()`
|
|
|
|
|
- Kill and restart the daemon when the subscriber fails to receive
|
|
|
|
|
- Use WSL paths (`/mnt/d/...`) in Windows Python file operations
|
|
|
|
|
- Read `__constant__` CUDA memory from host code
|
|
|
|
|
- Disable CUDA error checking
|
|
|
|
|
- Comment out the Khra'gixx injection in a file named "khra_gixx"
|
|
|
|
|
- Create more Python files instead of fixing the one that's broken
|