Skip to content

observer: genuine exponential divergence reports converged in BOTH channels once saturation clamps — contradicts #422's stated guarantee #861

Description

@InauguralPhysicist

Finding

#422 states, as the boundary of the value channel's known blind spot:

Exponential/geometric divergence (fixed relative step) IS caught; constant-increment or polynomial growth is not.

It is not caught. A textbook geometric runaway saturates at ±1e308 (the "finite by construction" rule), which turns an unbounded trajectory into a fixed point — and both channels then classify it as the strongest rest band.

Reproduction

v0.38.0, release build at 078e759.

define run as:
    z is 2.0
    for i in range of 20:
        z is z * z
    print of ("report=" + (report of z) + " report_value=" + (report_value of z) + " value=" + (str of z))
    print of ("  diverging? " + (str of (diverging of z)) + " converged? " + (str of (converged of z)))
    return 0
run of 0
report=converged report_value=converged value=1e+308
  diverging? 0 converged? 1

Expected: diverging, or at minimum not converged.

Mechanism

z reaches 1e308 after ~6 steps and stays pinned there for the remaining 14, so the dH window fills with zeros in both channels. On the entropy side H(1e308) ≈ 0 < h_low, so the entropy < h_low clause that normally holds converged back from information-rich fixed points is satisfied too. Every clause of the converged definition (PREDICATES.md kind 0) is legitimately met — the window really is quiet and the entropy really is low. The problem is upstream: saturation destroyed the evidence of divergence before the observer sampled it.

This is why report_value does not rescue it. #422 was closed on the reasoning that the relative-step channel catches fixed-relative-step growth; that reasoning holds only while the value can still grow. Past 1e308 the relative step is exactly 0.

Why it matters

README.md:158 sells the trajectory words for "instability alerts". This is the canonical instability, and the runtime reports maximal stability with rc=0. It is also the one failure mode where a wrong answer is most costly: a diverging solver that reports converged returns 1e308 as an answer rather than an error.

Options

  1. Flag the saturation event on the observer slot and let diverging read it (cheapest; makes the clamp visible rather than silent).
  2. Track magnitude alongside dH so an unbounded-growth signal exists independently of step size — this is option (a) from Observer value channel (report_value) is blind to sub-exponential divergence and sub-deadband oscillation (relative-delta normalization) #422, and would also cover the polynomial case Observer value channel (report_value) is blind to sub-exponential divergence and sub-deadband oscillation (relative-delta normalization) #422 left open.
  3. Reconsider the saturation rule itself (filed separately: the associativity/detectability consequences).

Related: #422, #674, #294, #412.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions