Verdict in/exp-008/25 July 2026

The environment strikes back

The evolved champions carry no clock, and we always suspected that was partly our simulator's fault: hidden liquidity only moved when our own payments moved it, so evidence never went stale. It does now — and the answer came back in two halves. Time-awareness re-evolved, on a 35-minute half-life nobody asked for. It still lost every tier, drift included.

  1. 01What the simulator gained
  2. 02The baseline, before any evolution
  3. 03Three outcomes, written before the run
  4. 04The verdict: a clock evolved, and it still lost
  5. 05What it settles, and what it does not
01

What the simulator gained

Two additions, both aimed at one honest weakness: a world where knowledge never expires is a world that flatters routers which never forget.

10min
of simulated time between payments, one second per attempt — so lnd's decay half-lives operate over spans that mean something
candidates can read view.Now()
≥10
background senders per gap, scaled to network size, each a naive fee-optimising payer moving liquidity we never see
amounts log-uniform, dust to half a channel
0.42was 0.59
what the champions now average across validation and test, down from 0.59 on the static hard corpus — drift costs everyone
headroom the evolution run did not claim

The clock

The simulator previously had no notion of time at all. Attempts happened in sequence and nothing aged, which quietly disabled half of lnd's design: PenaltyHalfLife and the bimodal estimator's seven-day liquidity relaxation are functions of elapsed time, and elapsed time was always zero. lnd's mission control now runs on a virtual clock that advances ten simulated minutes between payments and one second per attempt, so its decay genuinely operates. Candidates get the same clock through view.Now() — available, not suggested.

The traffic

Between our payments, a seeded population of background senders pays each other: naive fee-optimising routers, at least ten per gap or one per ten nodes, with amounts drawn log-uniformly from roughly dust up to half a channel. Their transfers move hidden balances under per-channel conservation, so liquidity sloshes without being created. Crucially the process is seeded and replayed, so lnd, the seed router and every candidate face the identical sequence of exogenous events — the drift is part of the scenario, not a source of noise between contestants.

The effect on the difficulty is immediate. On the static hard corpus the champions averaged about 0.59 across validation and test; on the drift corpus they average about 0.42, with attempts per payment up from nine or ten to around twelve. Nobody is comfortable here, which is the point: a harder environment is the only thing that can pay for a better algorithm.

the caveat this experiment exists to remove

Every result on the findings page was produced in a world without drift, and the champions' complete absence of time logic was partly an artifact of that world. Hard evidence bounds cannot go stale if nothing changes them, so evolution was right about the environment it was given — which is not the same as being right about mainnet. This page is the test of exactly that, and §04 is the answer.

02

The baseline, before any evolution

Five routers, none of which has ever seen drift, scored on the new corpus. Two findings fell out before the evolution run even started.

Composite objective on the drift corpus Fig. 1 · higher is better
evolved by GEPA baseline (lnd, or hand-written)
Note the axis: it tops out at 0.5, where the static-corpus figures ran to 0.8. Everything got harder. The ordering did not change — the three evolved routers cluster at the top of both splits, the hand-written seed sits in the middle, and lnd's production stack is last even though this is the first environment where its decay actually runs.
exp-008 baseline · corpus-drift, 8 validation and 8 held-out test files
router drift val drift test test success test attempts
lnd production stackDijkstra + mission control, decay now live 0.2130.203 0.38834.5
hand-written seed~300 lines, cheapest path + blacklist 0.3200.377 0.59248.3
hb1evolved, sharp-bimodal specialist 0.3870.455 0.64211.8
mx_c3evolved, generalist — title defended 0.3800.457 0.64212.3
gen2evolved, prose-seeded lineage 0.3830.456 0.64212.7

Finding one: hard bounds degrade gracefully

The prediction worth taking seriously was that interval beliefs would break under drift. A lowerOK bound is an assertion that an amount definitely passes; once strangers move the balance, that assertion can simply be false, and a router that treats it as proven has no mechanism for doubt.

It does not break. The three evolved routers hold roughly 2.2× lnd's objective on the held-out split at a third of the attempts — 0.456 against 0.203, twelve attempts against 34.5. The reason is asymmetry of cost: a stale bound that is too optimistic costs one failed attempt, after which the evidence updates and the interval narrows again. A stale bound is not a wrong model, it is one retry.

Finding two: lnd's decay does not close the gap

This is the sharper result. The obvious defence of mission control's time-decayed penalties was that our simulator never let them work. Now they work, over ten-minute gaps against liquidity that genuinely moved, and the production stack is still last — 0.203 on the held-out split, at 34.5 attempts per payment for a 0.388 success rate.

So decay as lnd implements it is not the missing ingredient. Whatever drift-awareness helps in this environment has to look different from a scalar pair-penalty healing on a one-hour half-life. Note also what the champions' 0.642 success at twelve attempts says about the ceiling: drift costs everyone success, and there is a lot of unclaimed room between 0.456 and a router that handles staleness deliberately. That room is still unclaimed: the router bred here to handle staleness deliberately reached 0.417 (§04).

03

Three outcomes, written before the run

