9645 commits in all time Apr 22, 2026 16:12 – Jul 21, 2026 16:12 UTC
iglosiggio algokit-cli
Merge c991e0ffc2e438430df7838ea07f66185bd70ce3 into b3769a2c96f58b8be8f1e6e982eac5ad4511f644
Git Commit 368ddd59 Branch pull/722/merge Document 2/2 ++ 2 --
iglosiggio algokit-cli
chore: Fix `algokit goal` links
Git Commit c991e0ff Branch fix-algokit-goal-links Document 2/2 ++ 2 --
cce sortition
Merge e59c909441f3c52bc371ed3d9c0af55b56a1209e into 9ffbb4eb8f7b0acb233c9e6dcc5d1fa030350a94
Git Commit 83ec9ec7 Branch pull/8/merge Document 4/1,120 ++ 1 --
cce sortition
document frozen-tail risk under consensus bounds
Replace the unreachable-tail wording with the accepted probabilistic bound and its no-grinding assumption. Pin current go-algorand committee behavior at the base minimum, payout eligibility landmarks, mainnet supply ceiling, and original report while showing that Boost terminates at finite double-CDF boundaries.
Git Commit e59c9094 Branch sortition-f128 Document 2/92 ++ 33 --
cce sortition
short-circuit the walk when the accumulated CDF freezes
pmf(0) = (1-p)^money amplifies the 2^-129 rounding of 1-p by up to the trial count, and pmf(0) scales every PMF term, so the accumulated CDF settles at a plateau that can sit ~money*2^-129 below 1 (~2^-78 at supply-sized money). A digest ratio between the plateau and 1.0 (e.g. 2^256-1-2^176, ratio ~1-2^-80, with money == total == 2e15) sits above every boundary without rounding to 1.0, and the walk previously ground through all 2e15 no-op iterations -- hours of CPU on the consensus path -- before returning money.

Detect the freeze instead: once an add cannot move cum while pmf strictly shrank, no later term can move it either (the rounded step factor is < 1 and only decreases; round-to-nearest is monotone), so the walk returns money immediately -- the identical result the plain walk reaches, in O(binomial tail) time. FuzzSelectF128 continuously validates the short-circuit against the oracle's full walk, and TestSelectF128FrozenTailReturnsMoney pins the supply-sized case for both the 2^-80 digest and ratio exactly 1.0.

The count in the stuck sliver stays DEFINED as money: reaching it requires a VRF hash within ~2^-78 of the maximum, which cannot be ground for, so the 192-bit-pmf(0) variant that would return the exact binomial-tail crossing there (parked on sortition-f128-pmf192) is not worth its added audit surface under current consensus parameters. Documented in the SelectF128 tail-edge note.
Git Commit 6b0359c0 Branch sortition-f128 Document 3/77 ++ 5 --
github go-algorand
add Go Benchmark (go) benchmark result for 83f620a1fc9bb20d7fa3b3958e28270a7492c224
Git Commit 28cc95a5 Branch gh-pages Document 1/445 ++ 1 --
algojohnlee go-algorand
Merge pull request #6667 from onetechnical/relstable4.7.4-remerge
Git Commit 83f620a1 Branch master Document 9/415 ++ 60 --
cusma specs
Merge b36dc971db89cdd8184267861ccf483eef511412 into 71e152527831ea860cfe66888704ff5b84373609
Git Commit 5a1cab31 Branch pull/293/merge Document 7/185 ++ 43 --
cusma specs
docs: clarify pq scheme fee surcharge for heartbeat and state proof transactions
Git Commit b36dc971 Branch pq-account Document 1/5 ++ 2 --
Merge ca77809893ea99eca062cdff9bfa65b22cc4e60e into a3679c833fbc334d3b47734db849a51ffc8a87f1
Git Commit 37257576 Branch pull/888/merge Document 1/1 ++ 1 --
sambitsargam algo-voting
Merge pull request #889 from sambitsargam/dependabot/npm_and_yarn/typescript-eslint/parser-tw-8.65.0
build(deps-dev): update @typescript-eslint/parser requirement from ^8.64.0 to ^8.65.0
Git Commit a3679c83 Branch main Document 1/2 ++ 2 --
sambitsargam algo-voting
Merge branch 'main' into dependabot/npm_and_yarn/typescript-eslint/parser-tw-8.65.0
Git Commit 9a6bb4f0 Branch main Document No file changes
sambitsargam algo-voting
Merge pull request #890 from sambitsargam/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-tw-8.65.0
build(deps-dev): update @typescript-eslint/eslint-plugin requirement from ^8.63.0 to ^8.65.0
Git Commit 44d8799b Branch main Document 1/1 ++ 1 --
cce sortition
fix CDF plateau at large money: 192-bit pmf(0), freeze short-circuit
Raising 1-p to the money-th power amplifies the base's single 2^-129 rounding by the trial count, so for supply-sized money (~2^51) pmf(0) -- a common factor of every PMF term -- carried ~2^-78 of error and the accumulated CDF plateaued that far below 1. A valid digest with ratio above the plateau (e.g. 2^256-1-2^176, ratio ~1-2^-80, with money == total == 2e15) then sat above every boundary: the walk ground through all 2e15 no-op iterations (hours) and returned money where the exact crossing is j=1913. The band of such digests was ~money*2^-129, 2^51 times the documented 2^-129 edge; the differential fuzz could not see it because the oracle computed the identical plateau.

