Parent
Part of #178
What to build
Pure planning helper: given a member GitHub identity, a member_projects URL/name, the new selected value, and candidate projects rows, return unpublish | republish | noop for at most one matching personal github-sourced showcase row. Match by GitHub owner/repo (case-insensitive) or normalized html URL. Never target owner_type=team. No DB I/O in this slice — unit tests only.
Acceptance criteria
Blocked by
None - can start immediately
Parent
Part of #178
What to build
Pure planning helper: given a member GitHub identity, a member_projects URL/name, the new
selectedvalue, and candidateprojectsrows, returnunpublish|republish|noopfor at most one matching personal github-sourced showcase row. Match by GitHub owner/repo (case-insensitive) or normalized html URL. Never targetowner_type=team. No DB I/O in this slice — unit tests only.Acceptance criteria
Blocked by
None - can start immediately