{
  "schema_version": "2026-06-15.app-ecosystem.v1",
  "generated_at": "2026-06-15",
  "service_name": "GosiGosi / Drill Legal Study Ecosystem",
  "public_base_url": "https://gosigosi.pages.dev",
  "source_of_truth": "web_static_assets",
  "purpose": "웹은 공식 콘텐츠 DB를 배포하고, 앱은 개인 풀이 기록과 학습 기록을 보관한다.",
  "assets": {
    "laws": {
      "url": "assets/law_texts.json",
      "index_url": "assets/laws/index.json",
      "url_pattern": "assets/laws/{key}.json",
      "type": "statute_text",
      "source": "국가법령정보센터",
      "sync_mode": "full_toc",
      "law_count": 13,
      "article_count": 4700,
      "empty_body_count": 0,
      "client_parse_note": "기존 웹 UI는 assets/law_texts.json 통합 파일을 사용한다. 앱은 assets/laws/index.json을 먼저 읽고 법령별 shard를 캐시할 수 있다."
    },
    "exam_items": {
      "index_url": "assets/exam_items/index.json",
      "url_pattern": "assets/exam_items/{subject_key}_questions.json",
      "type": "exam_question_choice_candidates",
      "source": "공기출 PDF 로컬 사본 자동 텍스트 추출",
      "subject_count": 16,
      "pdf_count": 305,
      "parsed_pdf_count": 232,
      "question_count": 5160,
      "rights_policy": "문제·정답 후보만 구조화하고 해설 원문은 저장하지 않는다.",
      "review_policy": "문항/보기 분리는 자동 후보이며 정답 확정과 해설 연결은 별도 검수 후 배포한다."
    },
    "constitution_precedents": {
      "url": "assets/precedent_links_constitution.json",
      "type": "exam_linked_precedent_candidates",
      "source": "헌법 기출 PDF 자동 추출 및 공식 출처 후보 매칭",
      "item_count": 125,
      "matched_official_count": 5,
      "candidate_count": 120,
      "needs_review_count": 120
    },
    "gongichul_pdf_index": {
      "url_pattern": "assets/gongichul/{subject_key}_pdfs.json",
      "type": "exam_pdf_index",
      "rights_policy": "문제·정답 원문은 허락 범위에서 열람하고, 해설 PDF는 관리자용으로 분리한다."
    }
  },
  "app_surfaces": [
    {
      "id": "ox_app",
      "name": "기출 OX 앱",
      "uses": ["gongichul_pdf_index", "exam_items", "constitution_precedents", "laws"],
      "private_user_data": ["answers", "wrong_notes", "fsrs_cards", "personal_highlights", "study_progress"]
    },
    {
      "id": "law_viewer_app",
      "name": "법령 뷰어 앱",
      "uses": ["laws", "constitution_precedents"],
      "private_user_data": ["law_tabs", "recent_articles", "bookmarks", "personal_highlights"]
    },
    {
      "id": "case_viewer_app",
      "name": "판례 뷰어 앱",
      "uses": ["constitution_precedents", "laws"],
      "private_user_data": ["recent_cases", "case_notes", "personal_highlights"]
    },
    {
      "id": "web_admin",
      "name": "웹 관리자/검수",
      "uses": ["all_assets"],
      "admin_only": true,
      "private_user_data": []
    }
  ],
  "sync_policy": {
    "public_content_authority": "web_static_assets",
    "private_user_content_authority": "app_local_storage_or_account_server",
    "offline_policy": "앱은 이 manifest를 먼저 읽고 schema_version, generated_at, asset url 기준으로 캐시를 갱신한다.",
    "highlight_policy": "공식 색칠과 개인 색칠은 같은 원문 위치를 참조하되 반드시 별도 layer로 저장한다.",
    "rights_policy": "공개 자산에는 해설 PDF 원문과 유료/저작권성 해설 전문을 넣지 않는다.",
    "update_order": ["source_fetch", "static_asset_build", "manifest_update", "app_cache_refresh", "impact_review"]
  },
  "deep_link_contract": {
    "law": "#lawViewer?law={law_name}&article={article_no}",
    "precedent": "#caseDetail:{case_id}",
    "admin_sources": "#adminSources",
    "home": "#home"
  }
}