code_drift1: pure GEPA, codex/gpt-5.6-sol reflection, small seed plus the insights prompt, 400 evaluations on corpus-drift. This ledger was published while it was still running; the flags are how each row resolved.

The setup deliberately did not prescribe the answer. The reflection prompt described drift neutrally — payments happen, time passes, other senders exist — and flagged the hard-bounds insight as something learned in a static world, a caveat rather than an instruction. Nothing told the model to add decay, and nothing told it not to. The success criterion was beating the champions on the held-out drift test; the interesting part came after, when the winner was read for any function of view.Now() or of evidence age.

Three outcomes, all of them worth having. The run delivered the mechanism of the second and the verdict of the third:

Decayre-emerges

what we would see

Evolved candidates that discount old evidence on a clock, in some form — a half-life on confidence, an expiry on bounds, a penalty that heals.

this happened · confidence halves every 35 virtual minutes, hard bounds expire outright at 20 — evolved constants against lnd's shipped hour
Something betteremerges

what we would see

Not decay but a different treatment of staleness: intervals that widen with elapsed time, confidence that erodes while the bound itself is kept, re-probing scheduled by age rather than by failure.

the form, not the payoff · what evolved is exactly this — keep the judgment, fade the trust in it, slide back toward the prior — and it still lost every tier
Intervalsstill win untouched

what we would see

The winner improves on the champions without referencing time at all — better attribution, better retries, better splitting, and still no clock.

the verdict, by another route · the winner did reference time, and did not improve on the champions — a time-less router (gen2, 0.456) still leads the drift tier

The result did not land on one row, and rounding it to one would be the convenient version. Mechanically it is the first row, in the shape the second asked for, with the third row's verdict. Selection under genuine staleness pressure did invent decay — of confidence in evidence rather than of penalties — and the router carrying it still finished behind three time-less ancestors on the corpus it was bred for.

what this run cannot settle

One drift model, and a naive one: background senders optimise fees and nothing else, there is no fee-market feedback, no channel opens or closes, and no correlation between their traffic and ours. The corpus is eight validation and eight test files from a single seed. A router that wins here has beaten this drift process, and the next honest objection is that real mainnet flow is bursty and correlated in ways this model does not capture.

The verdict section of exp-008-drift-evolution.md is now written, and it is what follows. The run's own telemetry — score curve, lineage, per-candidate diffs — is on the overview page.

04

The verdict: a clock evolved, and it still lost

code_drift1 spent all 400 evaluations, accepted 51 candidates and exited clean. Its winner, drift1, is the first evolved router in this project that reads the time — and fourth of six on the corpus it was bred for.

35min
half-life on confidence in a belief: conf·exp(−ln2·age/35min), an evolved constant against lnd's shipped hour
payments are ten virtual minutes apart
20min
after which lowerOK and upperFail are zeroed outright — proven bounds demoted to hints
an expiry, not a fade
0.417vs 0.456
drift1 on the held-out drift test against gen2, which never saw drift, on the same seed and the same 400-eval budget
the drift-bred router lost on drift

What the clock does

drift1 keeps its lineage's belief state — per-directed-channel lowerOK and upperFail bounds with a point estimate between them — and adds one field: updatedAt. Everything time-aware follows from that stamp. Confidence in a belief decays exponentially on a 35-minute half-life, so a fresh observation still carries 82% of its weight at the next payment and about two-thirds by the third. Below a floor of 0.01 the belief is not weak, it is gone.

Twenty minutes in, the two hard bounds are zeroed outright. The comment above that branch is the design in one line: bounds become hints rather than permanent facts after substantial age. And the probability model reads conf·learned + (1−conf)·prior — fresh evidence dominates, aging evidence slides back toward the rediscovered bimodal prior, dead evidence leaves the prior alone.

Why this is not lnd's decay

lnd fades a judgment: a failure earns a pair-penalty of full weight, and getWeight relaxes it on a one-hour half-life back toward an apriori scalar, while successes never decay at all. drift1 keeps the judgment and fades its trust in the observation behind it, symmetrically for passes and failures, recovering toward a prior it learned itself. That is a posterior collapsing toward a prior, not a penalty on a timer. Nothing in the prompt suggested either form.

How fast an old observation stops counting Fig. 2 · virtual minutes
scroll the chart sideways →
drift1 — confidence in the evidence, 35-min half-life lnd — weight on a failure penalty, 1-hour half-life
The two curves are not the same quantity, which is the point: lnd's line is how much a failure still hurts, drift1's is how much an observation is still believed. Drawn on one axis because both answer “how long does an old look at this channel keep governing the route”. drift1 forgets faster than lnd, expires its hard bounds at twenty minutes on top of that, and discards the belief entirely once confidence falls under 0.01 — roughly four hours idle, or twenty payments at this corpus's ten-minute gap.
Held-out drift test, after evolution Fig. 3 · higher is better
evolved by GEPA baseline (lnd, or hand-written)
The same axis as Fig. 1, so the bars are directly comparable. drift1 is the only router here that was evolved on drift, and it lands between the hand-written seed and the three static-bred evolved routers. Nothing moved at the top: mx_c3 still leads the tier at 0.457, and the ordering of Fig. 1 survives the run that was meant to overturn it.
exp-008 verdict · composite objective, four held-out tiers, all sealed from the run
router drift test hard test OOD v2 mainnet
lnd production stackDijkstra + mission control 0.2030.309 0.3570.694
hand-written seed~300 lines, cheapest path + blacklist 0.3770.530 0.4870.762
hb1evolved, sharp-bimodal specialist 0.4550.586 0.5450.790
mx_c3evolved, generalist — title defended (exp-020) 0.4570.583 0.5810.791
gen2evolved, prose-seeded, no clock 0.4560.565 0.5630.787
drift1evolved on drift, 1,147 lines, has a clock 0.4170.580 0.5440.790

