Skip to content

docs: state the trust base accurately and bring spec, soundness and build docs up to v0.21 - #308

Merged
defenwycke merged 9 commits into
mainfrom
docs/audit-spec-build
Sep 14, 2026
Merged

defenwycke merged 9 commits into
mainfrom
docs/audit-spec-build

Conversation

@defenwycke

Copy link
Copy Markdown
Contributor

PR "B" of the four-PR docs cleanup that follows the factual audit. Every audit finding below was checked against code, git history, GitHub or the evidence files before it was applied; the ones that did not hold up as stated are under Rejected audit findings. No file is moved or renamed (PR C does that). No code changes except scripts/check-spec.sh, and nothing under prover/methods/ is touched, so METHOD_ID does not move.

Per file

docs/SPEC.md + scripts/check-spec.sh

  • §9 now pins in_smt_root to the empty coinbase-SMT root, with the value as the code defines it (e[256], e[0] = 32 zero bytes, e[d] = SHA256(0x11 || e[d-1] || e[d-1])coinbase-smt/src/roots.rs), and says "All seven". Evidence: RangeState::is_genesis_anchored (rangestate/src/lib.rs), the host's assert_genesis_in_boundary (prover/host/src/main.rs, the audit fetch_block.py: coin_mtp uses header nTime instead of MTP(coin_height-1) → check-full/prove-full false-reject BIP68 time-locks (standalone path only) #3 F-3 block) and the verifier's shared-predicate call (verifier/src/lib.rs, F-2).
  • check-spec.sh checks §9 mechanically: the field list comes from is_genesis_anchored itself (self.* references), every one must appear in §9's condition list, and "All N MUST be checked" must count that list. It also guards against a regex that parses nothing. Negative controls run on a scratch copy: deleting the in_smt_root bullet fails (missing: ['in_smt_root']), and a wrong count word fails. The first version searched all of §9 and passed with the bullet deleted, because the prose below the list names in_smt_root; scoping to the list fixed it.
  • §10 seam list adds time and the coinbase-SMT root (guest fold_range asserts both).
  • §1 claim drops "unmodified" and says maximal-Core; §12 trust base lists all non-Core code: accumulator, coinbase SMT (coinbase-smt/src/{roots,bip30}.rs, #[path] in the guest), 0012 (field_bigint2.h, field_bigint2_impl.h, src/field_bigint2.rs), 0013 (src/liftx_hint.rs), 0001/0002, coreshim (provision-vps.sh phase 5).
  • §14: nine self-audit rounds plus rounds 10–11 (AI-assisted external reviews, SECURITY.md), still no commissioned audit. Wrapped proof "2,033 bytes" was block 170 only; the [1..1000] fold wraps to 3,441 B (prover/evidence/fold_and_snark_wrap_1_1000.txt).

docs/SOUNDNESS.md

  • §2 trust base: new item for 0012/0013 as consensus-relevant non-Core code, described from the patches, docs/FIELD_BIGINT2_BACKEND.md §5b and docs/LIFTX_HINT.md §3, with the missing gate 4 flagged. The accumulator is no longer "the one non-Core component" — the coinbase SMT and the field backend are named too.
  • H6 adds in_smt_root (audit fetch_block.py: coin_mtp uses header nTime instead of MTP(coin_height-1) → check-full/prove-full false-reject BIP68 time-locks (standalone path only) #3 F-2/F-3). H7 now describes what _frontier_chain actually does (coordinator/server.py): full boundary digest, H9 height contiguity, most-work selection.
  • §6 item 2 no longer says BIP68-time "completes with the bridge" (§5 records it fixed without one); 6(a) succinct chunk receipts marked done 2026-07-15 (docs/HAZYNC_ARCHITECTURE.md, FIX A).
  • §7 rewritten: negative regression tests and BIP68-time are done (SECURITY.md open items 1–2); rounds 10–11 described; open items are an independent audit, gate 4, and the standalone build_full anchor.

docs/EXPLAINER.md

  • "Unchanged/unmodified" crypto → plain-English maximal-Core wording, in three places.
  • The outside-review line now says two AI-assisted outside reviews found no flaw and that no professional audit has happened (SECURITY.md rounds 10–11).
  • Adds the live board and CONTRIBUTING.md; the closing pointer to HAZYNC_ARCHITECTURE.md (historical notes) now goes to CONTRIBUTING.md and docs/GOALS.md.

docs/EXTERNAL_REVIEW.md

docs/FUZZING.md, audit-fuzz/FINDINGS.md, audit-fuzz/seeds/README.md

  • Passes table adds forest_cache_equivalence (192k runs), fuzz-native/differential.cpp (27 checks), memsafety.cpp (661 cases, 0 sanitizer findings), realvector.cpp (Native differential + memory-safety harness: run the guest's Core code without a zkVM #222, be9761b), the in-zkVM negative corpus 7/7 (Negative corpus: every consensus rule violated alone must be refused — 7/7 #223, 8779122), and leaf-differential (in CI). Notes that CI runs seam_fuzz.py 20000 / parse_fuzz.py 30000 against the manual 200k/300k, and that the libFuzzer campaigns and fuzz-native/ do not run in CI.
  • "Native C++ differential — the highest-value next step … a prerequisite the repo doesn't ship" replaced by what landed and what is still uncovered: the native harnesses build stock libsecp, not 0012/0013, and the negative corpus has no bad-signature, locktime or BIP30 case.
  • guest-pure-fuzz comment: build.rs searches main.rs and script_flags.rs.
  • Accumulator positive control marked UNVERIFIED. The recorded crash in tree_of predates 8e789a9 (accumulator: refuse adversarial proof input instead of panicking (L-2) #63, L-2), which made tree_of return Option and delete return false for i >= num_leaves, so the committed seed should no longer crash the reference. The reference still lacks the guest's height and position pins, so run_reference's REFERENCE SOUNDNESS assertion may still fire on another input. That is plausible, not measured; no campaign was run here. The exact rerun command is given. The seeds README no longer says a non-crashing control means the harness broke, and notes that check-test-surfaces.sh only checks the seed exists.

docs/FIELD_BIGINT2_BACKEND.md

  • Up front: shipped in the canonical CORE guest since v0.21.0 (c12ad67, provision-vps.sh phase 5a). Gate 4 (corrupt-signature negative control) is recorded as an open soundness item for shipped code. No run was found: the Negative corpus: every consensus rule violated alone must be refused — 7/7 #223 corpus has no signature case, realvector.cpp's byte-flip builds stock libsecp natively, and no case in host adversarial / ci_negative_tests.sh corrupts a signature.
  • Goal "~24 → ~9" now sits beside the measured 10 cards and 1.295 straggler (docs/BUILDS.md §1). "Gates 0–2 pass" → 0–3. The unmeasured-straggler and "~9 holds only if C2 reproduces the digest" paragraphs are resolved. The normalize "no-op" row is reconciled with §3b's 21 instructions. The private-memory reference is removed.

docs/LIFTX_HINT.md

  • "COMPLETE BUT NEVER COMPILED, AND NOT MEASURED" → shipped (42417d2, canonical since c12ad67), measured +6.31% with 98.1% hits (docs/RELEASE_NOTES_v0.20.0.md), and liftx: hits=430 in 9d860d7. The "remaining host work" is done (b0c19dc). §3 soundness kept.
  • New §6, the run-time requirement. HAZYNC_LIFTX_HINT is read by prover/methods/build.rs (read only) and at run time by the host's write_chunk_inputs; the guest reads the hint block in chunk_prove. A chunked command run without the variable dies with DeserializeUnexpectedEnd (docs/history/BENCH_8xL40S_2026-09-08.md). It applies to every caller of write_chunk_inputs (prove-seg, prove-chunk, seg-serve, the chunk-profile and seg-* measurement commands). The worker CLI uses prove-range-bridge/fold-range, so board contributors are unaffected. The §5 A/B command now sets it.
  • Private-memory references removed.

docs/BUILDS.md (and docs/GHOST_NEXT_BUILD.md deleted)

  • Ghost recipe: "packing constants -- DEFAULTS. Do NOT apply Core's refit" was wrong since c12ad67, where the built-in consts became Core's refit (417,798 / 462,435 / 41,387 / 2, prover/host/src/main.rs). Ghost now gets its own Ghost calibration MEASURED on hardware: straggler 1.462x → 1.189x #227 constants explicitly (85636 / 168542 / 2 / 53162, af0534c). Measured: straggler 1.462 → 1.189 on the Ghost calibration MEASURED on hardware: straggler 1.462x → 1.189x #227 A/B, and §1's separate run measured 1.438 at those defaults.
  • The contradiction between "card counts are DERIVED" and "every card count is measured" is resolved: chunks were proved serially on one card (scripts/gpu-benchmark.sh) and turned into card counts by formula. The fleet check is 8 × L40S at 15m13s measured vs 15.2 min projected, putting sub-10-minute CORE blocks at ~13 L40S.
  • §4 "What is NOT measured": items 0–3 are done or superseded; replaced with what is genuinely still unmeasured.
  • provision-vps.sh quote corrected (see Rejected).
  • Merged GHOST_NEXT_BUILD.md as §3.1, fixing it on the way: the byte term is 2, not 6; the constants are global consts plus env overrides, not per-build-mode; 11.467x is an execute-mode cycle ratio; steps 1–3 are done. The remaining levers follow Ghost's next build: the four levers reopened by "fastest wins" #209 as it stands (MSM, wholesale bigint2 re-measure, G3 and scalar-inverse re-measure, the aggregate).

docs/TOPOLOGY_AND_SETTINGS.md — rewritten for v0.21.x CORE (531 → ~215 lines)

  • Stock-guest pricing replaced by CORE measurements, each labelled. Latency: the BENCH_8xL40S curve, ~13 L40S sub-10-min (INFERRED from N=8). 4090s: MILESTONE runs 1 and 4. Throughput: ~11 L40S (INFERRED, arithmetic shown).
  • Removed: 9.10x wholesale (never produced by a run, 9b767b5/c7feb62). "Scaling past 2 cards UNMEASURED" is replaced by 2.78x on 3 workers (2facde4, stock), 203.8 s on 8 workers and the Aggregate: measure the N-curve past 2, and remove the ~20s non-scaling execute #235 sweep. "Chain fold cost never measured" is replaced by 3.76 s/fold and 2.0–3.0 s/fold. "4090 must drop to po2 20" is replaced by po2 21 at a 22,478 MiB peak.
  • §4: -O3, fat LTO, codegen-units=1 and window 21 all shipped in v0.20.0 (42417d2 is the first tagged commit carrying each); ECMULT_GEN_KB is still 22. The old §7 "not settled" items 1–3 are answered, and "stock images ship CUDA 13.2" is dropped as unverified.
  • Kept: seg_po2 21/20, CUDA 12.8, the hazync GPU lock, chunk count free (+0.2%). Added: HAZYNC_LIFTX_HINT=1 at run time and HAZYNC_CHUNKS = card count. The §1 and §4.1 anchors are kept because other docs link to them. History links point under docs/history/ only for files already there.
  • The pre-rewrite body is f24c43b:docs/TOPOLOGY_AND_SETTINGS.md (last changed in 65c386e), for PR C to archive.

docs/GOALS.md

  • G1 transcript removed. It claimed "released v0.16.0 binaries" but printed 37987b85, because the id line was rewritten at re-baselines (067062e says so). It is replaced by a pointer to the CI assertion (hazync-verify exits exactly 2 on prover/testdata/snark/neg500.snark, regenerated under the current guest). The G4 ghostd transcript had the same defect — it was recorded under 4722cec8 (aedce8b) — and was turned into prose.
  • The hand-kept guest-id chain (wrong on b62d2a60: that is 067062e, 2026-08-21, first in v0.19.0; audit fetch_block.py: coin_mtp = MTP(coin_height-1), not header nTime (fixes #3) #5 is 4722cec8, 61a6f9f, v0.17.0) is replaced by a reproduce/LINEAGE.tsv pointer.
  • G2 and G6 and the modes table are restated for CORE, with stock figures labelled as such. Per input: ~0.77 card-s (INFERRED, 966,108). That gives ~44–73 L40S card-years (INFERRED; money not re-derived), ~11 L40S throughput and ~13 latency, plus the measured 4090 runs. The 24 GB po2 claim is corrected, and the ACCELERATION.md refs point to docs/history/.
  • G3: G3: verify the aarch64 verifier on real Pi-class hardware — the claim rests on qemu #41 closed 2026-08-01, superseded by WASM; "Done when" marked met, and a physical-device run noted as unrecorded. G4: stale "adoption itself still missing" paragraph deleted. bigint2 verifies ECDSA 13.78x faster than libsecp256k1 in-guest — decide what to do about it #139: closed 2026-08-23, and v0.21.0 ships CORE without it.

docs/PROVING.md

docs/METHOD_ID_DURABILITY.md (text of Discussion #299)

docs/PROOF_DURABILITY.md

  • "Every guest change across the 7 ids after that date is performance or build work": the 7 includes dfc9eeda itself. Of the 6 later changes, 4722cec8 is hardening. The "7 of 17 share today's rule set" count is correct and stays.
  • "Journal-format compatibility (broken before, at 68819a54)": 96407d0 changed the witness wire format, and its diff touches no journal struct. The journal changed when dfc9eeda (70a0fa5) added the SMT roots to RangeState.

Rejected audit findings

Checks run (worktree root)

  • ./scripts/check-versions.sh — pass ("versions consistent"; check 4 now actually runs: docs/PROVING.md current release (v0.21.4) == newest tag)
  • ./scripts/check-spec.sh — pass (10 checks, including the three new §9 ones); negative controls run as above
  • ./scripts/check-test-surfaces.sh — pass
  • ./scripts/lineage.sh --check — pass (17 rows)
  • ./scripts/test-lineage.sh — pass (0 failures)

Left for a human / later PRs

  • Gate 4 has never run. An execute-mode check-full on a CORE build, with one signature byte corrupted, must reject. This is an open soundness item for shipped code.
  • The accumulator reference control needs a rerun (cd audit-fuzz && cargo +nightly fuzz run delete_soundness_reference -- -max_total_time=300). No builds were run here.
  • The CORE card-years (~44–73) and ~11 L40S throughput are inferred from one block (966,108), using BENCH_8xL40S's own aggregate fit. Worth a decision on whether to publish card-years at all.
  • docs/PROVING.md still says CUDA 12.8 is installed "over the stock image's 13.2"; the 13.2 part is unverified and untouched.
  • For PR C: docs/history/GHOST_GAINS.md:8 and docs/history/README.md:32 still link GHOST_NEXT_BUILD.md; docs/history/TEN_MINUTE_BLOCK.md:1110 cites TOPOLOGY §0.5, which no longer exists; archive the old TOPOLOGY body from f24c43b.

…enesis_anchored

§9 listed six genesis conditions and omitted the empty coinbase-SMT root that
RangeState::is_genesis_anchored, the host's assert_genesis_in_boundary and the
verifier all require (audit #3 F-2/F-3). check-spec.sh now takes the field list
from the predicate itself and requires §9's condition list, and its count, to match.
Also: §10 seam fields, the maximal-Core claim, the full non-Core trust base in §12,
rounds 10-11 and the measured wrapped-proof sizes in §14.
…d EXTERNAL_REVIEW

Since v0.21.0 the canonical guest applies patches 0012 (field_bigint2) and 0013
(lift_x hint) beneath libsecp256k1, and the coinbase SMT sits beside the
accumulator. None of the three docs said so. Also: H6 in_smt_root, H7 as
_frontier_chain implements it, rounds 10-11, #69 closed, the epoch_start_time
expectation (it is the out-boundary's period start, not genesis time), and the
live board and CONTRIBUTING.md for the public explainer.
…or control unverified since #63

fuzz-native (differential, memsafety, realvector), the in-zkVM negative corpus,
forest_cache_equivalence and leaf-differential were missing from the passes table,
and the native differential was still described as a future step. The reference
Stump's recorded tree_of crash predates its hardening in 8e789a9; whether the
positive control still fires is unverified and the rerun command is given.
…4 open

Both have been in the canonical CORE guest since v0.21.0 (c12ad67) and both docs
still read as unbuilt or unmeasured. The corrupt-signature negative control (gate 4)
has never run on a CORE build and is now recorded as an open soundness item.
LIFTX_HINT.md gains the run-time requirement: chunked commands need
HAZYNC_LIFTX_HINT=1 or the guest dies with DeserializeUnexpectedEnd.
BUILDS told Ghost to use the default packing constants, which have been Core's
refit since c12ad67; Ghost now gets its #227 constants explicitly. Card counts
are described as what they are (serial chunk proving turned into cards by
formula), with the 8-card fleet result as the check. GHOST_NEXT_BUILD.md is merged
as §3.1 with its errors fixed, and deleted.

TOPOLOGY priced the stock guest (~29 L40S, 7-9 cards with #139, 9.10x wholesale)
and called several measured quantities unmeasured. Rewritten on the BENCH_8xL40S
and MILESTONE_966256 measurements; §1 and §4.1 anchors kept.
…and PROVING for v0.21

Both carried guest-id chains with wrong attributions (b62d2a60 is 067062e, not
audit #5) and GOALS carried two transcripts whose id lines had been rewritten to
the current guest. Both now point to reproduce/LINEAGE.tsv. GOALS' fleet and
card-year figures are restated for CORE with inferred figures labelled; PROVING
gains the current release line check-versions.sh greps, CUDA 12.8, the real
cost constants, the #256 stall retry, the vendored #119 fix and sm_100.
…ability docs

4722cec8 (audit #5) was soundness hardening, not performance or build work; the
7 ids sharing today's rule set include dfc9eeda itself; 68819a54 changed the
witness wire format, not the journal. METHOD_ID_DURABILITY links Discussion #299,
counts 16 supersessions, and cuts sections duplicated from PROOF_DURABILITY to
pointers.
defenwycke added a commit that referenced this pull request Sep 14, 2026
…int TEN_MINUTE_BLOCK at it

#308 rewrote the topology page for the CORE guest and dropped §0.5, which `TEN_MINUTE_BLOCK.md` cites
for the 2-card aggregate measurement. The revision as it stood at `f24c43b` (last changed 2026-09-05,
#200) is archived whole as `docs/history/TOPOLOGY_AND_SETTINGS_2026-09-05.md` with a banner, the
citation now names it (and the current §1.1), and the live page names the archive and drops its
reference to the merged-away run-1 milestone file.
@defenwycke
defenwycke merged commit b9f3f83 into main Sep 14, 2026
6 checks passed
@defenwycke
defenwycke deleted the docs/audit-spec-build branch September 14, 2026 11:08
defenwycke added a commit that referenced this pull request Sep 14, 2026
…int TEN_MINUTE_BLOCK at it

#308 rewrote the topology page for the CORE guest and dropped §0.5, which `TEN_MINUTE_BLOCK.md` cites
for the 2-card aggregate measurement. The revision as it stood at `f24c43b` (last changed 2026-09-05,
#200) is archived whole as `docs/history/TOPOLOGY_AND_SETTINGS_2026-09-05.md` with a banner, the
citation now names it (and the current §1.1), and the live page names the archive and drops its
reference to the merged-away run-1 milestone file.
defenwycke added a commit that referenced this pull request Sep 14, 2026
… duplicates, add CHANGELOG and FLEET_OPERATIONS (#316)

* docs: `FLEET_OPERATIONS.md` for proving one block across many GPUs; move `SEGMENT_DISTRIBUTION.md` to history

The operator half of `SEGMENT_DISTRIBUTION.md` (running `seg-serve`/`seg-connect`, knobs, trust model)
becomes a short current runbook for the shipped CORE build, re-read against `prover/host/src/main.rs`:
the run-time `HAZYNC_LIFTX_HINT=1` requirement for every command that writes chunk inputs, chunk count
= card count (+0.2%, BENCH_8xL40S), the last segment proved and lifted by workers since #158, the
in-binary #119 retry (#240), po2 21 as the CUDA default.

The design record moves to `docs/history/` with a banner: "nothing deployed" is stale, the 18-minute
floor was refuted in the same file, and the P1 `seg-export`/`seg-prove`/`seg-lift`/`seg-assemble`
commands never existed.

* docs: move superseded plans and dated records into `docs/history/`, each with a banner

`HAZYNC_ARCHITECTURE`, `AUDIT_2026-07`, `ROADMAP`, `RELEASE_PLAN`, `CORE_VS_GHOST`, `FLEET_SIZING`,
`GPU_EXPERIMENT_RUNBOOK`, and `tasks/overnight_2026-08-03.md` (as `OVERNIGHT_2026-08-03.md`; `tasks/`
is now empty and gone). Each banner names what superseded it and what is current.

In-place fixes the banners cannot carry: relative links out of `docs/history/`; ROADMAP no longer
calls `4722cec8` the current id; the overnight log again records `dfc9eeda`, the canonical id that
night (`LINEAGE.tsv`, and the text as committed in `70a0fa5`) — the `b161735a` re-baseline had
rewritten it — and cites `70a0fa5` for the squashed branch commit `29a4a46`.

* docs: `CHANGELOG.md`, and release bodies moved to `docs/history/releases/`

`CHANGELOG.md` indexes every tag from the GitHub releases (canonical), newest first, one to three
lines each taken from the release title and body.

v0.20.0 and v0.21.1-v0.21.4 notes move to `docs/history/releases/`; `RELEASE_NOTES_v0.21.0.md` stays
put while external links are repointed. Each gets a header pointing at its GitHub release, and the
known errors are marked inline: the v0.20.0 file is the pre-publish draft and omits #181/#217;
v0.21.3 says "five releases" where two separate it from v0.21.0; v0.21.4 credits
`/api/spine/segments` (shipped in v0.21.3, #288); v0.21.0 gives an upgrade command using subcommands
that do not exist and says the id is checked only at startup, fixed in `8c8839c`.

* docs/history: correct the acceleration, ten-minute, bench, stack and helix records

Banners name what superseded each. Corrections, each checked against its evidence: 7.18x was a
microbenchmark block bound, not a measurement (measured tip block 4.48x); ~7 cards was a projection
(measured CORE 10 / GHOST 5); the field backend "rejected" shipped as `patches/0012`; po2 23 invalid
proofs came from the baked control root, not #119; the 1.20x worker-process figure has a <=1.09x
ceiling; BENCH N=13 is 9.49 min by its own formula; #190 closed unmerged; §8.13 back in order; stale
branch names replaced by their `archive/` tags; a private wiki-link removed.

* docs/history: fold `EXPERIMENT_139_BIGINT2` and `SEGDIST_STEP2` into their parents; banner the rest

`BIGINT2_MIDDLE_PATH.md` absorbs the #139 trial record: Ghost channel only, never shipped in CORE, and
its 2.45x straggler was a projection (measured 2.118). `SEGDIST_TASKS.md` absorbs step 2, built in
#148 as `HAZYNC_WORKER_LIFTS`. GHOST_GAINS records which gains were built (G1 `0007`, G3 `0006`, G6
memo) and which were not; TIER0 notes window 21 is the shipped default; MODELS notes the aggregate
had already distributed 2.78x; TIP_BLOCK separates bigint2 alone (4.384x) from Tier 0 + bigint2
(4.48x) and points at the 4.112x proving result. Private wiki-links removed.

* docs/history: one record for the four block-966,256 runs, re-checked against the run logs

Runs 1 and 2 merge into `MILESTONE_966256_RUN4_2026-09-10.md` (the filename external sites link to).
Corrected from the retained evidence: run 1 execution 31.9 s / 298.5 MB; two continents, not five;
workers are cards minus the coordinator (26 in run 4); run 2 cost $1.372 with 3 stall-kills, and chunk 4
did not stall in every run; `4cad145` landed as `cadef1a` (#241); run 4 aggregate is not the larger
half (241.2 s vs 247.9 s); six countries in run 4. The 0.268 kWh figure is re-derived as 0.2678 kWh by
integrating power over the recorded timestamps (a plain 1 Hz sum gives 0.257 and undercounts).
Run 2 correction section kept verbatim.

* experimental: record that the field backend shipped; fold `STEP3-RESULT.md` into the README

The reopen condition was met (an 83-cycle native multiply) and a field backend shipped as
`patches/0012`. The sqrt row notes pubkey parsing is outside the counted region; `ACCELERATION.md`
paths point at `docs/history/`. The step-3 measurement moves into `experimental/README.md`.

* scripts: exempt dated records from the id-currency checks, and catch a claim whose id wraps

`check-versions.sh` checks 7 and 8 no longer demand the canonical id inside `docs/history/`,
`docs/RELEASE_NOTES_*` or `CHANGELOG.md`: forcing it there falsifies the record, as the `b161735a`
re-baseline did to the overnight log. `rebaseline-id.sh` never rewrites the same paths. Check 8 (and
the short-form rewrite) now follows a claim line that ends by introducing an id onto the next line,
the shape by which ROADMAP called `4722cec8` current across a line break. ROADMAP leaves check 1;
README.md, which states the canonical id, replaces it.

`rebaseline-id.sh` no longer tells anyone to rebuild or commit a verifier under `verifier/dist/`:
`release-sign.yml` builds it (#85). Comment paths to moved docs updated in four non-guest files.

* docs: rebuild both indexes for the new layout

`docs/README.md` lists every current doc by audience (use / run / review / history), drops the
mislabelled RELEASE_PLAN row, and sources each correction in "How to read a number".
`docs/history/README.md` indexes every file, corrects its stale-figure table (fe_sqrt 9.83% lives
in LIFTX_HINT, "~5x" in CORE_VS_GHOST, the unsourced ~2.6x is gone, MSM was declined rather than
measured) and adds the figures still repeated in the record, with what replaced them.

* docs/history: archive the pre-CORE `TOPOLOGY_AND_SETTINGS.md`, and point TEN_MINUTE_BLOCK at it

#308 rewrote the topology page for the CORE guest and dropped §0.5, which `TEN_MINUTE_BLOCK.md` cites
for the 2-card aggregate measurement. The revision as it stood at `f24c43b` (last changed 2026-09-05,
#200) is archived whole as `docs/history/TOPOLOGY_AND_SETTINGS_2026-09-05.md` with a banner, the
citation now names it (and the current §1.1), and the live page names the archive and drops its
reference to the merged-away run-1 milestone file.

* docs: move the v0.21.0 release body to `docs/history/releases/`

hazync.org/how-it-works/ now links the GitHub release instead (checked: no `RELEASE_NOTES_v0.21.0`
left on the page), so the file joins the other release copies. Its `BUILDS.md` link is re-based.

* docs: repoint links and paths to the moved documents

Operator links to `SEGMENT_DISTRIBUTION.md` go to `docs/FLEET_OPERATIONS.md`; the "maximal-Core"
citations go to `docs/SPEC.md` §12, which lists every non-Core piece of the circuit; "why those
numbers" goes to `docs/BUILDS.md`; the seam invariant to `SPEC.md` §10; design history to
`docs/history/HAZYNC_ARCHITECTURE.md`; the README drops "what is left to build" (RELEASE_PLAN is
obsolete). Bare paths in SECURITY, SOUNDNESS, FIELD_BIGINT2_BACKEND, GOALS (including the merged-away
run-1 milestone file), LIFTX_HINT and the host comment at `main.rs` (not a guest input) follow the
moves. RUNBOOK check-1 list now matches `check-versions.sh`: PROVING, SECURITY, README. SPEC credits
the audit rounds to `docs/history/SECURITY_AUDIT_LOG.md`.

* docs: point audit-round references at `docs/history/SECURITY_AUDIT_LOG.md`

The round-by-round narrative left `SECURITY.md` in #307. EXTERNAL_REVIEW, SEAM_FINDINGS and the
`seam_fuzz.py` docstring now cite the log for detail and `SECURITY.md` for the finding index; the
leaf-count note references in history/AUDIT_2026-07 and history/ROADMAP name the log (they pointed at
`../SECURITY.md`, a path that never resolved from docs/history); the log names the moved AUDIT path.

* docs: the verifier module is 1,064,517 bytes raw, 295,077 gzipped

Size of `hazync-verify.wasm` from v0.21.3 on (v0.21.4 asset, deployed module identical), measured
2026-09-14: 1,064,517 bytes raw, 295,077 with `gzip -c`, a 3.6x ratio. README and
verifier-wasm/README carried 1,065,304 / 295,139; `check-deployed-verifier.sh` now passes.

* docs: index the audit log, the topology archive and the v0.21.0 release copy; drop GHOST_NEXT_BUILD
defenwycke added a commit that referenced this pull request Sep 14, 2026
PRs #307, #308, #316 and #309 merged after these pages were written. The open pull requests are now #313, #314 and #315, main is 13 commits past v0.21.4, and coordinator/server.py is unchanged, so the live source_sha256 still matches (re-read 12:02 UTC).
defenwycke added a commit that referenced this pull request Sep 14, 2026
…model, glossary, status, release process, evidence index, community files (#317)

* docs: generate the coordinator reference from the code, and check it in CI

`scripts/gen-coordinator-reference.py` reads `coordinator/server.py`, `coordinator/hazync` and
`coordinator/run-workers.sh` with `ast` and writes `docs/COORDINATOR_REFERENCE.md`: every HTTP route
(including `/api/rotate`, documented nowhere until now), the body fields and query parameters each
handler reads, which handlers check a signature and over what, the status codes they return, every
environment variable with its default as written and where it is read, the CLI's commands, and the
variables the worker and launcher pass to their children.

One-line meanings are kept in the generator and held to the code in both directions: `--check` fails
on an undescribed route or variable, on a description for something the code no longer has, and on
any diff against the committed page. `--control` mutates copies of the sources (a POST route removed,
a GET route removed, a default changed, a variable added) and fails if `--check` misses any of them.
Both run in the `accumulator-tests` job after `check-versions.sh`.

Surfaced while generating, and reported on the page rather than fixed here: `MAX_ENV_FAILURES` is
read into a constant nothing uses, the comment above the POST dispatch still says claim and heartbeat
are gone, and `run-workers.sh`'s header omits `MODE=spine`.

* docs: add a threat model, component by component

For the guest and its trust base (Core v28 with patches `0001`/`0002`, libsecp with `0012`/`0013`,
the accumulator, the coinbase SMT, risc0 and the vendored prover crates), the host, GPU workers and
rented hosts, the coordinator, the worker CLI, the verifier CLI and C ABI, the served browser
verifier, release signing, ghostd adoption and the websites: what each is trusted for, what it is
not, what an attacker controlling it can and cannot do, and the code that enforces it.

Ends with the open items, each verified: field-backend gate 4 not run, the accumulator reference fuzz
control not rerun since #63, CORE card figures resting on one block, #244 layer 2 undecided, the
worker's unbounded reads of coordinator responses, unsigned claims, and key rotation that cannot be
revoked.

* docs: add a glossary of the terms the repository uses, each tied to the code that defines it

Covers proofs, folds and the spine, claims and beats, segments and chunks, the aggregate, METHOD_ID and lineage, the CORE/Ghost/stock channels, the field backend and lift_x hint, RangeState, receipts and the Groth16 wrap, witnesses and bundles, the coinbase SMT, audit numbering, and the proof party. Overloaded words ("leaf", "chunk", "segment", "anchor", "resolve") and docs that contradict the code are flagged inline.

* docs: add a dated status page (2026-09-14)

Current release and assets, canonical guest id and inputs, a timestamped board snapshot with links to the live API, what each v0.21 release shipped, open issues, and the decisions and checks that need the operator. Rewritten at each release; links CHANGELOG.md, which PR C adds.

* evidence: index every file in prover/evidence

For each of the 47 files: what it records, the guest id or commit it was produced under, how to reproduce it and whether that script still exists, and which docs cite it. Known issues are listed rather than fixed in the files: the hyphenated sigsplit reference, the deleted test_cov_negatives.sh, sigsplit.rs.txt without a manifest, and ten more.

* repo: add a code of conduct, issue templates and a pull request template

CODE_OF_CONDUCT.md is Contributor Covenant 2.1 with reports routed to the private reporting form (Security, Report a vulnerability); no email address is published. Issue templates: a bug report and a board or prover problem report asking for the worker release, both guest ids, segment size, GPU, block, selftest output and logs; config.yml sends security and conduct reports to private reporting and questions to Discussions. The pull request template asks what changed, the evidence, METHOD_ID impact and docs.

* docs: repoint the glossary and the evidence index at the restructured docs

Both were written before PR B deleted `docs/GHOST_NEXT_BUILD.md` and PR C moved the development record
into `docs/history/`. Re-verified against the merged tree:

- GLOSSARY: paths now point at `docs/history/` (architecture, audit, CORE_VS_GHOST), resolves at
  `docs/FLEET_OPERATIONS.md`, the straggler at `docs/BUILDS.md` §1 and §3.1. Drops three inline flags
  the restructure fixed (the `CLAIM_TTL` default and heartbeat wording in `coordinator/README.md`, the
  `LIFTX_HINT.md` banner, the Tier 0 note in a now-dated runbook). Index anchors whose headings contain
  underscores get explicit ids.
- Evidence index: "Cited by" regenerated with `git grep` on the merged tree, and two lines naming
  superseded guests now say so, which `check-versions.sh` check 8 requires.

* docs: link the threat model's open items to #310, #311 and #312, and re-verify it

Items 7-9 now link the filed issues and state what the code does: the bounds on unsigned claims
(`CLAIM_GRACE`, signed beats, rate limits, no per-key cap) with the derived ~1,200-per-address figure
labelled as not measured; one rotation per old key with `409` and no revocation; and the order
`_find_host()` searches (CLI directory, `$HAZYNC_HOME/bin`, `$HAZYNC_HOME`, the working directory, then
`PATH` for `hazync-` names only), including the bare `host`. It also records that `run-workers.sh`
requires `HAZYNC_HOST` and so never reaches the search, and that guest-id checks do not help against a
planted binary.

Repointed after the restructure: `history/` paths, `FLEET_OPERATIONS.md` for the segment trust model,
`EXTERNAL_REVIEW.md` §5 and §6 (renumbered), the audit log for round 6. Gate 4, the fuzz control and the
CORE card-years items now match `FIELD_BIGINT2_BACKEND.md`, `audit-fuzz/FINDINGS.md` and `GOALS.md` as
they stand. The browser verifier section covers both served copies, bitcoinghost.org and hazync.org.

* security: say how to report a vulnerability, privately

A short section at the top: GitHub private vulnerability reporting at
<https://github.com/bitcoin-ghost/hazync/security/advisories/new>, visible only to the reporter and
maintainers, also used for conduct reports. No email address. The rest of the file is unchanged.

* docs: split the release and re-baseline process out of the coordinator runbook

`docs/RELEASE_PROCESS.md` now holds cutting a release, checked step by step against `scripts/release.sh`,
`scripts/package-release.sh`, `scripts/check-dist.sh` and `release-sign.yml`; what must land on `main`
first (release notes, a `CHANGELOG.md` entry, the `docs/PROVING.md` current-release line that
`check-versions.sh` reads, `docs/STATUS.md`, a regenerated `docs/COORDINATOR_REFERENCE.md`, the wasm
sizes in `verifier-wasm/README.md`); and deploying the browser verifier to both sites (the
`bitcoin-ghost/hazync-web` pins, and the bitcoinghost.org copy) followed by `check-deployed-verifier.sh`
against each.

The re-baseline section moves from `coordinator/deploy/RUNBOOK.md` unchanged except for three additions
to its checklist (`lineage.sh --write`, the changelog marker, the hazync.org pins) and a note of a bug
verified in a throwaway worktree: `rebaseline-id.sh` exits 1 at its final `tail -1 reproduce/METHOD_ID`
check, because the file ends with a comment line, after every substitution has already been applied.
Not fixed here. The runbook keeps deployment and operation, with a pointer naming what moved, and
`prover/testdata/snark/README.md` points at the new file.

* docs: refresh the status page for 2026-09-14 after the doc restructure

New board snapshot (08:31:46 UTC), both served browser verifiers, open issues including #310-#312, and
open pull requests. Decisions for the operator are the four that remain: #244 layer 2, field-backend
gate 4, the accumulator fuzz control rerun, and whether to publish CORE card-years. The reporting route,
the filed weaknesses and the failing drift check move to a resolved list. Links repointed to
`history/releases/`, `BUILDS.md` and `RELEASE_PROCESS.md`.

* docs: index the new reference pages, and link the code of conduct

`docs/README.md` gains STATUS and GLOSSARY (use it), COORDINATOR_REFERENCE and RELEASE_PROCESS (run it),
THREAT_MODEL and the evidence index (review it), and its date line points at STATUS. README.md and
CONTRIBUTING.md each gain one line linking CODE_OF_CONDUCT.md.

* repo: ask pull requests that change a coordinator route or setting to regenerate the reference

* docs: bring the status page and threat model up to main at d5286b8

PRs #307, #308, #316 and #309 merged after these pages were written. The open pull requests are now #313, #314 and #315, main is 13 commits past v0.21.4, and coordinator/server.py is unchanged, so the live source_sha256 still matches (re-read 12:02 UTC).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant