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.
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.
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.
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.
| router | drift val | drift test | test success | test attempts |
|---|---|---|---|---|
| lnd production stackDijkstra + mission control, decay now live | 0.213 | 0.203 | 0.388 | 34.5 |
| hand-written seed~300 lines, cheapest path + blacklist | 0.320 | 0.377 | 0.592 | 48.3 |
| hb1evolved, sharp-bimodal specialist | 0.387 | 0.455 | 0.642 | 11.8 |
| mx_c3evolved, generalist — title defended | 0.380 | 0.457 | 0.642 | 12.3 |
| gen2evolved, prose-seeded lineage | 0.383 | 0.456 | 0.642 | 12.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).
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:
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.
what it would mean
A vindication of lnd's rationale from an independent search, with evolved constants instead of hand-picked ones. The interesting artifact would be the half-life it chooses, and how it compares to the shipped one hour.
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.
what it would mean
The best case, and a concrete design proposal for lnd: keep the evidence, age the certainty. That is a change mission control could adopt without giving up its own structure.
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.
what it would mean
That time-decay is overweighted in current designs: evidence-count confidence would be carrying the load even when the evidence really can go stale. Also the least comfortable result to publish, which is a reason to state the criterion in advance.
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.
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.
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.
| router | drift test | hard test | OOD v2 | mainnet |
|---|---|---|---|---|
| lnd production stackDijkstra + mission control | 0.203 | 0.309 | 0.357 | 0.694 |
| hand-written seed~300 lines, cheapest path + blacklist | 0.377 | 0.530 | 0.487 | 0.762 |
| hb1evolved, sharp-bimodal specialist | 0.455 | 0.586 | 0.545 | 0.790 |
| mx_c3evolved, generalist — title defended (exp-020) | 0.457 | 0.583 | 0.581 | 0.791 |
| gen2evolved, prose-seeded, no clock | 0.456 | 0.565 | 0.563 | 0.787 |
| drift1evolved on drift, 1,147 lines, has a clock | 0.417 | 0.580 | 0.544 | 0.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.
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).
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.