Skip to content

feat(capabilities): arm ADDRESS_PROOF_HEIGHT at 966_000 (H-7, #605) - #824

Merged
defenwycke merged 1 commit into
mainfrom
feat/605-arm-address-proof-at-966000
Sep 1, 2026
Merged

feat(capabilities): arm ADDRESS_PROOF_HEIGHT at 966_000 (H-7, #605)#824
defenwycke merged 1 commit into
mainfrom
feat/605-arm-address-proof-at-966000

Conversation

@defenwycke

Copy link
Copy Markdown
Contributor

Part of #605 (audit H-7).

What changes

ADDRESS_PROOF_HEIGHT goes from u64::MAX (never) to 966_000. At and above that height a challenger broadcasts the address proof it already performs, so the /24 a node claims becomes a converged, majority-attested fact instead of a self-report nothing checks. The probe itself has run report-only since #633 — this gate governs emission, not probing.

Preconditions, checked on the running fleet

The constant's docs demand two things before arming. Both verified against live nodes rather than the source tree:

1. Every node knows the CapabilityType::Address variant. All eight run v1.11.33 at bf3f822b5, verified per binary via --version — which names the commit since #820. Version string alone is a weaker claim, and the gap between the two is exactly what #759 is about.

2. A live pass rate on the rolled binary:

Passes since the roll (all 8 nodes) 722
Failures 0
Unreachable / WrongSigner / BadSignature 0 / 0 / 0

The 24h baseline from 2026-08-21 (9,681 pass / 181 fail, 98.2%, every failure Unreachable) stands as the longer sample; this confirms the newly rolled binary behaves the same.

Why 966_000

Chain was at 965,065, running ~150 blocks/day (measured: 144 blocks took 23h). The arming roll lands around 965,215, leaving ~785 blocks / ~5 days of margin.

That is deliberately more than the ~2.2 days SHARE_TIER_BIND_HEIGHT used, because this gate fails silently: CapabilityType is a plain serde enum with no unknown-variant fallback, so a peer that does not know "address" does not reject the verdict — it drops the entire message without saying so. Margin is what buys room to roll back and re-roll.

Tests and controls

Control Result
Revert constant to u64::MAX the_armed_height_is_pinned and the_gate_is_armed_not_dormant fail
the_accessor_agrees_with_the_constant correctly still passes (checks consistency, not the value)

Existing gate-summary test unaffected: MESH_ENVELOPE_V2 and ARCHIVE_TX_PROOF stay dormant, so never still renders and u64::MAX is still never printed raw.

cargo test -p ghost-pool --lib: 495 passed, 0 failed. Clippy and fmt clean.

⚠ Requires a fleet roll before 966_000

Mainnet gates ignore GHOST_*_HEIGHT env overrides — from_env returns the compiled default before reading the environment — so arming and rolling back are both binary changes plus a full roll. Plan: merge this, cut v1.11.34, roll all eight, with ~5 days of margin before it fires.

https://claude.ai/code/session_01Td1vvfowptTTnu88qG2iym

H-7's probe has run report-only in the verification rotation since #633. This
gate governs EMISSION: at and above 966_000 a challenger broadcasts the address
proof it already performs, so the `/24` a node claims becomes a converged,
majority-attested fact rather than a self-report nothing checks.

Both preconditions the constant's own docs demand were checked on the RUNNING
fleet, not from the source tree:

1. Every node knows the `CapabilityType::Address` variant. All eight run
   v1.11.33 at commit `bf3f822b5`, verified per binary through `--version`,
   which names the commit since #820 — not by version string, which is a
   weaker claim and the whole subject of #759.
2. A live pass rate on the rolled binary: 722 pass / 0 fail across all eight
   nodes since the roll, with zero `Unreachable`, `WrongSigner` or
   `BadSignature`. The 24h baseline from 2026-08-21 (9,681 / 181, 98.2%,
   every failure `Unreachable`) stands as the longer sample; this confirms the
   new binary behaves the same.

966_000 is ~785 blocks past where the arming roll lands — the chain was at
965,065 and is running ~150 blocks/day (144 blocks took 23h), so about five
days of margin. Deliberately more than the ~2.2 days SHARE_TIER_BIND_HEIGHT
used, because this gate fails SILENTLY: `CapabilityType` is a plain serde enum
with no unknown-variant fallback, so a peer that does not know `"address"` does
not reject the verdict, it drops the entire message without saying so. Margin
is what buys room to roll back and re-roll.

Three tests, each with a control. Reverting the constant to `u64::MAX` fails
`the_armed_height_is_pinned` and `the_gate_is_armed_not_dormant`;
`the_accessor_agrees_with_the_constant` correctly still passes, because it
checks consistency rather than the value. The existing gate-summary test is
unaffected — MESH_ENVELOPE_V2 and ARCHIVE_TX_PROOF remain dormant, so `never`
still renders.

⚠ Requires a fleet roll. Mainnet gates ignore `GHOST_*_HEIGHT` env overrides
(`from_env` returns the compiled default before reading the environment), so
arming AND rolling back are both binary changes.

Claude-Session: https://claude.ai/code/session_01Td1vvfowptTTnu88qG2iym
@defenwycke
defenwycke merged commit 6d9e62b into main Sep 1, 2026
12 checks passed
defenwycke added a commit that referenced this pull request Sep 1, 2026
The arming release. Two consensus-visible gates fire from this build, and both
require every node to be running it beforehand:

  * ADDRESS_PROOF_HEIGHT   966_000  (#824, H-7, #605)
  * MESH_ENVELOPE_V2_HEIGHT 966_400  (#825, H-11, #604)

Deliberately ~400 blocks apart rather than sharing a height, so a mesh problem
in that window is attributable to one gate rather than two. MESH_ENVELOPE_V2 is
the reason that matters: it does not degrade, it PARTITIONS — a node left on an
older binary rejects every mesh message from every upgraded peer, and the only
way back is upgrading it.

⛔ ALL EIGHT must carry this before 966_400. At 965,085 that is ~8 days.

Also carries #826: the deploy now prunes stale `$BINARY.bak.*` to the two most
recent instead of accumulating them forever. Measured before the fix, after the
v1.11.33 roll: vm1 39 files / 1.4 GB, vm4 38 / 765 MB, vm5 33 / 712 MB.

Both lockfiles synced; `tests/integration-sv2`, `crates/stratum-apps` and
`prototypes/ghast-bench` carry no workspace version and still resolve under
`--locked`. Checked with `grep -F`, since an unescaped `1.11.33` matches digits
inside dependency checksums.

Claude-Session: https://claude.ai/code/session_01Td1vvfowptTTnu88qG2iym
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