diff --git a/.conductor/settings.toml b/.conductor/settings.toml deleted file mode 100644 index aaa6043..0000000 --- a/.conductor/settings.toml +++ /dev/null @@ -1,13 +0,0 @@ -"$schema" = "https://conductor.build/schemas/settings.repo.schema.json" -file_include_globs = ".env*\n" - -[scripts] -setup = "mkdir -p .context && touch .context/handoff.md .context/fe-notes.md .context/be-notes.md .context/security-report.md && (npm install || true)" -run = "npm run dev -- -p $CONDUCTOR_PORT" -run_mode = "concurrent" - -[prompts] -general = "Follow AGENTS.md. Work only in this repo. FE/BE implement and summarize their own work; Security performs first-pass verification and fixes all found issues after PM says 검증 or 검증 단계로 넘겨; Lead performs second-pass verification and final synthesis after Security finishes." -code_review = "Focus on correctness, FE/BE API contract, auth/permission, secrets, file-boundary violations, and lint/typecheck/test/build evidence." -fix_errors = "Fix the smallest scoped issue within this repo and record failed commands or blockers in .context role notes." -create_pr = "Base PRs on master. Use 한것/검증/남은것 format. Summarize changed files, verification commands, Security result, and any PM approvals needed." diff --git a/AGENTS.md b/AGENTS.md index 8389434..16b73bc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,107 +7,74 @@ - DB: Supabase. - PM만 최종 승인과 배포를 한다. -## Conductor 역할 흐름 +## 운영 모델 -1. PM이 Codex FE/BE에게 작업 지시. -2. Codex FE와 Codex BE가 각자 영역에서 구현, todo 관리, lint/typecheck/test/build 실행. -3. FE/BE는 각자 작업 결과를 종합해 수정 파일, 실행 명령, 실패/남은 이슈를 역할 노트에 기록한다. -4. PM이 "검증 단계로 넘겨" 또는 "검증" 지시 전까지 Codex Security는 개입하지 않는다. -5. Security가 1차 검증을 수행한다: 전체 diff, FE/BE 연결, 보안, 권한, 타입, 테스트, 런타임 위험. -6. Security는 발견한 문제를 Security 선에서 전부 수정하고, 수정 내용과 남은 리스크를 `security-report.md`에 기록한다. -7. Security 완료 후 Claude Lead가 2차 검증과 최종 종합을 수행한다: security-report, diff, test 결과, 구조 리스크, 남은 이슈, 다음 작업, merge 가능 여부. +**Conductor 세션제는 폐지했다.** +FE / BE / SEC / LEAD는 별도 **스킬**로 운영할 예정이다 (스킬 정의는 스킬 쪽에서 관리). -## 파일 경계 +이 파일에는 스킬이 오기 전까지 쓸 **파일 경계·승인·짧은 보고 형식**만 둔다. +제품 규칙·검증 게이트는 [CLAUDE.md](CLAUDE.md), 상태 감사는 [docs/status-audit-2026-07-16.md](docs/status-audit-2026-07-16.md). -### Codex FE +## 역할 경계 (스킬 이관 전까지) -담당: -- UI/UX, 컴포넌트, 화면, 스타일, 반응형, 클라이언트 상태, API 연결부, 프론트 테스트 +### FE + +담당: UI/UX, 컴포넌트, 화면, 스타일, 반응형, 클라이언트 상태, API 연결부, 프론트 테스트 금지: -- `api/`, `server/`, `src/server/`, `supabase/`, `data/`, `engine/`, `config/`, `lib/specs/`, `lib/pricing/`, `lib/ai/` 직접 수정 -- API 스펙 임의 변경 -- DB schema/migration/auth 임의 변경 +- `app/api/`, `supabase/`, `lib/specs/`, `lib/pricing/`, `lib/ai/` 직접 수정 +- API 스펙·DB schema/migration/auth 임의 변경 -### Codex BE +### BE -담당: -- API, 서버 로직, `lib/specs/`, `lib/pricing/`, `lib/ai/`, DB 연결, migration, auth, permission, validation, backend security, backend test +담당: API, 서버 로직, `lib/specs/`, `lib/pricing/`, `lib/ai/`, DB 연결, migration, auth, permission, validation, backend test 금지: -- `components/`, `pages/`, `screens/`, `ui/`, `styles/`, 프론트 화면 파일 직접 수정 -- 응답 형식 임의 변경 -- package/lockfile 임의 변경 - -### Codex Security +- `components/`, 프론트 화면 파일 직접 수정 +- 응답 형식·package/lockfile 임의 변경 -- PM 검증 지시 후에만 실행. -- 검증: FE/BE API 불일치, request/response 타입, auth/session, permission 우회, DB/migration, secret/env 노출, webhook/결제/파일업로드, lint/typecheck/test/build, 런타임 에러, 파일 범위 침범. -- 발견한 보안/타입/설정/구조 문제는 Security 선에서 전부 수정한다. -- 수정한 내용, 수정하지 못한 리스크, 검증 결과를 `.context/security-report.md`에 기록한다. +### SEC -### Claude Lead +- 검증 단계에서만 실행 (PM 지시 또는 스킬 트리거). +- FE/BE API 불일치, auth/session, permission, secret/env, lint/typecheck/test/build, 파일 범위 침범을 본다. +- 발견한 보안/타입/설정 문제는 SEC 선에서 고치고, 남은 리스크를 짧게 보고한다. -- Security 통과 뒤 마지막에만 실행. -- 담당: 2차 검증, 최종 종합, 큰 구조 리뷰, 변경 요약, 남은 이슈, 다음 task 설계, merge 가능 여부 판단. -- 2차 검증에서는 `security-report.md`, FE/BE 노트, 전체 diff, lint/typecheck/test/build 결과, 파일 범위 침범 여부를 다시 확인한다. -- 코드 대량 수정 금지. +### LEAD -## 기록 위치 - -- `.context/handoff.md` -- `.context/fe-notes.md` -- `.context/be-notes.md` -- `.context/security-report.md` -- 필요 시 `docs/inbox/frontend.md`, `docs/inbox/backend.md`, `docs/inbox/security.md`, `docs/inbox/lead.md` +- SEC 이후 최종 종합만. +- merge 가능 여부, 구조 리스크, 남은 이슈. 코드 대량 수정 금지. ## 보고 형식 -토큰 절약을 위해 모든 역할은 기본 보고를 아래 형식으로 끝낸다. - ```text 한것: file1, file2 검증: lint ✅ type ✅ test ✅ build ✅ 남은것: 없음 ``` -문제 있을 때만 짧게 이유를 붙인다. - -```text -한것: file1 -검증: test ❌ — 핵심 이유 -남은것: 해야 할 일 -``` - -Lead 최종 보고는 아래 형식을 쓴다. +LEAD: ```text 판정: merge 가능/불가 한것: 핵심 3줄 이하 -검증: Security ✅ Lead ✅ +검증: SEC ✅ LEAD ✅ 남은것: 없음/항목 ``` -긴 설명, 전체 파일 출력, 장문 로그 붙여넣기는 금지한다. 상세 판단은 Conductor diff/test 결과로 한다. +긴 설명·전체 파일 출력·장문 로그 붙여넣기 금지. ## 공통 규칙 -- 기본은 자율 수행이다. 역할 범위 안 코드 수정, 검증 명령 실행, 문서/.context 기록, 작은 설정 수정은 PM 승인 없이 진행한다. -- 단, 아래 항목은 반드시 PM 승인 후 진행한다: - - 개인정보/시크릿/env 값 생성·수정·노출 - - DB schema/rules/migration 실제 적용 - - 인증 방식 변경 - - 결제/웹훅/권한 구조 변경 +- 역할 범위 안 수정·검증 명령·작은 설정은 PM 승인 없이 진행. +- 아래는 **PM 승인 후**: + - 시크릿/env 생성·수정·노출 + - DB schema/migration 실제 적용 + - 인증·결제/웹훅/권한 구조 변경 - package.json/lockfile 변경 - 새 유료 서비스/API 도입 - 배포 실행 - - git push/merge/delete branch + - git push/merge/delete branch (에이전트 클라우드 지시가 있으면 그 지시를 따름) - 대량 삭제 - 프로젝트 밖 파일 수정 -- package.json/lockfile 변경은 PM 승인 후. -- DB schema/migration 변경은 PM 승인 후. -- 인증 방식 변경은 PM 승인 후. -- 배포 실행은 PM만. - 시크릿/앱키를 클라이언트 번들에 넣지 않는다. -- 실패한 명령은 숨기지 않고 역할 노트에 기록한다. -- 긴 전체 파일 출력 금지. diff, 테스트 결과, 수정 파일 목록 중심으로 보고한다. +- 실패한 명령은 숨기지 않는다. diff --git a/CLAUDE.md b/CLAUDE.md index 110c2e6..a70644f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -23,11 +23,13 @@ Axis 코드베이스에서 작업할 때 따라야 할 규칙. 프로젝트 개 - 타입 체크: `npx tsc --noEmit`. - 데이터셋 변경 시 `dataset.test.ts` 무결성 검사 통과 확인. - 스키마·결과 포맷을 바꾸면 `lib/comparison-cache.ts`의 `CACHE_VERSION`을 올려 - 구버전 캐시를 무효화한다 (현재 v8). + 구버전 캐시를 무효화한다 (현재 코드 **v9**). +- 트리 파손·문서 불일치 현황은 `docs/status-audit-2026-07-16.md` 참고. ## 데이터셋 작업 -- 수동 검증 데이터: `lib/specs/dataset/{smartphones,earphones,laptops,tablets}.ts` +- 수동 검증 데이터: `lib/specs/dataset/` (`index.ts` + 카테고리/제조사 파일). + `e71f624` 이후 코어가 깨져 있으면 복구 후 작업한다. - 제품명은 로케일 정규화됨 — `canonicalName`(한국어) + `nameEn` + `nameJa`. EN/JA 로케일에서 어필리에이트 검색어·표시명이 이 필드로 결정된다. - 새 제품 추가 시: `id`는 lowercase-kebab, spec 키는 카테고리 스키마에 존재해야 함. diff --git a/DEV_NOTES.md b/DEV_NOTES.md index c84576d..184f81a 100644 --- a/DEV_NOTES.md +++ b/DEV_NOTES.md @@ -1,9 +1,11 @@ # Axis — 개발 노트 -> 마지막 업데이트: 2026-06-11 -> 테스트: `npm test` 통과 기준 유지 · 캐시 버전: **v8** +> 마지막 업데이트: 2026-07-16 (상태 감사 경고 추가; 본문 수치 일부는 구버전) +> 캐시 버전(코드): **v9** · 문서 본문의 v8/122개 수치는 복구 후 재집계 필요 > 프로덕션: https://axis-app-beta.vercel.app > +> ⚠️ `e71f624` 이후 트리 파손 — [docs/status-audit-2026-07-16.md](docs/status-audit-2026-07-16.md) +> > 이 문서는 개발 단일 참조점이다. 제품 방향·진행 현황·아키텍처·남은 작업을 모두 담는다. > 작업 규칙은 [CLAUDE.md](CLAUDE.md), 공개 소개는 [README.md](README.md). diff --git a/PROMPT.md b/PROMPT.md index 0ced458..e9d28d8 100644 --- a/PROMPT.md +++ b/PROMPT.md @@ -1,6 +1,9 @@ # Axis — AI 작업 프롬프트 > 배포 목표: 2026-08-15 (베타 → 정식) | 현재: 프로덕션 베타 배포 완료, 사업성 검증 단계 +> +> ⚠️ 2026-07-16: HEAD 코어 파손·문서 수치(122개/v8) 불일치. 작업 전 [docs/status-audit-2026-07-16.md](docs/status-audit-2026-07-16.md) 확인. +> Conductor 세션제 폐지 → FE/BE/SEC/LEAD 스킬 이관 예정 ([AGENTS.md](AGENTS.md)). --- diff --git a/README.md b/README.md index 9a1c3bc..4984178 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,10 @@ **프로덕션:** https://axis-app-beta.vercel.app · **상태:** 베타, 사업성 검증 단계 (한국 · 노트북 · 제휴) +> ⚠️ **2026-07-16 감사:** `e71f624` sync 이후 데이터셋/extract/cron 코어가 파손된 상태다. +> 아래 “현재 상태” 표·122개 데이터셋 수치는 복구 전까지 신뢰하지 말 것. +> 상세: [docs/status-audit-2026-07-16.md](docs/status-audit-2026-07-16.md) + --- ## 주요 기능 diff --git a/docs/handoff.md b/docs/handoff.md index daecc82..51e0413 100644 --- a/docs/handoff.md +++ b/docs/handoff.md @@ -1,20 +1,25 @@ # handoff.md — Axis -마지막 갱신: 2026-06-18 (conductor 종합) +마지막 갱신: 2026-07-16 (상태 감사) ## 현재 상태 -베타 배포 완료. 공유 카드 UI + 갤럭시 북6 데이터셋 완료. lint 블로커(`vs-input.tsx:63`)로 현재 배포 불가. 보안 이슈 2건(watches 소유권, 집계 익명화) 미수정. +**HEAD(`e71f624`)는 코어 파손.** 상세: [status-audit-2026-07-16.md](./status-audit-2026-07-16.md) + +- 데이터셋 `index`·다카테고리·extract 코어·cron/push API 삭제/미완 +- 문서상 “베타 정상 / 테스트 통과”는 현재 트리와 불일치 +- Conductor 세션제 폐지 → FE/BE/SEC/LEAD 스킬로 이관 예정 ## 주요 제약 - 결과/추천 로직 수정 금지 (프롬프트로만) - 스펙은 `lib/specs/dataset/`에서만 -- `CACHE_VERSION` 변경 시 `lib/comparison-cache.ts` 버전 올리기 +- `CACHE_VERSION` 변경 시 `lib/comparison-cache.ts` 버전 올리기 (현재 코드 v9) - 시크릿 하드코딩 절대 금지 ## 역할별 다음 과제 -- frontend (Task #26): `vs-input.tsx:63` lint 수정 (배포 블로커); 쿠팡 파트너스 제휴 링크 버튼 실연동 -- backend (Task #27): `/api/watches` 소유권 검증 (signed token); 인기 집계 익명화; Groq 폴백 체인 -- security (Task #28): frontend/backend 완료 후 재검수 → 배포 가능/불가 최종 판정 +- **FE:** `vs-input.tsx` lint(`react-hooks/set-state-in-effect`); 쿠팡 제휴 CTA 실연동; 홈/예시 칩을 노트북 중심으로 +- **BE:** `e71f624` 코어 복구(dataset/extract/cron); `/api/watches` 소유권; 인기 집계 익명화 +- **SEC:** 복구·소유권 수정 후 재검수 → 배포 가능/불가 +- **LEAD:** SEC 후 merge 판정 + 문서 정합(제품 수·v9·가격 소스) diff --git a/docs/issues.md b/docs/issues.md index 43ed3d2..de15b8c 100644 --- a/docs/issues.md +++ b/docs/issues.md @@ -1,30 +1,34 @@ # issues.md — Axis -마지막 갱신: 2026-06-19 (conductor 종합) +마지막 갱신: 2026-07-16 (상태 감사) -## 🔴 배포 블로커 +## 🔴 P0 — 트리 파손 / 배포 블로커 -### [audit] npm audit 9 취약점 — critical 1, high 2, moderate 6 -- `undici`(high), `esbuild`/`vite`/`vitest`, `postcss`/`next`, `js-yaml` 관련 -- **배정: conductor** — 의존성 업데이트 범위 결정 후 backend 실행. lockfile 변경은 conductor 승인 필수. +### [파손] e71f624 sync로 코어 모듈 삭제·미완 +- `lib/specs/dataset/index.ts` 및 smartphones/earphones/tablets/kr 삭제 +- 노트북 분리 파일(`laptops-samsung`, `laptops-apple-air/pro`) 미존재 +- `lib/specs/extract/{index,rules}.ts` 삭제 +- cron/push/admin API 삭제 (vercel.json·FE는 잔존) +- **배정: BE** — `5acb9fc` 기준 복구 후 테스트 녹색 -### [lint] components/vs-input.tsx:63 — react-hooks/set-state-in-effect -- 기존 오류, 이번 스프린트에서 미수정 -- 해결 전 배포 불가 (security 판정) -- **배정: frontend (Task #26)** → 수정 후 security 재검수 +### [lint] components/vs-input.tsx — react-hooks/set-state-in-effect +- **배정: FE** → 수정 후 SEC 재검수 -## 🟠 보안 이슈 (배포 전 해결 권장) +### [audit] npm audit 취약점 (이전 기록: critical 1, high 2, moderate 6) +- lockfile 변경은 PM 승인 필수 +- **배정: BE** (복구 이후) + +## 🟠 보안 (배포 전) ### [보안-중] /api/watches 소유권 미검증 -- 이메일만 알면 타인의 watch 목록 조회 가능 — 개인정보성 데이터 노출 위험 -- **배정: backend (Task #27)** — magic token / Supabase auth / signed token 중 하나로 전환 +- 이메일만 알면 타인 watch CRUD 가능 +- **배정: BE** — signed token / Supabase auth ### [보안-검토] 인기 비교 집계 개인정보 노출 가능성 -- 홈 화면 집계가 service_role로 `comparisons.query` 읽어 공개 노출 -- 쿼리에 개인/민감 정보 포함 가능성 -- **배정: backend (Task #27)** — normalized query만 저장/집계 또는 민감어 필터 +- 홈 집계가 service_role로 `comparisons.query` 원문 공개 +- **배정: BE** — normalized query만 저장/집계 또는 민감어 필터 -## ✅ 해결됨 +## ✅ 해결됨 (이전) -- tsc fetch mock 튜플 타입 오류 (backend 06-18 수정) -- CRON_SECRET 미설정 위험 (security 06-18 확인, 설정됨) +- tsc fetch mock 튜플 타입 오류 (06-18) +- CRON_SECRET 미설정 위험 (06-18 확인 기록) — **단, cron 라우트 자체는 현재 삭제됨 → 복구 시 재검증 필요** diff --git a/docs/progress.md b/docs/progress.md index c7dcdb1..006befc 100644 --- a/docs/progress.md +++ b/docs/progress.md @@ -1,37 +1,37 @@ # progress.md — Axis -마지막 갱신: 2026-06-18 (conductor 종합) +마지막 갱신: 2026-07-16 (상태 감사) -## 이번 스프린트 완료 (06-18) +## 2026-07-16 감사 -### frontend (Codex) -- `components/share-actions.tsx`: 공유 카드 프리뷰, 로케일별 공유/구매 보조 문구, 제휴 링크 안내 구조 개선 -- `app/globals.css`: 공유 카드·구매 CTA·공유 버튼·제휴 안내 모바일 레이아웃 + 다크모드 스타일 +- Conductor 세션제 폐지, `.conductor/` 제거 +- `AGENTS.md`를 FE/BE/SEC/LEAD 경계만 남기도록 축소 (스킬 이관 예정) +- 전체 상태 감사 문서: [status-audit-2026-07-16.md](./status-audit-2026-07-16.md) -### backend (Codex) -- `lib/specs/dataset/laptops*.ts`: 갤럭시 북6 Pro 14/16 추가, 파일 분리(제조사별) -- `tests/complete.test.ts`, `tests/web-search.test.ts`: fetch mock strict tuple 타입 수정 → tsc 통과 -- 갤럭시 북6 alias/검증 등급 회귀 테스트 추가 +## 이전 스프린트 기록 (06-18, 참고용 — HEAD와 불일치 가능) -### security (Codex) -- CRON_SECRET: `.env.local` 설정됨(len=64), 크론 라우트 2개 Bearer 검증 확인 -- AI 프로바이더 키: `NEXT_PUBLIC_` 없음, 서버 전용 확인 -- Supabase RLS: 주요 사용자 테이블 활성화, 공개 읽기 정책 의도된 데이터 제한 확인 -- **배포 판정: 불가** (lint 실패) +### frontend +- 공유 카드 UI / 제휴 안내 구조 개선 -## 명령 결과 +### backend +- 갤럭시 북6 데이터셋 추가 시도 → **후속 sync(`e71f624`)에서 데이터셋 코어가 깨짐** + +### security (당시) +- CRON_SECRET·RLS 점검 기록 있음 +- 당시 배포 판정: lint 실패로 불가 + +## 명령 결과 (2026-07-16 HEAD 기준) | 명령 | 결과 | |---|---| -| `npm test` | ✅ 170 tests 통과 | -| `npx tsc --noEmit` | ✅ 통과 (backend 06-18 수정 후) | -| `npm run build` | ✅ 통과 | -| `npm run lint` | ❌ 실패 — `components/vs-input.tsx:63` react-hooks/set-state-in-effect | +| 모듈 해석 | ❌ dataset/extract/cron 등 누락 | +| `npm test` / `tsc` / `build` | 복구 전 신뢰 불가 (의존성·모듈 파손) | +| `npm run lint` | 기존 `vs-input` hooks 이슈 잔존 가능 | ## 남은 작업 -- lint 블로커 수정 → security 재검수 -- /api/watches 소유권 검증 -- 인기 비교 집계 익명화 -- Groq 폴백 체인 -- 쿠팡 파트너스 제휴 링크 실연동 +1. `e71f624` 코어 복구 → test/tsc/build 녹색 +2. lint 블로커 수정 +3. `/api/watches` 소유권 + 인기 집계 익명화 +4. CI 도입 +5. FE/BE/SEC/LEAD 스킬 추가 diff --git a/docs/status-audit-2026-07-16.md b/docs/status-audit-2026-07-16.md new file mode 100644 index 0000000..7bc52dd --- /dev/null +++ b/docs/status-audit-2026-07-16.md @@ -0,0 +1,130 @@ +# Axis 상태 감사 — 2026-07-16 + +> 범위: 문서·코드·삭제 잔재·보안·검증 게이트·운영 방향(KR·노트북·제휴) 정합 +> HEAD: `e71f624` (Sync latest local workspace) +> Conductor 세션제: **폐지** → FE / BE / SEC / LEAD 스킬로 이관 예정 + +--- + +## 판정 + +**현재 `master`는 빌드·테스트·비교 파이프라인이 깨진 상태.** +문서상 “베타 정상 / 170 tests 통과”와 실제 트리가 정면으로 충돌한다. +최우선은 `e71f624`에서 삭제·파손된 코어 모듈 복구다. + +--- + +## P0 — 즉시 (복구 / 위험) + +| # | 이슈 | 증거 | +|---|------|------| +| 1 | `lib/specs/dataset/index.ts` 삭제 | `decision-engine`, `/api/price`, `discover`, 다수 테스트 import 실패 | +| 2 | 노트북 분리 파일 미완 | `laptops-samsung.ts`, `laptops-apple-air.ts`, `laptops-apple-pro.ts` 없음. 남은 실데이터는 LG 4개뿐 | +| 3 | 다카테고리 데이터셋 삭제 | `smartphones` / `earphones` / `tablets` / `kr/*` 삭제. 문서의 “122개”와 불일치 | +| 4 | extract 코어 삭제 | `extract/index.ts`, `extract/rules.ts` 없음. `pipeline.ts`가 `./index` import | +| 5 | Cron API 삭제, `vercel.json`은 유지 | `price-check` / `price-snapshot` 404 예정. Track/Alert 중단 | +| 6 | Push / Admin API 삭제 | FE(`watch-button`, `watch-list`, admin reviewer)는 죽은 엔드포인트 호출 | +| 7 | collect-specs 파손 | `danawa.ts` / `gsmarena.ts` / `smartphones.json` 삭제. `kakaku`만 남음 | +| 8 | `/api/watches` 이메일=소유권 | 이메일만 알면 CRUD 가능 (`docs/issues.md`에도 기록) | +| 9 | 하드코딩 fallback 추천 | `lib/decision-engine-fallback.ts` — 이름 길이로 승자 확정. 검증 게이트 규칙과 충돌 | + +**원인 커밋:** `e71f624` (+663 / −5234). 직전 정상 트리: `5acb9fc`. + +**권장 복구:** `5acb9fc`에서 최소 아래를 되살린 뒤, 노트북 분리 리팩터가 의도였다면 *완전하게* 맞춘다. + +- `lib/specs/dataset/{index,smartphones,earphones,tablets,laptops,kr/*}.ts` +- `lib/specs/extract/{index,rules}.ts` +- `app/api/cron/price-{check,snapshot}/route.ts` +- (쓸 경우) `app/api/push/subscribe`, `app/api/admin/extract` +- `scripts/collect-specs/sources/{danawa,gsmarena}.ts` + `models/smartphones.json` + +--- + +## P1 — 문서 ↔ 코드 불일치 + +| 문서 주장 | 실제 | +|-----------|------| +| 데이터셋 122개 | 디스크상 LG 노트북 일부만 (조립 불가) | +| `CACHE_VERSION` v8 (`CLAUDE`/`DEV_NOTES`/`PROMPT`) | 코드 **v9** | +| README: `partial`도 색인 허용 | `isIndexable` = **verified만** | +| README/PROMPT: naver 활성·cron·알림 완료 | Cron 라우트 삭제; `.env.example` 기본 `seed` | +| `docs/progress.md`: lint❌ 외 test/build/tsc ✅ | 모듈 파손으로 HEAD에서 통과 주장 신뢰 불가 | +| DEV_NOTES: 해자 “seed 미작동” vs README: 네이버 ✅ | 문서끼리 충돌 | +| PROMPT 로컬 경로 `/Users/minseokchae/...` | 에이전트/클라우드 환경과 불일치 | +| CLAUDE: 데이터셋 경로 `{smartphones,earphones,laptops,tablets}.ts` | 현 트리와 불일치 | + +문서 날짜도 README 06-17 / DEV_NOTES 06-11 / handoff 06-18로 흩어져 있다. +**단일 진실 소스**를 `DEV_NOTES.md` 또는 README 상태 표 하나로 고정해야 한다. + +--- + +## P2 — 부족한 것 (방향 대비) + +KR · 노트북 · 제휴 · 검증 우선 기준으로: + +1. **CI 없음** — `.github/workflows` 부재. `e71f624`급 파괴 sync가 게이트 없이 들어옴. +2. **watches 인증** — Supabase auth / signed token 중 하나로 소유권 고정. +3. **인기 비교 집계 익명화** — `app/page.tsx`가 service_role로 원문 query 공개. +4. **제휴 전환 계측** — 클릭률 >8% 검증 루프가 제품 로드맵에만 있고 대시보드/리포트 없음. +5. **노트북 SEO 집중** — `comparisons.ts`에 폰/이어폰/태블릿 슬러그 다수; `vs-input` 예시도 폰 유도. +6. **rate limit** — compare만. track/price/watches/share/guest 무제한 + in-memory라 서버리스에서 약함. +7. **API/보안 테스트** — watches 소유권, cron Bearer, guest share 남용 테스트 없음. +8. **프로덕션 seed 가드** — `.env.example`/`launch.json`이 seed 기본. 프로덕션 seed 거부 또는 강제 demo 라벨 필요. +9. **RESEND / BRAVE** — 문서상 미설정. 알림·웹검색 폴백 비활성(의도일 수 있음). + +--- + +## P3 — 지워야 할 것 / 정리 후보 + +### 이번 감사에서 처리 + +| 대상 | 조치 | +|------|------| +| `.conductor/` | **삭제** (Conductor 세션제 폐지) | +| `AGENTS.md` Conductor 오케스트레이션 | **제거**, FE/BE/SEC/LEAD는 스킬 이관 전까지 경계만 유지 | +| docs의 “conductor 종합/배정” 문구 | 역할명으로 정리 | + +### 이후 삭제·축소 후보 (복구 후 판단) + +| 후보 | 이유 | +|------|------| +| 원격 브랜치 `conductor-repo-role-check` | Conductor 실험 잔재 | +| 원격 `axis-fe` / `axis-be` / `axis-lead` | 세션제 브랜치 — 스킬 운영으로 대체 시 정리 | +| monitor 카테고리 (`lib/category`, schema, types) | DEV_NOTES: 신규 카테고리 보류 | +| `lib/specs/collect.ts` | import 0 | +| 쿼터 마이그레이션 잔재 (`0004`/`0005`, `AXIS_DEV_PLAN`) | 앱에서 미사용 | +| DB `products`/`specs` 테이블 스키마 | “스펙은 DB에서 안 꺼냄”과 잔존 스키마 | +| Amazon/Keepa 타입 잔상 (`lib/pricing/types.ts`) | 외부 가격이력 API 결제 금지 방향 | +| 비-노트북 SEO 슬러그·홈 예시 칩 | KR·노트북 집중과 충돌 (콘텐츠 전략 확정 후) | +| 푸시/이메일 스택 (검증 후 보류 시) | API 삭제된 채 FE·lib만 남음 — 복구 vs 완전 제거 선택 필요 | + +--- + +## 보안 요약 + +| 심각도 | 항목 | +|--------|------| +| 높음 | `/api/watches` 이메일 소유권 | +| 중 | guest share public insert + 짧은 토큰, 인기쿼리 원문 노출, rate limit 공백, CSP 없음 | +| 낮~중 | Admin=`AXIS_ADMIN=1` only (API는 현재 삭제됨) | +| — | 코드/문서에서 실시크릿 하드코딩 **미발견** | + +--- + +## 운영 모델 (Conductor → 스킬) + +- Conductor 세션제 **폐지**. +- FE / BE / SEC / LEAD는 **별도 스킬**로 운영 예정 (이 레포에 스킬 정의는 아직 없음). +- 당분간 `AGENTS.md`에는 파일 경계·승인 항목·짧은 보고 형식만 유지. +- `.context/*` Conductor 노트 경로는 더 이상 표준이 아님. 필요 시 스킬 쪽에서 정의. + +--- + +## 권장 다음 작업 순서 + +1. **`e71f624` 코어 복구** (dataset + extract + cron) → `npm test` / `tsc` / `build` 녹색. +2. 문서 정합: 제품 수, CACHE_VERSION=v9, 가격 소스, partial 색인 정책. +3. `/api/watches` 인증 + 인기 집계 익명화. +4. GitHub Actions: `lint` + `tsc` + `vitest` + `build`. +5. FE/BE/SEC/LEAD 스킬 추가 후 `AGENTS.md` 경계를 스킬과 맞춰 최종 정리. +6. 검증 가정 B/C(노트북 SEO·제휴 클릭)만 제품 작업으로 진행 — 새 기능 빌드 금지 유지.