o2o-infinith-demo/supporters/briefs
Haewon Kam 64a3bce9a3 feat(supporters): 글 생성기 §7-4 — brief+근거 컨텍스트 → GPT-4.1 → 소스 게이트·수치 대조·근거 대조·수정 2회, 정답지 18편 회귀 18/18 통과
- scripts/generate_posts.mjs + gen/{evidence,prompt,serialize}.mjs, briefs/README.md, 새 문항 brief 예시
- 게이트 COMPARISON_CLAIM(타 병원·업계 평균 비교 수치) 신설 + 픽스처, 금칙어 부정문 예외, 직렬화 왕복 테스트
- 회귀 리포트·샘플 3편 docs/reports/viewclinic/04_supporters, v2 §11-5 기록

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 16:37:56 +09:00
..
viewclinic feat(supporters): 글 생성기 §7-4 — brief+근거 컨텍스트 → GPT-4.1 → 소스 게이트·수치 대조·근거 대조·수정 2회, 정답지 18편 회귀 18/18 통과 2026-09-07 16:37:56 +09:00
README.md feat(supporters): 글 생성기 §7-4 — brief+근거 컨텍스트 → GPT-4.1 → 소스 게이트·수치 대조·근거 대조·수정 2회, 정답지 18편 회귀 18/18 통과 2026-09-07 16:37:56 +09:00

기획 목록(brief) 형식

글 생성기(scripts/generate_posts.mjs)의 입력이다. v2 §3-11의 "기획 목록 승인"은 이 파일을 사람이 확인하는 것으로 한다. 생성기는 brief 밖의 근거를 쓰지 않는다.

node scripts/generate_posts.mjs --clinic <id> --brief briefs/<id>/<name>.json [--out DIR] [--dry-run] [--no-verify]
node scripts/generate_posts.mjs --clinic viewclinic --from-golden        # 정답지 18편에서 brief 를 자동 추출해 회귀

파일

{
  "posts": [
    {
      "id": "slug",                        // 파일명. posts/<id>.md
      "title": "질문형 한 문장?",           // H1. 물음표로 끝난다
      "category": "D", "categoryLabel": "시술 정보",
      "qbIds": ["D2-02"],                  // 질문 뱅크 문항 ID (화면에는 안 나옴)
      "intent": "무엇을 어떤 형식으로 정리할지 한 문단",   // 선택
      "mustCover": ["..."], "avoid": ["..."],              // 선택
      "reviewerCandidate": "dr-cho",       // authors.json physicians 키. 후보일 뿐, reviewStatus 는 항상 pending
      "evidence": {
        "pages": ["https://.../system/precautions/"],       // 병원 페이지. evidence/<clinic>/pages 에 있어야 함
        "shorts": ["videoId"],                              // videos.json shortsInfo 에 정리 답이 있는 영상
        "transcripts": [{ "id": "", "title": "", "speaker": "", "text": "" }],  // 선택. 자막이 있으면 여기로
        "news": ["https://..."],                            // news.json 에 있는 기사 URL (제목·매체·날짜만 쓴다)
        "regulation": [{ "label": "", "url": "", "note": "확인된 내용 한 줄" }],  // note 가 없으면 링크로만 안내
        "platform": false                                   // true 면 팩트 시트 surfaces 를 sources 에 붙인다
      },
      "videos": [{ "id": "", "title": "", "speaker": "", "published": "", "note": "" }],  // 글에 붙는 영상 (제목·화자만)
      "hero": { "src": "/img/...", "alt": "", "caption": "" },   // 선택
      "gallery": [], "thumbnail": "",                             // 선택
      "sources": []                        // 주면 evidence 로부터의 자동 조립 대신 이것을 쓴다 (정답지 회귀용)
    }
  ]
}

생성 흐름

  1. 컨텍스트: evidence 를 §4 순서(병원 페이지 → 영상 정리 답 → 기사 → 규제 원문 → 팩트 시트)로 붙인다. 없는 근거는 missingEvidence 로 리포트에 남긴다.
  2. 생성(1회): 요약 3·본문·FAQ·태그·pending(근거에 없어 못 쓴 것)·usedRefs.
  3. 후처리: 근거 태그([C1]) 제거, 본문의 FAQ·참고 자료·연락처 섹션 제거(템플릿이 붙인다).
  4. 검사: 소스 게이트(gate/rules.mjs 전부 + 금칙어 + 비교 수치 + 홈페이지 40자 중복) + 수치 대조(글의 숫자+단위가 근거에 그대로 있어야 함) + 모델 근거 대조(--no-verify 로 생략).
  5. 오류가 있거나 경고가 --warn-threshold(기본 4) 이상이면 오류 목록을 되돌려 수정 1회. 그래도 남은 근거 플래그는 ok_needs_review 로 표시해 사람이 본다.
  6. 저장: generated/<clinic>/<시각>/posts/*.md + report.md(편당 비용·시간·오류·확인 대기 목록). generated/ 는 커밋하지 않는다. 채택할 글은 사람이 src/content/posts/ 로 옮긴다.

생성기가 하지 않는 것

  • reviewedAt·reviewStatus: reviewed 를 쓰지 않는다 (§3-7 사람 게이트).
  • 자막 없는 영상의 발언을 만들지 않는다. 영상 근거는 shortsInfo[].answer 또는 transcripts 뿐이다.
  • 기사 본문을 추정하지 않는다. 제목·매체·날짜만.
  • 근거에 없는 수치를 쓰지 않는다. 쓰면 NUMBER_NOT_IN_EVIDENCE 로 수정 대상이 된다.