igneum/sim/horizon/finality-and-weight
igneum-labs f99d1905ff Horizon: lane 3 (finality-and-weight) lands: tonight's pause reconstructed, the departure announcement, weight capture priced
The 6 October 2026 pause from the observer rows: 20 keys holding 42.7 percent of the frozen
voter table left in three minutes; locks formed without the hub; the 2/3 rule paused at
checkpoint 6843 (53.1 percent of total) and the frozen table (Q5) held the pause for a window
where rule v2 would have locked after 35 minutes. Candidate rules run in a copy of the finality
simulator (seeds 7, 11, 13): only the departure announcement keeps 0 conflicting locks and ends
the pause under an hour. Weight capture priced at the measured USD 11.7 per GH/s-hour: the veto
0.52 x N for 30 days (USD 4,300 per GH/s of network), a lock alone 2.03 x N. Lock delay by voter
count measured on node 1; the ZK light client and prover attestations costed.

Models: sim/horizon/finality-and-weight/ (finality_horizon.py, weight_capture.py,
lightclient_cost.py, merge_results.py, results/).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 19:57:01 +00:00
..
results Horizon: lane 3 (finality-and-weight) lands: tonight's pause reconstructed, the departure announcement, weight capture priced 2026-10-06 19:57:01 +00:00
finality_horizon.py Horizon: lane 3 (finality-and-weight) lands: tonight's pause reconstructed, the departure announcement, weight capture priced 2026-10-06 19:57:01 +00:00
lightclient_cost.py Horizon: lane 3 (finality-and-weight) lands: tonight's pause reconstructed, the departure announcement, weight capture priced 2026-10-06 19:57:01 +00:00
merge_results.py Horizon: lane 3 (finality-and-weight) lands: tonight's pause reconstructed, the departure announcement, weight capture priced 2026-10-06 19:57:01 +00:00
README.md Horizon: lane 3 (finality-and-weight) lands: tonight's pause reconstructed, the departure announcement, weight capture priced 2026-10-06 19:57:01 +00:00
weight_capture.py Horizon: lane 3 (finality-and-weight) lands: tonight's pause reconstructed, the departure announcement, weight capture priced 2026-10-06 19:57:01 +00:00

sim/horizon/finality-and-weight

Models behind docs/analysis/horizon/finality-and-weight.md (Horizon lane 3, 6 October 2026).

finality_horizon.py

A copy of sim/finality_v2.py as of fud-close 1544c63 (the block reading of Q2, scenario O) plus four candidate rules and three scenarios. The base rule in every candidate is the live one: active denominator under the block reading, floor 1.0 (a lock needs 2/3 of total), each partition side retargets (+daa) and counts only its own blocks (+local), and frozen=True for rule v3 (the frozen table, ledger F21).

Candidates (--cands, comma-separated keys or all):

key rule
v2 sliding table only (the rule before F21)
v3 plus the frozen table (the live rule since N3)
leave (iv) departure announcement: a key's signed leave removes it from every denominator 1 h later
decay1 (i) decaying denominator: a key the view has not seen vote for 1 h loses 0.5 of its denominator weight per hour (gone after 3 h)
decay6 (i) slow decay: 6 h grace, 1/24 per hour (gone after 30 h)
hyst (iii) floor with hysteresis: after 1 h under 2/3 signing the floor drops to 0.85 x 2/3 (sliding and frozen), back after 1 h at or above 2/3
twotier (ii) a provisional lock at 2/3 of the active denominator (block reading, no floor), reported beside the final lock, never certifying

Scenarios: T tonight's departure (34, 45, 50 percent of weight stops mining and signing at once, 31 days), P the partition suite (H, I, E, L3 eclipse, L4 12-day splits), Q silent weight (L1) and acquired keys that leave (Q2, leave candidate only).

Runs behind the analysis (igneum-build-1, Python 3.12, numpy 1.26.4, nice -n 19, one process per candidate, seeds 7, 11, 13; about 25 minutes wall):

for c in v2 v3 leave decay1 decay6 hyst twotier; do
  nice -n 19 python3 finality_horizon.py --scenarios T,P,Q --seeds 7,11,13 --cands $c > out-$c.md 2> err-$c.log &
done

Smoke run on the Mac (under the main checkout's run lock, about one minute):

/Users/joshm/Projects/igneum/tools/lock/with-lock.sh run nice -n 19 python3 finality_horizon.py --quick --scenarios T,P,Q --seeds 7

Outputs of the full run are in results/ (out-<cand>.md, err-<cand>.log with the per-scenario timings); python3 merge_results.py merges them into results/combined.md, the tables section 5 of the analysis quotes.

weight_capture.py

Arithmetic of task 3 (rented hash against the 30-day window at the measured USD 11.7 per GH/s-hour; bought keys). python3 weight_capture.py.

lightclient_cost.py

Arithmetic of task 4 (bytes and verification time of a year of certificates by voter count; the ZK light client's per-checkpoint cycles, approximate). python3 lightclient_cost.py.

obs-query.mjs (not in this directory)

The observer rows of tonight's pause were read with read-only SELECTs against the observer's Neon database (the script lived in the session scratchpad; it is fetch to the Neon SQL endpoint with DATABASE_URL from ~/.config/igneum/env, refusing anything but SELECT). The queries are quoted in the analysis document.