id: K3 number: 3 title: Amendment Procedure layer: kernel notes: >- Amendments are pull requests. The lifecycle below is implemented byte-for-byte by the proposal tooling; the states here and the states in the code are the same identifiers. clauses: - id: K3.1 title: Amendments are pull requests text: >- An amendment is proposed as a pull request against the canonical repository containing exactly one proposal document and the complete proposed change to the constitution source tree. No change to normative content may merge except through a ratified proposal. - id: K3.2 title: Lifecycle text: >- A proposal moves through the states draft, open, voting, and exactly one of ratified, rejected, withdrawn, or expired. A draft becomes open when its author publishes it for review. An open proposal enters voting only after its review window has elapsed. Voting closes when its voting window elapses. A proposal that has entered voting may no longer be edited; any edit to a proposal returns it to draft and voids ballots already cast. - id: K3.3 title: Review windows text: >- Each proposal class carries a minimum review window measured from the moment the proposal becomes open. Voting may not open earlier. parameters: review_days_major: type: integer value: 14 forkable: true min: 7 max: 90 review_days_minor: type: integer value: 7 forkable: true min: 3 max: 60 review_days_patch: type: integer value: 3 forkable: true min: 1 max: 30 - id: K3.4 title: Atomicity and classification text: >- A proposal contains one coherent change. The classifier assigns every proposal a class of major, minor, or patch according to Article 4; invariant-touching proposals form a fourth class with its own thresholds. The author may declare a higher class than the classifier assigns, never a lower one. The gate recomputes the class at ratification and blocks any proposal whose declared class is below the recomputed class. - id: K3.5 title: Withdrawal and expiry text: >- An author may withdraw a proposal at any time before voting closes. A proposal that has not been decided within its time to live from creation expires automatically. parameters: proposal_ttl_days: type: integer value: 90 forkable: true min: 14 max: 365