Contract Milestone Plans and Lifecycle

V4 FULL contract creation can opt into revenue_pattern: PROGRESS for compatible milestone products.
Omit progress_plan to snapshot the product template, or supply a complete MILESTONES plan to override it.
Percentages are plain decimal strings with at most four decimal places; AMOUNT allocations use rounded
money and must sum to the final line value after quantity and discounts. Sequences are positive JSON integers.
Existing accounting-engine eligibility applies; discounted milestone lines are currently unsupported.
Contract create, retrieve, and list responses return the saved plan with server-generated milestone IDs,
organization-local statuses, and exact allocations.

Complete or correct a milestone with PUT /contracts/{contract_id}/milestones/{milestone_ref}/completion.
Reverse completion with DELETE on the same path, or permanently forfeit a pending milestone with
PUT /contracts/{contract_id}/milestones/{milestone_ref}/cancellation. The reference may be the saved
milestone ID or its case-insensitive key. Completion writes fully replace memo and external references;
identical completion and cancellation retries do not repeat accounting effects.