{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://life-helper.local/schema/_index.json", "title": "life-helper schema index v1", "description": "전체 스키마 목록 + 운영 규칙 메타. 자세한 설계는 data-model.md 참조.", "version": "1.0.0", "schemas": { "catalog": { "protocol": "./protocol.schema.json", "break_protocol": "./break_protocol.schema.json", "common_frame": "./common_frame.schema.json", "methodology": "./methodology.schema.json", "frame_pattern": "./frame_pattern.schema.json", "reward_menu_item": "./reward_menu_item.schema.json", "reference": "./reference.schema.json", "diet_pattern": "./diet_pattern.schema.json" }, "user_data": { "user": "./user.schema.json", "phase": "./phase.schema.json", "habit": "./habit.schema.json", "if_then_rule": "./if_then_rule.schema.json", "tracker_entry": "./tracker_entry.schema.json", "lapse_log": "./lapse_log.schema.json", "urge_log": "./urge_log.schema.json", "reward_declaration": "./reward_declaration.schema.json", "reward_claim": "./reward_claim.schema.json", "reflection": "./reflection.schema.json" }, "shared": { "enums": "./enums.schema.json" } }, "operational_rules": [ { "id": "R1", "rule": "user당 동시 active build habit ≤ 3", "enforced_in": "habit query / application layer" }, { "id": "R2", "rule": "user당 동시 active break habit ≤ 1", "enforced_in": "habit query / application layer" }, { "id": "R3", "rule": "habit.frame.level ∈ {L2, L3} 강제 (L0/L1 거부)", "enforced_in": "habit.schema.json (enum)" }, { "id": "R4", "rule": "reward_declaration은 phase.started_at + 7일 이내에만 생성", "enforced_in": "application layer" }, { "id": "R5", "rule": "tracker_entry.value ∈ {done, blank} 2값만", "enforced_in": "tracker_entry.schema.json (enum)" }, { "id": "R6", "rule": "phase.duration_weeks = 6 default, 6주 중간 anchor 변경 warning", "enforced_in": "application layer" }, { "id": "R7", "rule": "if_then_rule.then_action 회피 키워드 감지 시 warning", "enforced_in": "client-side linter" }, { "id": "R8", "rule": "habit 일일 운영 ≤ 2분 (UX 제약)", "enforced_in": "UI design (not in schema)" }, { "id": "R9", "rule": "habit.dose_variants[] 개수 제한 없음. 체크인 UX는 장소 1탭 + 컨디션 1탭 → 추천 흐름으로 R8 유지", "enforced_in": "application + UI", "source": "docs/adr/0001-dose-variants.md" }, { "id": "R10", "rule": "reflection.scope='weekly'은 minimum_ratio 표시 (강제 임계값 X — hint 용도)", "enforced_in": "application calculation", "source": "docs/adr/0001-dose-variants.md" } ], "id_format": { "scheme": "ULID with type prefix", "examples": { "user": "u_01J9XYZ...", "habit": "hb_01J9XYZ...", "tracker_entry": "te_01J9XYZ...", "phase": "ph_01J9XYZ...", "lapse_log": "ll_01J9XYZ...", "urge_log": "ul_01J9XYZ...", "reward_declaration": "rd_01J9XYZ...", "reward_claim": "rc_01J9XYZ...", "if_then_rule": "if_01J9XYZ...", "reflection": "rf_01J9XYZ...", "reference": "ref_doi_10_1136_bmj_j2353" } } }