policy: feature-freeze cliff for the Codex inscription window (heights 998,000 → 1,050,667) #20

Closed
opened 2026-06-07 00:13:51 +00:00 by dobbscoin · 3 comments
dobbscoin commented 2026-06-07 00:13:51 +00:00

Operational policy, not a code change. Pinning the feature-freeze cliff height for the Restoration Hardfork's Codex inscription window so it's discoverable from PRs and outside contributors aren't surprised by a sudden change in merge cadence.

The window

Boundary Block ETA from filing
Freeze BEGINS 998,000 ~6.2 days (2026-06-13)
Descent verses begin 999,991 ~7.6 days
Fork activates 1,000,000 ~7.6 days
Codex canon ends (~47k Lovecraft blocks) ~1,047,248 ~40 days
Freeze ENDS (OFFSIG window close + 1) 1,050,667 ~42 days

The freeze is in effect for ~52,667 blocks (~36.5 days at 60s target). Block 998,000 was chosen because:

  • ~33 hours of "frozen but normal-conditions" runway before the Descent — enough room for any pre-freeze fix to land + rebuild + fleet-deploy without scrambling
  • 18,000 blocks past the LWMA-3 fork at 980,000 — retarget has had ~12.5 days to settle, so we're not freezing during a difficulty transient
  • Round number — easy to remember, easy to cite in commit messages

What's frozen

