{
  "generated_at": "2026-06-21T21:23:14.388Z",
  "artifact": "lbr_notebooklm_professor_trial_pack",
  "status": "ready_for_public_safe_professor_notebooklm_trial",
  "product": "LawBar Rebellion",
  "primary_public_url": "https://lawbar-forge.pages.dev",
  "default_api_model": "gpt-5.4-mini",
  "fallback_api_model": "gpt-5.4-nano",
  "purpose": "교수님이 이미 NotebookLM을 쓰는 상황에서 LBR이 계정·세션을 받지 않고 source pack -> professor-run NotebookLM -> response import -> review queue -> API/local DB promotion으로 이어지는 15분 파일럿을 시연하기 위한 공개 안전 패키지입니다.",
  "principle": "NotebookLM은 교수 소유 근거 준비실이고, LBR API/로컬 DB는 30~100문항 생성, 검수 큐, 학생 풀이, Anki, 교수 정답률 리포트를 반복 운영하는 제품 레이어입니다.",
  "route_split": {
    "notebooklm_lane": {
      "owner": "professor_or_school_workspace_account",
      "uses_openai_api_key": false,
      "lbr_credentials_stored": false,
      "no_session_stored": true,
      "output_role": "source-grounded issue map, citation candidates, draft question candidates, flashcards CSV candidates",
      "public_boundary": "NotebookLM notebook URL과 professor_workspace_owner는 공개 JSON에 노출하지 않고 private receipt에만 남깁니다."
    },
    "lbr_api_local_lane": {
      "owner": "lbr_server_or_local_database",
      "uses_openai_api_key": true,
      "default_model": "gpt-5.4-mini",
      "fallback_model": "gpt-5.4-nano",
      "output_role": "exam-format generation, review queue, student practice, Anki TSV, professor correct-rate report",
      "public_boundary": "API status는 ready/model/probe만 보여주고 OPENAI_API_KEY, 원문 OCR, 학생 식별자, 점수표 원본은 공개하지 않습니다."
    }
  },
  "trial_scope": {
    "sourcepack_id": "lbr-notebooklm-trial-civil-default-20260622",
    "subject": "민법",
    "unit": "채무불이행",
    "exam_formats": [
      "choice",
      "case",
      "record"
    ],
    "target_candidate_count": 5,
    "later_api_batch_target": 30,
    "public_safe_sources_only": true,
    "allowed_source_types": [
      "professor-approved lecture summary",
      "public statute citation list",
      "public precedent citation candidate",
      "deidentified aggregate score pattern",
      "issue map written by the operator"
    ],
    "forbidden_source_types": [
      "raw exam file",
      "OCR original",
      "student identifier",
      "score sheet original",
      "copyright-unclear textbook excerpt",
      "API key",
      "local file path"
    ]
  },
  "fifteen_minute_runbook": [
    {
      "minute": "0-2",
      "screen": "자료 범위 확인",
      "operator_action": "교수님에게 NotebookLM에 넣을 수 있는 자료 범위와 external_ai_allowed를 확인합니다.",
      "proof": "source_manifest_row_count, rights_status, external_ai_allowed"
    },
    {
      "minute": "2-5",
      "screen": "소스팩 전달",
      "operator_action": "공개 가능 요약·쟁점표만 담은 notebooklm-sourcepack.md와 notebooklm-query-package.md를 전달합니다.",
      "proof": "sourcepack_id, query_package_version"
    },
    {
      "minute": "5-8",
      "screen": "교수 NotebookLM 실행",
      "operator_action": "교수님이 본인 NotebookLM에서 직접 실행합니다. LBR은 로그인하지 않습니다.",
      "proof": "lbr_credentials_stored=false, no_session_stored=true"
    },
    {
      "minute": "8-12",
      "screen": "LBR 응답 회수",
      "operator_action": "NotebookLM JSON/Markdown 또는 flashcards CSV를 LBR AI 응답 회수 화면에 붙여 넣습니다.",
      "proof": "response_import_hash, lbr_import_batch_id"
    },
    {
      "minute": "12-15",
      "screen": "검수 큐와 API 승격 판정",
      "operator_action": "모든 후보는 draft/human_review_required 상태로 검수 큐에 들어가고, 통과 row만 API/local DB 30문항 batch로 승격합니다.",
      "proof": "review_queue_ready, promotion_ready_count, blocked_count"
    }
  ],
  "import_contract": {
    "accepted_inputs": [
      "sourcepack-response.json",
      "NotebookLM Markdown answer",
      "NotebookLM flashcards CSV"
    ],
    "required_fields": [
      "request_id",
      "sourcepack_id",
      "generated_at",
      "provider",
      "generated_draft_count",
      "review_queue_ready",
      "drafts",
      "review_flags",
      "lbr_credentials_stored",
      "no_session_stored",
      "raw_private_material_included",
      "student_identifiers_included"
    ],
    "required_review_flags": [
      "human_review_required",
      "citation_verification_required",
      "statute_date_check_required",
      "precedent_original_source_required",
      "private_material_not_quoted"
    ],
    "fail_closed_when": [
      "generated_draft_count does not match drafts.length",
      "raw_private_material_included is true",
      "student_identifiers_included is true",
      "lbr_credentials_stored is true",
      "no_session_stored is false",
      "public_notebook_url_allowed is true without private receipt",
      "case question contains choices or numeric answer",
      "choice question has not exactly five choices or not exactly one answer"
    ],
    "promotion_rule": "NotebookLM import가 성공해도 자동 승인이 아닙니다. rights_status, source_citations, human reviewer, review_flags가 통과한 후보만 API/local DB batch, student practice, Anki TSV, professor report로 승격합니다."
  },
  "candidate_drafts": [
    {
      "id": "trial-choice-001",
      "problem_type": "choice",
      "title": "채무불이행 손해배상 범위",
      "stem": "갑은 을에게 특정 기계 납품을 약정하였으나 이행기가 지난 뒤에도 납품하지 않았다. 을은 대체 거래와 추가 비용을 주장한다. 채무불이행 책임 성립과 손해배상 범위에 관한 설명 중 검수 후보로 가장 타당한 것은?",
      "choices": [
        {
          "no": 1,
          "is_answer": false,
          "trap": "책임 성립과 손해 범위를 혼동"
        },
        {
          "no": 2,
          "is_answer": true,
          "trap": "정답 후보"
        },
        {
          "no": 3,
          "is_answer": false,
          "trap": "인과관계 누락"
        },
        {
          "no": 4,
          "is_answer": false,
          "trap": "예견가능성 과잉 배제"
        },
        {
          "no": 5,
          "is_answer": false,
          "trap": "증명책임 전도"
        }
      ],
      "review_flags": [
        "human_review_required",
        "citation_verification_required"
      ]
    },
    {
      "id": "trial-choice-002",
      "problem_type": "choice",
      "title": "이행지체와 해제",
      "stem": "계약상 이행기가 정해져 있고 채권자가 상당한 기간을 정해 이행을 최고한 사안에서 해제권 행사 요건과 효과를 묻는 선택형 후보입니다.",
      "choices": [
        {
          "no": 1,
          "is_answer": false,
          "trap": "최고 필요 여부 과잉 일반화"
        },
        {
          "no": 2,
          "is_answer": false,
          "trap": "해제와 손해배상 병존 가능성 누락"
        },
        {
          "no": 3,
          "is_answer": true,
          "trap": "정답 후보"
        },
        {
          "no": 4,
          "is_answer": false,
          "trap": "원상회복 범위 오해"
        },
        {
          "no": 5,
          "is_answer": false,
          "trap": "상대방 귀책사유 추정 오류"
        }
      ],
      "review_flags": [
        "human_review_required",
        "statute_date_check_required"
      ]
    },
    {
      "id": "trial-case-001",
      "problem_type": "case",
      "title": "과잉금지원칙과 제한 입법",
      "stem": "공익 목적의 제한 입법이 기본권을 제한하는 사안에서 침해의 최소성과 법익 균형성을 중심으로 논증할 사례형 후보입니다.",
      "choices": [],
      "answer_outline": {
        "쟁점": "제한 입법의 목적 정당성, 수단 적합성, 침해 최소성, 법익 균형성",
        "규범": "과잉금지원칙의 네 단계 심사와 입법재량 통제 기준",
        "포섭": "사실관계에서 대체 수단, 제한 강도, 보호되는 공익의 구체성을 검토",
        "결론": "각 단계별 통과 여부를 분리해 위헌 또는 합헌 결론 후보를 제시"
      },
      "prohibited_phrases_checked": [
        "다음 중",
        "옳은 것은",
        "1~5번"
      ],
      "review_flags": [
        "human_review_required",
        "precedent_original_source_required"
      ]
    },
    {
      "id": "trial-case-002",
      "problem_type": "case",
      "title": "불법행위와 손해액 산정",
      "stem": "가해행위, 손해 발생, 인과관계, 과실상계가 함께 문제되는 사안에서 청구원인과 항변을 나누어 쓰는 사례형 후보입니다.",
      "choices": [],
      "answer_outline": {
        "쟁점": "불법행위 성립요건, 손해액, 인과관계, 과실상계",
        "규범": "고의·과실, 위법성, 손해, 상당인과관계와 손해공평분담 기준",
        "포섭": "피해자 행위, 손해 확대 요인, 증명 가능한 손해 항목을 구별",
        "결론": "일부 인용 가능성과 감액 사유를 구분해 결론 후보 작성"
      },
      "prohibited_phrases_checked": [
        "다음 중",
        "옳은 것은",
        "1~5번"
      ],
      "review_flags": [
        "human_review_required",
        "citation_verification_required"
      ]
    },
    {
      "id": "trial-record-001",
      "problem_type": "record",
      "title": "기록형 답안 목차와 증거관계",
      "stem": "계약서, 내용증명, 거래내역, 일부 변제 자료가 있는 기록에서 청구취지·청구원인·항변 재항변 구조를 정리하는 기록형 후보입니다.",
      "choices": [],
      "record_outline": {
        "목차": [
          "청구취지",
          "청구원인",
          "증거관계",
          "예상 항변",
          "결론"
        ],
        "증거관계": "계약 성립, 이행기, 불이행, 손해, 일부 변제 여부를 증거별로 분리",
        "누락위험": "원문 기록 복제 금지, 실제 서류명은 private receipt에서만 확인",
        "검수포인트": "청구원인과 항변을 혼동하지 않고 출처 후보를 확인"
      },
      "review_flags": [
        "human_review_required",
        "private_material_not_quoted"
      ]
    }
  ],
  "flashcards_csv_bridge": {
    "status": "review_required_learning_aid_only",
    "import_as": "Anki candidate",
    "approved": false,
    "human_review_required": true,
    "required_columns": [
      "sourcepack_id",
      "front",
      "back",
      "issue_tag",
      "source_hint",
      "response_import_hash",
      "approved",
      "human_review_required"
    ],
    "sample_rows": [
      {
        "sourcepack_id": "lbr-notebooklm-trial-civil-default-20260622",
        "front": "채무불이행 손해배상 범위 검토 순서",
        "back": "책임 성립 -> 손해 발생 -> 인과관계 -> 예견가능성 -> 감액 사유",
        "issue_tag": "civil_default_damages",
        "approved": false,
        "human_review_required": true
      },
      {
        "sourcepack_id": "lbr-notebooklm-trial-civil-default-20260622",
        "front": "사례형 답안에서 선택형 표현을 피해야 하는 이유",
        "back": "사례형은 선지 선택이 아니라 쟁점/규범/포섭/결론 구조의 논증형 답안입니다.",
        "issue_tag": "case_answer_structure",
        "approved": false,
        "human_review_required": true
      }
    ]
  },
  "professor_meeting_script": [
    "교수님 NotebookLM은 그대로 쓰셔도 됩니다. LBR은 계정에 로그인하지 않고, 교수님이 만든 근거 후보를 검수 큐와 Anki, 정답률 리포트로 이어 붙입니다.",
    "오늘은 공개 가능한 요약·쟁점표만 넣고 5개 후보를 회수해 보겠습니다. 원문 시험지, OCR 원문, 학생 실명, 점수표 원본은 넣지 않습니다.",
    "NotebookLM 결과가 좋아도 바로 학생에게 배포하지 않습니다. 모든 row는 draft이며 사람 검수 후에만 API/local DB 30문항 운영으로 승격됩니다.",
    "이 수동 회수 과정이 반복 업무로 느껴지면 그 지점이 LBR 유료 파일럿의 구매 신호입니다."
  ],
  "scoring_gate": {
    "total": 100,
    "pass_score": 70,
    "weights": [
      {
        "label": "자료 권한과 external_ai_allowed 확인",
        "points": 20
      },
      {
        "label": "교수 NotebookLM 직접 실행",
        "points": 15
      },
      {
        "label": "response_import_hash와 private receipt 확보",
        "points": 20
      },
      {
        "label": "검수 큐 draft 5개 이상 회수",
        "points": 20
      },
      {
        "label": "API/local DB 30문항 승격 조건 확인",
        "points": 15
      },
      {
        "label": "유료 파일럿 다음 행동 확인",
        "points": 10
      }
    ],
    "current_public_demo_score": 55,
    "current_public_demo_boundary": "합성·공개 안전 trial pack은 준비됐지만, 실제 교수 receipt와 허락 자료가 없으므로 수상·상용화 완료 증거가 아닙니다."
  },
  "public_safety_assertions": [
    "No API keys",
    "No local file paths",
    "No raw private school text",
    "No student identifiers",
    "No score sheet originals",
    "No NotebookLM credential or session storage",
    "Cloudflare Pages remains primary public URL",
    "Vercel remains backup mirror only"
  ],
  "next_actions": [
    "교수 후보 1명에게 15분 trial pack을 보내고 NotebookLM 계정 유형을 확인합니다.",
    "허락된 요약·쟁점표 1묶음을 받아 source_manifest와 source_hash를 채웁니다.",
    "교수님 NotebookLM 실행 후 response_import_hash를 LBR private receipt에 남깁니다.",
    "5개 후보가 검수 큐에 들어가면 30문항 API/local DB 승격 조건을 확인합니다.",
    "교수님이 반복 운영을 원하면 1주 paid pilot SOW로 전환합니다."
  ]
}
