Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions .conductor/settings.toml

This file was deleted.

97 changes: 32 additions & 65 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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, 테스트 결과, 수정 파일 목록 중심으로 보고한다.
- 실패한 명령은 숨기지 않는다.
6 changes: 4 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 키는 카테고리 스키마에 존재해야 함.
Expand Down
6 changes: 4 additions & 2 deletions DEV_NOTES.md
Original file line number Diff line number Diff line change
@@ -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).

Expand Down
3 changes: 3 additions & 0 deletions PROMPT.md
Original file line number Diff line number Diff line change
@@ -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)).

---

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

---

## 주요 기능
Expand Down
17 changes: 11 additions & 6 deletions docs/handoff.md
Original file line number Diff line number Diff line change
@@ -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·가격 소스)
40 changes: 22 additions & 18 deletions docs/issues.md
Original file line number Diff line number Diff line change
@@ -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 라우트 자체는 현재 삭제됨 → 복구 시 재검증 필요**
48 changes: 24 additions & 24 deletions docs/progress.md
Original file line number Diff line number Diff line change
@@ -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 스킬 추가
Loading