From c3de1ea9c9b203cca7cafee7258935ae89f631bc Mon Sep 17 00:00:00 2001 From: Defenwycke Date: Sat, 5 Sep 2026 22:53:32 +0100 Subject: [PATCH 1/2] Ghost calibration MEASURED on hardware: straggler 1.462x -> 1.189x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two L40S, block 962,000, 16 chunks, real GPU proving, one arm per box, differing only in the four HAZYNC_COST_* values. The refit clears the <=1.35 threshold BUILDS.md 4.2 states for the fourth card. ⛔ It first measured 1.567x — WORSE — and I reported that. It was ONE chunk: 31 of 32 chunk timings across both boxes sit at 2.4-3.0 s/segment, and hz-b chunk 1 came in at 4.89 (171 s for 35 segments). Re-run twice: 94 s both times, 2.69 s/seg. It never reproduced. Two hypotheses were refuted on the way, which is the useful part: - the segment straggler said the OPPOSITE (57 -> 49 max segments), which is what flagged the wall-clock number as suspect rather than the constants - "the boxes differ in speed" is true but IRRELEVANT: an identical 33-segment chunk is 87 s vs 90 s, and a straggler is a ratio, so box speed cancels out of it entirely ⇒ Re-run an outlier before believing it, and prefer the quantised metric: proving bills in whole segments, not cycles. Claude-Session: https://claude.ai/code/session_017fQ8BAyHyzxBf3bvdmckVL --- docs/GHOST_NEXT_BUILD.md | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/GHOST_NEXT_BUILD.md b/docs/GHOST_NEXT_BUILD.md index 32a4f11..0f4b57f 100644 --- a/docs/GHOST_NEXT_BUILD.md +++ b/docs/GHOST_NEXT_BUILD.md @@ -53,6 +53,48 @@ The packer balances its own model perfectly; that is what makes a wrong model in and block 741000 carries **2 Schnorr verifies out of 723** — so it cannot inform the curve split at all, and the curve split is the dimension Ghost most needs right. +## ✅ MEASURED ON HARDWARE 2026-09-05 — the refit is worth 1.462x → 1.189x + +Two L40S, block 962,000, 16 chunks, **real GPU proving**. Same guest, same block, one box per arm, +differing only in the four `HAZYNC_COST_*` values: + +| arm | straggler | max | mean | +|---|---|---|---| +| shipped defaults | **1.462x** | 149 s | 102 s | +| refit | **1.189x** | 124 s | 104 s | + +That clears the ≤1.35 threshold §4.2 of `BUILDS.md` states for the fourth card. ⚠ I have not +re-derived the card arithmetic itself, so read this as "the straggler target is met", not as a +card count. + +Refit constants, fitted on block 965,500 (7.7% Schnorr), intercept forced to zero: + +``` +HAZYNC_COST_EC_OP=85636 HAZYNC_COST_SCHNORR_OP=168542 +HAZYNC_COST_INPUT_BYTE=2 HAZYNC_COST_INPUT_BASE=53162 Schnorr:ECDSA = 1.97x +``` + +### ⛔ How this nearly came out backwards + +The run first measured **1.567x — WORSE than doing nothing** — and that was reported. It was one +chunk. Across 32 chunk timings on two boxes every measurement sits at **2.4–3.0 s/segment**; hz-b +chunk 1 came in at **4.89 s/segment** (171 s for 35 segments). Re-run twice: **94 s, 94 s, 2.69 +s/segment** both times. The 171 s never reproduced. + +Three checks were needed to get there, and two of them refuted a hypothesis rather than confirming it: + +1. **The segment straggler said the opposite** — 57 → 49 max segments, i.e. the refit was *better* + by the machine-independent metric. That is what said the wall-clock number was wrong. +2. **"The boxes differ in speed"** — plausible, and *false as an explanation*: an identical + 33-segment chunk runs 87 s on hz-a and 90 s on hz-b, only 3.4% apart, **and a straggler is a + ratio, so box speed cancels out of it entirely.** +3. **Wall time is proportional to segments** — 2.4–3.0 s/seg across 31 of 32 samples — which + isolated the 32nd as a transient rather than a property of the partition. + +⇒ A single un-replicated chunk timing was enough to invert the conclusion. Re-run an outlier before +believing it, and prefer the quantised metric (segments) over the continuous one (cycles): proving +bills in whole segments. + ## The work, in order 1. **Profile the Ghost arm on a taproot-bearing block.** `HAZYNC_PROFILE_EXEC=1`, 16 chunks, execute From 25dd403f194d3ee1527b84cc07b9128f1743a87e Mon Sep 17 00:00:00 2001 From: Defenwycke Date: Sun, 6 Sep 2026 22:41:50 +0100 Subject: [PATCH 2/2] =?UTF-8?q?BUILDS.md=20=C2=A73:=20Ghost=20DOES=20have?= =?UTF-8?q?=20a=20calibration=20=E2=80=94=20correct=20the=20claim=20this?= =?UTF-8?q?=20branch=20refutes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The line 'Ghost needs its own calibration; it does not have one' was written before the 2026-09-05 run and never updated. This branch IS that calibration, so the doc contradicted its own evidence -- and the stale line had already been quoted as the measured reason Ghost cannot be a shipping channel (hazync#225). Records Ghost's constants, its measured straggler 1.462 -> 1.189, and the warning that Core's and Ghost's fits do not transfer in either direction. The channel decision is unchanged: Ghost stays experimental because it is substitution (broad), which is a fidelity judgement and needs no performance excuse -- its straggler is in fact better than Core's 1.210. Claude-Session: https://claude.ai/code/session_017fQ8BAyHyzxBf3bvdmckVL --- docs/BUILDS.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/BUILDS.md b/docs/BUILDS.md index 252c052..b6f6dc1 100644 --- a/docs/BUILDS.md +++ b/docs/BUILDS.md @@ -111,8 +111,28 @@ backend arm's derived baseline is 1.469 (§2, and the value `scripts/gpu-benchma MEASURED default-constants straggler is **1.438** (§1). The regression is real on any of the three — they are quoted here so a reader is not left reconciling two numbers for one claim. The likely cause is rescaling Ghost's Schnorr constant by the old 13.77x ECDSA ratio, when the hint removes decompression from *both* curves — taproot key-path spends -call `lift_x` too — so that ratio should have narrowed. **Ghost needs its own calibration; it does -not have one.** +call `lift_x` too — so that ratio should have narrowed. + +✅ **Ghost DOES now have its own calibration — measured 2026-09-05, two L40S, real GPU proving on +block 962,000.** The predicted narrowing is confirmed: the fitted Schnorr:ECDSA ratio is **1.97x**, +not the old 13.77x. + +``` +HAZYNC_COST_EC_OP=85636 HAZYNC_COST_SCHNORR_OP=168542 +HAZYNC_COST_INPUT_BYTE=2 HAZYNC_COST_INPUT_BASE=53162 +``` + +| arm | straggler | max | mean | +|---|---|---|---| +| shipped defaults | 1.462x | 149 s | 102 s | +| Ghost refit | **1.189x** | 124 s | 104 s | + +⚠ These are GHOST's constants and they are NOT Core's (§2). Neither set transfers: Core's refit +moves Ghost 1.407 → 1.884, about a card. Each channel carries its own fit, and a build that takes +the wrong one is worse off than one that takes none. + +⚠ The card arithmetic was not re-derived — read this as "the ≤1.35 straggler target of §4.2 is +met", not as a card count. ✅ **#139 and the field backend are orthogonal and stack**: 10.676x → 11.467x, +7.4%. They accelerate different things — #139 replaces `secp256k1_ecmult`; the field backend replaces the representation