feat(blog): Engineering·Life IA와 홈 탐색 UX 개편 - #80
Conversation
네비게이션을 Engineering·Life·Resume 중심으로 정리했어요. 모바일 하단 네비 탭 구조와 터치 영역을 조정해서 탐색 안정성을 높였어요. /engineering, /life 목록 진입점을 추가하고 /blog, /series 리다이렉트를 붙였어요. Engineering 전용 목록 페이지와 타입 필터, 페이지네이션 동기화를 도입했어요.
시리즈 글 메타 카테고리를 Tech로 통일했어요. 프론트매터 스키마와 Post 타입 계약을 category enum 중심으로 맞췄어요. 저장소 레이어에서 정규화 가정이 유지되는지 테스트를 보강했어요.
홈을 Hero 이후 2컬럼 탐색 구조로 바꾸고 아티클 5개 페이징을 붙였어요. 인기 글 Top5 집계와 시리즈 상세 라우트를 추가해서 홈에서 바로 탐색이 이어지게 했어요. 스크롤 연동 soft reveal 인터랙션과 관련 테스트·스모크 시나리오를 함께 보강했어요.
개발 환경에서 오버레이 기반 코멘트 수집 흐름을 추가했어요. Webhook autorun 경로와 가이드를 넣어서 annotation 등록 후 처리 루프를 자동화했어요. 로컬 설정 변수와 관련 의존성을 함께 정리했어요.
모바일 전용 시나리오는 desktop 프로젝트에서 건너뛰도록 가드를 추가했어요. 홈 시리즈 카드 이동 테스트는 click 플로우를 안정화해서 간헐 실패를 줄였어요. 로컬 smoke 실행에서 19 passed, 2 skipped 기준으로 재검증했어요.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2553ed3d7f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| .order('count', { ascending: false }) | ||
| .limit(normalizedLimit); |
There was a problem hiding this comment.
Apply deterministic tie-break before limiting views
getPopularViewsInRecentDays limits rows immediately after ordering only by count, then tries to break ties by updated_at in memory; if more than limit posts share the same count, Supabase can return any subset of tied rows, so newer posts can be dropped and the final ranking becomes non-deterministic for the "recent popular" panel. Add a secondary DB sort on updated_at before .limit(...) so the cutoff is stable.
Useful? React with 👍 / 👎.
| }); | ||
| } | ||
|
|
||
| const child = runAutorunCommand(payload.annotation?.id); |
There was a problem hiding this comment.
Make webhook autorun lock acquisition atomic
The webhook checks for an active lock and then spawns the autorun process before writing a new lock file, so two webhook requests arriving close together can both pass the check and start separate autorun processes. This breaks the single-run guarantee (reason: 'autorun already running') and can trigger overlapping automated edits/tests; acquire the lock atomically before spawning.
Useful? React with 👍 / 👎.
useReducedMotion 반환값이 boolean | null이라서 Vercel 타입 검사에서 useSoftRevealMotion 호출이 실패했어요. null 병합으로 boolean 타입을 고정해서 preview 빌드가 안정적으로 통과하게 했어요.
변경 요약
Engineering | Life | Resume중심으로 재구성했어요./engineering,/life로 분리하고/blog,/series는 새 구조로 리다이렉트했어요./blog/[slug]는 그대로 유지해서 기존 외부 링크를 안전하게 보존했어요.Tech로 정규화하고 스키마 계약을 강화했어요.커밋 구성
feat(blog): Engineering·Life IA 라우팅 재구성/engineering,/life엔트리를 추가했어요./blog,/series리다이렉트를 적용했어요.refactor(post): 시리즈 카테고리 Tech 정규화category를Tech로 통일했어요.feat(home): 홈 아티클 중심 탐색 패널 개편chore(devtools): Agentation 자동 피드백 워크플로 도입test(e2e): 스모크 시나리오 프로젝트별 안정화검증 결과
npm run test:smoke15 passed, Playwright smoke19 passed, 2 skipped라우트 계약
NEW /engineeringNEW /lifeNEW /engineering/series/[seriesId]301 /blog -> /engineering301 /series -> /engineering?type=seriesKEEP /blog/[slug]검토 포인트