v0.2.9 Cut B — status 4분기 + 사유 + Ollama-less (F17/F18/F23) #27
Reference in New Issue
Block a user
Delete Branch "worktree-v029-cut-b-status-reason-ailess"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
v0.2.9 Cut B — F17 (status 4분기 + AI 자동 분류) + F18 (자유 텍스트 사유) + F23 (Ollama-less wizard + raw-only fallback). 데이터 모델 정비 cut (2주 scope).
setStatus(id, status, reason)repo 메서드 +listByStatus+ 4탭 UI (Inbox/완료/보관/휴지통). NoteCard 의 "이동 ▾" dropdown + MoveStatusModal (사유 입력 + 4 status 버튼 + AI 자동 분류)./api/generate format:json활용. 실패 시 archived fallback (안전한 default).변경 내역 (19 commits)
Phase 1: schema + repo
06a1cafTask 1 — m004 마이그레이션 (status/status_changed_at/move_reason)facbf54Task 2 — NoteRepository.setStatus + listByStatus + restoreNote 재구현 (v0.2.6 #10 fix 보존)Phase 2: ai_status disabled
fd839f6Task 3 — ai_status 'disabled' + CaptureService aiEnabled + m005 migrationPhase 3: 4탭 UI
606ac94Task 4 — useInbox view enum + counts + setView92375edTask 5 — 헤더 4탭 + count badgePhase 4-5: NoteCard 메뉴 + Modal + classifyStatus
d4dce9bTask 8 — inbox:set-status + ai:classify-status (stub) IPC9eb7abcTask 7 — MoveStatusModal495c3d1Task 6 — NoteCard 이동 메뉴d315097Task 9-10 — classifyStatus AI prompt + IPC 정식 구현Phase 6: Onboarding
d2c7bf1Task 11 — OnboardingWizard 3 옵션c65d6c8Task 12 — settings:* IPC + App.tsx 첫 launch 분기Phase 7: NoteCard fallback + Banner
bc67deaTask 13 — NoteCard ai_status='disabled' fallback49fbed0Task 14 — Banner + HealthChecker ai_enabled 비활성Phase 8: 설정 토글 + 처리 버튼
c21fca5Task 15 — AiProviderSection AI 자동 처리 토글6070562Task 16 — requeueDisabled + 처리 버튼Phase 9: release
ba08190Task 17 — dogfood F17/F18/F23 promoted + version 0.2.9f42d03fe2e fix — OnboardingWizard dismiss step 추가3fab44bfinal review minor — statusLabelWithParticle (한국어 조사 분기) + initialTarget drop테스트 / 빌드
Schema 변경
Risk 잔재
Test Plan
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- NoteStatus 타입 추가 ('active'/'completed'/'archived'/'trashed') - Note interface 에 status / statusChangedAt / moveReason 필드 추가 - setStatus(id, status, reason, now?) — 단일 transaction 으로 status + move_reason + status_changed_at + updated_at 갱신. status='trashed' ↔ deleted_at 동기화 (backward compat). 그 외 status 는 deleted_at NULL. - listByStatus(status, opts) — status 별 필터 + ORDER BY COALESCE(status_changed_at, created_at) DESC. limit cap 200. - hydrate 에 status / statusChangedAt / moveReason 매핑 추가. 미설정 row 는 'active' fallback. - restoreNote 재구현 — setStatus('active', null) 로 status + deleted_at 동기화 + v0.2.6 #10 round 1 fix (ai_status='failed'/'pending' → pending_jobs 재투입) 보존. - 기존 테스트 fixture 5건에 새 필드 추가 (NoteCard, store.expired/recall/tagFilter/trash). - 신규 테스트 11건 (setStatus + listByStatus + restoreNote 회귀).- AiStatus enum 'disabled' 추가 — settings.ai_enabled=false 일 때 새 노트의 초기 status. - m005 migration: ai_status CHECK 제약을 ('pending','done','failed','disabled') 로 relax. SQLite 가 ALTER COLUMN CHECK 미지원 → table recreate (notes_new INSERT SELECT DROP RENAME). 기존 인덱스 (idx_notes_created_at, idx_notes_ai_status, idx_notes_deleted_at) 재생성. - SettingsService schema 에 ai_enabled / onboarding_completed (optional) 추가 + isAiEnabled / setAiEnabled / isOnboardingCompleted / setOnboardingCompleted accessor. 기본 fallback (ai_enabled=true, onboarding_completed=false) — 기존 settings.json 무영향. - NoteRepository.create 가 optional aiStatus 받도록 — 'pending' 외 값일 때 pending_jobs skip. 기존 caller (rawText 만 전달) 무영향. - CaptureService deps 에 settings (좁은 AiEnabledSource 인터페이스) 추가. submit() 가 ai_enabled 조회 → false 면 ai_status='disabled' insert + enqueue skip. settings 미주입 시 기존 동작 (항상 enabled) 보존 — 테스트 케이스 무영향. - main/index.ts wiring: settings: settingsSvc 주입. Tests: 489 → 494 (CaptureService ai_enabled 2건 + m005 migration 3건). typecheck 0.- store.ts: view enum ('inbox'|'completed'|'archived'|'trash'|'settings') + counts + setView + loadByView. setShowSettings delegates to setView (mirror). - types.ts + preload + ipc/inboxApi: listByStatus + countsByStatus IPC. - NoteRepository.countByStatus 신규. - store.view.test (5) + NoteRepository.countByStatus test (1). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>- App.tsx: 기존 2탭 (Inbox/휴지통) → 4탭. setView/counts 사용. - onNavigate 도 setView 로 위임 (mirror state 동기 갱신). - App.test: 4탭 렌더 + 클릭 → setView('completed') + aria-pressed (3 cases). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>- 한국어 조사 분기: '보관로/휴지통로/활성로' → '보관으로/휴지통으로/활성으로' ('완료로' 만 받침 X). 받침 jongseong 검사 helper. - MoveStatusModal 의 unused initialTarget prop 제거 + caller (NoteCard) 정리 548/548 + typecheck 0 유지. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>코드 리뷰 — v0.2.9 Cut B
Scope: 19 commits / 47 files / +2323/−1975
Spec coverage ✅ 100%
Cut B design 의 모든 섹션이 task 매핑됨. F17 (status 4분기 + AI 자동 분류) + F18 (자유 텍스트 사유) + F23 (Ollama-less wizard + raw-only fallback).
코드 품질
Strengths
generate시그니처 무영향 — Ollama 단일 provider 라 호환.statusLabelWithParticle): 받침 jongseong 검사 — '보관으로/휴지통으로/활성으로' / '완료로'.Minor (모두 final review minor cleanup
3fab44b에서 처리됨)statusLabel "보관로/휴지통로" 한국어 grammar→statusLabelWithParticle으로 분기MoveStatusModal→ drop + caller 정리_initialTargetunused propCritical / Important issue 없음.
Architecture
requeueDisabled와 기존retryAllFailed가 동일 패턴 (향후requeueByStatus통합 가능, DRY 후보)Risk 잔재
���지 권장
v0.2.9+npm run dist:win→ Windows exe 빌드dist:mac+dist:linux후 dmg/AppImage/deb 추가 attachOverall
Ready to merge. Spec 100% coverage, 472 → 548 unit + 1 e2e + typecheck 0, schema 마이그레이션 외래키 안전성 검증, v0.2.6 #10 fix 보존, 2 minor 모두 cleanup commit 에서 처리. Cut C (v0.2.10) 진입 가능.
🤖 Reviewed by Claude Opus 4.7 (1M context)