[Copied over from Comadery]
Background
As Compound Governance evolves, it is becoming more obvious that certain proposals need a longer time for pre-vote analysis. For instance: The COMP issuance rebalancing proposal (CP011) effects not only Compound, but caused externalities that impact borrowing/supply demand such as Dai issuance and the Dai peg. These externalities affect both systems and deserve a more thorough analysis than proposals that are more straightforward. Compare CP011 to CP014 (née CP013), which aims to change the collateral factor for WBTC to be non-zero. This is a much more straightforward vote as the main economic risk factors deal with answering the following questions:
- Should WBTC be used as collateral in spite of the centralization/liquidity issues?
 - Is 65% the right collateral factor? If not, why is it too low/high?
 
In order to accommodate the differences in analysis complexity (especially with regards to economics), we propose adding a formal analysis period to each vote.
On-Chain Formal Analysis Periods
A formal analysis period is defined as a non-voting period where a proposal is active (e.g. submitted on-chain). Right now, a proposal is defined such that voting starts at block height  startBlock  (defined as the predecessor block of the block height where  propose  is called) and ends at block height  endBlock = startBlock + 17820  (roughly 3 days). With this format, all votes get the same time. We instead propose that another block height  beginVotingBlock  is added such that:
- The block height interval  
[startBlock, beginVotingBlock)represents a time where no votes are allowed to be cast but the proposal is on-chain (for provenance) and interested parties can inspect the proposal - The block height interval  
[beginVotingBlock, endBlock]is exactly the same as the current voting interval - We hold the invariant  
beginVotingBlock >= startBlockwithstartBlocks == beginVotingBlockequivalent to the current situation (e.g no formal analysis period) 
Using the extra parameter  beginVotingBlock  allows for the proposer to signal and declare the following on-chain:
- The proposal  requires  at least  
analysis_time(proposal) = [startBlock, beginVotingBlock)blocks of analysis. - If  
analysisTime(proposal) > analysisTime(proposal'), whereproposal'is another proposal, then the proposer signals to all voters thatproposalis worth more careful analysis (in terms of time) thanproposal' - By adding this as a parameter to  
GovernorAlpha.propose()each of these analysis periods is documented on-chain for provenance so that the community can later analyze which types of proposals need more/less analysis 
The extra work of doing this on-chain will allow for the community to look back upon how different changes require different levels of analysis. This change requires a simple, two-line mutation to  contracts/governance/GovernanceAlpha.sol  :
function propose(address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description, uint memory analysisTime) public returns (uint) { … uint startBlock = add256(block.number, votingDelay()); uint beginVotingBlock = add256(startBlock, analysisTime); uint endBlock = add256(beginVotingBlock, votingPeriod()); … }
It is our belief that by documenting on-chain the relative amount of difficulty for each proposal, we can provide better analysis and guide informed decisions as Compound Governance manages an ever expanding set of digital assets.