The gap (found by the Troncale sweep, verified)
Buffering's release is zeroth-order: a constant amount per tick (min(stock, release_rate)), not a fraction of stock. The Troncale sweep verified (by probe) that this is a hard floor — a Sensing→Modulating loop on the release only sheds downstream mass, it cannot make the STOCK itself drain proportional to its level.
Consequences, all confirmed in troncale-sweep/:
- Exponential (first-order) decay is not expressible.
decay rung shows a straight line to zero, not an exponential.
- Lotka-Volterra / predator-prey is not expressible.
05-coupled-predator-prey runs away — the predator grows unbounded because constant-rate death can't balance a growing inflow.
Proposal
A per-buffer release mode, mirroring the gradient/pushed flow-mode pattern already shipped:
- fixed (current):
release = min(stock, rate) — zeroth-order, constant amount.
- proportional:
release = rate · stock (rate now a fraction/tick, 0..1) — first-order, exponential drain.
This is the conservative-physics analogue of the gradient flow mode, and it's small (one buffer attribute + a branch in circuit.rs step, same shape as the FlowMode work). It must stay conservation-faithful (the ledger already guards this).
Payoff
- Exponential decay becomes atomic → the
decay rung gets a true first-order variant.
- Lotka-Volterra / predator-prey becomes constructible → closes the sweep's sharpest boundary (bucket d? → a), and gives the lens packs a real Ecology/Odum population-dynamics demo.
- First-order kinetics generally (radioactive decay, drug clearance, RC discharge) — the other half of the dynamics vocabulary.
Context: Troncale sweep landed this session (src/sweep.rs); conservation ledger fec49c9; gradient flow-mode 65edd87. On feature/bert-core, main untouched.
The gap (found by the Troncale sweep, verified)
Buffering's release is zeroth-order: a constant amount per tick (min(stock, release_rate)), not a fraction of stock. The Troncale sweep verified (by probe) that this is a hard floor — a Sensing→Modulating loop on the release only sheds downstream mass, it cannot make the STOCK itself drain proportional to its level.Consequences, all confirmed in
troncale-sweep/:decayrung shows a straight line to zero, not an exponential.05-coupled-predator-preyruns away — the predator grows unbounded because constant-rate death can't balance a growing inflow.Proposal
A per-buffer release mode, mirroring the gradient/pushed flow-mode pattern already shipped:
release = min(stock, rate)— zeroth-order, constant amount.release = rate · stock(rate now a fraction/tick, 0..1) — first-order, exponential drain.This is the conservative-physics analogue of the gradient flow mode, and it's small (one buffer attribute + a branch in
circuit.rsstep, same shape as the FlowMode work). It must stay conservation-faithful (the ledger already guards this).Payoff
decayrung gets a true first-order variant.Context: Troncale sweep landed this session (src/sweep.rs); conservation ledger fec49c9; gradient flow-mode 65edd87. On
feature/bert-core, main untouched.