Skip to content

feat(governance): decouple minimum dissolve delay to vote from propose#9880

Merged
jasonz-dfinity merged 3 commits intomasterfrom
jason/decouple-dissolve-delay-vote-propose
Apr 16, 2026
Merged

feat(governance): decouple minimum dissolve delay to vote from propose#9880
jasonz-dfinity merged 3 commits intomasterfrom
jason/decouple-dissolve-delay-vote-propose

Conversation

@jasonz-dfinity
Copy link
Copy Markdown
Contributor

Why

Under Mission 70, neuron_minimum_dissolve_delay_to_vote_seconds was lowered from 6 months
to 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

  • Add a NEURON_MINIMUM_DISSOLVE_DELAY_TO_PROPOSE_SECONDS constant (6 months) and use it in
    make_proposal instead of the governable vote minimum.
  • Add validation on neuron_minimum_dissolve_delay_to_vote_seconds ensuring it cannot exceed
    the 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

  • Updated test_neuron_minimum_dissolve_delay_to_vote_seconds_bounds for the new validation error

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>
@github-actions github-actions bot added the feat label Apr 14, 2026
@jasonz-dfinity jasonz-dfinity requested a review from Copilot April 14, 2026 23:16
@jasonz-dfinity jasonz-dfinity marked this pull request as ready for review April 14, 2026 23:19
@jasonz-dfinity jasonz-dfinity requested a review from a team as a code owner April 14, 2026 23:19
Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This pull request changes code owned by the Governance team. Therefore, make sure that
you have considered the following (for Governance-owned code):

  1. Update unreleased_changelog.md (if there are behavior changes, even if they are
    non-breaking).

  2. Are there BREAKING changes?

  3. Is a data migration needed?

  4. Security review?

How to Satisfy This Automatic Review

  1. Go to the bottom of the pull request page.

  2. Look for where it says this bot is requesting changes.

  3. Click the three dots to the right.

  4. Select "Dismiss review".

  5. 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

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 in make_proposal.
  • Add validation preventing neuron_minimum_dissolve_delay_to_vote_seconds from 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_proposal now 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.

Comment thread rs/nns/governance/src/network_economics.rs Outdated
Comment thread rs/nns/governance/src/governance.rs
Comment thread rs/nns/governance/src/governance.rs Outdated
Comment thread rs/nns/governance/src/governance.rs Outdated
Comment thread rs/nns/governance/src/network_economics.rs
Comment thread rs/nns/governance/src/network_economics.rs
jasonz-dfinity and others added 2 commits April 15, 2026 22:12
- 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>
@jasonz-dfinity jasonz-dfinity dismissed github-actions[bot]’s stale review April 16, 2026 05:17
  1. Done. 2. Existing APIs behave as before. 3. No data migration needed. 4. No security-sensitive changes.
@jasonz-dfinity jasonz-dfinity added this pull request to the merge queue Apr 16, 2026
Merged via the queue into master with commit c9933d7 Apr 16, 2026
37 checks passed
@jasonz-dfinity jasonz-dfinity deleted the jason/decouple-dissolve-delay-vote-propose branch April 16, 2026 05:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants