v0.3.1 Cut F — 멀티모달 vision AI (F24) #31
Reference in New Issue
Block a user
Delete Branch "worktree-v031-cut-f-vision"
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.3.1 Cut F — F24 (이미지 멀티모달 AI 분석). semver patch — 새 vision 기능 추가, 기존 text-only 흐름 영향 X (
GenerateOptions?optional 로 backward compat). Ollama vision 모델 (gemma3 family default) 활용 + capability detection (app launch + manual refresh) + Configure UI + AiWorker integration (5MB cap + base64 변환). 'both' 자동 fallback 과 'skipped' enum 은 v0.3.2+ deferred.VisionDetect.isVisionCapable(model)(family/families/name 3-layer) +refreshVisionCache(deps)(Ollama/api/tags결과 cache). app launch 시 fire-and-forget + 설정 페이지 manual refresh 버튼.VisionSection추가 — cache 기반 dropdown + 다시 감지 버튼 + 마지막 감지 시각. 빈 cache 시 "감지된 모델 없음" 안내.GenerateInput.images?: Array<{ base64; mime }>+GenerateOptions.visionModel?(둘 다 optional — 기존 호출자 무영향).LocalOllamaProvider.generate(input, opts?)가useVision = !!visionModel && images.length > 0분기 — vision 시model = visionModel,prompt = buildVisionPrompt,body.images = base64[].note.media + visionModel둘 다 충족 시 vision path. 이미지당 5MB cap (final review fix:note.media[].bytesfast-fail — readFile/base64 전 차단). visionModel null 시 기존 text-only 회귀 검증.repo.updateAiResult()경유 —notes_fts/note_revisions/note_tags직접 mutation 없음. 4-path invariant 보존.ImportService.test buildExportNotehelper 가 frontmatter 5 필드 (Cut E 추가) 누락 →composeFrontmatter가 undefined moveReason 받아 throw. helper 에 default 추가.변경 내역 (12 commits)
Phase 0: 문서
7a56184docs(plan) — Cut F plan + spec 정정 (단위 679, SettingsService 개별 메서드, 'skipped' enum 미도입, fallback 미구현)Phase 1: settings + detection
463be7cTask 2 —SettingsService.{getVisionModel,setVisionModel,getVisionCapableCache,setVisionCapableCache}3eb0ef1Task 1 —VisionDetect.{isVisionCapable,refreshVisionCache}(fetch 주입)Phase 2: provider/prompt
e2e8b9bTask 3 —buildVisionPrompt+GenerateInput.images?+GenerateOptions.visionModel?369d418Cut E gap fix —ImportService.test buildExportNote5 필드 default5012b40Task 4 —LocalOllamaProvidervision pathPhase 3: AiWorker + IPC
2179cfbTask 5 —AiWorkervision integration (note.media + 5MB cap)d03098cTask 6 — vision IPC + preload (3 채널)Phase 4: UI + 자동 호출
72e9b68Task 7 —VisionSectionUI (dropdown + 다시 감지)7468217Task 8 — mainrefreshVisionCachewhenReady fire-and-forgetPhase 5: release + final review fix
7b53640chore(release) — v0.3.181fae12fix(v031) — endpoint resolution helper + 5MB fast-fail (final review)테스트 / 빌드
Schema 변경
m007 (Cut D) 이후 schema 변경 없음 — Cut F 는 settings.json 의 zod schema 만 확장 (vision_model / vision_capable_cache / vision_cache_at). DB schema 무영향.
메모리 정책 갱신 (Cut F 머지 후 적용)
/api/tagscache. dogfood 시 false-positive 발견 시 family set 보강note.media[].bytes) 로 readFile 전 차단Risk 잔재 (final review)
Test Plan
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- F24 promoted (✅ v0.3.1 Cut F — Ollama vision 모델 capability detection + AiWorker integration) - version 0.3.0 → 0.3.1 (semver patch — 새 기능, 기존 영향 X) - 단위 679 → 710 (+31): VisionDetect 9 + SettingsService 4 + visionPrompt 2 + LocalOllamaProvider vision 3 + AiWorker vision 3 + IPC 5 + UI 4 + ImportService helper fix 5 (Cut E gap) - typecheck 0 errors - 자동 fallback (caption→text) + 'skipped' enum deferred v0.3.2+코드 리뷰 — v0.3.1 Cut F
Scope: 12 commits (7a56184..81fae12) — semver patch (vision 추가, backward compat)
Spec coverage ✅ 100%
Cut F design 의 모든 섹션이 task 매핑됨. F24 옵션 모두 적용 — 'skipped' enum + automatic fallback 만 v0.3.2+ deferred (spec 정정 반영).
VisionDetect.isVisionCapable(family/families/name 3-layer) + 9 unitgetVisionModel/setVisionModel/getVisionCapableCache/setVisionCapableCache(Cut B/E 패턴)void refreshVisionCache(...)whenReady fire-and-forgetVisionSection(dropdown + 다시 감지 + 마지막 감지 시각 + 안내 텍스트)GenerateInput.images?+GenerateOptions.visionModel?(둘 다 optional → backward compat)!!visionModel && images.length > 0분기. body.images base64코드 품질
Strengths
VisionDetect의 fetch/now 주입 → 단위 테스트 결정적.visionPrompt도 pure builder.GenerateInput.images?+GenerateOptions?모두 optional — 기존 LocalOllamaProvider/AiWorker 호출자 무영향. 회귀 test 3건 (LocalOllamaProvider) 명시 검증.settings,mediaStore) 를 기존opts객체-bag 안에 추가 → 모든 기존 test 의new AiWorker(repo, holder, {...})사이트 무수정. typecheck 0.updateAiResult()경유.notes_fts/note_revisions/note_tags직접 mutation path 추가 없음. 4-path invariant 보존.note.media[].bytes(이미 DB 에 있음) 로 readFile/base64 전 차단. retry 마다 동일 비용 반복 회피.ImportService.test buildExportNote의 frontmatter 5 필드 누락 →composeFrontmatter(undefined moveReason)throw. helper 에 default 추가하여 회귀 회복.Final review follow-up 적용 (
81fae12)initial final review (Opus, 1차) 에서 발견된 minor 2건:
settings:refresh-vision-cache가settings.ollama?.endpoint만 체크 — env / default fallback 없음. dev 환경 (env var only) 사용자가 manual 다시 감지 시 silent 'no_endpoint' 반환readFile+base64변환 후 throw → 3 retry 마다 같은 작업 반복→ Fix:
settings:refresh-vision-cache도settings.ollama?.endpoint ?? process.env.INKLING_OLLAMA_ENDPOINT ?? DEFAULT_OLLAMA_ENDPOINT동일 fallback chain 사용note.media[].bytes(DB 값) 으로 fast-fail — readFile 전 throwre-verification 결과:
Architecture
VisionDetect= pure detection /LocalOllamaProvider= transport + 분기 /AiWorker= orchestration /VisionSection= viewAiProviderSection,SyncSection) 와VisionSection동일 layoutRisk 잔재 (final review 분석)
Sub-review 트레일
머지 권장
v0.3.1+npm run dist:win→ Windows exe 빌드dist:mac+dist:linux후 dmg/AppImage/deb 추가 attachOverall
Ready to merge. Spec 100% coverage, 679 → 710 unit (+31) + typecheck 0, schema 변경 없음 (settings.json zod 만), backward compat 보장 (optional opts), single write path invariant 4-path 유지 (vision 결과 = updateAiResult 경유), Cut E gap 회복 (ImportService helper). final review 2 minor 모두 follow-up commit 으로 처리. Cut G (v0.3.2 — F25 사이드바) 진입 가능.
🤖 Reviewed by Claude Opus 4.7 (1M context) with Sonnet sub-agents per subagent-driven-development skill