chore(operations): squads rotation rehearsal executed 2026-05-16 + offset fix#369
Merged
alrimarleskovar merged 2 commits intoMay 16, 2026
Merged
Conversation
…fset fix Two artifacts from end-to-end devnet rehearsal execution: 1. Rehearsal log (new): docs/operations/rehearsal-logs/2026-05-16-squads-rotation-rehearsal.md - 4 phases validated with tx evidence: propose, cancel, re-propose, commit - Parallel test deploy (program-id 6WuSo1ut...7Rpn) — canonical 8LVrg...QQjw untouched - Pre-flight blockers documented (devnet ProtocolConfig pre-PR #323, DeclaredProgramIdMismatch, insufficient SOL) - Post-rotation state: live=6Y6BL1mq..., pending=default, eta=0 (clean) 2. Offset fix in 2 scripts (squads-rehearsal-verify.ts + squads-rehearsal-commit-authority.ts): - OFFSET_PENDING_AUTHORITY: 311 -> 313 - OFFSET_PENDING_AUTHORITY_ETA: 343 -> 345 - Root cause: struct's SIZE comment listed pending_authority before lp_share_bps; Borsh serializes in source declaration order which has lp_share_bps (u16) FIRST. - Bug surfaced during rehearsal: verify displayed garbage Pubkey, commit aborted with false "Timelock active" before sending tx. - Fix verified end-to-end: post-fix verify correctly reads live/pending/eta. Closes operational gap flagged by external reviewer (Squads rehearsal "scripts ready, execution pending ~5 sprints"). Validates the propose/cancel/commit ix logic for the eventual mainnet ceremony. Squads-side multisig setup remains a separate ceremony-day artifact (mainnet only).
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
This was referenced May 16, 2026
alrimarleskovar
pushed a commit
that referenced
this pull request
May 17, 2026
- §Security & Audit severity table reconciled with internal-audit-findings.md (34/31 → 40/36; Critical 2→3, Low 10→12, Informational 6→9, won't-fix 2→3). - §Development Status row 1: 195+ → 370+ PRs merged on main (496 commits since project start). - §Development Status row 4: smart contract LoC 6,150 → 8,655 across the 3 in-scope Anchor programs (matches AUDIT_SCOPE.md). - §Development Status row 5: test count 227 → 280+ across 22 spec files; added explicit breakdown (security/encoder/canary-control/audit-regression/lifecycle) + bankrun_compat shim mention (ADR 0007). - §Development Status row 9 (security audit) rewritten: stale 'Halborn/Ottersec/Sec3 + bug bounty deferred — out of hackathon scope' framing replaced with current 'internal pre-audit complete, 40 findings, 36 closed, Adevar engagement in scoping' framing; added pointer to all 11 indexed security docs. - §Development Status row 10 (devnet testing) tail: bankrun_compat shim (ADR 0007) + Squads multisig rotation rehearsal evidence (2026-05-16, devnet program-id 6WuSo1ut…7Rpn). - §Development Status row 11 (mainnet migration): SEV PR range #326..#365 → #326..#372. - §Core Mechanics line 107: '[Adevar SEV-025]' → 'internal pre-audit [SEV-025]' (matches the constraint enforced in wave 3). - docs/status.md: §Recent additions title #322-#369 → #322-#372 to capture wave 3 tail. Drift discovered after wave 3 by re-reading the README end-to-end against the canonical sources (AUDIT_SCOPE.md, internal-audit-findings.md). The prose surface had been refreshed at the top (§Security & Audit > stats) but the dependent severity table and §Development Status rows were written before the internal pre-audit completed and the wave 1-3 doc refresh. This is the same Adevar-attribution drift the wave 3 PR (#372) closed across docs/security/, applied to the README sections that escaped the wave 1-3 scope. Internal pre-audit framing preserved verbatim. https://claude.ai/code/session_01YapZy1Z5gzbV5EammBkSQm
alrimarleskovar
added a commit
that referenced
this pull request
May 17, 2026
… sweep (#373) - §Security & Audit severity table reconciled with internal-audit-findings.md (34/31 → 40/36; Critical 2→3, Low 10→12, Informational 6→9, won't-fix 2→3). - §Development Status row 1: 195+ → 370+ PRs merged on main (496 commits since project start). - §Development Status row 4: smart contract LoC 6,150 → 8,655 across the 3 in-scope Anchor programs (matches AUDIT_SCOPE.md). - §Development Status row 5: test count 227 → 280+ across 22 spec files; added explicit breakdown (security/encoder/canary-control/audit-regression/lifecycle) + bankrun_compat shim mention (ADR 0007). - §Development Status row 9 (security audit) rewritten: stale 'Halborn/Ottersec/Sec3 + bug bounty deferred — out of hackathon scope' framing replaced with current 'internal pre-audit complete, 40 findings, 36 closed, Adevar engagement in scoping' framing; added pointer to all 11 indexed security docs. - §Development Status row 10 (devnet testing) tail: bankrun_compat shim (ADR 0007) + Squads multisig rotation rehearsal evidence (2026-05-16, devnet program-id 6WuSo1ut…7Rpn). - §Development Status row 11 (mainnet migration): SEV PR range #326..#365 → #326..#372. - §Core Mechanics line 107: '[Adevar SEV-025]' → 'internal pre-audit [SEV-025]' (matches the constraint enforced in wave 3). - docs/status.md: §Recent additions title #322-#369 → #322-#372 to capture wave 3 tail. Drift discovered after wave 3 by re-reading the README end-to-end against the canonical sources (AUDIT_SCOPE.md, internal-audit-findings.md). The prose surface had been refreshed at the top (§Security & Audit > stats) but the dependent severity table and §Development Status rows were written before the internal pre-audit completed and the wave 1-3 doc refresh. This is the same Adevar-attribution drift the wave 3 PR (#372) closed across docs/security/, applied to the README sections that escaped the wave 1-3 scope. Internal pre-audit framing preserved verbatim. https://claude.ai/code/session_01YapZy1Z5gzbV5EammBkSQm Co-authored-by: Claude <noreply@anthropic.com>
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.
Summary
End-to-end Squads multisig rotation rehearsal executed on devnet 2026-05-16. Closes the operational gap flagged by external reviewer ("scripts ready, execution pending ~5 sprints").
Two artifacts:
docs/operations/rehearsal-logs/2026-05-16-squads-rotation-rehearsal.md)` — 4 phases validated with on-chain tx evidenceRehearsal evidence — 4 on-chain phases
4pfiQLAEzpoz...s1NDWguUm...2dhWa68945...2xeWvuDTa4...Final state on parallel test deployment:
live=6Y6BL1mq...(rotated),pending=default,eta=0(clean).Parallel deployment — canonical untouched
Rehearsal ran against a parallel
roundfi_coredeploy at6WuSo1utWKg8gNyzzJyqCoeLa7VpEyu8ZN1EtLzJ7Rpn, NOT the canonical8LVrgxKwKwqjcdq7rUUwWY2zPNk8anpo2JsaR9jTQQjw. Reason: the canonical devnetProtocolConfig(3c9MmoM8...) is 317 bytes — predates PR #323 that added authority-rotation fields (current code expects 381 bytes). The parallel deploy reproduces the rehearsal without disturbing Pool 1/2/3 history.Audit-worthy finding documented in rehearsal log §1.1: a
reallocmigration ix will be required to bring the canonical ProtocolConfig forward to the post-#323 layout. Tracked as gap for next devnet refresh sprint.Offset fix (script bug found during execution)
scripts/devnet/squads-rehearsal-{verify,commit-authority}.tshad wrong offsets:Root cause: source order in
programs/roundfi-core/src/state/config.rsplaceslp_share_bps: u16(2 bytes, line 122) BETWEENcommit_reveal_required(line 107) andpending_authority(line 136). The struct's ownpub const SIZEcomment block (line 193) listspending_authorityBEFORElp_share_bps— script author trusted the SIZE comment instead of source declaration order. Borsh serializes in declaration order, not comment order.Symptom:
verifydisplayed garbage Pubkey (7jkAWw2ZGq1R1...),etaas out-of-range Date (causedRangeError: Invalid time value).commitaborted with "Timelock active" error path before sending the tx because the misreadetalooked far in the future.Verified end-to-end post-fix: verify correctly reads
live=6Y6BL1mq...,pending=default,eta=0after the rotation completed.What this rehearsal validates
propose_new_authorityix exists, callable by current authority, atomically setspending_authority+pending_authority_etacancel_new_authorityix exists, callable by current authority, resets pending statecommit_new_authorityix exists, callable by anyone, enforcesetawindow, rotateslive authorityverify,propose-authority,cancel-authority,commit-authority) work end-to-end with the offset fixpnpmaliases (devnet:squads-rehearsal-*) work (added in PR chore(operations): squads rehearsal quickstart + pnpm aliases #367)squads-multisig-procedure.md§3-§5.Pre-flight blockers documented
Rehearsal log §1.1-§1.3 documents 3 blockers discovered + resolved during execution:
DeclaredProgramIdMismatchafter first deploy (resolved viaanchor keys sync+ rebuild)solana configwallet (resolved viasolana transferbetween wallets)These are documented for future operators — saves debugging time on next rehearsal.
Net delta
docs/operations/rehearsal-logs/2026-05-16-squads-rotation-rehearsal.md(new)scripts/devnet/squads-rehearsal-verify.tsscripts/devnet/squads-rehearsal-commit-authority.tsTest plan
verifycorrectly reads live/pending/eta8LVrg...QQjwprogram + Pool 1/2/3 history untouched.env,Anchor.toml,lib.rs,constants.rsrestored to canonical state (none of these commit in this PR)pnpm devnet:squads-rehearsal-verifyagainst the rehearsal program-id (6WuSo1ut...7Rpn) — should showlive=6Y6BL1mq...until that orphan deploy is wiped on next devnet refreshRelated
docs/operations/squads-multisig-procedure.mddocs/operations/squads-rehearsal-quickstart.md(PR chore(operations): squads rehearsal quickstart + pnpm aliases #367)docs/operations/rehearsal-logs/2026-05-12-pause-rehearsal.mdhttps://claude.ai/code/session_01YapZy1Z5gzbV5EammBkSQm
Generated by Claude Code