Context
Milestones are stored in Payout.milestones as JSON while milestone operations have independent status, evidence, feedback, amount, and escrow semantics. JSON storage prevents relational constraints, efficient querying, safe concurrent updates, and reliable history.
Scope
- Design
Milestone, MilestoneEvidence, and milestone transition/history models.
- Preserve ordering, amount/currency, due dates, status, evidence, feedback, and on-chain identifiers.
- Add constraints ensuring milestone totals agree with payout funding and ordering is unique per payout.
- Implement an expand/backfill/verify/contract migration strategy with resumable batches.
- Dual-read or dual-write during rollout so deployment is reversible.
- Replace whole-JSON updates with optimistic or transactional row-level operations.
Acceptance criteria
Relevant areas
prisma/schema.prisma, useMilestoneActions.ts, ManageMilestonesDialog.tsx, payout schemas and API routes.
Context
Milestones are stored in
Payout.milestonesas JSON while milestone operations have independent status, evidence, feedback, amount, and escrow semantics. JSON storage prevents relational constraints, efficient querying, safe concurrent updates, and reliable history.Scope
Milestone,MilestoneEvidence, and milestone transition/history models.Acceptance criteria
Relevant areas
prisma/schema.prisma,useMilestoneActions.ts,ManageMilestonesDialog.tsx, payout schemas and API routes.