feat(governance): decouple minimum dissolve delay to vote from propose#9880
Conversation
The minimum dissolve delay to vote (`neuron_minimum_dissolve_delay_to_vote_seconds`) was also used to gate proposal submission. Under Mission 70, this was lowered to 2 weeks, meaning neurons with just 2 weeks of dissolve delay could submit proposals. This introduces a separate constant `NEURON_MINIMUM_DISSOLVE_DELAY_TO_PROPOSE_SECONDS` (6 months) for proposal submission eligibility, while the vote minimum remains independently governable. A validation check is added to ensure the vote minimum cannot exceed the propose minimum, since every time a neuron submits a proposal it also votes on it — a proposer that is ineligible to vote on their own proposal would be incoherent. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
This pull request changes code owned by the Governance team. Therefore, make sure that
you have considered the following (for Governance-owned code):
-
Update
unreleased_changelog.md(if there are behavior changes, even if they are
non-breaking). -
Are there BREAKING changes?
-
Is a data migration needed?
-
Security review?
How to Satisfy This Automatic Review
-
Go to the bottom of the pull request page.
-
Look for where it says this bot is requesting changes.
-
Click the three dots to the right.
-
Select "Dismiss review".
-
In the text entry box, respond to each of the numbered items in the previous
section, declare one of the following:
-
Done.
-
$REASON_WHY_NO_NEED. E.g. for
unreleased_changelog.md, "No
canister behavior changes.", or for item 2, "Existing APIs
behave as before.".
Brief Guide to "Externally Visible" Changes
"Externally visible behavior change" is very often due to some NEW canister API.
Changes to EXISTING APIs are more likely to be "breaking".
If these changes are breaking, make sure that clients know how to migrate, how to
maintain their continuity of operations.
If your changes are behind a feature flag, then, do NOT add entrie(s) to
unreleased_changelog.md in this PR! But rather, add entrie(s) later, in the PR
that enables these changes in production.
Reference(s)
For a more comprehensive checklist, see here.
GOVERNANCE_CHECKLIST_REMINDER_DEDUP
There was a problem hiding this comment.
Pull request overview
This PR decouples the minimum dissolve delay required to submit proposals from the (recently lowered) minimum dissolve delay required to vote, ensuring proposal submission retains the original 6‑month requirement while voting eligibility can remain lower.
Changes:
- Introduce
NEURON_MINIMUM_DISSOLVE_DELAY_TO_PROPOSE_SECONDS(6 months) and enforce it for non-ManageNeuron proposal submission inmake_proposal. - Add validation preventing
neuron_minimum_dissolve_delay_to_vote_secondsfrom exceeding the proposal-submission minimum. - Update network economics validation tests to expect the additional validation defect.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| rs/nns/governance/src/governance.rs | Adds the new 6‑month proposal-submission constant and applies it in make_proposal for non-ManageNeuron proposals. |
| rs/nns/governance/src/network_economics.rs | Adds an extra validation defect ensuring vote minimum does not exceed the proposal-submission minimum. |
| rs/nns/governance/src/network_economics_tests.rs | Updates expected validation errors to include the new “must not exceed propose minimum” defect. |
Comments suppressed due to low confidence (1)
rs/nns/governance/src/governance.rs:5248
make_proposalnow enforces a new, hard 6‑month minimum dissolve delay for submitting non-ManageNeuron proposals. There doesn’t appear to be a unit/integration test covering this new behavior (e.g., a neuron with 2 weeks dissolve delay should still be able to vote but should be rejected when attempting to submit a Motion/ExecuteNnsFunction/etc. proposal). Please add a targeted test to lock in the new decoupled thresholds and prevent regressions.
let min_dissolve_delay_seconds_to_propose = if action.manage_neuron().is_some() {
0
} else {
NEURON_MINIMUM_DISSOLVE_DELAY_TO_PROPOSE_SECONDS
};
// The proposer must have sufficient dissolve delay to submit proposals.
// This threshold is intentionally decoupled from the voting eligibility
// threshold, which can be lower.
if proposer_dissolve_delay_seconds < min_dissolve_delay_seconds_to_propose {
return Err(GovernanceError::new_with_message(
ErrorType::InsufficientFunds,
"Neuron's dissolve delay is too short.",
));
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Reword validation defect to use domain terms instead of constant name
- Use consistent {:?} formatting for the vote delay field
- Add blank line before validation block
- Simplify comment (remove redundant decoupling explanation)
- Change ErrorType from InsufficientFunds to PreconditionFailed
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Done. 2. Existing APIs behave as before. 3. No data migration needed. 4. No security-sensitive changes.
Why
Under Mission 70,
neuron_minimum_dissolve_delay_to_vote_secondswas lowered from 6 monthsto 2 weeks. Since the same parameter also gated proposal submission, neurons with just 2 weeks
of dissolve delay can now submit proposals. This decouples the two thresholds so that proposal
submission retains the original 6-month requirement.
What
NEURON_MINIMUM_DISSOLVE_DELAY_TO_PROPOSE_SECONDSconstant (6 months) and use it inmake_proposalinstead of the governable vote minimum.neuron_minimum_dissolve_delay_to_vote_secondsensuring it cannot exceedthe propose constant. Every time a neuron submits a proposal it also votes on it, so the vote
minimum must stay at or below the propose minimum.
Testing
test_neuron_minimum_dissolve_delay_to_vote_seconds_boundsfor the new validation error