docs: state the trust base accurately and bring spec, soundness and build docs up to v0.21 - #308
Merged
Merged
Conversation
…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
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
…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).
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.
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 underprover/methods/is touched, soMETHOD_IDdoes not move.Per file
docs/SPEC.md+scripts/check-spec.shin_smt_rootto 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'sassert_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.shchecks §9 mechanically: the field list comes fromis_genesis_anchoreditself (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 thein_smt_rootbullet 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 namesin_smt_root; scoping to the list fixed it.timeand the coinbase-SMT root (guestfold_rangeasserts both).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.shphase 5).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.md0012/0013as consensus-relevant non-Core code, described from the patches,docs/FIELD_BIGINT2_BACKEND.md§5b anddocs/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.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_chainactually does (coordinator/server.py): full boundary digest, H9 height contiguity, most-work selection.docs/HAZYNC_ARCHITECTURE.md, FIX A).SECURITY.mdopen items 1–2); rounds 10–11 described; open items are an independent audit, gate 4, and the standalonebuild_fullanchor.docs/EXPLAINER.mdSECURITY.mdrounds 10–11).CONTRIBUTING.md; the closing pointer toHAZYNC_ARCHITECTURE.md(historical notes) now goes toCONTRIBUTING.mdanddocs/GOALS.md.docs/EXTERNAL_REVIEW.mdepoch_start_timeexpectation corrected. The verifier reportsrs.out_epoch_start(verifier/src/lib.rs), which is the timestamp of block⌊height/2016⌋×2016; it equals1231006505only below 2016. A reviewer following the old line would have chased a non-bug.0012field backend and0013hint, with exact paths; rounds 10–11 predate them. Items 3–5 renumbered 4–6.docs/RUN_YOUR_OWN_COORDINATOR.md,PEER_COORDINATORS), "do not commission until Let anyone run their own coordinator (archive node + bridge + board) without duplicating proving work #69 has a design" removed, the unbounded.read()inget()(coordinator/hazync) kept.docs/AUDIT_*.md": onlydocs/AUDIT_2026-07.md(round 8) exists; the text now says so.docs/FUZZING.md,audit-fuzz/FINDINGS.md,audit-fuzz/seeds/README.mdforest_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), andleaf-differential(in CI). Notes that CI runsseam_fuzz.py 20000/parse_fuzz.py 30000against the manual 200k/300k, and that the libFuzzer campaigns andfuzz-native/do not run in CI.0012/0013, and the negative corpus has no bad-signature, locktime or BIP30 case.guest-pure-fuzzcomment:build.rssearchesmain.rsandscript_flags.rs.tree_ofpredates8e789a9(accumulator: refuse adversarial proof input instead of panicking (L-2) #63, L-2), which madetree_ofreturnOptionanddeletereturnfalsefori >= num_leaves, so the committed seed should no longer crash the reference. The reference still lacks the guest's height and position pins, sorun_reference'sREFERENCE SOUNDNESSassertion 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 thatcheck-test-surfaces.shonly checks the seed exists.docs/FIELD_BIGINT2_BACKEND.mdc12ad67,provision-vps.shphase 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 inhost adversarial/ci_negative_tests.shcorrupts a signature.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. Thenormalize"no-op" row is reconciled with §3b's 21 instructions. The private-memory reference is removed.docs/LIFTX_HINT.md42417d2, canonical sincec12ad67), measured +6.31% with 98.1% hits (docs/RELEASE_NOTES_v0.20.0.md), andliftx: hits=430in9d860d7. The "remaining host work" is done (b0c19dc). §3 soundness kept.HAZYNC_LIFTX_HINTis read byprover/methods/build.rs(read only) and at run time by the host'swrite_chunk_inputs; the guest reads the hint block inchunk_prove. A chunked command run without the variable dies withDeserializeUnexpectedEnd(docs/history/BENCH_8xL40S_2026-09-08.md). It applies to every caller ofwrite_chunk_inputs(prove-seg,prove-chunk,seg-serve, the chunk-profile andseg-*measurement commands). The worker CLI usesprove-range-bridge/fold-range, so board contributors are unaffected. The §5 A/B command now sets it.docs/BUILDS.md(anddocs/GHOST_NEXT_BUILD.mddeleted)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.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.provision-vps.shquote corrected (see Rejected).GHOST_NEXT_BUILD.mdas §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)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.-O3, fat LTO,codegen-units=1and window 21 all shipped in v0.20.0 (42417d2is the first tagged commit carrying each);ECMULT_GEN_KBis still 22. The old §7 "not settled" items 1–3 are answered, and "stock images ship CUDA 13.2" is dropped as unverified.seg_po221/20, CUDA 12.8, thehazyncGPU lock, chunk count free (+0.2%). Added:HAZYNC_LIFTX_HINT=1at run time andHAZYNC_CHUNKS= card count. The §1 and §4.1 anchors are kept because other docs link to them. History links point underdocs/history/only for files already there.f24c43b:docs/TOPOLOGY_AND_SETTINGS.md(last changed in65c386e), for PR C to archive.docs/GOALS.md37987b85, because the id line was rewritten at re-baselines (067062esays so). It is replaced by a pointer to the CI assertion (hazync-verifyexits exactly 2 onprover/testdata/snark/neg500.snark, regenerated under the current guest). The G4 ghostd transcript had the same defect — it was recorded under4722cec8(aedce8b) — and was turned into prose.b62d2a60: that is067062e, 2026-08-21, first in v0.19.0; audit fetch_block.py: coin_mtp = MTP(coin_height-1), not header nTime (fixes #3) #5 is4722cec8,61a6f9f, v0.17.0) is replaced by areproduce/LINEAGE.tsvpointer.ACCELERATION.mdrefs point todocs/history/.docs/PROVING.mdprovision-vps.sh). The cost-model formula is replaced by the real constants andHAZYNC_COST_*overrides. Added: the prover: a stuck block prove can hold a worker (and a claim) for 6 h -- there is no progress signal, and a timeout walks the OOM ladder #256 stall retry (once at the same size, no ladder) and the vendoredrisc0-circuit-rv32im-sysProver emits a succinct receipt that fails its own verify() for rare rand_z values — both backends, in preflight #119 fix (prover/Cargo.toml).b62d2a60, incomplete) and the v0.10–v0.13 narrative are replaced by aLINEAGE.tsvpointer plusscripts/release.sh. The canonical date is 2026-09-07, per LINEAGE. It now says "The current release is v0.21.4". Before this,check-versions.shcheck 4 was silently skipping, because the line it greps did not exist.sm_100is added to the NVCC flags and thecuobjdumpexpectation (prover/build-release.sh, Ship native sm_100, and make the CUDA version a knob (#178) #181).docs/METHOD_ID_DURABILITY.md(text of Discussion #299)4722cec8(audit fetch_block.py: coin_mtp = MTP(coin_height-1), not header nTime (fixes #3) #5,e5d8b12) was soundness hardening, not performance.PROOF_DURABILITY.md(the1d6c3792case, the composition mechanism, the two corrections) are cut to pointers. The position statement, the two constraints and the open questions are intact.docs/PROOF_DURABILITY.mddfc9eedaitself. Of the 6 later changes,4722cec8is hardening. The "7 of 17 share today's rule set" count is correct and stays.68819a54)":96407d0changed the witness wire format, and its diff touches no journal struct. The journal changed whendfc9eeda(70a0fa5) added the SMT roots toRangeState.Rejected audit findings
provision-vps.shtext is not in the file" — both fragments are there: "a box provisioned with this must never produce a shipped proof" is the phase-5b comment, and "This box is for benchmarking only." is its echo. They are not contiguous, though, and they describe the bigint2 verifies ECDSA 13.78x faster than libsecp256k1 in-guest — decide what to do about it #139 patch 0005 lever, not "the Ghost lever". So the finding is only partly right; the quote was corrected rather than removed.AUDIT_2026-07.mdcorresponds to could not be established from the repo (SECURITY.mdkeeps the two numbering schemes deliberately separate). The verifiable statement was used instead: it is the only standalone audit write-up.HAZYNC_LIFTX_HINT=1must be set at run time or the guest dies" — true only for commands that build a chunk payload. The hint block is written bywrite_chunk_inputsand read by guestchunk_prove; the board worker'sprove-range-bridge/fold-rangepath carries no hint block. Applied with that scope.state_reasonsayscompleted, but the closing comment says "Closing as won't-fix — upstream defect". The comment was followed.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
check-fullon a CORE build, with one signature byte corrupted, must reject. This is an open soundness item for shipped code.cd audit-fuzz && cargo +nightly fuzz run delete_soundness_reference -- -max_total_time=300). No builds were run here.docs/PROVING.mdstill says CUDA 12.8 is installed "over the stock image's 13.2"; the 13.2 part is unverified and untouched.docs/history/GHOST_GAINS.md:8anddocs/history/README.md:32still linkGHOST_NEXT_BUILD.md;docs/history/TEN_MINUTE_BLOCK.md:1110cites TOPOLOGY §0.5, which no longer exists; archive the old TOPOLOGY body fromf24c43b.