fix(cauchy): slow divergers truncate honestly — valve arms below cycle_cutoff_time and watches the loop floor - #355
Merged
ofloveandhate merged 1 commit intoJul 16, 2026
Conversation
…le_cutoff_time and watches the loop floor Two composing pieces, each necessary, neither sufficient alone: 1. Arm the security valve below cycle_cutoff_time (B1 CycleTimeCutoff semantics, manual E.5.9). A slowly-diverging path (fractional-order blowup) carries significant pole mass at every radius, so it is never pole-mass-in-zone and the valve never armed -- it crawled to the tracker's far-larger truncation threshold (measured: a t^(-1/3) diverger took ~117k extra steps over 3 more decades of |t| at up to 70 digits). Valve ONLY, deliberately not acceptance: forcing the zone there would re-open the junk-success hole (a Laurent pole's stationary finite mean would be accepted below the cutoff). 2. The valve watches the STRONGER of the endpoint norm and the loop FLOOR (min dehomogenized norm over the Cauchy loop samples). Arming alone was proven insufficient by the regression test: the mean is structurally blind to fractional-pole divergers -- around a closed loop the branches of t^(-p/q) cancel, so the mean sits near 0 while every sample is at ~r^(-p/q). The floor exceeds max_norm only when the ENTIRE loop is beyond it, so a transient single-sample spike (the cyclic-6 hazard that forbade watching samples directly, 156 -> 153) cannot lift it. Named regression test: the x^2*t - 1 diverger (x = t^(-1/2), exactly the branch-cancellation case) returns SecurityMaxNormReached promptly instead of dying at the tracker's threshold ~12 decades of |t| later. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Finishes the Cauchy divergent-path truncation arc: slowly-diverging paths (fractional-order blowup, e.g. x = t^(-1/2) from x²t−1) now truncate honestly at the security valve instead of crawling to the tracker's far-larger thresholds. Measured on a t^(-1/3) diverger before this work: ~117k extra steps over 3 more decades of |t| at up to 70 digits of precision.
Two composing pieces, each necessary and neither sufficient:
1. Arm the valve below
cycle_cutoff_time(B1's CycleTimeCutoff semantics, manual E.5.9)A slow diverger carries significant pole mass at every radius, so it is never pole-mass-in-zone and the security valve never armed — the divergence bailout was unreachable for exactly the paths that need it. Below the cutoff the valve now arms unconditionally. Applied to the valve ONLY, deliberately not to acceptance: forcing the zone there would re-open the junk-success hole (a Laurent pole's stationary finite mean would be accepted once below the cutoff); pole junk still runs to its honest non-Success terminal. A genuinely convergent path's mean has long stabilized by the cutoff, so arming cannot reintroduce the cyclic-6 false truncations.
2. The valve watches the loop FLOOR, not just the mean
Arming alone was proven insufficient by the (deliberately red) regression test: the valve watched the Cauchy MEAN, and around a closed loop the branches of t^(-p/q) cancel — the mean sits near 0 while every loop sample has norm ~r^(-p/q). Mean-watching is structurally blind to fractional-pole divergers.
The watched quantity is now the stronger of the extrapolated endpoint's dehomogenized norm (still the earliest signal for a clean infinite endpoint) and the loop floor — the minimum dehomogenized norm over the Cauchy loop samples. The floor exceeds
max_normonly when the entire loop is beyond it. This is safe where watching samples directly was not (any single sample transiently spiking truncated finite cyclic-6 paths, 156 → 153, which is why sample-watching was removed): a transient spike lifts the max, never the min.Tests
slow_diverger_hits_security_max_norm_below_cycle_cutoff(previously red by design): the x²t−1 diverger now returnsSecurityMaxNormReachedpromptly instead of dying at the tracker's threshold after ~12 decades of |t|.🤖 Generated with Claude Code