Parent preservation issue: #56\n\nSource: DataTalksClub/course-management-platform commit 56cac9a8f15a1f183de35a5e18040c49e758ff4c (CMP issue #233).\n\n## Scope\n\nPort the adopted project peer-review fix for malformed “learning in public” URLs:\n\n- render the evaluation form with the existing validation message instead of returning HTTP 500;\n- preserve the target’s cohort-aware evaluation routes and existing fail-closed criterion validation;\n- keep the evaluation write atomic so an invalid submission creates no partial criterion responses or submitted review state;\n- add regression coverage to the target-adapted evaluation flow.\n\nThis is a selective bug-fix port. It does not advance the global CMP source pin or import unrelated CMP APIs/features.\n\n## Acceptance criteria\n\n- [ ] A malformed learning-in-public URL returns HTTP 200 with “Learning in public links must be valid HTTP or HTTPS URLs.”\n- [ ] The peer review remains in its prior state with no submitted timestamp and no criteria responses.\n- [ ] Existing valid evaluation, closed-form, and criterion-integrity behavior remains passing.\n- [ ] Adoption overlay evidence records the target-owned adapted files and the CMP source fix reference.\n\n## Non-goals\n\nNo project-evaluation redesign, source-pin advance, new CMP API, deployment workflow, or production-data operation.
Parent preservation issue: #56\n\nSource: DataTalksClub/course-management-platform commit 56cac9a8f15a1f183de35a5e18040c49e758ff4c (CMP issue #233).\n\n## Scope\n\nPort the adopted project peer-review fix for malformed “learning in public” URLs:\n\n- render the evaluation form with the existing validation message instead of returning HTTP 500;\n- preserve the target’s cohort-aware evaluation routes and existing fail-closed criterion validation;\n- keep the evaluation write atomic so an invalid submission creates no partial criterion responses or submitted review state;\n- add regression coverage to the target-adapted evaluation flow.\n\nThis is a selective bug-fix port. It does not advance the global CMP source pin or import unrelated CMP APIs/features.\n\n## Acceptance criteria\n\n- [ ] A malformed learning-in-public URL returns HTTP 200 with “Learning in public links must be valid HTTP or HTTPS URLs.”\n- [ ] The peer review remains in its prior state with no submitted timestamp and no criteria responses.\n- [ ] Existing valid evaluation, closed-form, and criterion-integrity behavior remains passing.\n- [ ] Adoption overlay evidence records the target-owned adapted files and the CMP source fix reference.\n\n## Non-goals\n\nNo project-evaluation redesign, source-pin advance, new CMP API, deployment workflow, or production-data operation.