store.Retain exists and works. No server option reaches it. So an
operator running sapedbd has no way to say how much history to keep, and the change log
grows for as long as the database is written to.
There is a second, quieter consequence. The too_far_behind refusal — a follower
asking for an entry that has been trimmed away — cannot happen on
sapedbd today at all. Only an embedder calling Retain directly can
produce it. A refusal path that no shipped configuration can reach is a refusal path nobody has
operated.
store.Retain is defined and covered by its own tests.cmd/sapedbd calls it —
measured by grepping the server's option handling for the symbol.Retain from the test itself to
construct the condition, which is what surfaced this.Does it lose data, break a promise on a public surface, or stop somebody installing and running? No — nothing is lost, nothing public is contradicted, and a first-day install runs fine. So it defers, by the same rule everything else defers by.
Said plainly anyway, because the deferral has a shape: this is what bites the first operator in their third week, on a disk that filled while every health signal stayed green. Adding the option later is purely additive and breaks nobody, which is the whole reason it is safe to wait.