Security: admin-key custody missing named signer list, backup signer, and rotation process [SEC-B10] #398
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:implement
agent:implement
agent:open_issues
agent:ready
agent:research
agent:security_audit
agent:verify
architecture
backend
blocker:hybrid
blocker:launch
blocker:limit-orders
blocker:v2
block:log_only
block:security
bug
ci
contracts
correctness
deploy
dev
devops
docs
documentation
duplicate
e2e
enhancement
epic
feature
frontend
functional-completion
gas
good first issue
governance
help wanted
high-risk
hooks
hybrid
indexer
infra
infrastructure
integrators
invalid
launch-blocker
limit-orders
localnet
localterra
low priority
missing-implementation
needs-design
ops
performance
priority
high
priority
medium
product
qa
QA
question
ready
ready
research
scripts
security
security-hardening
smartcontracts
tech-debt
testing
ux
UX
v2
verification
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-dex-terraclassic#398
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Checklist Item
SEC-B10: Document admin-key custody for small launch: multisig preferred, named backup signer, no single hot wallet for mainnet if avoidable. Verify: deployment runbook has signer list and rotation process.
Summary
The security model and launch checklist require that governance be a multisig with no single hot wallet on mainnet. The requirement exists as a policy statement in multiple places but no document provides a named signer list, a designated backup signer, or a key rotation process.
What Was Checked
docs/security-model.mdline 17 -- "governance address should be a multisig or DAO-controlled address in production. Never use a single EOA for mainnet governance" -- policy only, no namesdocs/runbooks/launch-checklist.mdPhase 0 line 13 -- checklist item requires multisig for governance and treasury, item uncheckeddocs/runbooks/wasm-admin-migration.md-- migration procedures only, no signer list or rotation stepsdocs/deployment-guide.md-- contract deployment commands only, no key custody sectiondocs/operator-secrets.mdlines 47-49 -- "Multisig governance for factory/router/pair admin is required for production" -- no names, no rotationCODEOWNERS-- only@PlasticDigitslisted, no multisig member rosterExpected (per checklist)
The deployment runbook or a linked custody document must include: the planned multisig type and threshold, named roles for each required signer, a designated backup signer, a key rotation process (conditions and steps), and a statement that no single hot wallet controls mainnet governance.
Actual
The requirement exists as a policy statement across three files but no implementation details exist anywhere in the repo. No signer names, roles, threshold configuration, backup designation, or rotation schedule are documented.
Evidence
docs/security-model.mdline 17: policy requirement onlydocs/operator-secrets.mdlines 47-49: policy requirement onlydocs/runbooks/launch-checklist.mdline 13: checklist item not yet completedCODEOWNERS: only@PlasticDigits, no multisig member listSuggested Fix
Add a custody section to
docs/runbooks/launch-checklist.mdor a separatedocs/runbooks/key-custody.mdcovering:This document does not need to be public but must be linked from the launch runbook so it is reachable during an incident.
Verification Checklist
docs/runbooks/launch-checklist.mdis completed with a reference to the custody docLabels
security,pre-launchCc: @PlasticDigits
Pending multisig setup
mentioned in issue #381
mentioned in commit
f1091f011fmentioned in merge request !978
Picked up SEC-B10 and wrote the custody runbook + wired it in. MR !978, branch
issue-398-key-custody-roster, commitf1091f01.New
docs/runbooks/key-custody.mdcovers the whole checklist:k-of-nCosmos multisig (or DAO), with a minimum-threshold table by TVL band (2-of-3 bootstrap, 3-of-5 growth, >=3-of-5 + timelock mature)set-contract-admin+ factoryUpdateConfig { governance }-> threshold-sign -> verify on chain -> retire old keys)Kept it from stepping on the neighbors: it points at SEC-B09/#397 for the actual multisig signing flow and forward-refs SEC-D10/#408 for the copy-paste rotation cookbook + LocalTerra rehearsal, so nothing's duplicated.
Wiring: completed the Phase 0 custody item in the launch checklist (links the runbook, SEC-B10,
make verify-issue-398), added it to the Related-docs header, the Admin-controls BLOCK row, and the go/no-go doc-invariant block, plus a cross-link from the security model. Added the usual guard set —check_key_custody_docs.py,verify-issue-398.sh,AGENTS_KEY_CUSTODY.md, Makefile targets intolint+help.make verify-issue-398-> 5/5; the drift guard fails closed on a missing file or stripped marker, and every section anchor resolves.One thing I deliberately did NOT do: left the Phase 0 checkbox unchecked and invented no signer names, addresses, or final threshold — that's your "pending multisig setup". The runbook says outright not to treat the custody gate as satisfied until the real multisig is generated and live, and the filled roster gets linked privately off #391. So the docs side is good to merge/close from my side; the actual gate flips once the ceremony's done.
Needs your review + merge. @PlasticDigits
mentioned in merge request !979
mentioned in issue #408
mentioned in commit
f1125d59c9terra1zlmv2xydxcusurtr6rl78wsvytdc6mfex6hep7
SEC-B10 (#398) — verification complete
All acceptance criteria for the documentation/custody framework deliverable are satisfied on
main(MR !978 merged; canonical multisig addressterra1zlmv2xydxcusurtr6rl78wsvytdc6mfex6hep7recorded indocs/reference/governance-multisig.mdand cross-linked from the custody runbook).Acceptance checklist
docs/runbooks/key-custody.md§1 (k-of-n Cosmos multisig, TVL-banded minimum thresholds)docs/runbooks/key-custody.md§2 (primary governance / treasury / security / backup roles; private fill-in at key ceremony)docs/runbooks/key-custody.md§3docs/runbooks/key-custody.md§4 (+ forward-ref to SEC-D10 / #408)key-custody.md;docs/security-model.mdcross-linkdocs/runbooks/launch-checklist.mdPhase 0 item linkskey-custody.md, SEC-B10,make verify-issue-398Commands run (2026-07-01)
Artifacts
docs/runbooks/key-custody.md— custody framework runbookdocs/reference/governance-multisig.md— canonical on-chain addressskills/AGENTS_KEY_CUSTODY.md— agent playbookscripts/check_key_custody_docs.py+scripts/qa/verify-issue-398.sh— drift guardscheck-key-custody-docs,verify-issue-398(wired intolint+help)Operational note (not blocking #398)
The Phase 0 checkbox in
launch-checklist.mdremains unchecked until the key ceremony fills the private roster (signer identities, finalk, emergency rehearsals from the live multisig). That is the launch gate (#391), not this documentation issue.Closing #398 — the repo deliverable for SEC-B10 is complete.