mini-brainstorm 4개 결정:
- Q1=C: vocab pool = AI+user 통합 + kebab-case 필터
- Q2=A: telemetry emit 단위 = 태그별 (per-tag hit/miss)
- Q3=B: prompt 강도 = "Prefer" (우선, MUST 아님)
- Q4=A: 기존 노트 재처리 = 자연 진화 (X)
핵심 invariant 6개 + privacy invariant + tests ≥19개 약속.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mini-brainstorm 결정 3개:
- Q1=A unreachable backoff cap 15분 (30s→60s→120s→240s→480s→900s)
- Q2=A timeout 도 unreachable 동일 (무한 retry, attempts 증가 안 함)
- Q3=A retry-all 만 (per-note 버튼 v0.2.4)
AiWorker unreachable/timeout 무한 retry + schema/other max 3 유지
+ retryAllFailed atomic + FailedBanner (Inbox stack 4번째)
+ tray '지금 AI 처리 (실패 N건)' 9th callback
+ ai_retry_manual telemetry.
roadmap §3 #2 deviation 1건 (timeout) 의식적 — v0.2.4 dogfood 데이터로 영구 hang 케이스 식별 후 가다듬기.
T1-T8 작업 순서 + 단위 ≥ 17개.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
§2.1 / §3.2 / §11 보강 — IPC handler 가 직접 telemetry.emit 안 하고
HealthChecker.runOnce({ manual: true }) 호출 → onTelemetry hook 으로
ollama_recheck_manual 발화. 단위 테스트 가능 (HealthChecker 레이어).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
m1 — spec §5.3 dialog 버튼 순서를 impl 패턴 (`['옮기기','취소'], defaultId=1, cancelId=1`) 으로 보정. project 의 permanentDelete/emptyTrash 와 일관 (위험 액션은 default focus = 취소).
m2 — telemetryEvents.test.ts 에 `expired_batch_trash` 의 extra-field 회귀 가드 추가. `expired_banner_shown` 과 대칭 (privacy invariant).
m3 — ExpiryBanner.InnerProps.candidates 타입을 narrow subset → `Note` 로 통일. v0.2.4 에서 Note 타입 진화 시 silent drift 방지.
m4 — onTrash 의 `void trashExpiredBatch(ids)` → `.catch((e) => console.warn(...))` 로 Promise rejection 가시화. (project-wide error toast 도입은 v0.2.4 backlog 유지)
n1 — 24h+ 앱 켜둔 상태에서 snooze 자동 만료. `setTimeout(snoozeUntilMs - now)` 으로 자정 KST 시점에 force re-render. (refreshMeta trigger 의존 제거)
n2 — CaptureService.listExpired 의 dedup signature reset on empty 의도 주석 1줄. future maintainer 위해.
n3 (`as any[]`) 은 repo 전체 hydrate 패턴 — 단독 fix 시 inconsistency. v0.2.4 backlog #22 로 합산.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
§6.2 의 expired_banner_shown signature dedup 위치를 zustand store(renderer)
→ CaptureService(main) 로 변경. 결과: 신규 IPC 채널 1개 추가 회피.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.2.3 두 번째 항목의 mini-brainstorm 결과 lock.
UI=A (Inbox 탭 toggle), 필터=A (명시적 WHERE deleted_at IS NULL),
AiWorker race=C (pending_jobs cleanup + processJob 가드),
액션=B (per-card 영구 삭제 추가 — IPC 4채널 → 5채널, telemetry 3 → 4 events),
confirm/정렬/카드차이 모두 A.
self-review 후 ExportService/ImportService 충돌 정책 ambiguity 명시화.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add .catch(...) to telemetry.cleanupOldFiles fire-and-forget for consistency
with backup.runDaily pattern (M1 from T10 code review).
- Mark Roadmap §3 #7 as completed (✓).
- Correct spec: tray:exportTelemetry was never an IPC channel — tray callbacks
run in main process directly. Replace with "트레이 콜백 (main 내부)".
Closes v0.2.3 task 1 of 7. Next task: #4 휴지통 (migration v3).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.2.2 dogfood 7항목 (#7 telemetry 신설 + #1~#6) 단일 cut 로드맵.
데이터 안전 우선 (C 채택), schema migration v3 3컬럼 한 묶음 (B),
trash↔backup/export B 정책, #6 = 1 spike 흡수.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
신규 spec 파일 추가 (구현 결과 반영). dogfood-feedback.md 의 F7
헤더 🔬 drafting → 🚀 promoted 로 갱신. F1 spec 의 후속 리스트에
F7 링크 추가.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.2.1 dogfood 첫 실증 피드백. '내일 모레' → 내일로 잘못 잡힘.
규칙 파서 한계 3 (합성/양가 / 범위 / 모호) + 5 후보 방향 (A 화이트
리스트 / B 충돌 감지 / C UI 신호 / D AI 우선 / E 규칙 폐기).
1차 A+B 작은 PR 즉시 시도 가능, 2차 C UI 신호, 후속 D/E 결정.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
F4 의 6개 cue 메커니즘 중 외부 신호 없이 즉시 구현 가능한 두 가지
(C 환경 앵커, F 정체성 고리) 를 묶어 promoted spec 으로 추출. A (잠금
hook), D (variable interval prompt), B (ambient if-then) 는 dogfood
soak 측정 결과를 본 뒤 결정.
F4 헤더를 🌱 raw → 🔬 drafting (C·E·F promoted) 로 갱신하고, F4 진행
상태에 두 promoted 경로를 명시.
- 신규 spec docs/superpowers/specs/2026-04-26-f6-l2-git-sync.md
결정 표 + 범위 + 시스템 의존 + 동작 요약 + 후속 후보
- 2026-04-25-dogfood-feedback.md F6 진행 상태 line 갱신:
L2 — 🌱 raw → 🚀 promoted (MVP)
- README.md '원격 백업 (선택, F6-L2)' 섹션:
일회 설정 (git init + remote add + 자격증명) + 사용법
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
strategy.md §1 heading and core sentence reframed to '머릿속에서
꺼내 두기' as the load-bearing user action (was '기억 구출').
§4.1 보상 카피 list updated to match shipped copy. Brief Zeigarnik-
effect rationale added per F4-E. §7 example updated.
Slice spec §5.5 카피 테이블 4개 항목 갱신 — code 와 spec 의 카피
드리프트 차단.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Marks F2 in dogfood-feedback as 🚀 promoted and adds the standalone
spec at docs/superpowers/specs/2026-04-26-f2-tag-click.md capturing
the mini-brainstorm decisions, scope, and follow-ups (multi-tag
filter, rename/merge, source preservation on undo).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Extracted to own spec with mini-brainstorm decisions captured.
F1 in dogfood-feedback.md marked 🚀 promoted with link.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Extracted to own spec with mini-brainstorm decisions captured.
F5 in dogfood-feedback.md marked 🚀 promoted with link.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
final reviewer 가 식별한 forward-looking polish 4건을 후속 리스트에
명시. 4번째는 F1 (Due Date 마이그레이션 v2) PR 시 즉시 반영 권장:
openDb() 가 마이그레이션을 BackupService 인스턴스화 전 호출하므로
마이그레이션 결함 시 첫 실행 직전 상태 회수 불가.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Extracted to its own spec, dogfood-feedback.md F6 header reflects
L1 promoted status while L2/L3 remain raw.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Task 1: 순수 GFS retention 함수 + 7 단위 테스트
Task 2: BackupService.snapshot() — KST 날짜·tmp+rename 원자성 + 6 단위 테스트
Task 3: runDaily() — .last-snapshot 마커 + lastSnapshotAt + 7 단위 테스트
Task 4: main/index.ts wiring (whenReady + before-quit) + tray '지금 백업'
Task 5: F6-L1 promotion (별 spec 분기 + dogfood-feedback.md 상태 갱신)
backup 위치: <profileDir>/backups/ (mini-brainstorm 결과 A 채택).
스키마 변경 0, 외부 dep 0. better-sqlite3.backup() API 가정.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8개 항목 순차 작업 (F6-L1 → F5 → F6-L3 → F1 → F2 → F3+F4-E →
F6-L2 → F4-C·F) + 데이터 안전 우선 + 머지+테스트 게이트 + 단일
v0.2.1 cut 후 dogfood 재설치 + 1주 soak. F4-A·D 는 측정 후
별 brainstorm 으로 deferred. 항목별 mini-brainstorm 에서
decision-pending 답변하는 라이프사이클.
본 spec 은 순서·범위·게이트만 정의, 항목 내부 설계는 per-item.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
slice + strategy.md §3 가 회의·퇴근 같은 강한 contextual cue 만 다루고
샤워·산책·자기 직전 같은 ambient 떠오름은 사각지대. 6개 심리 메커니즘
(habit stacking, ambient if-then, 환경 앵커, variable interval prompt,
Zeigarnik, 정체성 고리) 후보 + 슬라이스 내/후속 분류 + H1~H5 가설.
권장 순서: E (카피 priming) → 데이터 → C·F → A·D.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dogfood 첫 알림 노출에서 '구출' 표현이 일상 한국어로 부자연스럽다는
피드백. 5개 UI 표면 + e2e 단언 + strategy.md §1·§3·§7 의 어휘 결정에
함께 묶임. drafting 시 결정 대기 #1(strategy 재검토 동반 여부)이
promoted 경로 좌우.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reframe the file as a living register for in-flight dogfood feedback
rather than a single-feature stub. Each item carries a status label
(raw / drafting / ready-for-spec / promoted / rejected) and a fixed
six-slot template (관찰 / 제안 방향 / 결정 대기 / 가설·측정 / 범위 /
영향). Items graduate to their own spec file once mature; the entry
here then collapses to a one-line link.
- F1: Due-date 추출 (drafting) — content from the previous stub
normalized to the new template.
- F2: 태그 클릭 = 즉시 삭제 + undo 부재 (raw) — NoteCard.tsx:110
binds chip onClick to removeTag, no confirm or undo, and there is
no "filter by tag" affordance to match the user's mental model.
Direction: split click=filter, ✕-icon=remove with 5s undo toast.
README docs map updated to point at the new path.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The due-date extraction work originated as feedback during dogfood, but
the dogfood strategy doc itself should stay feature-agnostic — it's the
generic operating manual for the 2-week dogfood, not a feedback log.
- Remove the "시간 표현 포함 노트 수" row from dogfood-strategy §3.1.
- Rephrase the due-date spec stub so H1 / §7 / §9 reference the spec's
own sample-collection plan instead of relying on the dogfood retro.
- Spec is now framed as "independent of slice exit"; entry timing is a
separate decision once an accumulated sample meets H1.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Captures the design skeleton, hypotheses, and open questions for the
hybrid (rule-based first → AI fallback) Korean date-phrase extractor.
Schema impact, prompt change, UX copy, and library tradeoffs are
sketched but deferred — formalization waits for slice v0.4 dogfood
Pass and the H1 (time-phrase frequency ≥ 30%) check in week-1 retro.
Cross-link added to dogfood-strategy daily-metric table so the H1
data is collected during dogfood, and to README docs map.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Task 2 of the slice plan. Creates the minimal Electron main
process: app entry that opens an Inbox BrowserWindow on
whenReady, an inboxWindow module that handles show/hide/close-
to-tray semantics, an HTML placeholder renderer ("Inkling Inbox
(renderer pending)"), and the minimum @shared/types augmentation
for app.isQuitting (Task 3 expands this file).
Plan tsconfig template adjustment: TypeScript 6 deprecates
baseUrl. Dropped it and made paths entries explicitly relative
("./src/...") so they resolve from tsconfig.json's directory.
Updated both the in-repo tsconfig.json and Task 1 Step 3 in the
plan to match.
Verification: `npm run typecheck` exits 0. Full `npm run dev`
sanity check is deferred until Task 3 (preload) and Task 19
(quickcapture HTML) land — electron-vite.config.ts wires both
entries that don't yet exist.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>