lnd/simulation
Olaoluwa Osuntokun d13a376e53 simulation/command-center: redesign site, add findings page
In this commit, we replace the dashboard's console theme with an
editorial report design: a single light paper theme, serif headings
and body with mono reserved for quantitative type, and one oxide
accent used only where it carries meaning. The palette was validated
for CVD contrast against the actual background rather than eyeballed.

We also add findings.html, a standalone write-up of the research so
far: the mainnet validation headlined by the 8.6x attempt reduction,
the paradigm-over-parameters negative result, the three tiers of
held-out evidence, and an anatomy ledger of what the evolved routers
dropped, rediscovered, and invented relative to lnd's stack --
including the honest caveat that the champions' rejection of time
based logic is partly a simulator artifact.

Four hand-drawn SVG diagrams explain the system: the GEPA loop, a
schematic contrasting clock-decayed penalties with evidence-bounded
liquidity intervals, the rediscovered bimodal prior plotted from the
champions' own constants, and the champions comparison chart.

The live-run wiring is hardened for code-mode runs: the candidate
view now detects Go-source candidates, shows line counts and source
diffs, and degrades gracefully on missing exporter fields. Finally,
refresh_dashboard.sh now bundles findings.html, so scheduled
refreshes no longer drop the page from the published site.
2026-07-24 13:52:24 -07:00
..
champions simulation: add evolved router champions and lab notebook 2026-07-24 13:01:06 -07:00
command-center simulation/command-center: redesign site, add findings page 2026-07-24 13:52:24 -07:00
lab simulation/lab: add decisions log 2026-07-24 13:31:17 -07:00
.gitignore simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
codex_lm.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
evaluate.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
evaluate_code.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
export_run.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
gen_scenarios.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
preflight.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
README.md simulation: point README at durable gepa clone and uv 2026-07-24 13:04:18 -07:00
refresh_dashboard.sh simulation/command-center: redesign site, add findings page 2026-07-24 13:52:24 -07:00
run_gepa.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
run_gepa_code.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00
run_gepa_omni.py simulation: add GEPA optimization harness 2026-07-24 13:01:06 -07:00

Routing Optimization Harness

This directory holds the GEPA-based optimization harness for lnd's pathfinding. The core idea: lnd's real routing code (or a candidate replacement algorithm) runs against an in-process simulated Lightning Network with hidden liquidity, an evaluator scores the outcome, and a reflective LLM optimizer (GEPA) proposes improved candidates from the failure feedback.

Components

Piece Where What
Simulator routing/sim_*.go In-memory LN with hidden balances; real pathfinding + mission control run unmodified against it
CLI cmd/routesim params JSON + scenario file in, attempt traces + aggregate JSON out
Candidate slot cmd/routesim/candidate_impl.go A complete routing algorithm behind --router=candidate; swapped per candidate via go build -overlay
Corpus gen_scenarios.py train/val/test scenario files: topology + liquidity seed + payment batch
Evaluators evaluate.py, evaluate_code.py score = success rate small saturating penalties for attempts and fee ppm
Runners run_gepa.py, run_gepa_code.py parameter mode and code mode optimization
Reflection LM codex_lm.py GEPA LM protocol via codex exec headless (default gpt-5.6-sol)
Lab notebook lab/ running log of experiments, results, ideas

Quick start

# Build the simulator binary.
go build -o /tmp/routesim ./cmd/routesim

# Generate a scenario corpus.
python3 simulation/gen_scenarios.py --out /tmp/corpus

# Score the lnd defaults on one example.
cd simulation && ROUTESIM_BIN=/tmp/routesim python3 evaluate.py /tmp/corpus/val/example_000.json

# Compare lnd stack vs the candidate router on a scenario file.
/tmp/routesim --scenarios /tmp/corpus/val/example_000.json --router=lnd    --traces=false
/tmp/routesim --scenarios /tmp/corpus/val/example_000.json --router=candidate --traces=false

# Full optimization runs. gepa must be installed from git main — a
# durable clone lives at ~/codez/gepa; prefer uv for the env:
#   uv venv /tmp/gepa-venv && uv pip install -p /tmp/gepa-venv \
#       "~/codez/gepa[full]"
# Also needs the codex CLI authenticated and OPENAI_API_KEY set.
ROUTESIM_BIN=/tmp/routesim python3 run_gepa.py --corpus /tmp/corpus --name run1 --max-evals 400
ROUTESIM_BIN=/tmp/routesim python3 run_gepa_code.py --corpus /tmp/corpus --name code1

The two optimization modes

  1. Parameter mode (run_gepa.py) — candidate = JSON of the existing heuristic's knobs (estimator choice, apriori/bimodal params, attempt cost, min probability). Validates the loop and tunes the current paradigm.
  2. Code mode (run_gepa_code.py) — candidate = the full Go source of candidate_impl.go, an entire routing algorithm implementing the routing.SimRouter interface. This is the paradigm-free path: the candidate sees only gossip, its own balances, and per-attempt feedback. Compile errors are returned to the proposer as feedback.

Anti-reward-hacking measures

  • Candidate routers receive a SimNetworkView wrapper, not the concrete graph, so hidden balances and liquidity mutation are unreachable.
  • evaluate_code.py rejects candidates using unsafe, reflect, os/exec, network packages, etc.
  • Selection happens on a val split; a sealed test split is only used for final reporting.
  • The source's own channels are rebalanced 50/50 before each batch so scores measure routing skill, not sender funding luck.

Command center

command-center/ holds a static dashboard site (serve with python3 -m http.server from that directory).