Fix in two parts. pmf(0) is now computed by a minimal 192-bit-mantissa float (f192: quotient, multiply, power, one rounding to f128) whose 64 guard bits absorb the amplification (money*2^-193 < 2^-129); the oracle mirrors it at prec 192. And the walk now detects a frozen CDF -- an add that cannot move cum while pmf strictly shrinks proves no later term can either -- and returns money immediately, the same result as the plain walk without the up-to-money no-op iterations.

The plateau now sits within ~(walk length)*2^-129 of 1, so the residual stuck band is ~2^-116 and returns money instantly. New coverage: TestF192PowVsBig and FuzzF192Pow (f192 vs 192-bit big.Float, incl. supply-sized exponents), TestSelectF128LargeMoneyTail (the 2^-80 digest now yields 1913, matching an independent 512-bit computation), and TestSelectF128FrozenPlateauReturnsMoney (derives a digest inside the stuck band from the observed plateau and requires an immediate money return). The more accurate pmf(0) moved the hair-trigger ratio==1.0 pins: the money=1954 early stop is now j=4 (was 3) and its fall-through twin is total=...960 (was ...000); the all-0xff digest at money == total == supply now stops at j=2012. BenchmarkSelectF128: 272ns/op (was 170ns; the 192-bit power costs ~100ns), still 1 alloc and faster than the 355ns cgo/Boost path.
Git Commit 2375ec3d Branch sortition-f128-pmf192 Document 3/347 ++ 39 --
cce sortition
clarify tail-edge divergence wording in SelectF128 doc
The compressed 'as large as money vs. a few' read as a typo (money is the parameter, not a quantity of currency). Spell it out: at a near-maximum digest one implementation may stop within a few steps of the binomial tail while the other returns the full trial count money.
Git Commit eec84b81 Branch sortition-f128 Document 1/6 ++ 4 --
Merge 976eca01ad7caac103441e1956794180da3cea42 into 9bc334a8819e21a61e5717e04c07dec184a7c579
Git Commit 33d16c58 Branch pull/73/merge Document 2/201 ++ 329 --
chore(deps): update semantic-release monorepo
Git Commit 976eca01 Branch renovate/major-semantic-release-monorepo Document 2/201 ++ 329 --
github go-algorand
add Go Benchmark (go) benchmark result for 48c92817b7d125afefd4bcb0c033bcffabc09bad
Git Commit 69538e0c Branch gh-pages Document 1/445 ++ 1 --
algojohnlee go-algorand
Merge pull request #6668 from algorand/relbeta4.7.4
Git Commit bdff8de5 Branch rel/beta Document 11/417 ++ 62 --
onetechnical go-algorand
Merge 697cc227a449966bbdee7f7b67435e0e01ad123a into 48c92817b7d125afefd4bcb0c033bcffabc09bad
Git Commit f712e1bc Branch pull/6667/merge Document 9/415 ++ 60 --
cce go-algorand
falcon: sign ToBeHashed, not Hashed (#6669)
Git Commit 48c92817 Branch master Document 3/65 ++ 13 --
cce sortition
Merge 0fdbb9de7efd338de8bdf49d43cf7c5df97fb083 into 9ffbb4eb8f7b0acb233c9e6dcc5d1fa030350a94
Git Commit 0774d8bb Branch pull/8/merge Document 4/987 ++ 1 --
cce sortition
correct ratio==1.0 docs: both walk outcomes occur; pin both branches
At ratio exactly 1.0 (only the all-0xff digest IS exactly 1.0; the rest of the top 2^-129 digest interval rounds up to it), the accumulated f128 CDF reaches exactly 1.0 only for some distributions, decided at ulp granularity: money=1954/exp=1500 stops at j=3 with total=1_999_999_999_999_964 but falls through with total=2_000_000_000_000_000, 36 more. Other distributions never get within half an ulp of 1.0 (p=1/2 with money=100 leaves cdf(99) = 1 - 2^-100, 2^28 ulps short) and the walk runs to money -- which, with the rounded threshold fixed at 1.0, is also the exact-CDF count, since the exact CDF is < 1 for every j < money. The previous text presented the early stop as the behavior and money as hypothetical; this had it backwards.

Reframe the f128 round-to-nearest rationale accordingly: RNE is required because every result must be the correctly-rounded 128-bit value to stay bit-identical to the 128-bit big.Float oracle; the ratio==1.0 edge is a consequence, not the requirement. Boost's double CDF -- evaluated independently per j via ibetac rather than accumulated -- can also saturate to 1.0 on its far coarser grid, potentially at a different (typically earlier) j, so old-vs-new divergence at this edge can be as large as money vs. a few.

TestSelectF128RatioExactlyOne now pins both branches and both boundaries: the hair-trigger total pair (j=3 vs money), the provably-stuck money=100/p=1/2 case, and the exact tie money=129/p=1/2 where true cdf(128) = 1 - 2^-129 sits precisely on the rounding midpoint and ties-to-even rounds it up to 1.0 (stops at j=128). The rounds-to-1.0 digest is constructed with exactly 129 leading one bits, the minimal such digest.
Git Commit 0fdbb9de Branch sortition-f128 Document 3/61 ++ 26 --
cce sortition
update comment
Git Commit 9902d6de Branch sortition-f128 Document 1/6 ++ 7 --
cce sortition
take expectedSize as uint64 in SelectF128
The committee size is a uint64 in the protocol (CommitteeSize(proto)); the float64 parameter only mirrored the C++ double signature and forced casts at every caller. Passing the exact integers lets each PMF-recurrence constant be a SINGLE round-to-nearest-even f128 divide of exact values -- q = (total-expected)/total and pq = expected/(total-expected) -- instead of stacking roundings through an intermediate float64 p (float64(totalMoney) is itself inexact above 2^53). Invalid probabilities (NaN/Inf/negative/fractional) become unrepresentable and p >= 1 is an exact integer comparison, so the differential fuzz no longer needs any input filtering.

f128FromFloat64 loses its only caller and is removed; sub and its norm192s helper likewise lose theirs (1-p is now a direct divide of exact integers, one rounding instead of two) and are removed along with their fuzz checks. The oracle mirrors the integer-quotient constants. Boost agreement is unchanged (200000/200000); the fuzz explored the new signature for 8.1M execs clean. Setup now does two divs instead of convert+sub+div: ~170ns/op (was ~159), still 1 alloc.
Git Commit da28510a Branch sortition-f128 Document 3/68 ++ 154 --