feat(tag-vocab): #3 태그 vocab — prompt + telemetry (v0.2.3 6/7) #18
Reference in New Issue
Block a user
Delete Branch "feat/v023-tag-vocab"
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.3 dogfood feedback roadmap §3 #3 cut. AI prompt 에 vocab 주입 + per-tag hit/miss telemetry.
mini-brainstorm 4개 결정:
Changes
Spec & plan
Test Plan
- TagVocabHitPayload { tagId: int>0, vocabSize: int>=0 } .strict() - TagVocabMissPayload { vocabSize: int>=0 } .strict() - TelemetryEventSchema union 13 → 15 - 단위 +3 cases (hit accept, miss accept, hit extra field 거부) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>- processJob 가 generate 직전 repo.getTopUsedTags(20) fetch - provider.generate 에 vocab 전달 (LocalOllamaProvider 가 prompt 에 주입) - ai_succeeded emit 후 per-tag 분류 → tag_vocab_hit/miss emit - hit: vocabSet.has + getTagIdByName lookup → { tagId, vocabSize } - miss: { vocabSize } - AiTelemetryEmitter union 4종 (ai_succeeded/ai_failed/tag_vocab_hit/tag_vocab_miss) - 단위 +4 cases (vocab passthrough, hit+miss, vocab=[] all miss, per-tag emit count) - collectingTelemetry mock → AiTelemetryEmitter 타입 적용 (typecheck 통과) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>- nit1: tag_vocab_hit/miss 테스트 payload cast dedupe (한 번에 typed 바인딩) - nit2: { kind: string; payload: unknown } 반복을 EmittedEvent 타입 alias 로 hoist skip: Minor1 (serial await — ai_succeeded 와 패턴 일관), Nit3 (magic number VOCAB_TOP_N — v0.2.4 backlog), Nit4 (한국어 코멘트 — 기존 코드와 일관) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>feat(tag-vocab): #3 �±� vocab ? prompt + telemetry (v0.2.3 6/7)to feat(tag-vocab): #3 태그 vocab — prompt + telemetry (v0.2.3 6/7)Round 1 self-review (controller-side)
i1 — 중복 태그 hit 인플레이션 (
AiWorker.ts:170-185)res.tags가['design', 'design', 'meeting']같이 중복 들어올 가능성.updateAiResult는INSERT OR IGNORE로 dedup 하지만 telemetry emit 루프는 안 함 → 같은 tagId 가 2번 카운트되어 hit-rate 통계 왜곡.Fix:
for (const tagName of new Set(res.tags))로 dedup. 테스트 추가 (중복 태그 응답 시 emit 1회만).m2 — LIMIT-then-filter 테스트 갭 (fix)
docstring 에 명시된 "limit 보다 짧을 수 있음" 동작이 테스트로 lock 되지 않음. 테스트 1개 추가.
m1 + n1 + n2 (skip)
ai_succeeded와 동일 직렬 emit — 패턴 일관성 우선, 성능은 v0.2.4tagId는 AUTOINCREMENT 1+ 라positive()가 정확Plan
i1 + m2 fix 후 round 2 자체 verify.
Spec compliance
Verdict
APPROVE WITH FIX — i1 + m2 inline 수정 후 round 2.
- i1 (Important): AiWorker per-tag emit 루프에 res.tags Set dedup AI 가 같은 태그 중복 응답 시 hit count 2번 emit 되던 통계 왜곡 수정 + 테스트 1개 (중복 태그 1 hit + 1 miss 검증) - m2 (Minor): NoteRepository.getTopUsedTags LIMIT-then-filter 테스트 갭 + 테스트 1개 (limit=3 + 한글 1 + kebab 2 → 결과 length=2 lock-in) skip: m1 (per-tag serial await — ai_succeeded 패턴 일관), n1 (prompt 빈 줄 cosmetic), n2 (tagId positive — AUTOINCREMENT 1+) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>Round 2 — APPROVE
d8621d5for (const tagName of new Set(res.tags))+ 테스트 1개skip 항목 (round 1 결정):
ai_succeeded와 패턴 일관, 성능은 v0.2.4 backlogpositive()— AUTOINCREMENT 1+ 라 정확머지 후 알려줘. closure 단계 (local main sync + 브랜치 정리 + memory backlog) 진행.