Parent epic: #5
Normative spec: 04 — Preserved project/peer-review behavior
Scope
Port copied project/criteria/deadline definitions, GitHub/commit submission, required/volunteer peer assignment, criterion responses/reviews, self/duplicate prevention, voting, scoring/pass/fail/results/statistics, extensions/repairs/reassignment/notifications, and full learner plus Studio/admin API behavior using cohort scope and durable concurrency controls.
Non-goals
No scoring redesign, arbitrary synchronous URL validation/SSRF, cross-cohort reviews, or destructive criteria deletion with responses.
Acceptance criteria
Test scenarios
- Required/volunteer assignment under concurrent workers, insufficient peers, retries, self/duplicate/cross-cohort attempts.
- Valid/invalid/private/link-local/metadata/redirect/oversize project URLs in safe validator.
- Every rubric response/vote/scoring/pass-fail/statistics fixture, stale repair/rescore, and protected deletion.
Playwright
Learner submits project, receives/reviews peers, votes/views results; Studio authors criteria, assigns/repairs/rescores and inspects statistics at desktop/mobile with screenshots.
Dependencies
Depends on #31–#33 and #51–#54; notifications integrate with #50.
Parent epic: #5
Normative spec: 04 — Preserved project/peer-review behavior
Scope
Port copied project/criteria/deadline definitions, GitHub/commit submission, required/volunteer peer assignment, criterion responses/reviews, self/duplicate prevention, voting, scoring/pass/fail/results/statistics, extensions/repairs/reassignment/notifications, and full learner plus Studio/admin API behavior using cohort scope and durable concurrency controls.
Non-goals
No scoring redesign, arbitrary synchronous URL validation/SSRF, cross-cohort reviews, or destructive criteria deletion with responses.
Acceptance criteria
Test scenarios
Playwright
Learner submits project, receives/reviews peers, votes/views results; Studio authors criteria, assigns/repairs/rescores and inspects statistics at desktop/mobile with screenshots.
Dependencies
Depends on #31–#33 and #51–#54; notifications integrate with #50.