Files
life-helper/docs/adr/0001-dose-variants.md
joungmin 29befe4d97 [Architect] Refs #204 — apply OQ decisions: diet_pattern (19th), ADR-0002 normalize dose_variants
- OQ-1: dose_variants 정규화 결정을 ADR-0002 로 승격 (ADR-0001 = 왜, ADR-0002 = 어떻게).
- OQ-3: nutrition diet 패턴 5개를 별도 diet_pattern 카탈로그(19번째 SoT)로 분리.
  · 02-catalog §8 신규, 인덱스 IDX_diet_patterns_evidence / IDX_diet_patterns_kfit.
  · 05-seed: diet_patterns.json (5행) 추가, 로딩 순서 끝에 배치.
  · 04-migrations: v1 테이블 합계 = Catalog 8 + User 11 + 부속 1 + meta_kv = 21.
- README §2/§3/§6/§11 갱신: 18→19 SoT, AC-2 에 diet_pattern=5 검증 추가.
- README §12 OQ → Resolved Open Questions 표 (OQ-1~OQ-8 결정 결과).
- habit_dose_variant → habit_dose_variants 표기 통일.
- fn-weekly-minimum-ratio, 03-drift-schema-user 의 ADR-0002 cross-link.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-11 17:13:04 +09:00

3.8 KiB
Raw Blame History

ADR-0001: Dose Variants (상황·컨디션별 도즈 옵션)

상태: Accepted 날짜: 2026-06-11 · 결정자: 사용자 (joungmin) + AI 합의 · 관련 이슈: #204 관련 ADR: ADR-0002 — dose-variants 정규화 (어떻게 저장)

맥락 (Context)

기존 데이터 모델은 tracker_entry.valuedone / blank 2값(R5)이고, habit.min_dose / target_dose 가 단일 문자열이었다. 사용자가 컨디션이 나쁘거나 환경(짐 vs 집, 출장 등)이 풀 도즈와 안 맞을 때, "할 수 없으면 0(blank)"이라는 이분법이 강요됐다. 결과: blank → lapse → 자책 → abandonment 사이클 위험.

BJ Fogg Tiny Habits 의 "If tired, do tiny" + Lally 2010 의 자동화 곡선 모두 "빈도 > 강도" 를 가리킨다. 본 시스템의 "Never miss twice" 가드레일과도 맞물려, 상황별 가변 도즈가 본질적으로 필요하다.

결정 (Decision)

habitdose_variants[] 배열을 추가한다. 각 variant 는 { id, label, dose_text, context_tags?, condition_tags?, is_minimum? } 구조. tracker_entryvariant_idcontext_snapshot { location, condition } 추가. 체크인 UX 는 장소 1탭 + 컨디션 1탭 → 매칭 variant 추천 + override 흐름.

운영 규칙:

  • R9 신규: dose_variants[] 개수 제한 없음 (기존 R9 ≤4 폐기). is_minimum=true 권장이나 강제 X.
  • R10 신규: 주간 reflection.minimum_ratio 표시 — is_minimum=true variant 선택 비율. 강제 임계값 없음 (SDT autonomy 존중), hint 만.

기존 단일 min_dose / target_dose 필드는 호환성을 위해 보존하되 dose_variants 사용 시 deprecated.

근거 (Rationale)

  • 다양성 + 상황 매칭 둘 다 잡음 (사용자 명시 요구). 옵션 A (3단계 enum) 는 "다양"이 약함, 옵션 C (매트릭스) 는 가드레일 #2 위반 위험.
  • 체크인 ≤ 60초 (R8) 유지: "1탭 × 2" 입력 후 자동 추천이므로 마찰 작음.
  • 자유 태그: 사용자별 컨텍스트(예: '출장-호텔', '주말-새벽') 무한 확장.
  • is_minimum 플래그: tiny 가드 계산을 위한 최소한의 메타데이터. enum 강제 안 함.
  • R10 hint-only: 강제 임계값은 결정 피로 + 자율성 침해. 데이터만 제공.

결과 (Consequences)

  • 긍정:
    • Never miss twice 가드 강화 (tiny variant 로도 스트릭 유지).
    • 5-Tier Reward T1 (3회 스트릭) 진입 확률 ↑.
    • 컨텍스트 스냅샷 누적으로 향후 자동 추천 학습 가능.
  • 부정 / 비용:
    • 체크인 UI 가 2-step (상황 입력 + variant 선택) 으로 늘어남. 데이터 1탭 추가.
    • tracker_entry 통계가 done/blank 단순 카운트가 아닌, variant level 분석 필요.
    • 사용자가 처음 habit 만들 때 variant 1개 이상 정의해야 하는 onboarding 부담.
  • 후속 작업:
    • Phase 1 schema 작업 (#204) 에 dose_variants 반영.
    • 4개 SoT 마크다운 (huberman / methodologies / breaking / nutrition) 에 "도즈 변동" 가이드 짧게 추가 (별도 후속).
    • seed/ 카탈로그 데이터에 권장 variant 예시 포함.

검토한 대안 (Alternatives Considered)

  • 옵션 A — 3단계 enum (tiny/normal/strong) + context_tags
    • 기각 사유: "다양"이라는 사용자 요구가 3단계로 제한됨.
  • 옵션 C — condition × context 2축 매트릭스
    • 기각 사유: 입력 마찰 큼, 가드레일 #2 (≤2분/일) 위반 위험.
  • Tiny 가드 — Streak 가중치 (tiny=0.5x)
    • 기각 사유: "점수화" 느낌이 5-Tier Reward Ladder 의 "행동 단순 카운트" 원칙과 충돌.
  • Tiny 가드 — 장치 없음
    • 부분 채택: 강제는 안 함. 다만 reflection 비율 표시는 유지 (정보 제공만).