The decisive cut: drift1 against gen2

Comparing drift1 to the champions is a little unfair — they had 900 evaluations across two runs, it had 400. The comparison that is fair is gen2. Same small seed, same insights-in-the-prompt design, same 400-evaluation budget, and gen2 never saw drift, because the virtual clock did not exist when it was bred. The static-bred, time-less router scores 0.456 on the drift corpus. The drift-bred, time-aware one scores 0.417. Whatever the clock bought, it did not cover what the mutations spent building it.

The static tiers say the same thing from the other direction. drift1 holds 0.580 on the sealed hard test and 0.790 on the mainnet snapshot at 2.4 attempts per payment — champion-class, 8× better than lnd's 19.8 on the perfect failure channel these tiers use (exp-019 retired the ratio). So the time machinery cost it nothing where nothing drifts, and it bought nothing where things do. On drift itself it settles 60% of payments at 12.2 attempts, against mx_c3's 64% at 12.3.

05

What it settles, and what it does not

The open question from exp-006 onward was whether the champions' timelessness was a design property or a simulator artifact. At this level of churn, it is a design property.

lnd's rationale is validated. Its necessity is not.

Stale knowledge should lose force — an independent search that was never told about decay invented something to that effect the moment its evidence could actually go stale, and that mechanism won selection inside its own lineage rather than being carried along neutrally. The intuition behind PenaltyHalfLife is real, and it is now confirmed from the outside.

What is not confirmed is that a router needs it. Both decaying designs on this page lose to routers that simply keep their evidence: lnd finishes last at 0.203 with its half-lives finally operating, and drift1 finishes behind three time-less ancestors. Decay buys insurance against a cost the interval design barely pays.

the asymmetry that decides it

When drift1 zeroes a bound at twenty minutes it throws away information that is usually still approximately right, and it pays for that on every route it prices afterwards. hb1 and mx_c3 keep the bound, are occasionally wrong, and pay one extra attempt when they are — an attempt that also refreshes the belief. The objective charges 0.01 per extra attempt. That is a small bill next to planning against a prior when you had a measurement.

Champions of record: unchanged, now on four tiers

hb1 and mx_c3 stay the champions, with mx_c3 leading or tying every tier except the hard test. drift1 is kept as source and written up, not promoted — the same disposition as the gen2 winner. It is the only artifact in this project where an evolutionary search invented decay on its own, and you can see exactly which form it chose.

the caveats that survive the verdict

One drift intensity. Ten-minute gaps and roughly one background payment per ten nodes per gap. One traffic model: naive fee-optimising senders, no fee market, no bursts, no correlation with our own flow. One budget: 400 evaluations against a champion lineage that accumulated its Pareto route search, bidirectional evidence and shard ladders over 900. drift1's deficit is plausibly a budget deficit as much as a mechanism deficit.

So the honest claim is narrow: time logic did not pay for itself in this environment at this budget, not that it can never pay. A heavier churn rate, bursty or adversarial traffic, or a longer run could all tip it back.

next: exp-010, splitting pressure

The environment lever worked once — drift is genuinely harder, and everyone lost ground on it — but it did not change the ranking, so the next experiment pushes on the other unexercised axis. The champions price their shards one route at a time; joint route-set planning, Pickhardt-style min-cost flow across shards, has never been under selection pressure because the corpus rarely forces a split. exp-010 makes it force one, on a corpus of unequal parallel corridors.

It has since closed, and it rhymes with this page: three separate proposer lineages all evolved joint route-set planning, the deepest of them tied a champion on the corpus it was bred for, and none of them beat mx_c3 across the held-out tiers. The environment elicited the mechanism again; the champions still stand (the splitting verdict).

Its follow-up, exp-010b, went after the “one drift intensity” caveat above from the other side: traffic now moves on every attempt boundary rather than only between payments, and shards hold liquidity until the whole payment settles, so a long reactive ladder pays for the churn it sits through. That reordered the baseline — lnd fell to last at 105 attempts per payment — and the drift-bred mechanism it elicited is the one this page would predict: an evolved router that relaxes its hard bounds after repeated failure so a moving network can be re-probed. It burned 57 attempts per payment doing it, which is the same asymmetry as above with the sign flipped (the atomic verdict).

read next
Findings: what the evolved routers kept, dropped, and invented

The settled results behind this experiment — mainnet validation, the paradigm-over-parameters pivot, an anatomy of the evolved algorithms against lnd's, and the paradigm ceiling that made changing the environment the only move left.