Anything that compiles into Offeringsd. The daemon is what runs the chain. If it ships in the daemon binary, it's frozen:

  • Consensus code — src/main.cpp, src/chainparams.cpp, src/pow.cpp, src/checkpoints.cpp
  • Block-sync state machine — CNodeState and friends in src/main.cpp
  • Network layer — src/net.cpp, src/net.h, src/protocol.{h,cpp}
  • RPC surface — src/rpc*.cpp (adding RPCs touches the daemon's exposed interface)
  • Startup / init — src/init.cpp
  • Miner — src/miner.cpp (the Conclave-signed mining path runs through here)
  • Wallet core — src/wallet.cpp, src/wallet*.cpp

What's NOT frozen

  • Qt-only changes — src/qt/* (and src/qt/forms/*) that don't modify shared code. Offerings-qt is a separate binary; the headless fleet doesn't link it. Issues like #15 / #16 / #18 (when its time comes) are merge-on-clean-build throughout the window.
  • Documentation — README, release notes, BCT posts, this issue tracker itself
  • CI workflow changes that don't affect the compiled binary (e.g. cache key tweaks, runner pinning)
  • Auto-memory / handoff docs (these don't touch the repo anyway)

Hotfix path during the window

A PR that needs to land between blocks 998,000 and 1,050,667 must:

  1. Be a genuine emergency — security issue with the Codex inscription mechanism, block-sync stall, chain split / consensus discrepancy, key compromise. Not "this would be nice to have."
  2. Cite this issue (refs #<this-issue>) and explain why it's not deferrable to the post-freeze opening.
  3. Get a second reviewer. Two eyes minimum. PRs from external contributors get review from the maintainer; maintainer-authored fixes get review from at least one fleet operator (vps1 / chaos).
  4. Have a fleet-deploy plan documented before merge. Who rebuilds where, in what order, how we verify each daemon's protocolversion / blocks post-restart. This is the lesson from the 2026-06-06 90003 era-bump deploy — having the order written down beforehand made it boring; not having it would have left us scrambling.
  5. Be testable on testnet first if possible. Especially anything touching the retarget (pow.cpp) or the OFFSIG window enforcement (main.cpp::ConnectBlock).

What happens to non-emergency PRs during the window

They sit on a frozen-for-codex label or in a draft state, and merge after block 1,050,667. The contributor isn't penalized — their work lands in the v2.1.0 (or whichever release follows the freeze opening) cycle.

External contributors (e.g. 9019x / skifdni) submitting PRs during the window will get a polite "great work, this lands post-1,050,667" response with a link here.

Why this exists at all

The Codex inscription is a 50,676-block continuous sequence. The Conclave miner inside Offeringsd is the only thing that can produce blocks in that window — outsider-mined blocks are rejected as bad-conclave-sig. If the daemon stalls, the inscription breaks. If the chain forks, the inscription forks. Both outcomes are unrecoverable mythologically — the canon is supposed to be unbroken.

So during the window, main only takes changes that exist specifically to prevent those outcomes. Everything else waits 36 days.

What gets adjusted if the freeze starts but Codex is somehow delayed

If anything goes sideways and the fork itself drifts past block 1,000,000's actual timing, the freeze stays in effect until 1,050,667 in chain-height terms, not wall-clock. The freeze cliff is height-anchored, not time-anchored. So a slow-block-time spell or unexpected retarget transient extends the freeze automatically; it doesn't open early.

References

  • src/chainparams.cpp:167-168 — OFFSIG window heights nSignedWindowStart / nOpenMiningHeight
  • src/main.cpp::ConnectBlock + src/chainparams.cpp — OFFSIG enforcement
  • src/miner.cpp::SignBlockIfNeeded — Conclave signing path
  • https://23skidoo.info/awakening/ — live countdown
  • Companion parked issues during the freeze: #17 (banlist epic), #18 (pindexBestKnownBlock backport), #19 (UPnP Phase 3)

The chain holds its breath. Iä Iä.

Operational policy, not a code change. Pinning the feature-freeze cliff height for the Restoration Hardfork's Codex inscription window so it's discoverable from PRs and outside contributors aren't surprised by a sudden change in merge cadence. ## The window | Boundary | Block | ETA from filing | |---|---|---| | **Freeze BEGINS** | **998,000** | ~6.2 days (2026-06-13) | | Descent verses begin | 999,991 | ~7.6 days | | Fork activates | 1,000,000 | ~7.6 days | | Codex canon ends (~47k Lovecraft blocks) | ~1,047,248 | ~40 days | | **Freeze ENDS** (OFFSIG window close + 1) | **1,050,667** | ~42 days | The freeze is in effect for **~52,667 blocks (~36.5 days at 60s target)**. Block 998,000 was chosen because: - ~33 hours of "frozen but normal-conditions" runway before the Descent — enough room for any pre-freeze fix to land + rebuild + fleet-deploy without scrambling - 18,000 blocks past the LWMA-3 fork at 980,000 — retarget has had ~12.5 days to settle, so we're not freezing during a difficulty transient - Round number — easy to remember, easy to cite in commit messages ## What's frozen Anything that compiles into `Offeringsd`. The daemon is what runs the chain. If it ships in the daemon binary, it's frozen: - **Consensus code** — `src/main.cpp`, `src/chainparams.cpp`, `src/pow.cpp`, `src/checkpoints.cpp` - **Block-sync state machine** — `CNodeState` and friends in `src/main.cpp` - **Network layer** — `src/net.cpp`, `src/net.h`, `src/protocol.{h,cpp}` - **RPC surface** — `src/rpc*.cpp` (adding RPCs touches the daemon's exposed interface) - **Startup / init** — `src/init.cpp` - **Miner** — `src/miner.cpp` (the Conclave-signed mining path runs through here) - **Wallet core** — `src/wallet.cpp`, `src/wallet*.cpp` ## What's NOT frozen - **Qt-only changes** — `src/qt/*` (and `src/qt/forms/*`) that don't modify shared code. `Offerings-qt` is a separate binary; the headless fleet doesn't link it. Issues like #15 / #16 / #18 (when its time comes) are merge-on-clean-build throughout the window. - **Documentation** — README, release notes, BCT posts, this issue tracker itself - **CI workflow changes** that don't affect the compiled binary (e.g. cache key tweaks, runner pinning) - **Auto-memory / handoff docs** (these don't touch the repo anyway) ## Hotfix path during the window A PR that needs to land between blocks 998,000 and 1,050,667 must: 1. **Be a genuine emergency** — security issue with the Codex inscription mechanism, block-sync stall, chain split / consensus discrepancy, key compromise. Not "this would be nice to have." 2. **Cite this issue** (`refs #<this-issue>`) and explain why it's not deferrable to the post-freeze opening. 3. **Get a second reviewer.** Two eyes minimum. PRs from external contributors get review from the maintainer; maintainer-authored fixes get review from at least one fleet operator (vps1 / chaos). 4. **Have a fleet-deploy plan documented before merge.** Who rebuilds where, in what order, how we verify each daemon's `protocolversion` / `blocks` post-restart. This is the lesson from the 2026-06-06 90003 era-bump deploy — having the order written down beforehand made it boring; not having it would have left us scrambling. 5. **Be testable on testnet first if possible.** Especially anything touching the retarget (`pow.cpp`) or the OFFSIG window enforcement (`main.cpp::ConnectBlock`). ## What happens to non-emergency PRs during the window They sit on a `frozen-for-codex` label or in a draft state, and merge after block 1,050,667. The contributor isn't penalized — their work lands in the v2.1.0 (or whichever release follows the freeze opening) cycle. External contributors (e.g. 9019x / skifdni) submitting PRs during the window will get a polite "great work, this lands post-1,050,667" response with a link here. ## Why this exists at all The Codex inscription is a 50,676-block continuous sequence. The Conclave miner inside `Offeringsd` is the only thing that can produce blocks in that window — outsider-mined blocks are rejected as `bad-conclave-sig`. If the daemon stalls, the inscription breaks. If the chain forks, the inscription forks. Both outcomes are unrecoverable mythologically — the canon is supposed to be unbroken. So during the window, `main` only takes changes that exist specifically to prevent those outcomes. Everything else waits 36 days. ## What gets adjusted if the freeze starts but Codex is somehow delayed If anything goes sideways and the fork itself drifts past block 1,000,000's actual timing, the freeze stays in effect until 1,050,667 in **chain-height** terms, not wall-clock. The freeze cliff is height-anchored, not time-anchored. So a slow-block-time spell or unexpected retarget transient extends the freeze automatically; it doesn't open early. ## References - `src/chainparams.cpp:167-168` — OFFSIG window heights `nSignedWindowStart` / `nOpenMiningHeight` - `src/main.cpp::ConnectBlock` + `src/chainparams.cpp` — OFFSIG enforcement - `src/miner.cpp::SignBlockIfNeeded` — Conclave signing path - https://23skidoo.info/awakening/ — live countdown - Companion parked issues during the freeze: #17 (banlist epic), #18 (`pindexBestKnownBlock` backport), #19 (UPnP Phase 3) --- *The chain holds its breath. Iä Iä.*
dobbscoin commented 2026-06-16 00:20:41 +00:00

Cross-link from the v2.0.x-rc-bipsoft work: #32, #33, and #34 were originally filed (2026-06-14/15) with activation at h=1,025,000 — inside this freeze window. Revised 2026-06-16 to activate at h=1,055,555, 4,889 blocks past freeze-end at h=1,050,667, bundled with #6 rolling-checkpoints at the same height. One upgrade cycle, one BCT post, one Conclave deploy.

Branch development is on feat/v2.0.x-rc-bipsoft. main stays frozen until h=1,050,667 per this policy.

Net effect: no consensus changes hit main inside the window, and the consensus bundle still lands cleanly within the same release runway. Filing in the issue tracker stays freeze-safe (documentation, not daemon code).

Cross-link from the v2.0.x-rc-bipsoft work: #32, #33, and #34 were originally filed (2026-06-14/15) with activation at h=1,025,000 — inside this freeze window. Revised 2026-06-16 to activate at **h=1,055,555**, 4,889 blocks past freeze-end at h=1,050,667, bundled with #6 rolling-checkpoints at the same height. One upgrade cycle, one BCT post, one Conclave deploy. Branch development is on `feat/v2.0.x-rc-bipsoft`. `main` stays frozen until h=1,050,667 per this policy. Net effect: no consensus changes hit `main` inside the window, and the consensus bundle still lands cleanly within the same release runway. Filing in the issue tracker stays freeze-safe (documentation, not daemon code).
dobbscoin commented 2026-06-18 03:12:23 +00:00

ok policy is live. mainnet's around h=1,003k now which is past the 998,000 start, so we're in the window (chain held its breath right on schedule).

added the frozen-for-codex label for PRs that should sit until h=1,050,667. anything between now and then either fits the hotfix path in the body or it gets the label and waits in draft.

work-in-flight: feat/v2.0.x-rc-bipsoft carries #32 / #33 / #34 / #6 / #39, all activating at h=1,055,555 — past freeze-end by design. soak runs ~24 more hours, then the branch waits ~30 days for freeze-end before merging to main. nothing else queued for main during the window.

leaving this open as the canonical reference. closes whenever the freeze does (h=1,050,667, ~2026-07-19).

ok policy is live. mainnet's around h=1,003k now which is past the 998,000 start, so we're in the window (chain held its breath right on schedule). added the `frozen-for-codex` label for PRs that should sit until h=1,050,667. anything between now and then either fits the hotfix path in the body or it gets the label and waits in draft. work-in-flight: `feat/v2.0.x-rc-bipsoft` carries #32 / #33 / #34 / #6 / #39, all activating at h=1,055,555 — past freeze-end by design. soak runs ~24 more hours, then the branch waits ~30 days for freeze-end before merging to main. nothing else queued for main during the window. leaving this open as the canonical reference. closes whenever the freeze does (h=1,050,667, ~2026-07-19).
dobbscoin commented 2026-08-11 01:24:12 +00:00

Freeze is over. Closing.

The window was heights 998,000 → 1,050,667. Mainnet is at h=1,080,978 — 30,311 blocks past freeze-end, roughly three weeks.

Everything the policy was protecting landed as designed. The bipsoft bundle (#32, #33, #34, #6, #39) activated at h=1,055,555, past freeze-end by 4,889 blocks exactly as the revision intended: one upgrade cycle, one BCT post, one Conclave deploy. No consensus change entered main inside the window.

The frozen-for-codex label no longer gates anything, and the [post-Codex] markers still carried in the titles of #17, #18, and #37 are dead text — those three are unblocked as of h=1,050,667 and should be read that way.

The Codex is inscribed. The chain held its breath and let it out.

Freeze is over. Closing. The window was heights `998,000 → 1,050,667`. Mainnet is at **h=1,080,978** — 30,311 blocks past freeze-end, roughly three weeks. Everything the policy was protecting landed as designed. The bipsoft bundle (#32, #33, #34, #6, #39) activated at h=1,055,555, past freeze-end by 4,889 blocks exactly as the revision intended: one upgrade cycle, one BCT post, one Conclave deploy. No consensus change entered `main` inside the window. The `frozen-for-codex` label no longer gates anything, and the `[post-Codex]` markers still carried in the titles of #17, #18, and #37 are dead text — those three are unblocked as of h=1,050,667 and should be read that way. The Codex is inscribed. The chain held its breath and let it out.
dobbscoin closed this issue 2026-08-11 01:24:13 +00:00
Sign in to join this conversation.
No labels
enhancement
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
SubGeniusFinance/Offerings-to-Cthulhu#20
No description provided.